Pro tools
Babel
Write After Effects expressions and bake them down to native Figma keyframes: wiggle, loopOut, time, the language you already know.
What it does
Babel lets you speak After Effects and bake Figma. Write an expression, watch Babel sample it across time, then bake the result as real Motion keyframes. The evaluator runs live in the panel (no network, no JavaScript eval, just a real parser and interpreter) so the language you already know runs where AE can't reach.
Interactive lesson: Babel
A guided, click-through tour of Babel in the live plugin, locked to this tool. No Figma needed.
Getting started
Enable properties, type an expression, watch it, bake it.
- 1
- Select one or more layers.
- 2
- Enable the properties to affect (Position, Scale, Rotation, Opacity). The number on each is its amplitude %.
- 3
- Type an expression or tap a preset.
- 4
- Watch the live preview and signal graph.
- 5
- Hit Bake.
Affect & amplitude
The Affect squares pick which properties the expression drives. Each value is an amplitude %: the one expression is sampled once per enabled property and scaled by that percentage. Position and Scale are 2D (paired X/Y); Rotation and Opacity are scalar.
Variables & math
The core variables are time (or t): the current sample in seconds, value: the base value (0 for scalars, [0,0] for 2D), and PI: π.
The full Math surface is available: sin, cos, tan, abs, round, floor, ceil, min, max, pow, sqrt, sign, hypot, plus Math.PI.
Functions
wiggle(freq, amp) is deterministic smooth noise; oscillate(freq, amp) is a clean sine; noise(t) is 1-D value noise. bounce(amp, freq, decay) and spring(amp, freq, decay) are decaying oscillators. smooth(value, width, samples) is a temporal box-average.
random() / random(a, b) and seedRandom(n) give deterministic pseudo-random; clamp(v, lo, hi) bounds a value. The remap family (linear / ease / easeIn / easeOut / easeInOut(t, tMin, tMax, v1, v2)) maps ranges (the ease* forms also take the 3-arg (t, tMin, tMax) → 0..1 shape). posterizeTime(fps) quantizes to a frame rate for stop-motion; degreesToRadians and radiansToDegrees convert angles. loopOut(...) and loopIn(...) are recognized as no-ops. Generative expressions already span the duration.
Per-layer index
index is the selected layer's 0-based position. Babel evaluates and bakes each selected layer separately with its own index, so one expression can fan out across a selection. For example, wiggle(2, 30) + index * 10 offsets each layer progressively. The live preview and graph show layer 0.
Expression Library
Open the Expression Library below the presets to browse the full vocabulary by category, or type in its search box to filter by name. Tap any entry to insert it at the cursor. You can browse, search, and preview without a selection. You only need a layer to Bake.
Conventions & Simplify
Position is px offsets and needs [x, y] (a single number broadcasts to both channels). Scale is a multiplier (1 = 100%). Rotation is degrees. Opacity is 0–1 (clamped). For a scalar property, an array result takes its first element.
The Simplify slider raises the decimation tolerance. Higher means fewer keyframes. Babel always keeps the first and last sample, caps at 200 keyframes, and never drops below 2.