Documentation
MoveMatic is a vector animation tool for product UI motion on macOS. Compose vector shapes, text, images, and video into multi-scene .mvm documents; animate every property with keyframes; add span effects, pulses, and camera zooms; and render the whole thing to MP4. This page is the complete reference.
Installation
Download the DMG from the MoveMatic page, open it, and drag MoveMatic.app into your Applications folder. macOS 14 Sonoma or later, Apple Silicon only.
Concepts
Three nested ideas drive everything else.
- Document — a
.mvmfile holds one or more scenes, a chosen active scene, and an optional document-wide audio bed. - Scene — a fixed-size canvas with its own duration, frame rate, background, layer tree, and timeline. Scenes are played back in order; each can declare a transition into the next.
- Layer — every visible thing on the canvas. Layers carry static properties (position, size, fill, stroke, corner radius, shadow, opacity, etc.) and time-based ones (visibility spans, keyframes, pulses).
The toolset is organized around those three: most edits happen in the Layer panel (organize), the Inspector (set properties), or the Timeline (animate).
Opening a document
- File → New (⌘N) creates an empty document with a single 1920×1080 scene.
- File → Open… (⌘O) opens an existing
.mvmfile. - File → Open Recent lists recently opened documents.
- ⌘S saves; ⌘⇧S saves a copy.
Each document opens in its own window. The title bar shows the filename and an Edited badge while there are unsaved changes.
Sample project
The DMG ships with two sample documents under Help → Sample Documents:
- Showcase.mvm — a four-scene, ~18-second promo built around a deliberate visual story (Hello, Motion, Stories, Ship It). It exercises every shipping layer kind, span effect, pulse target, and keyframable property. Good first thing to open.
- AllFeatures.mvm — a denser feature-parade test fixture. Useful as a reference but reads as a tour, not a story.
Canvas
The center of the window is the canvas — a fixed-size scene rendered with whatever's authored at the current playhead. Floating panels (layers, inspector, timeline, scene strip) overlay it as material-backed cards rather than pane splits.
Navigation
- Pan — drag empty canvas with Space held, or two-finger scroll, or drag with the middle mouse button.
- Zoom — pinch on the trackpad, or ⌘+ / ⌘-. ⌘0 fits the whole scene; ⌘1 zooms to 100%; ⌘2 zooms to the selected layer.
- ⌥-drag — duplicate-on-drag. If the drag begins over a layer the selected set is cloned and the copies move with the drag; if it begins on empty canvas it pans.
Selection chrome
Selected layers get an accent-colored dashed bounding box, eight resize handles, and a rotate handle above the top edge. Cropped images and videos wrap the chrome around the visible cropped sub-rect, not the original layer frame.
For freeform / arc / wave lines the rectangular bbox is suppressed in favor of per-anchor endpoint dots (with Start and End labels), which double as drag handles.
Click and drag
- Click on a layer selects it. ⇧-click or ⌘-click extends the selection.
- Click on empty canvas drops the selection. Click-drag from empty space draws a marquee that picks up every layer it touches.
- Click on a selected group, then drag — moves the group. A pure click (no drag) drills into the child under the cursor.
- The body drag is gated by a 4-point arming threshold so a click never accidentally nudges a layer with sub-pixel rounding.
Snap guides
Drag a layer near another layer's edges or center, the scene center, or the scene's edges and a yellow guide line appears with the alignment value. Hold ⌘ during the drag to bypass snapping.
Layer panel
The Layer panel is the floating card on the upper left. It shows every layer in the active scene as a tree — groups expand into their children — with the Scene pseudo-row at the top.
Rows
Each row has, left to right: indent, disclosure chevron (for groups), kind icon, fill swatch, name, hidden / locked badges, and a timeline-pin "meatball" target.
- Double-click a row name to rename inline.
- Right-click a row for context actions: Rename, Reset Name, Duplicate, Group, Ungroup, Hide / Lock, Reset Timeline, Replace Media…, Delete.
- Hidden layers show an eye-with-slash badge and dim out. Locked layers show a lock badge and reject canvas edits.
Scene pseudo-row
The top row labeled Scene stands in for "nothing selected" — clicking it clears the selection so the Inspector pivots to scene-level properties. Its trailing anti-meatball (a slashed dot) unpins every layer's timeline pin in one click.
Selection
- Click a row to select it. ⇧-click for range, ⌘-click to toggle.
- ↑ / ↓ arrows navigate vertically; ⇧↑ / ⇧↓ extend the selection.
- → / ← expand / collapse the focused group (or step into / out of it when already open).
- Tab cycles selection through siblings at the current depth (root → next root, or within a group's children). ⇧Tab steps backward. Both wrap.
- Return drills into every selected group at once — expands each, then replaces the selection with the union of all their direct children. Empty groups just expand.
Drag-reorder
Drag any row to a new position. An accent-colored line marks the drop slot. When the dragged row is part of a multi-selection, every selected layer rides along (the payload is newline-separated UUIDs; drops preserve relative stacking).
Pin to timeline
The small dot at the right of each row is the timeline pin. Click it to keep that layer's timeline rows visible even when the layer isn't selected on canvas — handy for editing layer A's timing while picking colors on layer B.
Scene strip
The scene strip is a thin band of chips above the timeline showing every scene in the document. Click a chip to jump to that scene; drag to reorder; right-click for Rename, Duplicate, Delete.
The active scene is highlighted. Transitions are rendered as short connector pills between chips; click one to set its kind (Fade, Slide, Push, Zoom) and duration.
Timeline
The Timeline panel docks across the bottom of the window. Its content depends on what's selected: nothing selected shows the aggregate tracks across the whole scene; selecting layers reveals their per-layer rows.
Common chrome
- Transport — Jump to start, frame back, play, frame forward, settings, scrubber. Scrubber tracks the playhead live.
- Timecode readout — shows
seconds · frame/total. - Ripple toggles — two arrow pills floating beside any selected timeline bar / marker, indicating push items before / push items after directions. See Ripple editing.
- Music chip — the document audio bed's filename, with a chevron menu to relink / volume / remove.
Per-layer rows
Each selected (or pinned) layer renders a stack of rows:
- Visibility — colored span bars for every
TimeSpanon the layer. - Video (video layers only) — the clip's scene range, with source-trim handles.
- Pulses (opt-in; appears when a pulse exists) — circular markers with optional duration tails.
- Keyframes — one diamond strip per animated property.
When a group is the sole layer shown, three children-aggregate rows appear under it: spans / pulses / keyframes scoped to that group's subtree. Empty buckets are hidden.
Inspector
The Inspector is the floating card on the upper right. It always reflects the primary selected layer; multi-selection edits fan out across every other selected layer in the same gesture.
Common rows: Transform (X, Y, Rotation), Size (W, H, Corner radius), Appearance (Fill, Stroke, Opacity, Shadow), Animation (Origin, Cursor override), plus kind-specific sections (Text font / size / color, Video clip range, Line shape, etc.).
Multi-select offsets are preserved. Scrubbing or stepping a property with multiple selected layers offsets each one by the same delta from its own baseline. Before scrub: multiple. After scrub: still multiple. Typing a specific value into the field is still a "set them all" action.
Text: harmonize. A checkbox next to the text-color swatch derives the glyph color as a hue-preserving darker shade of the layer's fill — one-click readable foreground for chip-style buttons. The swatch is disabled (and the cursor flips to 🚫) while harmonize is on; flip it off to set the color directly. Only shows for fills that aren't fully transparent.
Claude Assistant
A second tab on the Inspector hosts an embedded Claude conversation that can read and edit the active scene. Enable it in MoveMatic → Settings → Assistant, paste your own Anthropic API key, pick a model (Opus 4.7, Sonnet 4.6, or Haiku 4.5), and a "Assistant" segment appears next to "Properties" in the Inspector header.
- Ask in natural language. The assistant has tools to read the scene and apply structured patches.
- Each turn lands as a single undoable edit — named after the turn so the undo menu reads "Undo Make every text fill cyan" rather than "Undo Edit."
- Friendly per-tool-call summaries appear in the transcript; "Copy transcript" sends the whole exchange to the clipboard for sharing.
- Your API key stays in
NSUserDefaultson your Mac and is only sent toapi.anthropic.comwhen you submit a turn.
Mix & Match
Select a row of layers and choose Arrange → Mix & Match… (or right-click the selection on canvas). A sheet lets you toggle which property categories to redistribute across the selection — Fill, Stroke Color, Stroke Width, Shadow, Corner Radius, Width, Height, X, Y, Rotation, Font, Font Size, Text Color, Text Content — then commits the whole shuffle as a single undo step.
- Bias slider. All the way left: pure shuffle — values get permuted within the selection, so no new value is introduced. Slide right and each destination layer pulls a fresh value sampled from the pool's min–max range. Useful for "vary these cards a little" vs "completely re-mix them."
- Distribute as set. When on, every enabled property uses the same source layer per destination, so layer A's whole look transfers to layer B in one move. Off: each property is permuted independently — a faster way to feel out unusual combinations.
- Text content pool. Text-content shuffles work off a comma-separated pool. Pre-fills with the current selection's text so you can extend it (add more candidate strings) before committing.
- Discrete properties (Shadow presets, Font names) always shuffle — the bias slider doesn't apply because there's no continuous range to sample from.
Layer kinds
Layers are added from the palette at the bottom-left of the canvas (the "+" button menu) or via the layer panel's "+".
- Rectangle — fill, stroke (uniform or per-side), corner radius, shadow.
- Ellipse — same set as rectangle, no corner radius.
- Text — string, font (PostScript name), size, color, optional bounding box (fill + stroke + corner radius).
- Line — multi-shape: freeform polyline with optional Catmull-Rom smoothing and arrowheads; preset closed shapes (square, circle, triangle); preset open shapes (arc, wave). Arc has a bend slider (-10…10) and a length multiplier that scales the curl on long arcs; wave has a frequency / amplitude pair, with frequency snapped to half-cycle increments so both endpoints sit on the layer's midline.
- Image — PNG, JPEG, HEIC, etc. Imported via drag-and-drop onto the canvas, or via the palette. Supports crop and stroke around the cropped region.
- Video — H.264 / HEVC / etc. Stored by file URL plus a security-scoped bookmark so a moved file silently relinks. Has its own clip-trim track on the timeline (source range independent of scene timing) and an end behavior (Loop, Freeze last frame, End).
- Cursor — animated SwiftUI cursor in one of a dozen variants (Arrow, Pointer, Grab, I-beam, etc.) plus a Wait throbber. Treated as an animatable cursor sprite, not an interaction layer.
- Hotspot — invisible rectangle that overrides any cursor layer's variant when the cursor's bbox intersects it. The only "interaction region" kind.
- Zoom — camera viewport. See Camera zoom.
- Group — container with optional auto-layout. Groups have their own transform, opacity, span effects, and pulses, which compose with their children's.
- Gradient Field — procedural two-color drifting gradient with warp speed and pulse amount; good for backgrounds.
Groups
Select two or more sibling layers and press ⌘G (or Arrange → Group) to wrap them in a group. ⌘⇧G ungroups, baking the group's transform / scale / rotation / layout / pulses into each child so the visual position is preserved.
Grouping is supported at any depth. A group inside a group rotates and scales with its parent; nested children's keyframes, span effects, and pulses all play correctly through the parent chain. The only restriction is that grouping requires every selected layer to share a parent — cross-parent selections disable the Group command rather than silently re-homing layers.
Return on a group selects its direct children. With multiple groups selected, every group expands and the selection becomes the union of all their children.
Size mode
Groups carry a Size Mode toggle in the Layout section:
- Dynamic (default): the group's bounds are the union AABB of its laid-out children. Resizing isn't meaningful — you change child positions or layout to change the group.
- Fixed: the group has its own explicit W and H independent of contents. A purple translucent rect (same vocabulary as a Zoom layer's chrome) appears on canvas with standard 8-corner resize handles. The first flip from Dynamic to Fixed seeds W/H from the current children-derived bounds, so the on-screen rect doesn't jump.
Fixed groups carry a floating lock pill in the rect's top-right corner. Locked (default): moving the rect moves the children with it — historical group-drag behavior. Unlocked: moving the rect leaves the children where they are, useful for sliding a "viewport" frame around the contents.
Auto-layout groups
Groups have a layout mode in the Inspector — Freeform (default), Horizontal, or Vertical. In Horizontal or Vertical, children are stacked along the chosen axis with a configurable gap and alignment (start, center, end), like a CSS flex container. Per-child X (or Y) keyframes are ignored along the laid-out axis; everything else still animates.
The groupGap is keyframable, so you can animate cards spreading apart and back together as a single coordinated breathing motion.
Selection & reorder
- Marquee — drag from empty canvas to draw a selection rect. Every layer whose AABB intersects gets picked.
- Multi-select duplicate — with multiple layers selected, ⌘D duplicates them all; ⌥-drag clones the whole set.
- Bring forward / send backward — ⌘] / ⌘[. To-front and to-back are ⌘⇧] / ⌘⇧[.
- Align & Distribute — under the Arrange menu. Each acts on the selection set in scene space.
Auto-naming
Rectangles, ellipses, lines, text layers, and cursors auto-name themselves based on a salient attribute and stay synced as you edit:
- Rectangles: "<color> Rectangle" from fill.
- Ellipses: "<color> Ellipse" from fill.
- Lines: "<color> <shape>" from stroke + lineShape (e.g. Coral Wave).
- Text: the first line of the text content.
- Cursors: the variant label.
The moment you type your own name in the inspector or the layer-panel rename field, auto-naming turns off for that layer. Right-click → Reset Name turns it back on and re-derives.
Visibility spans
A visibility span is a time range during which a layer renders. Layers are invisible outside their spans. New layers come with one full-duration span so they're visible everywhere by default.
- Drag a span's body in the timeline to move it; drag either edge to resize.
- Click a span to surface it in the Inspector as Span on <Layer>, with start / end times and the effect list.
- Drop a new span by clicking the "+" gutter button on a layer's visibility row, or via the layer's context menu.
- The aggregate Visibility row collapses spans that share start/end across layers into one bar; dragging it moves every contributing span.
Span effects
Each span carries up to one intro effect (plays at the span's start) and one outro effect (plays at the span's end), plus optional secondary effects. They stack — a span with Fade In + Slide In Left as intro will do both simultaneously over the effect's duration.
Available effects
- Fade In / Fade Out — opacity ramp.
- Pop In / Pop Out — overshoot scale spring (0 → 1.08 → 1.0).
- Bounce In / Bounce Out — multi-bounce eased scale.
- Slide In / Slide Out — Left / Right / Top / Bottom, four directions each.
- Type On / Delete Off (text only) — reveal / hide characters from the start.
- Draw On / Erase Off (line only) — animate the line's drawn length. Each has its own direction toggle (arrow.left.circle / arrow.right.circle in the inspector) — flip drawOn's direction to grow from the end inward, or flip eraseOff's to erase from the start. They're independent.
- Blinking Cursor Start / End (text only) — pulsing caret glyph at the start or end of the typed text.
Group span effects pivot scale / rotation around the laid-out children's content centroid rather than the group's stored origin, so a Pop In on a group expands outward from the visible content's center, not from an off-content reference point.
Pulses
A pulse is a one-shot beat at a specific time. The layer plays a short envelope (~1 second) firing one or more of three independent effects:
- Scale — brief size bump (1 → 1.15 → 1) with sine easing.
- Glow — triple-stacked accent-color drop shadow that fades in and back out.
- Radiate — three concentric rings emanating outward from the layer's center, staggered. The layer's own silhouette covers its rings; layers below it in z-order get painted over.
Drop pulse markers on the per-layer pulse row, or aggregate across the scene. The inspector lets you toggle each effect, set its trigger time, and (for groups) inherit downward to children.
Keyframes
Every animatable property has its own track and its own diamond strip. To create a keyframe:
- Edit the property in the Inspector; the small diamond next to the field flips to a filled accent color and a keyframe is recorded at the current playhead.
- Or click the diamond directly — it snapshots the current value.
- Or press ⌘K to snapshot every transform / size / opacity property at once.
Drag a diamond in the timeline to retime; click to select and surface its row in the Inspector with time, value, easing, and wait. Multi-select diamonds with ⇧-click or marquee to retime in bulk.
Animatable properties
X, Y, Rotation, Scale X, Scale Y, Opacity, Fill, Stroke, Stroke Width, Width, Height, Corner Radius, Shadow, Cursor variant, Group Gap, Font Size, Font Name, Text Color, Line Arc Bend, Line Wave Frequency.
Easing
Each keyframe carries an easing curve that governs interpolation into the next keyframe: Linear, Ease In, Ease Out, Ease In/Out, Spring (with stiffness + damping), and Cubic (CSS-style four-point bezier).
The inspector's easing picker fans across the timeline's multi-selection: when every selected keyframe shares a preset the picker shows it; when they disagree the picker shows a blank label, and any selection from the menu writes the new preset to every selected keyframe in one undo entry.
Wait keyframes
Each keyframe also carries a wait value: hold the keyframe's value for N seconds after its time before interpolating to the next. Equivalent to authoring a paired keyframe at time + wait, but expressed as a single field so retiming the source diamond pulls the wait along with it.
Visually, waits render as a translucent tail off the right side of the diamond on the timeline.
Aggregate tracks
With nothing selected, the timeline renders four collapsed rows across every layer in the scene:
- Visibility — bars sharing the same (start, end) across multiple layers fuse into one. Dragging a fused bar moves every contributing layer's matching span by the same delta.
- Video — clip-range bars per video layer, with their own source-trim handles.
- Keyframes — diamonds at every unique time; a marker showing how many layers' keyframes share that time.
- Pulses — markers at every unique time.
Clicking a fused marker opens a small popover listing each contributing layer so you can drill in. When a single group is the timeline's sole layer, the per-layer rows are followed by these same aggregate rows scoped to its children's subtree — handy for inspecting a complex group as one bird's-eye row instead of N layer rows.
Timeline selection
Spans, pulses, keyframes, and video clips are independently selectable on the timeline. Click for single, ⇧-click for additive, marquee for batch. The selection drives:
- Inspector contents (single span → span editor; single keyframe → keyframe row; multi → bulk-edit mode).
- Delete behavior (⌫ removes every selected item).
- Ripple anchor (the dragged item's original position seeds the snapshot — see Ripple).
Snapping
Drag-snap is split into two layers, both configurable from the timeline's settings sheet:
- Grid increment — quantize every drag to a chosen step: Frame, 0.1s, 0.25s, 0.5s, or 1s.
- Proximity targets — toggles for "also snap to" the playhead, visibility / video span edges, keyframes, and pulses. Anything within ~6 px of the cursor's quantized position pulls it onto the target time.
Hold ⌘ during a drag to bypass snapping entirely for fine adjustments.
Set In / Set Out
With one or more spans (or video clips) selected on the timeline:
- I — set each selected item's in (start) to the current playhead. If the playhead is past the item's end, the whole item slides instead of inverting.
- O — same, but for the out (end).
Both honor the current ripple toggles: with ripple on, the trim's delta cascades through every captured before / after item the same way a body drag would.
Ripple editing
Ripple mode shifts the rest of the scene's timeline content by the same delta as the primary drag, like a tracking shot. The two toggles — push items before and push items after — pick which side of the dragged item's anchor goes along for the ride.
- R cycles the toggles: off → before → after → both → off.
- Direction pills appear on any selected timeline bar / marker once a ripple direction is on, so you can see at a glance what's coming with you.
- Ripple applies to every drag and every trim (span body, span edge, pulse marker, keyframe, video clip; I / O; Move…/Dilate… modals).
- Items pushed past the timeline's duration extend the scene to fit; pulled back inside the original duration shrink it back to where it was at drag-begin (never below).
- The captured anchor is the dragged edge's original time, so trimming a span's left edge ripples the items before that edge (with push-before on); trimming the right edge ripples items after the new right edge.
Move & Dilate modals
Two batch modal sheets, both under Timeline → Move… (⌘⇧M) and Timeline → Dilate….
- Move… — shift every selected item by a delta (typed in seconds) or to a snap target (the playhead, a specific time, the earliest item's start). Live preview shows before / after positions on a stripped-down mini-timeline.
- Dilate… — scale every selected item's time around an anchor (earliest, latest, mean, playhead). Useful for "make this whole intro 30% faster" without retouching each keyframe.
Both modals honor ripple toggles — non-selected items shift to keep the rest of the scene aligned with the user's edit.
Two-level zoom
The timeline supports one zoom-out (fit all) and one zoom-in (4× window with a context minimap above the tracks).
- Toggle via the magnifier in the timeline toolbar, or with Z.
- While zoomed in, two-finger horizontal scroll pans the visible window; the minimap shows where it sits in the full scene.
- The minimap's window can be dragged or its edges resized to move / zoom the viewport.
Multiple scenes
A document can hold any number of scenes. Each scene has its own size, frame rate, duration, background color, end-pause (a hold of the last frame after the timeline runs out), and layer tree.
- Add scene — ⌘⇧N, the "+" on the scene strip, or Scene → New Scene.
- Duplicate active scene — Scene → Duplicate. Adds " Copy" to the name and inherits size / fps / duration / background from the source.
- Delete — right-click a scene chip → Delete. A document always keeps at least one scene.
- Reorder — drag scene chips. Playback follows array order.
- Rename — double-click a chip's title. Empty names fall back to Scene N.
Scene transitions
Between any two adjacent scenes you can drop a transition. Click the connector pill between scene chips to open the transition picker.
- Fade — cross-fade between the outgoing last frame and the incoming first frame.
- Slide Left / Slide Right — outgoing scene slides off in the chosen direction.
- Push — outgoing pushes out as incoming pushes in (matched motion).
- Zoom — outgoing scales out while incoming scales in.
- None — hard cut.
Duration is configurable per transition. A scene's endPause field lets you hold the last frame for an extra N seconds before the transition starts — useful for letting a finished animation breathe.
Audio bed
A document can carry one continuous audio track that plays across every scene during preview and is muxed into the exported MP4. Set it via Scene → Document Audio… or the music chip on the scene strip.
- Pick any audio file (MP3, AAC, M4A, WAV). A security-scoped bookmark is stored alongside the path so moved files silently relink.
- Volume is per-document, 0…1.
- The track auto-fades over the last second of the final scene so exports don't end with an abrupt audio cut.
Images
Drag any image file onto the canvas to add it. Multi-drag drops every file at once, fanned out by 20pt down-right so they don't all land on the same pixel.
- Image bytes are inlined into the
.mvmdocument on save — there's no relink dance for images. - Layer size on add defaults to the source's natural pixel dimensions, capped at 600pt on the long edge.
- Stroke around the image follows the cropped (visible) region, not the original layer frame.
- Right-click → Replace Image… swaps the source without disturbing the layer's transform, animations, or selection. If the new image has a different aspect a dialog asks whether to keep the layer's current frame or resize to the new natural aspect.
Videos
Pick a video file via the palette or drag-drop it. MoveMatic supports anything AVKit can decode (H.264 / HEVC / ProRes / etc.).
Source vs scene time
A video layer carries a video clip: a source range plus a scene range. The Video timeline row shows the clip's scene start / end and a source-start trim. Dragging the body moves the clip in scene time; dragging the left edge trims into the source; dragging the right edge truncates the rendered length.
End behavior
When scene time runs past the source's natural end, the clip can:
- End — go blank (the clip's outpoint stops playback).
- Loop — wrap modulo the source duration.
- Freeze Frame — hold the last frame.
Relink & missing sources
Video files are referenced by file URL + security-scoped bookmark. If a file moves, MoveMatic silently relinks via the bookmark on next open. If a file is genuinely gone, the layer shows a striped placeholder ("Video missing") and the layer panel's right-click menu surfaces Replace Video… to point at the new location.
Audio
Each video clip carries its own audio that's muxed into the exported MP4 alongside the document audio bed, at the clip's scene timing.
Stroke
Videos accept the same stroke options as images — color, width, position (inside / outside), per-side widths. The stroke wraps the visible cropped region, with rounded corners matching the layer's cornerRadius.
Cropping
Images and videos both support cropping via the Crop toggle in the Inspector.
- Off — the source fills the layer frame.
- Auto (legacy / video-only) — detect a black-keyed source window and mask everything else to transparent. Insets X and Y let you tune the detected bbox.
- Manual — open the Crop editor by clicking Edit Crop…. A modal sheet shows the source at native resolution with eight handle controls; drag handles to set the crop rectangle, arrow keys to nudge by one pixel (⇧ = ten), Auto snaps to a detected source window, Reset drops the crop back to identity. Esc cancels; ⌘Return commits.
The crop editor's loupe is pixel-accurate — zoom in close and the source's actual pixels are visible without resampling.
After a manual crop the inspector's X / Y read the visible top-left position rather than the underlying layer-frame top-left, and the 3×3 origin grid maps cells to the visible cropped sub-rect's corners / edges / center. Selection chrome, the stroke, and the rounded mask all line up with the visible content.
Camera zoom
A Zoom layer is a camera viewport — for the duration of its visibility span, the rendered scene "lenses into" the layer's rectangle.
- Full screen mode: the whole canvas zooms into the rectangle. Use for hero-shot moments — drop a zoom layer over a single button at the end of an animation and the playback gracefully closes in on it.
- Picture-in-picture mode: the captured rectangle is rendered into a child rect somewhere else on the canvas, like a sticky note showing a detail from another part of the scene. The child rect is its own layer with its own transform, animations, span effects, and pulses.
- Zoom span edges carry their own start / end transition picker: a smooth animated zoom-in, a fade, or a hard cut on each side independently.
- Zoom layers are invisible at edit time except for their outline so you can drag the bounds; during playback / export they're consumed entirely.
Export to MP4
File → Export… (⌘E) opens the export sheet.
- Target — Current Scene, All Scenes (joined by transitions), or a specific scene by name. The last choice is remembered.
- Output filename — defaulted from the document name + target.
- Motion blur samples — Off, Fast (2× ½-res), Light (4×), Medium (8×), Strong (16×). Each sample is rendered at a different sub-frame time and averaged. Fast renders at half resolution into an off-screen bitmap; close to indistinguishable quality on real motion at roughly an eighth of Light's cost. The renderer also skips the blur pass on frames where nothing actually moves during the shutter window, so long static stretches export at single-frame speed regardless of the setting.
- Output scale — 1×, 2×, 3×. Multiplies the scene's pixel dimensions in the output.
- Include audio — toggle the document audio bed + every video clip's audio into the muxed output.
Export is non-blocking — a progress sheet shows percentage, current frame, and a live preview snapshot updated every ~10Hz. Cancel via the sheet's Cancel button or Esc.
The rendered MP4 matches the live canvas pixel-for-pixel: same layer kinds, same span effects, same pulses, same scene transitions, same zoom-camera mapping. If there's a visible difference you found a bug — file it.
Keyboard shortcuts
File & document
| Shortcut | Action |
|---|---|
| ⌘N | New document |
| ⌘O | Open document |
| ⌘S | Save |
| ⌘⇧S | Save a copy |
| ⌘W | Close window |
| ⌘E | Export MP4 |
| ⌘Z / ⌘⇧Z | Undo / Redo |
Canvas
| Shortcut | Action |
|---|---|
| ⌘+ / ⌘- | Zoom in / out |
| ⌘0 | Fit scene to canvas |
| ⌘1 | Zoom to 100% |
| ⌘2 | Zoom to selected layer |
| Space drag | Pan |
| ⌥ drag | Duplicate-on-drag (over a layer) / Pan (empty space) |
| ⌘ drag | Bypass snapping |
| ⇧ drag | Constrain motion to a single axis |
| ↑ / ↓ / ← / → | Nudge selection by 1pt (⇧ = 10pt) |
| L | Toggle aspect lock on width / height |
| ⌫ / Delete | Delete selection |
Selection & layers
| Shortcut | Action |
|---|---|
| ⌘A | Select all layers in active scene |
| ⌘D | Duplicate selection |
| ⌘G / ⌘⇧G | Group / Ungroup |
| ⌘] / ⌘[ | Bring forward / Send backward |
| ⌘⇧] / ⌘⇧[ | Bring to front / Send to back |
| ↑ / ↓ (layer panel) | Navigate rows (⇧ = extend) |
| → / ← (layer panel) | Expand / collapse group (or step into / out of) |
| Tab / ⇧Tab | Cycle through siblings at the current depth |
| Return | Drill into every selected group (selection becomes their children) |
Timeline
| Shortcut | Action |
|---|---|
| Space | Play / Pause |
| ← / → (timeline focus) | Step one frame back / forward |
| ⇧← / ⇧→ | Step 10 frames back / forward |
| Home / End | Jump to scene start / end |
| ⌘K | Snapshot keyframes for every transform / size / opacity property at playhead |
| I / O | Set In / Set Out on every selected span / video clip (honors ripple) |
| R | Cycle ripple direction: off → before → after → both → off |
| Z | Toggle 1× ↔ 4× zoom |
| ⌘ drag | Bypass timeline snapping |
| ⌘⇧M | Open the Move… modal |
Scenes
| Shortcut | Action |
|---|---|
| ⌘⇧N | New scene |
| ⌘⇧→ / ⌘⇧← | Next / previous scene |