AI director
Let an AI drive a web demo for you in plain language, then add cinematic effects — 3D camera moves, spotlights, callouts — to the moments that matter.
This is the most hands-off way to use the screenify CLI: it builds on web demos by letting an AI both drive the demo for you — no action script needed — and direct the cinematic effects on the moments that matter. You bring your own AI key; screenify does the rest.
Bring your own AI key
Agent features call a language model, so you bring a key from an AI provider — screenify doesn't resell AI. Set one of these environment variables and screenify auto-detects the provider:
| Variable | Provider | Get a key |
|---|---|---|
OPENROUTER_API_KEY | OpenRouter — one key, many models (recommended) | openrouter.ai/keys |
ANTHROPIC_API_KEY | Anthropic (Claude) | console.anthropic.com |
OPENAI_API_KEY | OpenAI (or any OpenAI-compatible endpoint via --base-url) | platform.openai.com |
You only pay your own provider for the tokens used — a typical demo is a few cents.
Setting the key
The key is read from your environment. Pick one of three ways:
# 1. Persist it (recommended) — add to your shell profile, then open a new terminal
echo 'export OPENROUTER_API_KEY="sk-or-..."' >> ~/.zshrc
source ~/.zshrc
# 2. For the current terminal only
export OPENROUTER_API_KEY="sk-or-..."
# 3. Inline, just for one command
OPENROUTER_API_KEY="sk-or-..." screenify web record https://your-app.com -p "demo it"Swap ~/.zshrc for ~/.bashrc if you use bash. Once set, screenify doctor --json reports that agent mode is ready, and any agent command picks the key up automatically.
Prefer not to touch your shell? In the desktop app, open Settings → Command Line → AI API key, paste your key, and Save. The CLI uses it automatically — no env var needed. An env var of the same name still takes priority if you set one.
Let the AI drive the demo
Instead of an action script, give a plain-language task with -p:
screenify web record https://your-app.com \
-p "demo the landing page: scroll through the main sections and click the primary call-to-action" \
--model openai/gpt-4o-mini \
-o demo.mp4 -- --wallpaper orange --padding 16The agent reads the page, decides the next action, performs it, and repeats — then screenify finishes it with the same smooth cursor, auto-zoom, and idle-trim as a scripted demo. As it goes, it can also emphasize the moments it judges important with a cinematic effect.
Model tip: pick a model that's reliable at tool use —
openai/gpt-4o-mini(via OpenRouter) is a good, cheap default. Add--visionto also send the agent screenshots of the page (slower and more tokens, but better on visually complex sites).
Useful options: --provider, --model, --max-steps <n>, --vision, and --no-agent-effects (let the agent drive but add no effects).
Add cinematic effects
The effects command layers cinematic moments onto any recording — most naturally a web demo, where the click points are already known. It's non-destructive: it renders a styled copy and leaves your project untouched unless you pass --save.
There are two ways to direct it.
Plain recipe
Spell out exactly what you want with --plan "<effect> [preset] [count|all]", and param=value tunes any knob listed in effects schema (e.g. follow amount=2 for a 2x follow-cursor zoom):
# A 3D camera tour across the 3 most important clicks
screenify effects demo.screenify --plan "zoom3d tour 3" -o cinematic.mp4
# A glowing callout on the 2 key moments
screenify effects demo.screenify --plan "callout neon 2" -o cinematic.mp4AI director
Add --ai and describe the intent — a language model reads what each moment is and picks which to emphasize and which effect fits each:
screenify effects demo.screenify --ai \
--plan "make this feel cinematic and draw attention to the main call-to-action" \
-o cinematic.mp4--dry-run shows what would be added without changing anything; --save writes the effects back into the project.
The effect catalog
| Effect | What it does | Presets |
|---|---|---|
zoom3d | A 3D camera move that tilts and pushes in on a point | tour, push, orbit, flat |
spotlight | Dims (and optionally blurs) everything around a focus area | focus, soft, blur |
blur | Blurs a region itself, to hide or soften an element | medium, light, strong |
callout | A bordered, dimmed highlight box around an element | highlight, spotlight, neon |
follow | A camera that glides along with the cursor | gentle, loose, tight |
establish | An opening camera move across the frame | corners, topdown, diagonal |
photomotion | A camera move over a Realistic photo mockup — needs one set on the project | drift, pan, push, reveal |
text | An animated title on the Text track — the words go in quotes | clean, bold, boxed, outline, glow, gradient, pill, marker, neon, ocean, tag, sticker |
graphic | An animated template on the Graphics track — lower third, stats, steps, pricing, end card… (Pro to export) | lower-third, title-card, stat-row, steps, pricing, cta, launch-hero, end-card and more |
devicemotion | A camera move around a 3D device mockup — timed with start= / end= | slow-orbit, push-in, drift, arc, turntable, lid-reveal, hero, auto and more |
music | Background music from the built-in, royalty-free library — on the Music track | upbeat, ambient, cinematic, lofi, electronic, corporate |
Run screenify effects schema --json for the full, always-current catalog — every effect, preset, and tunable parameter.
Add animated titles
Put a title on screen with the text effect. Write the words in quotes, then say when and how it appears:
# A title that rises in at 2s, stays 3s, near the bottom, with a glow
screenify effects demo.screenify --plan "text 'Ship faster' start=2 duration=3 anchor=bottom glow" -o demo.mp4
# Word-by-word entrance on a red tag
screenify effects demo.screenify --plan "text 'Now with AI' start=0.5 in=wpop tag" -o demo.mp4
# Chain several beats in one command
screenify effects demo.screenify --plan "text 'Step 1' start=0 duration=2, then text 'Step 2' duration=2" -o demo.mp4| Option | What it sets | Default |
|---|---|---|
'…' | The words — single or double quotes, case and commas kept | — |
start= | When it appears, in seconds (2, 2s, 800ms) | 0.5 |
duration= | How long it stays on screen | 3 |
in= / out= | Entrance / exit animation — rise, fade, pop, hero, swing, spin, wdrop, wpop, tw, ldrop and more | rise / fade |
anchor= | Where on the frame — top-left … center … bottom-right | center |
size= | Text size, % of the frame height | 6 |
| style word | Any style from the table above | clean |
A title added this way is a real Text item: open the project in Screenify Studio and it's on the Text track, ready to edit like one you made by hand. New animations and styles appear automatically as they're released — effects schema --json always lists what's available.
Add graphics
The graphic effect places a template from the Graphics library. Name the template, then fill its fields by name:
# A speaker lower third at 2s
screenify effects demo.screenify --plan "graphic lower-third title='Ana Silva' subtitle='CEO' logo='AS' start=2" -o demo.mp4
# A row of three stats at the end, for 5 seconds
screenify effects demo.screenify --plan "graphic stat-row v1='10K+' l1='Creators' v2='4.8' l2='Rating' v3='2 min' l3='Setup' start=12 duration=5" -o demo.mp4| Option | What it sets | Default |
|---|---|---|
| template name | Which template — effects schema --json lists every one with a one-line description | — |
field='…' | A field of that template (title=, subtitle=, button=, price= …). Only fields the template has are accepted | the template's own text |
start= · duration= | When it appears and for how long, in seconds | 0.5 · 4 |
anchor= | Where on the frame — top-left … center … bottom-right | the template's own |
size= | Scale, 0.6–1.8 | 1 |
glass= | Frosted glass behind the panels | true |
| style knobs | Shared by every template: dim= (0–100, how dark the backdrop of a full-frame card is) · accent= background= textColor= (#rrggbb) · font= (brand, system, rounded, serif, mono) · entrance= (fade, rise, drop, slide, pop, blur, wipe) · speed= and more. A template accepts only the knobs it uses — effects schema --json lists them | the template's own |
List fields and images (a list of features, a logo, an avatar) are edited in the app.
Leave out start= and Screenify spaces the graphics for you — evenly over the video, skipping any intro or outro space, and a full-frame card waits until a 3D device camera move has begun:
screenify effects demo.screenify --plan "graphic chapter title='Setup', then graphic chapter title='Export', then graphic cta button='Try it free'" -o demo.mp4Sample content is refused. Templates ship with example numbers, prices and names — a rating of 4.9, a $149 price, a made-up person. A graphic that still shows them is rejected by effects and by export, naming the fields to fill, so a video never presents an example as a real claim. Type your real values into those fields; a value you type yourself is always accepted, even if it happens to match the example.
An agent can also design a template of its own and pass it with templateFile= — the same JSON format the built-in templates use. Screenify Studio checks it with the same rules as its own templates and names the field to fix if something is wrong.
Graphics added this way are real Graphics items: open the project and they're on the Graphics track. Exports from the command line include them, with the same motion and look as the app.
Move the camera around a 3D device
With a 3D device mockup, devicemotion directs the camera. Give each move a time window:
# Four moves that flow into each other
screenify effects demo.screenify \
--plan "devicemotion slow-orbit start=3 end=10, devicemotion arc start=10 end=17, devicemotion drift start=17 end=24, devicemotion push-in start=24 end=30" \
-o demo.mp4 -- --mockup macbook-pro-16 --environment glasshouse-interior
# Or let Screenify fill the video with varied 5–7s moves
screenify effects demo.screenify --plan "devicemotion auto style=lively" -o demo.mp4 -- --mockup iphone-17-pro-maxMoves that touch flow straight into each other — no easing out and back in at the seam. Each move takes distance=, speed=, reach=, ease= and, on a Mac, transition=zoom|fade. A new move replaces any existing one it overlaps. The same move names work on a MacBook and an iPhone.
Intro and outro spaces
Add an empty-background space before or after the recording and put a full-frame card in it — the same as Add as intro / outro in the app:
# A 3-second title card before the recording
screenify effects demo.screenify --plan "graphic title-card title='Ship faster' subtitle='The new release' at=intro duration=3" -o demo.mp4
# A closing logo screen after it
screenify effects demo.screenify --plan "graphic outro name='Acme' tagline='Ship faster' url='acme.com' logo='A' at=outro" -o demo.mp4
# Just the space
screenify effects demo.screenify --plan "space intro 3s" --saveOnly full-frame templates fit a space: title-card, chapter, kinetic-quote, outro. A text title works too. An intro makes the video longer and moves every effect right with it.
Add background music
music picks a track from Screenify Studio's built-in library — the same royalty-free originals as the app's Music tab — and puts it on the Music track:
# The first upbeat track, under the whole video
screenify effects demo.screenify --plan "music upbeat" -o demo.mp4
# A specific track, louder, with a quick fade in and a longer fade out
screenify effects demo.screenify --plan "music track='Product Hunt Energy' volume=0.7 fadein=0.5 fadeout=2" -o demo.mp4
# Something calm between 3s and 20s
screenify effects demo.screenify --plan "music ambient mood=calm start=3 end=20" --save| Option | What it sets | Default |
|---|---|---|
| genre | upbeat, ambient, cinematic, lofi, electronic, corporate | upbeat |
track='…' | A track by name — wins over genre and mood | — |
mood= | e.g. energetic, calm, confident, focused — a word that isn't a genre is read as a mood in a storyboard | — |
start= · end= | When the music plays, in seconds | whole video |
volume= | 0–1 | 0.3 |
fadein= · fadeout= | Fades, in seconds | 1 · 1 |
A track shorter than its window loops. New music replaces music it overlaps. The track downloads on first use and is then on your Mac like one you picked in the app — open the project and it's on the Music track, ready to adjust. You never need to supply a music file.
Add AI narration
voiceover reads your script with the same AI voices as the app and puts it on the Voiceover track — open the project
and it's an AI passage you can edit or regenerate:
screenify effects demo.screenify --plan "voiceover 'Graphics ship in one click.' start=3" --save
screenify effects demo.screenify --plan "voiceover 'Pick a theme once.' voice=am_michael speed=1.2 start=12" -o demo.mp4| Option | What it sets | Default |
|---|---|---|
| words in quotes | The script. [pause:1s] adds a pause | — |
voice= | One of the app's 54 AI voices, e.g. af_heart, am_michael, bf_emma | af_heart |
speed= | 0.85 slower · 1 natural · 1.2 faster | 1 |
start= | When it starts, in seconds or as an event (below) | 0 |
Passages can't overlap — the Voiceover track holds one voice at a time. It uses the app's voice engine, so Screenify Studio must be installed; the voice model downloads once and is shared with the app.
Tie effects to what happens on screen
In a web demo, place any effect at the moment something happens instead of a fixed second, so it stays on the right page however fast the pages load:
screenify effects demo.screenify --plan "graphic lower-third title='Pricing' subtitle='Simple plans' start=@goto:pricing+0.5" --save@goto:<part of the address> (the first page, a goto step or a click that opens a page) · @click:<label> ·
@type:<text> · @scroll · @event:<text>, with an optional +N / -N seconds. @start and @end are the first and
last second of the recording, and work in any project — e.g. a camera move that runs to the end:
devicemotion drift start=10 end=@end.
Two AI roles, one tool
It's worth separating the two ways AI shows up here:
web record -p— the AI performs the demo (clicks, scrolls) and can emphasize moments live.effects --ai— the AI directs the effects on an already-recorded demo, choosing which moments deserve a flourish.
Use them together (drive with -p, then refine with effects --ai) or on their own. And remember the whole CLI is itself drivable by an outer agent like Claude Code — see For agents & CI.
Web demos
Point screenify at a URL and it drives a real browser, adds a smooth cursor and auto-zoom, trims dead time, and hands you a finished demo video.
Build a whole demo
Describe a whole demo video in one storyboard file — the site to record, the 3D device, camera moves, graphics, narration and music — and build it with one command that also checks the result.