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.

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.

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.

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

Per-layer rows

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

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.

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, and cursors 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.

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.

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.

Aggregate tracks

With nothing selected, the timeline renders four collapsed rows across every layer in the scene:

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:

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.

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 & Dilate modals

Two batch modal sheets, both under Timeline → Move… (⌘⇧M) and Timeline → Dilate….

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).

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.

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.).

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:

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
ZToggle 1× ↔ 4× zoom
dragBypass timeline snapping
⌘⇧MOpen the Move… modal

Scenes

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