remotion-dev/remotion · error · TypeError
"${name}" must be greater than 0, but got ${JSON.stringify(v
Error message
"${name}" must be greater than 0, but got ${JSON.stringify(value)} What it means
Thrown by validatePositiveUnitInterval (packages/effects/src/paper.ts:279), which is called only for fiberSize and crumpleSize. It fires when the resolved value is ≤ 0 (the subsequent ≤ 1 check is error 770). Both params are documented as 0.01–1, so zero or negative values are rejected here first.
Source
Thrown at packages/effects/src/paper.ts:279
folds: p.folds ?? DEFAULT_FOLDS,
foldCount: p.foldCount ?? DEFAULT_FOLD_COUNT,
drops: p.drops ?? DEFAULT_DROPS,
fade: p.fade ?? DEFAULT_FADE,
seed: p.seed ?? DEFAULT_SEED,
scale: p.scale ?? DEFAULT_SCALE,
});
const validateAtMost = (value: number, max: number, name: string): void => {
if (value > max) {
throw new TypeError(
`"${name}" must be <= ${max}, but got ${JSON.stringify(value)}`,
);
}
};
const validatePositiveUnitInterval = (value: number, name: string): void => {
if (value <= 0) {
throw new TypeError(
`"${name}" must be greater than 0, but got ${JSON.stringify(value)}`,
);
}
validateAtMost(value, 1, name);
};
const validatePaperParams = (params: PaperParams): void => {
assertEffectParamsObject(params, 'Paper');
assertOptionalFiniteNumber(params.amount, 'amount');
assertOptionalColor(params.colorFront, 'colorFront');
assertOptionalColor(params.colorBack, 'colorBack');
assertOptionalFiniteNumber(params.contrast, 'contrast');
assertOptionalFiniteNumber(params.roughness, 'roughness');
assertOptionalFiniteNumber(params.fiber, 'fiber');
assertOptionalFiniteNumber(params.fiberSize, 'fiberSize');
assertOptionalFiniteNumber(params.crumples, 'crumples');
assertOptionalFiniteNumber(params.crumpleSize, 'crumpleSize');View on GitHub (pinned to 78fe4bb3fd)
Solutions
- Set fiberSize/crumpleSize to a value in (0, 1] (minimum 0.01).
- Clamp animations: interpolate(..., {extrapolateLeft: 'clamp', extrapolateRight: 'clamp'}) and use a floor like Math.max(0.01, value).
- Pre-validate with the guard below.
Example fix
// before
paper({fiberSize: 0, crumpleSize: 0.35}); // throws on fiberSize
// after
paper({fiberSize: 0.2, crumpleSize: 0.35}); Defensive patterns
Strategy: validation
Validate before calling
// Ensure fiberSize and crumpleSize are within (0, 1]
function sanitizePositiveUnit(v: number | undefined, floor = 0.01): number | undefined {
if (v === undefined) return undefined;
if (typeof v !== 'number' || !Number.isFinite(v) || v <= 0) return floor;
return Math.min(v, 1);
}
// usage: paper({fiberSize: sanitizePositiveUnit(raw.fiberSize)}) Type guard
const isPositiveUnitInterval = (v: unknown): v is number => typeof v === 'number' && Number.isFinite(v) && v > 0 && v <= 1;
Try / catch
try {
paper({fiberSize: raw.fiberSize, crumpleSize: raw.crumpleSize});
} catch (err) {
if (err instanceof TypeError && /must be greater than 0/.test(err.message)) {
paper({fiberSize: Math.max(0.01, raw.fiberSize), crumpleSize: Math.max(0.01, raw.crumpleSize)});
} else throw err;
} Prevention
- Floor animated fiberSize/crumpleSize at 0.01 with Math.max or extrapolateLeft: 'clamp'.
- Validate externally sourced params before calling paper().
- Match UI control minimums to the documented 0.01 floor.
When it happens
Trigger: Calling paper({fiberSize: 0}) or paper({crumpleSize: -0.1}); animating either param down to or below zero without clamping.
Common situations: An interpolate() call that ramps to 0; defaults overridden by an empty/zero from a config; negative values from a mis-scaled UI control.
Related errors
- "${name}" must be <= ${max}, but got ${JSON.stringify(value)
- "scale" must be greater than 0, but got ${JSON.stringify(r.s
- "${name}" must be between ${min} and ${max}
- "${name}" must be greater than 0, but got ${JSON.stringify(v
- "${name}" must be greater than or equal to 0, but got ${JSON
AI-assisted analysis of remotion-dev/remotion@78fe4bb3fd (2026-08-12).
Data as JSON: /api/errors/4eb623fc3467716c.
Report an issue: GitHub.