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
| Verb | What it does |
|---|---|
vos create --actions actions.json out.webm --strict | The 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 --strict | Drive 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 take | Re-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-zooms | PNG stills from the composed take: contact sheet plus every zoom apex. This is how you look at your work |
vos render take out.webm | Deterministic 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,og | The 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.app | Your 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.json | Re-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 take | Serve the take into the studio; the document arrives intact and every span is draggable |
vos ingest video.webm --cursor trace.zip --out take | A 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.jsonl | The 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
| Verb | What it does |
|---|---|
vos setup | Ready 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 doctor | What is ready, in words: node, browser, ffmpeg, skills, a credential (never printed), the dev server with --url. Exit 3 when no browser |
vos whoami | The key's name and the account it belongs to, never the key |
vos logout | Remove the stored credential |
vos login | Browser 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.json | Full 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 --claimable | The 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 list | Your 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.
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>onrendersets the browser frame:macos | mac-dark | windows | windows-dark | minimal | none. Onframes,--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,noneclears 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.
Related
- actions.json and doc.json for the two documents these verbs read and write.