CLI › Reference

Verbs

Every vos command, from the one-shot create to the hosted push and pull.

Every vos command, at reference altitude. The take verbs work on a take directory; the platform verbs talk to vos.so. Full flag detail lives in vos <verb> --help and the complete agent reference at /llms-full.txt.

The take pipeline

VerbWhat it does
vos create --actions actions.json out.webm --strictThe one-shot: record, auto-plan and render in one browser session. The take dir still lands on disk, so the loop stays open
vos record --actions actions.json --out take --strictDrive the page, synthesize the cursor track, encode, auto-plan zooms. Recording is real time. --hosted records on vos.so instead, for a machine with no browser: a public URL (or a preview behind --header) lands as a private vos with its doc and digest and comes home with its media; a session never travels
vos plan takeRe-plan auto zooms from the cursor track. source:"manual" spans are preserved; --fresh discards the doc. --reuse re-times a previous cut onto a re-recording of the same script and names whatever could not follow
vos frames take --at-zoomsPNG stills from the composed take: contact sheet plus every zoom apex. This is how you look at your work
vos render take out.webmDeterministic render. --range a..b --draft spot-checks an edit in seconds; never ship a draft. A range render keeps its audio
vos deliver take --to cws,producthunt,ogThe release's assets in one pass: stills and video cuts per verified channel spec, plus the kit.json manifest. Misses land in skipped with the reason. Card destinations (OG, LinkedIn, the tile and marquee) render from the poster document of their aspect class beside the take (poster/<class>/doc.json, or LAUNCH.md's poster: roles) at its rest; screenshots are the real page, full bleed, unless --composed
vos brand https://your.appYour brand as a BRAND.md recipe, witnessed: /design.md when you publish one, /llms.txt for the name, then the page (ground, surfaces, faces, inks, the accent buttons and links agree on, icons, og:image), with where each value came from and the site's own avoid list
vos validate take/kit/kit.jsonRe-measures every kit asset from its bytes against the channel specs: a .png that is WebP, a size or duration the manifest lies about, a set under its count, a byte ceiling
vos open takeServe the take into the studio; the document arrives intact and every span is draggable
vos ingest video.webm --cursor trace.zip --out takeA take from a recording someone else made: the file becomes recording.<container>, its own dimensions and length become meta.json, and a trace beside it (a Playwright trace.zip, stamped JSON records, a t,x,y,type CSV) becomes the cursor track the plan zooms on. Without a trace nothing is planned, and the done event says so. The studio reads the same traces when both files are dropped together
vos actions from-agent-browser steps.jsonlThe walk an agent made in agent-browser (each command kept beside its --json result, the batch record shape) becomes actions.json: refs resolve through the last snapshot to role and name selectors, CSS passes through, and every step the recorder cannot follow is named, never dropped
vos validate <actions.json or take>Structural check for a script; semantic lints for a take's doc. Must pass before you render

Always pass --strict to record (and create): a skipped selector or a page that never settles exits 2 with a machine-readable skipped[] list. A skip is a broken flow; fix the selector and re-record, never ship around it.

Both take --max-duration <seconds>, default 1800: the capture stops there and says so in the done event (capped: true; with --strict that exits 2). The default is the hosted cap, 30 minutes, which vos push refuses to exceed. See Limits.

The platform verbs

VerbWhat it does
vos setupReady this machine: the skills into your agent's directories, a browser, one rules block, then doctor. Takes --agent, --global, --no-skills, --no-rules, --no-browser, --url
vos doctorWhat is ready, in words: node, browser, ffmpeg, skills, a credential (never printed), the dev server with --url. Exit 3 when no browser
vos whoamiThe key's name and the account it belongs to, never the key
vos logoutRemove the stored credential
vos loginBrowser sign-in; stores a content key itself. See Install and log in
vos fetch <id or watch-url>A program's config.json plus tracking; public voses need no auth. --media brings its declared files home under assets/
vos check config.jsonFull local validation: migrate, schema, compile, determinism, font and declared-file lints
vos push <take or config.json>Host work as a private vos or a new version. Polymorphic by sniff: a take dir routes through the take pipeline. On create, --desc, --tags and --folder <folder> describe and file the vos in one call. Every local file the program names is uploaded. --prompt <text> shows the prompt that made it on its watch page
vos push config.json --claimableThe credential-free rung: a program and the files it names (12 files, 50 MB at most); prints a 72 hour claim link. --share makes the claim page lead with Claim and share
vos pull <take or dir>The typed changelog since your base, plus a synced document. Always pull before editing pushed work
vos folder listYour folders as a tree, with what each one holds
vos folder create <name>Add a folder; --parent <folder> nests it (5 levels max)
vos folder move <ids> --to <folder>File voses and assets into a folder; --to none unfiles. Add-only: renaming, deleting and reordering stay on vos.so
vos folder pull <folder>The folder's context package on disk: every recipe (inherited ones too), exemplar configs and take docs, each tracked so a push lands as a version
vos asset rename <id> <name.md>Rename one of your assets in place; the extension keeps matching its kind
vos recipe push <FILE.md> --folder <folder>Put a recipe on the shelf, filed into that folder. --asset <id> instead replaces one in place, same id, the displaced body kept as the prior version

The push and pull rules (attribution, stale bases, protected nodes) live in Push and pull.

Doc overrides on render and frames

Check any presentation without editing doc.json; the disk file is untouched and the patched doc is lint-gated, so a bad override fails exactly like a bad document.

Shell
vos frames take --frame 2.0 --set frame.browserBar.kind=mac-light --set tilt[0].rx=8
vos render take out.webm --frame macos --background soft-beams
  • --set path=value (repeatable) patches any doc field; the value is JSON when it parses, else a string. Array indices work: --set zoom[0].level=3.
  • --frame <kind> on render sets the browser frame: macos | mac-dark | windows | windows-dark | minimal | none. On frames, --frame <t> is the still-time selector; set the frame kind there via --set frame.browserBar.kind=....
  • --background <url> adds a background media layer; kind inferred from the URL, none clears it.

What to expect (measured, M-series laptop)

Recording is real time plus a few seconds of encode. Rendering is about 1.5 times real time at 1080p, of which around 5 seconds is fixed browser and CDN startup; --parallel pays off on takes longer than about 30 seconds and is ignored when audio is present. A draft range check takes about 5 seconds; a frames sheet about 2.