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
- Wrap the LUT contents in an object: lut({content: cubeFileContents}).
- Log the value you pass and check it is a non-null object before calling lut().
- 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
- Always call lut() with an object literal: lut({content})
- Let TypeScript infer the LutParams type instead of casting from unknown/any
- Avoid passing values derived from possibly-failed async reads without checking for undefined
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
- A custom role ARN must either be "undefined" or a string…
- A "duration" of a spring must be a "number" but is
- A numeric bitrate must be a positive integer.
- animationData should be provided as an object. If you only…
- Argument passed to " " for param " " is undefined
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)