ScreenFlow for AI agents.

Polished screen recordings,on autopilot.
Write a declarative spec of your demo. screeny drives your real Mac app — real cursor, real clicks, real typing — then beautifies it in post with cinematic zoom, a composited cursor, and keycaps. Record once, re-cut without re-recording.
<Demo id="notes-demo" targetApp="com.apple.Notes" typos="off">
<Setup>
<Relaunch />
<NewDocument />
</Setup>
<Scene id="open">
<Open id="launch" app="com.apple.Notes" />
<Wait id="ready" for="elementVisible" target='role="button" name="New Note"' timeout="5s" />
</Scene>
<Scene id="write">
<Click id="new" target='role="button" name="New Note"' />
<Type id="note" into='role="textarea"'
text="screeny — agent-authored screen recordings. Smooth zoom, real cursor, premium feel." />
</Scene>
<Scene id="reveal">
<Pause id="hold" for="2s" />
</Scene>
</Demo>
The two-document model
Record once. Re-cut forever.
The actions and the camera are never coupled. .screeny is what happens; .screenycut is how it’s filmed — zoom, pan, and highlights anchored to named moments in the recording. Re-frame the whole video without ever re-running the app.
<Demo id="notes-demo" targetApp="com.apple.Notes">
<Scene id="write">
<Click id="new" target='role="button" name="New Note"' />
<Type id="note" into='role="textarea"'
text="screeny — agent-authored recordings." />
</Scene>
<Scene id="reveal">
<Pause id="hold" for="2s" />
</Scene>
</Demo>
The actions. No camera here.
<Cut take="notes-demo">
{/* frame the button; cursor moves in and clicks */}
<Camera anchor="click:new" to="type:note.start"
camera="zoom-1.4 follow-target ease-cinematic" />
{/* frame the note body while typing */}
<Camera anchor="type:note.start" to="type:note.end"
camera="zoom-1.5 follow-target ease-cinematic" />
{/* pull back for the reveal */}
<Camera anchor="pause:hold" camera="zoom-1.0 ease-cinematic" />
</Cut>
The camera. Anchored to moments.
zoom 1.4× · same take, re-framed
Same recording, re-framed — the actions on the left never re-run. Only the camera changes.
Built like a product, not a screen recorder.
Lives with your source code.
Your demo is a declarative .screeny file committed right beside the code it records. Re-run one command and it re-records against the latest state of your app.
A declarative cut.
Camera, zoom and highlights live in a separate .screenycut, anchored to named moments like click:new and type:note.start — so the frame lands on the right thing at the right time.
Cinematic quality, automatically.
60fps ProRes 422 HQ capture at retina 2×, beautified in post by a critically-damped analytic-spring camera that never bounces, Lanczos upscaling, and a composited 3× cursor that never scales with the frame.
Input that feels human.
The cursor follows Fitts’-law paths with natural overshoot and micro-jitter; typing uses log-normal cadence with pauses at word boundaries. It reads like a person — not a robot snapping between coordinates.
A demo in six commands.
Capture the real app once. After a single screeny run, re-author the .screenycut and render again and again — the cinematography changes, the recording never does. No re-capture.
Or skip the keyboard entirely: an agent can author the whole .screeny and .screenycut through the screeny-mcp server — every element validated against the same shared catalog the CLI uses.
Pricing
Free to use. $49 to go watermark-free.
One free, local macOS engine. Runs entirely on your Mac — no subscription, no metering, no cloud.
Free
$0
Full-resolution, full-length renders.
- Unlimited recordings
- Cinematic camera, organic cursor & keycaps
- “Made with screeny” end-card
Pro
Recommended$49
one-timeEverything in Free, watermark removed.
- No “Made with screeny” watermark
- One-time key — no subscription
- Validates online once, works offline after
Runs on your Mac · no subscription · the only difference is the watermark.