remotion-dev/remotion · error · TypeError

" " must be >= , but got

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.

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.

Appendix: 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)