Property keyframes and easing
Beyond hand-drawn frames, any property on any object — position, rotation, color, a shader parameter, virtually anything editable in the right panel — can be keyframed directly, with a richly-adjustable easing curve controlling exactly how it moves from one value to the next. This is the layer that turns Formo from "a frame-by-frame tool" into something that also handles motion-graphics-style animation on the same objects, side by side.
Use record and auto-record
Manually, with Record. With an object selected, click Record in the timeline panel. This keys the object's entire current pose at the current frame (every relevant property it's currently showing, captured together as one keyframe moment), not just one field you happened to click into. Record is scoped to your current selection: nothing outside what's selected gets touched, so keying one character's pose doesn't accidentally stamp a keyframe onto something else sitting nearby in the scene.
Automatically, with Auto-record. Turn on Auto-record, and Formo keys a property for you the moment you change it. No separate Record click needed. This is debounced by roughly 250 milliseconds: if you're dragging a slider or nudging a value repeatedly in quick succession, those edits coalesce into a single keyframe rather than spawning a new one on every tiny movement. The practical effect is that Auto-record feels like "just work, and the keyframes appear," rather than something you have to remember to trigger. It's the mode most people settle into once they're keyframing regularly, with manual Record reserved for the moments you want to key a pose deliberately without having changed anything yet.
Any property. Position and rotation are the obvious ones, but this isn't a fixed, special list — opacity, a fill color, a stroke's weight, a shader's own exposed parameter, all of it keyframes exactly the same way. If it's a field in the right panel, Record and Auto-record both know how to key it.
Shape motion with easing curves
Right-click a segment between two keyframes on the timeline to open the easing picker. It's laid out in four grouped columns, and the grouping itself tells you something about what each curve does:
Ease-in: Sine, Quad, Cubic, Quart, and Expo, in that order of increasing sharpness. All five start a motion slow and finish fast, but how aggressively they accelerate differs: Sine is the gentlest, barely distinguishable from linear at a glance; each step toward Expo compounds the acceleration further, until Expo's motion barely moves at all for the first stretch of the segment before rushing to catch up right at the end.
Symmetric: the same five curve families, but eased on both ends instead of just the start: Linear (no easing at all, a straight constant-speed motion), then Sine, Quad, Cubic, Quart, and Expo, each slow-fast-slow in a mirrored shape. This is the group you reach for when a motion should settle gently into its destination as naturally as it left its origin — the most commonly reached-for group for anything that shouldn't feel mechanical.
Ease-out: the mirror image of the Ease-in column: a sharp, fast departure that eases gently into its arrival. Good for anything that should feel like it's settling into place at the end, like an object landing or a UI element coming to rest.
Other: three different animation characters, not just different sharpness levels of the same shape.
- Back (in, out, and in-out variants): the motion overshoots slightly past its target before settling back, the classic "anticipation and overshoot" animator's trick, compressed into a curve you apply rather than hand-key yourself.
- Bounce (in, out, and in-out variants): a springy, multi-bounce settle, like something dropped onto a surface and rebounding a few times before it stops.
- Step: no interpolation at all. The value holds at its starting point for the entire segment, then jumps instantly to the new value right at the end — for snapping cleanly between discrete states rather than easing between them.
Reading what's already applied. Whichever easing is currently on a segment is highlighted in the menu when you open it, so you're never guessing what you're about to change from.
Create custom cubic-bezier curves
When none of the fourteen-plus named presets is quite right, a Custom option opens an inline two-handle cubic-bezier editor — the exact same cubic-bezier(x1, y1, x2, y2) format shared by CSS, Figma, and Rive, so a curve you're used to from any of those tools translates directly. Drag either handle and the curve reshapes live, with the motion itself updating as you drag so you can feel the change, not just see the graph move. The same four numbers behind the curve are also shown directly, in case you'd rather type an exact value you already know than eyeball it by dragging.
Mix keyframed properties with hand-drawn animation
These two animation systems aren't an either/or choice on a given object; they coexist deliberately, and the rule for how is worth understanding precisely rather than just trusting it works.
The core rule. If a specific property has been fully keyframed (meaning it has real keyframes driving it across the timeline, not just sitting at one static value), that keyframed track owns it completely during playback. Any other property on the same object that hasn't been fully keyframed keeps behaving normally, including still picking up fresh values from Auto-record as you keep working. So a character's rotation and position can be entirely driven by keyframes and easing, while its face is still being redrawn frame by frame with F5/F6/F7 on a brush layer underneath — two different animation methods, layered on one character, without one interfering with the other.
A deeper nuance, specifically for multi-clip components. If a component holds more than one animation clip — an "idle" clip and a "walk" clip on the same character, say — a color or other style change you make while "walk" is open only affects "walk." Switch to "idle," and it's untouched. You don't have to worry about a small tweak in one clip accidentally showing up in every other clip on the same symbol.
This works for the usual visual properties: fills, strokes, opacity, visibility, rotation, and stroke styling. Position is handled a little differently under the hood, but behaves the way you'd expect either way. The short version: a clip-specific tweak and a fully keyframed property can both live on the same character at once, and neither one messes with the other.