remotion-dev/remotion · error

LUT effect requires a parameters object, but got

Error message

LUT effect requires a parameters object, but got ${JSON.stringify(params)}

What it means

The lut() effect factory validates its parameters object before the effect is registered. This TypeError is thrown when you pass anything other than a plain object (null, undefined, a string, a number, etc.) as the parameters. The LUT effect needs a params object with a `content` field, so a non-object means the caller has called the API incorrectly.

Solutions

  1. Wrap the LUT contents in an object: lut({content: cubeFileContents}).
  2. Log the value you pass and check it is a non-null object before calling lut().
  3. Check the Remotion docs at https://www.remotion.dev/docs/effects/lut for the current LutParams shape.

Example fix

// before
const effect = lut(cubeContents);
// after
const effect = lut({content: cubeContents});
Defensive patterns

Strategy: validation

Validate before calling

function isLutParams(v: unknown): v is {content: string} {
  return v !== null && typeof v === 'object' && !Array.isArray(v);
}
if (!isLutParams(candidate)) throw new TypeError('lut() requires {content: string}');

Type guard

const isLutParams = (v: unknown): v is LutParams =>
  v !== null && typeof v === 'object';

Try / catch

try {
  const effect = lut(input as LutParams);
} catch (e) {
  if (e instanceof TypeError && e.message.includes('requires a parameters object')) {
    console.error('Fix the lut() call: pass lut({content})');
  } else throw e;
}

Prevention

When it happens

Trigger: Calling `lut(null)`, `lut(undefined)`, `lut('some .cube string')`, `lut(buffer)` or any non-object value instead of `lut({content})`. Also happens if you destructure/spread incorrectly or pass a legacy positional argument shape that this effect does not accept.

Common situations: Copy-pasting older Remotion effect examples that used a different call signature; forgetting to wrap the LUT file contents in an object; passing the result of a failed async file read (undefined) straight into lut().

Understand the failure class

Background: "Must be a positive integer", "Invalid value", "Unsupported": the invalid-argument-value error family, when a library rejects the value you pass — this error's family across 35 libraries.

Related errors


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

Appendix: source

Thrown at packages/effects/src/lut/index.ts:78

	const created = {
		parsed: parseCubeLut(content),
		effectKey: `lut-${content.length}-${firstHash >>> 0}-${secondHash >>> 0}`,
	};
	parsedLuts.set(content, created);

	if (parsedLuts.size > MAX_CACHED_LUTS) {
		const oldestContent = parsedLuts.keys().next().value;
		if (oldestContent !== undefined) {
			parsedLuts.delete(oldestContent);
		}
	}

	return created;
};

const validateLutParams = (params: LutParams): void => {
	if (params === null || typeof params !== 'object') {
		throw new TypeError(
			`LUT effect requires a parameters object, but got ${JSON.stringify(params)}`,
		);
	}

	if (
		typeof params.content !== 'string' ||
		params.content.trim().length === 0
	) {
		throw new TypeError(
			`"content" must be a non-empty string, but got ${JSON.stringify(params.content)}`,
		);
	}

	getCachedLut(params.content);
};

export const lut = createEffect<LutParams, LutState>({
	type: 'remotion/lut',

View on GitHub (pinned to 46a3a6bf13)