# @veedstudio/openedit-cli The Open Edit command-line tool: agent-driven video creation and editing, powered by VEED. The package carries the agent skill that `init` installs into a workspace; everything else is a command below. The source is public at [veedstudio/open-edit](https://github.com/veedstudio/open-edit), whose README covers what Open Edit is and what it makes; this page is the command surface. ## Usage ```sh npx @veedstudio/openedit-cli --help ``` ## Commands ### login Log in with VEED (OAuth 2.1 + PKCE via the browser; the token is stored locally and refreshed automatically): ```sh npx @veedstudio/openedit-cli login ``` Pass `--manual` (or set `VEED_LOGIN_MANUAL=1`) when no reachable browser exists: the URL is printed, and the redirect is pasted back instead of caught on a localhost loopback. ### token Print a valid VEED access token for other tools to consume, refreshing it first when stale (`VEED_ACCESS_TOKEN`, when set, is passed through as-is). The value is printed only when the output is captured; run it straight in a terminal and it reports that a token exists without putting one in your scrollback: ```sh npx @veedstudio/openedit-cli token ``` Exits non-zero when no login is stored. `--path` prints the token store location instead of a token. ### transcribe Transcribe videos, writing `runs//transcript.json`. The provider is the user's choice, recorded once with `--record`: a bare `transcribe video.mp4` runs the recorded one (and refuses, saying why, when nothing usable is recorded), and `--provider` names another for one run. Locally with WhisperX (free, offline, nothing billed anywhere): ```sh npx @veedstudio/openedit-cli transcribe --provider whisperx video.mp4 [...] [--model medium] [--language de] [--force] ``` A transcript already on disk is left alone (it may have been retimed onto an edit); `--force` transcribes it again. Or hosted by VEED (premium quality; requires the one-time `login`, and spends the workspace's VEED transcription credits — `--workspace ` names which, required only when the account has several): ```sh npx @veedstudio/openedit-cli transcribe --provider veed video.mp4 [...] ``` `--record [--model ]` records the transcription provider choice in `.open-edit-prefs.json` instead of running anything. ### whisper Map a Whisper-family JSON produced by your own service (WhisperX, openai-whisper, whisper-timestamped, mlx-whisper, whisper.cpp `-oj -ml 1`, or the OpenAI API's `verbose_json` with word granularity) into the same `runs//transcript.json`: ```sh npx @veedstudio/openedit-cli whisper transcription.json media.mp4 [...] [--force] ``` Word timestamps are required; the media argument may be a video or an audio file. ### generate / generate-set / sample-presenter Fabric generation — source footage from a script, when there is no video to caption. Generating draws the named workspace's AI Playground credits twice — the speech is synthesized, then lip-synced — so it is two commands: the first quotes the sum and records the approval, the second spends exactly what was approved (no `--script` on the spend pass — the recorded, hashed script is what bills): ```sh npx @veedstudio/openedit-cli generate --script "spoken words" --key my-run --workspace npx @veedstudio/openedit-cli generate --key my-run --yes ``` `--resume` collects a job already created and paid for; `--abandon ` clears one abandoned charge record. `generate-set --shots shots.json` covers several shots under one approval, and `sample-presenter` proposes a deterministic character/voice pair for a run key (listing costs nothing). ### background-removal / lipsync Remove a video's background, or re-lipsync a video to a new audio track. Background removal tries VEED's free route first; when that route cannot run, it stops having spent nothing and prints what fal's model would cost and the command to run with `--fal`. Only `--fal` (the full model, uploaded to fal's own storage) or `--fast` (fal's fast model) buys anything, and lipsync always goes through fal. Every fal call bills your own fal key, never a VEED workspace; a re-run of the same inputs resumes the paid job instead of buying it again: ```sh npx @veedstudio/openedit-cli background-removal video.mp4 [--fal|--fast] [--mask-only] [--no-refine] [--out ] npx @veedstudio/openedit-cli lipsync video.mp4 narration.mp3 [--out ] ``` The fal key comes from `FAL_KEY`, or `OPEN_EDIT_FAL_KEY_FILE` pointing at a file that holds it. ### veed-project / veed-pull Hand a finished edit to VEED's editor as a project a person can take apart: footage cuts, text, captions, images and each audio track become the editor's own items, and each page element the plan names becomes a transparent clip cut to its box. It uses your VEED login and spends no VEED credits and nothing on your fal key. The last step runs in your browser: click the "OpenEdit to VEED" bookmark on VEED. The way back is the "Send to Claude" bookmark on a project open in the editor, and `veed-pull`: ```sh npx @veedstudio/openedit-cli veed-project --install-bookmark npx @veedstudio/openedit-cli veed-project plan.json [--workspace ] [--local] npx @veedstudio/openedit-cli veed-pull ~/Downloads/openedit-.json --out ``` `veed-project --help` lists the plan's fields; `veed-pull` writes the project back as such a plan. ### fal Run any fal model on your own key. Local file paths inside the input are uploaded for you (multipart above 90 MB), outputs are downloaded, and each job ends with a cost line: the billed figure when your key can read fal's billing, otherwise `cost: unknown` beside fal's listed price. An identical request is bought once, even across processes and crashes: ```sh npx @veedstudio/openedit-cli fal schema npx @veedstudio/openedit-cli fal run --input '{"prompt":"…"}' [--out ] npx @veedstudio/openedit-cli fal run --batch jobs.json [--concurrency N] # [{model, input, name?}] ``` ### install-ffmpeg / install-whisperx `install-ffmpeg` looks for an existing FFmpeg first (`OPENEDIT_FFMPEG` and `OPENEDIT_FFPROBE`, then a previous install, then PATH) and only downloads when there is none — a checksum-verified static build into the app-data dir (the download route is Windows-only; macOS points at `brew install ffmpeg`, Linux at `apt`). A set `OPENEDIT_FFMPEG` or `OPENEDIT_FFPROBE` is run first, and fails the command, naming the variable, when its binary does not start, since nothing else is used while it is set; `--check` runs whichever pair every command would. `--force` reinstalls the app-data copy, and is refused while either override is set, since no command would run the copy it installs. `install-whisperx` installs the local transcription provider into an isolated uv/pipx tool environment; it never touches the system Python. ```sh npx @veedstudio/openedit-cli install-ffmpeg [--check|--force] npx @veedstudio/openedit-cli install-whisperx [] ``` ### render / fonts / install-browser Render an HTML page to video in headless Chrome, frame-exact. The page runs on a virtual clock (timers, `requestAnimationFrame`, `Date.now` and a seeded `Math.random` advance one frame per frame); CSS and Web Animations, GSAP's global timeline and an optional `window.__seek(t)` are set to each frame's time, and `