remotion-dev/remotion · error · Error

Could not load LUT (HTTP ).

Error message

Could not load LUT (HTTP ${response.status}).

What it means

LutPreview fetches a .cube LUT file from a URL to render a before/after preview. When the HTTP response is not ok (4xx/5xx), it throws this error so the component can surface a load failure instead of silently rendering without the LUT.

Solutions

  1. Check the browser network tab for the failing LUT request status and URL; fix the URL or restore the file at that location.
  2. Verify the host serves the .cube file with proper CORS headers since the fetch is cross-origin with an anonymous crossorigin image.
  3. Test the LUT URL directly with curl to distinguish 404 (wrong URL) from 403 (permissions/CORS) from 5xx (server issue).
  4. If the URL is user-supplied, validate it and show a fallback state in the UI.

Example fix

// before
<LutPreview src="https://cdn.example.com/luts/look1.cube" />
// after (verify the URL exists and is CORS-enabled first)
<LutPreview src="https://cdn.example.com/luts/look-1-v2.cube" />
Defensive patterns

Strategy: try-catch

Validate before calling

const res = await fetch(lutUrl, {method: 'HEAD'});
if (!res.ok) throw new Error(`LUT URL unavailable: ${res.status}`);

Try / catch

try {
  render(<LutPreview src={lutUrl} />);
} catch (e) {
  if (/Could not load LUT/.test(e.message)) showFallbackState();
  else throw e;
}

Prevention

When it happens

Trigger: Passing a `src` prop URL to LutPreview that returns a non-2xx status: a 404 for a removed or mistyped LUT URL, a 403 from a bucket/CORS policy, or a 500 from the hosting server.

Common situations: LUT file moved or renamed on a CDN; S3/R2 bucket permissions changed; requesting a LUT through a proxy that blocks cross-origin anonymous fetches; offline or firewalled environment.

Understand the failure class

Background: "API error: {status}" and "HTTP 401/403/404/429/5xx" errors: non-2xx HTTP responses explained — this error's family across 27 libraries.

Related errors


AI-assisted analysis of remotion-dev/remotion@46a3a6bf13 (2026-09-18). Data as JSON: /api/errors/8c2f6a584360c59b. Report an issue: GitHub.

Appendix: source

Thrown at packages/studio/src/components/LutPreview.tsx:177

				return;
			}

			event.preventDefault();
			event.stopPropagation();
		},
		[],
	);

	useEffect(() => {
		const controller = new AbortController();
		const image = new Image();
		image.crossOrigin = 'anonymous';
		setState({type: 'loading'});

		const load = async () => {
			const response = await fetch(src, {signal: controller.signal});
			if (!response.ok) {
				throw new Error(`Could not load LUT (HTTP ${response.status}).`);
			}

			const lut = parseCubeLut(await response.text());
			if (controller.signal.aborted) {
				return;
			}

			image.src = sampleImage;
			try {
				await image.decode();
			} catch {
				throw new Error(
					'Could not load the LUT sample image. Check your internet connection.',
				);
			}

			if (controller.signal.aborted) {
				return;

View on GitHub (pinned to 46a3a6bf13)