Skip to main content
Roveflow captures video in two places.
  1. /roveflow auto-records every run — this is the default, and it’s what you want 95% of the time.
  2. make record is a repo-local helper for recording an example app running without a smoke test — useful for bug-repro clips or marketing shots of a bare app.

Automatic recording during a smoke test

Every invocation of /roveflow starts xcrun simctl io booted recordVideo right after the simulator boots and finalizes the .mov when the report is compiled. The file lands alongside the report:
docs/roveflow/runs/2026-04-17-2010/
  report.md
  recording.mov          ← full-run simulator video
  scenarios/
    cold-setup/
    open-detail/
Skip recording with --no-record:
/roveflow --no-record
Good reasons to skip: no GUI simulator visible, CI runs on a headless sim, or you just want tighter iteration loops.

Manual recording without a smoke test

The repo’s Makefile exposes a record target that boots an example app on your iOS simulator and simultaneously captures a .mov. Use it when you want video of an app without driving it through /roveflow — install-story demos, bug reports against the examples, or marketing clips.

Prerequisites

  • macOS with Xcode command-line tools (xcrun simctl available).
  • An iOS simulator already booted (xcrun simctl list devices booted).
  • Flutter on PATH.
  • The Roveflow repo checked out locally — make record is a repo-local Makefile target, not a roveflow CLI subcommand.

Synopsis

make record                 # records examples/counter_app (default)
make record APP=nav_app     # records examples/nav_app
make record-nav             # shorthand for APP=nav_app

What it does

  1. Creates recordings/ at the repo root if absent.
  2. Starts xcrun simctl io booted recordVideo in the background, writing recordings/<APP>-YYYYMMDD-HHMMSS.mov.
  3. Runs flutter run inside examples/<APP> in the foreground.
  4. On Ctrl+C or natural Flutter exit, a shell trap sends SIGINT to the recorder so the .mov is finalized and playable.

Options

VariableDefaultDescription
APPcounter_appExample app directory under examples/ to run. Any folder with a valid Flutter project works.

Encoding flags

The Makefile hardcodes three simctl flags:
FlagWhy
--codec=h264Broadest browser/player compatibility. The default HEVC trips some players.
--mask=ignoredRectangular frame — cleaner for embedding in docs/sites.
--forceOverwrite if the filename already exists (the timestamp makes this a safety net).
Tweak the Makefile directly if you need different encoding settings.

Output

recordings/
  counter_app-20260418-1420.mov
  nav_app-20260418-1503.mov
recordings/ is gitignored — the files stay local. Upload the .mov wherever you need it, or post-process with ffmpeg for GIF/WebM.

Troubleshooting

  • No simulator booted. Start one via Xcode or xcrun simctl boot <UDID> before running make record.
  • Multiple simulators booted. booted is ambiguous with more than one running. Shut extras down or edit the Makefile to target a specific UDID.
  • .mov will not play. If you killed the process with kill -9 instead of Ctrl+C, the file is truncated. Always exit Flutter cleanly so the SIGINT trap finalizes the recording.

Which one should I reach for?

You want…Use
Video of a scenario run with agent decisions/roveflow (auto)
Video of a single scenario for a flake investigation/roveflow --only=<id>
A 2-minute clip of an example app to paste in a bug reportmake record APP=<name>
Faster iteration; don’t care about video/roveflow --no-record

Next

Running smoke tests

Modes, --only, and --no-record.

Authoring scenarios

YAML format, criticality tiers, and skip results.