Reely turns an iOS feature into a clean, auto-zoomed, captioned sizzle reel — from inside your own AI coding agent. You stay in Claude Code (or any MCP host); it authors a faithful mock of your feature and calls Reely’s local run_reel tool, which builds, drives the Simulator, records, composites the look, and opens the finished reel in the Reely viewer.
You, in your agent
“Make a sizzle reel of the onboarding flow.”
→
/reely-sizzle-reel skill
Authors a mock + FeatureAdapter + FlowSpec (your key, no LLM cost to us).
→
run_reel (Reely engine)
build → Simulator → drive → record → composite → opens the viewer.
The authoring half is the LLM’s job. The rendering half — run_reel — is Reely’s deterministic engine, exposed as a local stdio MCP tool and shared with the reely run CLI.
Installation
Reely is macOS-only and uses your local Xcode + iOS Simulators. Setup is three parts: install the tooling once per machine, wire Reely into a repo once, then generate reels by asking your agent.
1. Prerequisites (once per machine)
Xcode 26 toolchain and xcodegen installed (Apple Silicon recommended).
Claude Code (claude) installed and authenticated — logged in, or ANTHROPIC_API_KEY set.
ffmpeg / ffprobe on PATH (used for verification only).
2. Build the binary and the viewer
Build a stable reely binary (.mcp.json points at it — don’t use swift run, its path is ephemeral), then build and launch the viewer once so macOS associates .reelyproj with it.
bash
cd /path/to/Reely
swift build -c release # → .build/release/reely
cd Editor && xcodegen generate
xcodebuild -project ReelyEditor.xcodeproj -scheme ReelyEditor \
-destination 'platform=macOS' -derivedDataPath build
open "build/Build/Products/Debug/Reely Editor.app" # registers it, then quit
3. Wire Reely into your project (once per repo)
Point install at the iOS project you want reels for:
This writes, non-destructively (existing entries are preserved):
File (in your repo)
What it does
.mcp.json
Registers the reely stdio MCP server (absolute binary path + a 15-min tool timeout).
.claude/settings.json
Pre-approves mcp__reely__run_reel so the call never blocks on a permission prompt.
.claude/skills/reely-sizzle-reel/
Copies the authoring skill into the repo, and materializes .reely/scaffold/.
Re-run install any time you rebuild the binary at a new path, or to refresh the skill.
4. Verify
Run claude in your repo, approve the project’s MCP server when prompted, and confirm with /mcp — you should see reely connected. For a no-authoring smoke test, install into the Reely repo itself and run the tool against the bundled harness:
text
Call run_reel with harness Harness/ReelyHarness.xcodeproj,
scheme ReelyHarness, spec Fixtures/create-project.flowspec.json.
If the viewer pops up on a finished reel, the whole pipeline is healthy.
The run_reel tool
Everything below is one tool. Your agent calls it; you steer it with a plain-English prompt. Paths are relative to the repo root. It is single-flight — it shares one Simulator + scratch dir, so a second concurrent call is rejected until the first finishes.
Argument
Required
Default
Notes
harness
required
—
Path to the recording target .xcodeproj / .xcworkspace (relative to the repo).
scheme
required
—
Scheme of the recording target.
spec
required
—
Path to the Flow Spec JSON — the ordered steps to drive.
device
—
iPhone 16 Pro
Simulator device name. Must exist in xcrun simctl list devices.
output
—
out/reel.mp4
Output video. A sibling .reelyproj bundle is always written next to it.
effects
—
true
Apply the sizzle effects: padded canvas, auto-zoom, dead-air cuts.
themeFromApp
—
false
Colour the background, captions and contact shadow from the app brand.
brandBundle
—
built harness
Path to the real product .app / .xcassets / app icon to theme from.
captionFont
—
system
Caption typeface: a curated preset, system, app, or any PostScript name.
Captions have no argument: the agent writes caption copy onto FlowSpec steps and they auto-enable from the spec content.
Use cases
Each case is a real prompt you’d type to the agent, and the reel it produces. Together they cover every parameter — go from all-defaults to a fully branded, captioned App Store preview by changing what you ask for.
1
A clean reel, all defaults
/reely-sizzle-reel Make a sizzle reel of the onboarding flow.
⏎
The baseline. The skill authors a brand-faithful mock + FeatureAdapter + FlowSpec, then calls run_reel with only the three required paths. Device, output and effects all take their defaults.
2
Self-narrating captions
/reely-sizzle-reel Make a reel of onboarding with captions that explain each step.
⏎
Captions are not a tool parameter — the agent is the copywriter. It writes a caption field onto the hero beats of the FlowSpec, and captions auto-enable when the spec carries any copy. The run_reel call is unchanged.
3
Brand it from the app
/reely-sizzle-reel Make the reel and brand it with our app’s colors and font.
⏎
Theme-from-App is opt-in. With themeFromApp: true the compositor pulls the background, caption palette and contact shadow from the brand surface — and swaps captions into the app’s own embedded font.
4
Theme from a specific bundle
/reely-sizzle-reel Brand the reel from our shipping MyApp.app.
⏎
By default Theme-from-App reads the built harness app. Point brandBundle at the real product to extract the true palette + icon — it accepts a .app, an .xcassets, or an app-icon image.
5
Pick a caption typeface
/reely-sizzle-reel Use Avenir Next for the captions.
⏎
captionFont overrides the caption face. Choose one of ten preinstalled iOS presets (helvetica-neue, avenir-next, futura, gill-sans, optima, georgia, palatino, baskerville, american-typewriter, menlo), or system, app (force the extracted brand face), or any PostScript name.
6
Record on another device
/reely-sizzle-reel Record the reel on an iPhone SE.
⏎
device selects the Simulator. It must be a device name present in xcrun simctl list devices; output is device-native portrait.
7
Choose the output path
/reely-sizzle-reel Save the reel to marketing/launch.mp4.
⏎
output sets the mp4 path (relative to the repo). A reopenable .reelyproj bundle — raw.mov + timeline.json + effects.json — is always written next to it for the viewer.
8
Raw recording, no sizzle
/reely-sizzle-reel Just give me the raw recording — no zoom or background.
⏎
effects: false writes a plain trim: the synced, dead-air-free recording with no padded canvas, auto-zoom or cuts. Useful when you want to grade or composite the footage yourself.
9
Everything: an App Store preview
/reely-sizzle-reel Make a fully-branded, captioned App Store preview and save it to out/appstore.mp4.
⏎
The combined case: the skill bakes caption copy into the spec, themes from the app brand with captions in the brand face, and writes to a named path — one call, every lever.
CLI fallback
Everything run_reel does is also a plain command — useful for CI or headless use. The same engine backs both.
bash
reely run \
--harness Harness/ReelyHarness.xcodeproj --scheme ReelyHarness \
--spec Fixtures/create-project.flowspec.json --device "iPhone 16 Pro" \
--output out/reel.mp4 --project out/reel.reelyproj
open out/reel.reelyproj # open it in the viewer
# Re-author the look on an existing recording, no re-record:
reely effects out/reel.mp4 --timeline out/reel.timeline.json --output reel.mp4
The same run_reel surface is what a hosted cloud-Mac renderer would expose later — moving from local to cloud is swapping the MCP endpoint, not a rewrite.