Command Line

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:

VariableProviderGet a key
OPENROUTER_API_KEYOpenRouter — one key, many models (recommended)openrouter.ai/keys
ANTHROPIC_API_KEYAnthropic (Claude)console.anthropic.com
OPENAI_API_KEYOpenAI (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 16

The 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 --vision to 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.mp4

AI 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

EffectWhat it doesPresets
zoom3dA 3D camera move that tilts and pushes in on a pointtour, push, orbit, flat
spotlightDims (and optionally blurs) everything around a focus areafocus, soft, blur
blurBlurs a region itself, to hide or soften an elementmedium, light, strong
calloutA bordered, dimmed highlight box around an elementhighlight, spotlight, neon
followA camera that glides along with the cursorgentle, loose, tight
establishAn opening camera move across the framecorners, topdown, diagonal
photomotionA camera move over a Realistic photo mockup — needs one set on the projectdrift, pan, push, reveal
textAn animated title on the Text track — the words go in quotesclean, bold, boxed, outline, glow, gradient, pill, marker, neon, ocean, tag, sticker
graphicAn 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
devicemotionA camera move around a 3D device mockup — timed with start= / end=slow-orbit, push-in, drift, arc, turntable, lid-reveal, hero, auto and more
musicBackground music from the built-in, royalty-free library — on the Music trackupbeat, 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
OptionWhat it setsDefault
'…'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 screen3
in= / out=Entrance / exit animation — rise, fade, pop, hero, swing, spin, wdrop, wpop, tw, ldrop and morerise / fade
anchor=Where on the frame — top-left … center … bottom-rightcenter
size=Text size, % of the frame height6
style wordAny style from the table aboveclean

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
OptionWhat it setsDefault
template nameWhich 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 acceptedthe template's own text
start= · duration=When it appears and for how long, in seconds0.5 · 4
anchor=Where on the frame — top-left … center … bottom-rightthe template's own
size=Scale, 0.6–1.81
glass=Frosted glass behind the panelstrue
style knobsShared 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 themthe 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.mp4

Sample 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-max

Moves 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" --save

Only 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
OptionWhat it setsDefault
genreupbeat, ambient, cinematic, lofi, electronic, corporateupbeat
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 secondswhole video
volume=0–10.3
fadein= · fadeout=Fades, in seconds1 · 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
OptionWhat it setsDefault
words in quotesThe script. [pause:1s] adds a pause—
voice=One of the app's 54 AI voices, e.g. af_heart, am_michael, bf_emmaaf_heart
speed=0.85 slower · 1 natural · 1.2 faster1
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.