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

  1. Set fiberSize/crumpleSize to a value in (0, 1] (minimum 0.01).
  2. Clamp animations: interpolate(..., {extrapolateLeft: 'clamp', extrapolateRight: 'clamp'}) and use a floor like Math.max(0.01, value).
  3. 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

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


AI-assisted analysis of remotion-dev/remotion@78fe4bb3fd (2026-08-12). Data as JSON: /api/errors/4eb623fc3467716c. Report an issue: GitHub.