Updated October 14, 2026. Written for EffectCraft 0.9.2 (what changed since).
EffectCraft's expressions are JavaScript with the After Effects object model: time, value, thisComp, thisLayer, wiggle, loopOut, valueAtTime, linear and ease, effect("…")("…") and most of the other names tutorials use. That makes effectcraft.run/editor a practical way to follow an expressions tutorial on a Chromebook, a school computer, or any machine without Creative Cloud.
How do you add an expression?
- Find the property. Select the layer in the Timeline and press P for Position, R for Rotation, S for Scale or T for Opacity. Click into the app first so the shortcuts reach it.
- Open the expression field. Alt+click the stopwatch next to the property, or select the property and choose Animation › Add Expression.
- Type or paste the expression into the field under the property. The editor highlights syntax, numbers its lines, matches brackets and completes names with Tab.
- Preview. Click an empty part of the Timeline, then press the Spacebar.
To point at another layer's property, drag the expression's pick whip onto it in the Timeline and the reference is written for you, as in thisComp.layer("Logo").transform.rotation.
When an expression fails, a bar along the bottom of the Composition viewer lists every failing expression at the current time, with arrows to step through them. Click the message and EffectCraft selects the layer and reveals the property. Until you fix it, the property renders with its keyframed value.
Recipes to copy
| Put it on | Expression | What it does |
|---|---|---|
| Position | wiggle(2, 30) | Drifts randomly about twice a second, up to 30 px from its keyed value |
| Any keyed property | loopOut("cycle") | Repeats the keyframes forever after the last key |
| Any keyed property | loopOut("pingpong") | Plays the keys forward, then backward, then forward again |
| Position, Rotation | loopOut("offset") | Repeats the keys and adds the change each time, for steps or a counter |
| Position, Rotation | loopOut("continue") | Keeps moving at the speed of the last keyframe |
| Rotation | time * 90 | Turns 90 degrees every second, no keyframes needed |
| Opacity | linear(time, 0, 1, 0, 100) | Fades in over the first second of the comp |
| Position | [value[0], value[1] + Math.sin(time * 4) * 20] | Bobs up and down 20 px around its own position |
| Position | thisComp.layer("Leader").transform.position.valueAtTime(time - 0.2) | Follows the layer named Leader, 0.2 s behind |
| Position | wiggle(effect("Slider Control")("Slider"), 30) | Wiggle speed set by a Slider Control on the same layer, which you can keyframe |
| Position | posterizeTime(8); wiggle(2, 30) | The same wiggle, updated only 8 times a second for a choppy, hand-made feel |
| Rotation | seedRandom(5, true); random(-15, 15) | A fixed random tilt, different on each layer you paste it on |
For the Slider recipe, add Effect › Expression Controls › Slider Control to the layer first. Angle, Checkbox, Color, Dropdown Menu, Layer, Point and 3D Point controls work the same way and give a rig its knobs.
loopOut() with no argument means "cycle". All four loop types need at least two keyframes on the property, since they repeat what happens between them. Pass a number as the second argument, as in loopOut("cycle", 2), to loop only the last two keyframe intervals; loopIn() does the same before the first key.
What behaves differently from After Effects?
After Effects lets a project choose between its JavaScript engine and Legacy ExtendScript. EffectCraft has only JavaScript, but it accepts the old-style array arithmetic that many tutorials rely on, so value + [10, 0] shifts a position 10 px to the right.
Randomness is repeatable. wiggle() and random() are seeded by the layer's index and the property, so a frame renders identically every time and on every computer. Duplicate a layer and the copy wiggles differently, as you'd expect.
Edge cases are where you may hit differences. The object model was written from Adobe's public Expression Language Reference, and its developers rate expressions and scripting together about 65% ready. Nobody has yet run a large library of real-world expressions through both apps side by side. Simple motion like the recipes above is the solid part; for a complex rig from a template, scrub through it frame by frame before you trust the render.
There is no link to an external code editor yet, so write expressions in the built-in field or paste them in.
Handing off: bake expressions to keyframes
Some destinations can't run expressions. A Lottie file exported from EffectCraft's menu leaves them out, and LottieFiles' compatibility table tells After Effects users to bake them to keyframes before exporting too. Select the property and choose Animation › Keyframe Assistant › Convert Expression to Keyframes: you get a key on every frame and the expression is switched off. Keep a duplicate of the layer if you may want to change the expression later.
If you want wiggle motion as editable keys from the start, select two or more keyframes and use the Wiggler, as in After Effects: it adds random keyframes between them instead of an expression.
Expressions are one part of the After Effects workflow. For the rest (panels, effects, file formats and what EffectCraft can't open yet), see a free After Effects alternative that runs online. For text, the range selector also takes an Expression selector; our guide to animating text online explains the selectors.
Try it now: make a shape layer, paste wiggle(2, 30) on its Position, then add a Slider Control and swap the 2 for effect("Slider Control")("Slider"). Keyframe the slider from 0 to 8 and the shake builds up on its own.