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.

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

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:

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

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

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.

Right-click context menu

Right-click anywhere on the canvas to insert layers, paste, group / ungroup, manage z-order, hide / lock, and reach a Select Layer submenu that lists every layer within 20 pt of the cursor (sorted nearest-first). Handy when layers overlap and a regular click would always pick the top-most one — the menu lets you target an obscured layer directly.

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.

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. -clicking the anti-meatball does the opposite — pins every layer in the scene (groups + descendants).

Selection

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.

-clicking a group's pin expands the group AND pins every descendant in one click — a fast way to bring a whole folder's timing into view.

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.

Rename opens a modal sheet — double-click the chip OR pick Rename from the context menu. The sheet's text field is auto-focused with the existing name selected, so you can type to replace. Return commits, Esc cancels. The Inspector's scene-name field is still inline (auto-focused on new-scene creation), so creating a new scene drops you straight into the typing surface.

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

Per-layer rows

Each selected (or pinned) layer renders a stack of rows:

When a group is the sole layer shown, children-aggregate rows appear under it: visibility / video / pulses / keyframes / behaviors / motions 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 with a solid / dashed / dotted style, Opacity slider, Shadow), Animation (Origin, Cursor override, Motion Trails), plus kind-specific sections (Text font / size / color, Video clip range, Line shape, etc.). Opacity, Blur, and many other scalar rows use a unified slider control (rail + editable value + arrow-step + label scrub).

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.

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.

Layer kinds

Layers are added from the palette at the bottom-left of the canvas (the "+" button menu) or via the layer panel's "+".

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:

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

Auto-naming

Rectangles, ellipses, lines, text layers, cursors, and videos auto-name themselves based on a salient attribute and stay synced as you edit:

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. The menu item hides itself for shape / line / video layers that are already at their auto-derived default, so the menu doesn't show dead options.

Visibility spans

A visibility span is a time range during which a layer renders. Layers without any spans are visible everywhere by default; the visibility track itself is opt-in and only appears once a layer has at least one 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

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:

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:

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.

Behaviors

Procedural property animators that drive a layer's value over a time range without authored keyframes. Add one from the layer header's + menu — each behavior targets a single keyframable property (X, Y, rotation, scale, opacity, font size, line bend, …). Behaviors render as yellow bars on the property's timeline row; drag the body to move, drag an edge to resize.

Three kinds:

While a behavior's window covers the playhead, the behavior's evaluator wins — keyframes on the same property still resolve at the window's start for the baseline, but the behavior's output is what renders inside the window. Outside the window, keyframes resume.

Motions

Layer-level animators that move the whole layer over a time range. Added from the layer header's + menu. Motions render as orange bars on a dedicated per-layer Motion row.

Motions claim their target properties (X, Y, plus rotation when Tilt is on) for their window, the same way Behaviors do — keyframes on those properties are bypassed inside.

Target picker & end state. A follow's target rows are labeled Target Layer (Follow Layer) and Target Path (Follow Path), and a layer is excluded from its own picker. Each follow ends with a chosen end state — by default Stick, which holds the followed position once the window ends. Follow Path leads with a Transition to Start duration that eases the layer onto the path before the path motion begins (hidden when the entry mode is Snap).

Motion trails

Turn on Trails in the Inspector's Animation section and a moving layer leaves a short series of fading ghost copies at its recent positions — a motion-blur-style echo that traces the path of the motion. Enable it on a group and the whole composite trails together. Trails render identically on the canvas and in exported MP4 / PNG output, and are purely visual: they add no layers and don't affect hit-testing or selection.

Particles

A particle layer is a region that spawns rendered particles over time. Inspector sections:

Shape

The rendered primitive per particle — Circle, Square, Triangle, Diamond, Pentagon, Hexagon, Star, Ring, plus the option to Choose Layer… and clone one of the scene's own layers (text glyph, an image, a shape, a group) as the particle shape. Cloned particles inherit the source's full rendering.

Emitter

A single menu defining where particles spawn:

Emission, Motion, Life curve, Render

Aggregate tracks

With nothing selected, the timeline renders collapsed rows across every layer in the scene — one per track type that has any content:

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 — visibility, video, keyframes, pulses, behaviors, and motions all participate.

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:

Snapping

Drag-snap is split into two layers, both configurable from the timeline's settings sheet:

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:

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, and the "Ripple moved N items" toast fires so the silent shift is visible.

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.

Move, Expand / Contract & Retime

A group of batch modal sheets under the Timeline menu: Move… (⌘⇧M), Distribute… (⌘⇧D), Expand / Contract… (⌘⇧E), and Retime…. Each previews its result non-destructively on the real timeline as you adjust, and commits as a single undo step — Cancel restores exactly what was there before.

All honor ripple toggles — non-selected items shift to keep the rest of the scene aligned with the user's edit. The toggles ARE the global Push Before / Push After; flipping them inside a modal flips them everywhere else, and vice versa.

Distribute

Kind-agnostic — pick 2+ timeline elements of any mix (visibilities, video clips, keyframes, pulses, behaviors, motions) and choose Timeline → Distribute… (⌘⇧D). One sheet, two modes:

Like the other batch sheets, Distribute previews on the real timeline, runs as a single undo step, and respects the global ripple toggles for items outside the selection.

Timeline zoom

The timeline cycles between three zooms — fit all (1×), 4×, and 8× — via the Z keyboard shortcut. The 4× and 8× modes show a context minimap above the tracks for navigation across the larger-than-window timeline.

Multiple scenes

A document can hold any number of scenes. Each scene has its own size, frame rate, duration, background color, start- and end-pause (holds of the first frame before the timeline animates and the last frame after it runs out), and layer tree.

Scene transitions

Between any two adjacent scenes you can drop a transition. Click the connector pill between scene chips to open the transition picker.

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.

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.

Videos

Pick a video file via the palette or drag-drop it. MoveMatic supports anything AVKit can decode (H.264 / HEVC / ProRes / etc.).

Multiple clips per layer

A video layer holds a list of video clips — each clip places a portion of the layer's source on the scene timeline at its own start / end, with its own trim, speed, and end behavior. The Video row renders one bar per clip; all bars share the layer's single source file.

Source vs scene time

Each clip carries a source range plus a scene range. Dragging the bar's body moves the clip in scene time; dragging the left edge trims into the source; dragging the right edge truncates the rendered length. Clips snap to the standard timeline targets (other clips' edges, span edges, keyframes, pulses, playhead).

Trim sheet

Click Trim… in the video clip inspector to open a dedicated trim sheet:

End behavior

When scene time runs past the source's natural end, the clip can:

Freeze Frame mode

The clip inspector's Mode toggle flips between Video (normal playback) and Freeze Frame. When Freeze Frame is on, the trim / playback / end-behavior knobs disappear and the inspector shows a mini-filmstrip, a large preview, and an integer-frame input. The chosen frame renders for the entire span — extend the clip's right edge indefinitely past the source duration and it stays held. Useful for "card holds" between cuts.

Speed

Each clip has a Playback Speed field (0.01% – 10000%). Scrub the label or arrow-step the field by 1% ( × 10, ÷ 10). The bar in the timeline rescales so the rendered duration always matches the trimmed source ÷ speed.

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.

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.

Export to MP4

File → Export… (⌘E) opens the export sheet.

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

ShortcutAction
⌘NNew document
⌘OOpen document
⌘SSave
⌘⇧SSave a copy
⌘WClose window
⌘EExport MP4
⌘Z / ⌘⇧ZUndo / Redo

Canvas

ShortcutAction
⌘+ / ⌘-Zoom in / out
⌘0Fit scene to canvas
⌘1Zoom to 100%
⌘2Zoom to selected layer
Space dragPan
dragDuplicate-on-drag (over a layer) / Pan (empty space)
dragBypass snapping
dragConstrain motion to a single axis
/ / / Nudge selection by 1pt ( = 10pt)
LToggle aspect lock on width / height
/ DeleteDelete selection

Selection & layers

ShortcutAction
⌘ASelect all layers in active scene
⌘DDuplicate selection
⌘G / ⌘⇧GGroup / 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 / ⇧TabCycle through siblings at the current depth
ReturnDrill into every selected group (selection becomes their children)

Timeline

ShortcutAction
SpacePlay / Pause
/ (timeline focus)Step one frame back / forward
⇧← / ⇧→Step 10 frames back / forward
Home / EndJump to scene start / end
⌘KSnapshot keyframes for every transform / size / opacity property at playhead
I / OSet In / Set Out on every selected span / video clip (honors ripple)
RCycle ripple direction: off → before → after → both → off
ZCycle timeline zoom: 1× → 4× → 8× → 1×
I / O (Trim sheet)Set In / Out at the trim sheet's cursor source-time — overrides focused fields
dragBypass timeline snapping
⌘⇧MOpen the Move… modal
⌘⇧DOpen the Distribute… modal
⌘⇧EOpen the Expand / Contract… modal

Scenes

ShortcutAction
⌘⇧NNew scene
⌘⇧→ / ⌘⇧←Next / previous scene

Languages

MoveMatic is localized into English, Deutsch, Español, Français, Italiano, Nederlands, Polski, Português (Brasil), Українська, 日本語, 한국어, 简体中文, and 繁體中文. It picks the right language automatically based on your System Settings → General → Language & Region preferences.

To pin MoveMatic to a specific language without changing system preferences, open System Settings → General → Language & Region → Applications, click the + button, and pick MoveMatic.

Documents created in a non-English locale also auto-name their scenes and layers in that language — Szene 1, 사각형 1, Ellisse 2 — so the layer panel reads naturally instead of dropping back to English defaults. Renamed layers persist as you typed them across locale changes.