Recording a flow
Sometimes the fastest way to describe a scenario is to do it. klera
gives you two ways to record yourself walking through the app and turn
that walk-through into a .flow.md file you can keep, edit, and rerun.
You’ll pick between them based on who is doing the recording and where they’re standing.
| Option | Best for |
|---|---|
| In-app recorder | PMs, designers, QA — anyone with the app already in their hand |
| Engineer-led CLI recording | Engineers pairing with a PM at a desk; CI repro capture |
Both produce the same output: a .flow.md file with prose you can
clean up, plus a .flow.json cache that captures the exact steps the
recorder saw. The prose is what you keep editing afterwards.
Option A: in-app recorder
This is the path most PMs and designers will use. The recorder lives inside the dev build of the app — the build engineering hands you for testing — and a single keyboard shortcut starts and stops it.
Open the dev build of the app
You need the dev build, not the App Store / TestFlight build. If you’re not sure which one you have, ask engineering — the dev build is the one that shows a developer menu when you shake the phone.
Trigger the recorder
iOS Simulator
Press Cmd + Shift + R in the simulator window. The recorder overlay appears at the top of the screen with a red dot.
Walk through the scenario
Tap, type, scroll, and swipe through the app exactly as you’d describe the scenario to a teammate. Each tap and each piece of text you type gets captured. Don’t worry about pausing — idle time isn’t recorded.
Stop the recorder
Press Cmd + Shift + R again (or tap the red dot in the overlay).
The recorder stops and writes two files into your project’s flows/
folder:
flows/recorded-2026-04-29-1412.flow.md— a draft prose descriptionflows/recorded-2026-04-29-1412.flow.json— the compiled step list
What gets captured
The recorder is conservative. It captures the things a flow needs to reproduce later, and nothing else:
- Taps — on every interactive element, with the element’s name or text or accessibility label so the flow doesn’t depend on screen coordinates.
- Typed text — what you typed and which field you typed it into.
- Screen transitions — when the screen changes, so the flow can assert the next screen is visible before continuing.
- Visual snapshots — only if you tap the camera icon in the overlay during recording. By default, snapshots are not captured.
What is not captured: scrolling that didn’t lead to a tap, idle seconds, network traffic, your typing speed, or any system-level gestures (like swiping up to close the app).
The recorder never sees fields you marked as secret in your project’s
fixtures (passwords, API keys). If you type one of those into the app,
the recorder writes a placeholder in its place — your real password
won’t end up in a committed .flow.md.
What to clean up afterwards
The draft prose the recorder generates is a starting point, not a final flow. Two minutes of cleanup is normal:
- Rename the file.
recorded-2026-04-29-1412.flow.mdis a timestamp; rename it to something a teammate would recognise, likeflows/sign-in-and-reorder.flow.md. - Rewrite the title. The recorder’s first guess at a scenario name is usually too literal. Replace it with the one-line summary you’d write in a Linear ticket.
- Clean up the body prose. The recorder describes what it saw in plain language, but it’s a description of clicks. Rewrite it the way you’d describe the scenario to a coworker. Group related steps into one sentence. Drop steps that aren’t essential.
- Add the assertion. A recording captures what you did; it doesn’t always capture what success looks like. Add a final sentence: “Assert that the welcome screen shows the user’s name.”
After you save your edits, the compiled .flow.json regenerates
automatically. The exact mechanics are explained in
writing prose flows.
Option B: engineer-led CLI recording
If you’re sitting at a desk with engineering and they have a terminal open, the same recording surface is available from the command line:
pnpm exec klera record sign-in-and-reorderThis connects to the running dev build and starts recording, the same
way the in-app shortcut does. The PM walks through the scenario; the
engineer presses Ctrl-C in the terminal to stop. The result is the
same pair of files in flows/, named after whatever the engineer
typed on the command line.
When this option makes sense:
- Pairing on a tricky scenario where the engineer wants to capture console output too (network calls, log lines).
- Reproducing a CI failure on a developer’s laptop and saving the reproduction as a flow so the next regression catches it.
- Bulk-recording several short scenarios in one session — the CLI remembers the previous filename so you can keep adding flows without re-typing every name.
The output format is identical. Whoever ends up owning the flow can edit the prose afterwards in their editor of choice.
After recording
Once the file is on disk and you’ve cleaned up the prose, treat it like any other flow: run it, commit it, let CI keep it green. The writing prose flows page covers the editing loop. The reading a report page covers what happens when the flow eventually fails.
If a recorded flow turns out to be flakier than you expected — for instance, the recorder caught a race condition between two animations — the self-healing reference explains how klera tries to recover before declaring a failure.