remotion-dev/remotion · error · TypeError

"${name}" must be >= ${min}, but got ${JSON.stringify(value)

Error message

"${name}" must be >= ${min}, but got ${JSON.stringify(value)}

What it means

validateAtLeast throws when a pattern() prop resolves to a value below its required minimum (e.g. rowOffsetEvery/columnOffsetEvery must be >= 0, scale must be >= its schema min). The message interpolates the expected minimum and the offending value so the failing prop is obvious.

Source

Thrown at packages/effects/src/pattern.ts:255

		return;
	}

	if (!Number.isInteger(value)) {
		throw new TypeError(
			`"${name}" must be an integer, but got ${JSON.stringify(value)}`,
		);
	}
};

const validatePositive = (value: number, name: string): void => {
	if (value <= 0) {
		throw new TypeError(`"${name}" must be > 0`);
	}
};

const validateAtLeast = (value: number, min: number, name: string): void => {
	if (value < min) {
		throw new TypeError(
			`"${name}" must be >= ${min}, but got ${JSON.stringify(value)}`,
		);
	}
};

const validatePatternParams = (params: PatternParams): void => {
	assertEffectParamsObject(params, 'Pattern');
	assertOptionalFiniteNumber(params.scale, 'scale');
	assertOptionalFiniteNumber(params.cropLeft, 'cropLeft');
	assertOptionalFiniteNumber(params.cropTop, 'cropTop');
	assertOptionalFiniteNumber(params.cropRight, 'cropRight');
	assertOptionalFiniteNumber(params.cropBottom, 'cropBottom');
	assertOptionalFiniteNumber(params.gapX, 'gapX');
	assertOptionalFiniteNumber(params.gapY, 'gapY');
	assertOptionalFiniteNumber(params.offsetU, 'offsetU');
	assertOptionalFiniteNumber(params.offsetV, 'offsetV');
	assertOptionalFiniteNumber(params.rowOffset, 'rowOffset');
	assertOptionalFiniteNumber(params.rowOffsetEvery, 'rowOffsetEvery');

View on GitHub (pinned to 78fe4bb3fd)

Solutions

  1. Keep the prop at or above its documented minimum (the schema declares min per prop).
  2. Clamp animated values: Math.max(min, value).
  3. Audit imported config against the patternSchema min/max before passing it through.

Example fix

// before
pattern({ rowOffsetEvery: -1 })

// after
pattern({ rowOffsetEvery: Math.max(0, computedEvery) })
Defensive patterns

Strategy: validation

Validate before calling

// Enforce per-prop minima from the schema before calling pattern().
const MIN = { rowOffsetEvery: 0, columnOffsetEvery: 0 } as const;
function clampMin<T extends keyof typeof MIN>(k: T, v: number | undefined) {
  return v === undefined ? undefined : Math.max(MIN[k], v);
}
pattern({
  rowOffsetEvery: clampMin('rowOffsetEvery', raw.rowOffsetEvery),
  columnOffsetEvery: clampMin('columnOffsetEvery', raw.columnOffsetEvery),
});

Type guard

const isAtLeast = (v: unknown, min: number): v is number =>
  typeof v === 'number' && Number.isFinite(v) && v >= min;

Prevention

When it happens

Trigger: Calling pattern() with a prop below its documented min (rowOffsetEvery: -1, columnOffsetEvery: -2), or animating such a prop below the floor. Checked on resolved values in validatePatternParams.

Common situations: Negative defaults inherited from external config; animated counters that dip below zero at the start/end frame; unit conversion errors producing undersized values.

Related errors


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