diff --git a/.claude/skills/open-edit/scripts/preflight.sh b/.claude/skills/open-edit/scripts/preflight.sh index 45a0c32..af18ed9 100755 --- a/.claude/skills/open-edit/scripts/preflight.sh +++ b/.claude/skills/open-edit/scripts/preflight.sh @@ -6,9 +6,12 @@ set -uo pipefail # GUI-launched agents inherit a minimal PATH that commonly omits Homebrew. Add both standard -# prefixes before probing node; preserve the caller's remaining PATH. +# prefixes before probing node — but AFTER the caller's own PATH, never ahead of it. A Homebrew npm +# keeps its own global directory, so an npx taken from there cannot see a CLI installed by whichever +# npm the caller is using: it fetches a published copy and silently runs that instead of the one the +# caller set up. HOMEBREW_PATH_PREFIX="${OPEN_EDIT_HOMEBREW_PATH_PREFIX-/opt/homebrew/bin:/usr/local/bin}" -export PATH="${HOMEBREW_PATH_PREFIX:+$HOMEBREW_PATH_PREFIX:}$PATH" +export PATH="$PATH${HOMEBREW_PATH_PREFIX:+:$HOMEBREW_PATH_PREFIX}" if ! command -v node >/dev/null 2>&1; then MODE="" diff --git a/.github/README.md b/.github/README.md new file mode 100644 index 0000000..c2d087a --- /dev/null +++ b/.github/README.md @@ -0,0 +1,173 @@ +

+ + + + OpenEdit, powered by VEED + +

+ +

Video editing for coding agents. Describe the edit; get the MP4.

+ +

+ License: Apache-2.0 + Platform: Apple Silicon and Windows x64 +

+ +

+ Get started · + Prompts · + Examples · + VEED +

+ +OpenEdit is an open-source, agent-driven editing pipeline. There is no GUI and no timeline: you tell +your coding agent what you want, and it transcribes, designs, renders and hands you the file. + +## Get started + +You need an Apple Silicon Mac (with Homebrew) or a Windows x64 PC, Git, Node 20 or newer, and one of +Claude Code, Codex or Gemini CLI. From your project folder, install the skill into your agent: + +```sh +npx skills add veedstudio/open-edit --skill open-edit +``` + +Then open the agent (`claude`, `codex` or `gemini`) and ask: + +``` +Add subtitles to my video clip.mp4 +``` + +The first run sets itself up: it checks for Git, Node, pnpm and ffmpeg and names the command for +anything missing (Homebrew or corepack on a Mac; on Windows the commands are printed for you to run, +and ffmpeg is fetched into your user folder with no admin rights), asking before any global install; +clones its runtime into `.open-edit/` inside your project and registers a session hook in the settings +of Claude Code, Codex and Gemini CLI; downloads the renderer into your user's app-data folder; and asks +once how you want speech transcribed. Hosted by VEED +transcribes best (a veed.io account, [sign up](https://www.veed.io/signup) or +[log in](https://www.veed.io/login); the free tier covers about ten minutes a month); WhisperX runs +locally for free (needs `uv` or `pipx`; the first transcription downloads the model, about 2 GB for the +fast tier and more for the better one; nothing leaves your machine); or bring your own service. When the +run finishes you get the MP4 with subtitles burned in, a preview open in your browser, and the path to +the file, which lives under `.open-edit/` in your project. + +GPT-6 Astra title sequence made in OpenEdit + +*Made in OpenEdit with GPT-6 Astra driving the pipeline: pure motion graphics, no source footage, prompted +against the [OpenAI Brand Film](https://vimeo.com/1122006941) as a visual reference.* + +OpenEdit launch video + +*The launch video, also made in OpenEdit. Click either one to watch with sound.* + +## What you can ask for + +Captions are the shortest path, not the limit. The agent can edit, cut and reframe footage, layer +motion graphics and visual elements, turn slides into video, and pull in any +[AI video/image generator](https://www.veed.io/tools/ai-video) or MCP server when it helps. Source +video is optional: stills, slides or generated media are enough when the brief calls for it. + +As a first ask: + +``` +Add subtitles that look like this [IMG-REF] to my video [VIDEO] + +Cut the false start and the long pause around 0:42, then caption it + +Make a 20-second title sequence for my launch, no footage, in my brand colours +``` + +On a delivered render: + +``` +I don't like the yellow colour, make it darker + +Move the text up a bit + +When he says "go buy it now", make sure the 'now' really stands out +``` + +No footage at all? It can generate a talking-head clip from a script with +[VEED Fabric](https://www.veed.io/ai/fabric-1-0) and edit that. Generation is billed: it quotes the price +in your workspace's AI Playground credits and spends nothing without your yes. + +## Examples + +Real outputs, each with the prompt that produced it. Click any example to watch it with sound. + +``` +create viral subtitles with /open-edit and translate my video to 5 languages using VEED Lipsync 2.0 on Fal +``` + +One source clip, three languages, three caption styles, translated and re-lipsynced through +[VEED's Lip Sync API](https://www.veed.io/tools/lip-sync-api): + +| Spanish | French | German | +| --- | --- | --- | +| [![Spanish](../docs/examples/happy3-ES-078.webp)](https://github.com/veedstudio/open-edit/releases/download/launch-examples/happy3-ES-078.mp4) | [![French](../docs/examples/remix-FR.webp)](https://github.com/veedstudio/open-edit/releases/download/launch-examples/remix-FR.mp4) | [![German](../docs/examples/happy2-DE-lowerthird.webp)](https://github.com/veedstudio/open-edit/releases/download/launch-examples/happy2-DE-lowerthird.mp4) | + +``` +generate 3 viral hooks in Seedance 2.0 on Fal and create dynamic motion graphics using /open-edit +``` + +Three hooks generated with [Seedance](https://www.veed.io/tools/ai-video/seedance), three +motion-graphic treatments: + +| | | | +| --- | --- | --- | +| [![News hook](../docs/examples/news-comic.webp)](https://github.com/veedstudio/open-edit/releases/download/launch-examples/news-comic.mp4) | [![Desk hook](../docs/examples/chair-remix.webp)](https://github.com/veedstudio/open-edit/releases/download/launch-examples/chair-remix.mp4) | [![Makeup hook](../docs/examples/makeup-happy-v2.webp)](https://github.com/veedstudio/open-edit/releases/download/launch-examples/makeup-happy-v2.mp4) | + +``` +use Figma MCP to study my BrandBook and create branded campaign graphics using /open-edit +``` + +One brand book, three campaign cards: + +| | | | +| --- | --- | --- | +| [![Race Fashion 1](../docs/examples/race-card-1.webp)](https://github.com/veedstudio/open-edit/releases/download/launch-examples/race-card-1.mp4) | [![Race Fashion 2](../docs/examples/race-card-2.webp)](https://github.com/veedstudio/open-edit/releases/download/launch-examples/race-card-2.mp4) | [![Race Fashion 3](../docs/examples/race-card-4.webp)](https://github.com/veedstudio/open-edit/releases/download/launch-examples/race-card-4.mp4) | + +## How it works + +The skill tells your agent the whole flow: transcribe with real per-word timings, draw a caption style +from a pool of recipes, compose the document in HTML and CSS, render it with VEED's renderer, then check +the result for timing and contrast before handing it back. Every step of a captioned run is a command +from the `@veedstudio/openedit-cli` package; the [CLI reference](../README.md) lists them. + +The renderer is source-available and free to use, and it does not run a headless browser: nothing to +install, launch or keep alive for the length of a render. It does need a desktop session, so renders +run on your machine rather than on a headless box. + +Transcription is your choice, asked once and remembered. WhisperX runs locally and nothing leaves your +machine. VEED's hosted transcription uploads the file in order to transcribe it and stores it for that +purpose. Any Whisper-family JSON from your own service works too, and no credentials pass through +OpenEdit. Every provider writes the same `runs//transcript.json`, and per-word timings are +required: without them the caption reveals drift, so a transcript that has none is refused rather than +rendered badly. + +## Requirements + +| | | +| --- | --- | +| Platform | Apple Silicon Mac or Windows x64 PC. Intel Macs are not supported: the renderer ships macOS-arm64 and windows-x64 only | +| macOS | Built and tested on Tahoe 26.0. Nothing checks the version, so earlier releases may work, untested | +| Windows | Windows 10 or newer (the installer extracts with the bundled `tar`). Git and Node via winget, pnpm via corepack or npm: preflight prints the exact commands and never runs them itself. ffmpeg is fetched into your user folder for you, no admin rights needed | +| Linux | Planned; prioritisation depends on demand | +| Agents | Claude Code, Codex or Gemini CLI. The installed skill prepares the runtime and loads its `AGENTS.md` instructions itself | + +## Scope and limitations + +V1 targets captions. Motion graphics, charts, and brandbook-matched styling render today, but are less +exercised than captions and should be expected to have rough edges. + +Report defects through GitHub issues. + +## License + +The editor is licensed under Apache-2.0. The renderer binaries are distributed under PolyForm Shield +1.0.0, which permits commercial use of the videos you produce with no payment to VEED. See `LICENSE` +and `NOTICE` for the full terms. + +--- + +

OpenEdit · powered by VEED

diff --git a/.gitignore b/.gitignore index 769ec82..0ee0940 100644 --- a/.gitignore +++ b/.gitignore @@ -51,3 +51,9 @@ __pycache__/ # Engine probe renders — regenerable output of the probe harness internal/motion/probes/*/probe.mp4 .ffmpeg/ +# Compiled content — emitted in place by `node cli/scripts/build.mjs --content`. The packer does this +# in its own copy of the tree; a working checkout stays .ts-only so nothing stale can shadow an edit. +refs/html/**/*.js +pipeline/**/*.js +veed/args.js +internal/packaging/out/ diff --git a/AGENTS.md b/AGENTS.md index 0fcad36..0e261e9 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -89,7 +89,11 @@ fast-path/refinement switch. restores a single source track and levels whichever track it is given to the delivery loudness; this is what a film needs instead. - `veed/` — VEED-native transcription + login (one writer of `transcript.json`; real per-word timings), plus Fabric generation and video background removal on the same login. `npx @veedstudio/openedit-cli background-removal` reaches the live free VEED route by default, or fal's own `--fast` model when that variant is wanted; `npx @veedstudio/openedit-cli lipsync` (video + new audio -> re-lipsynced video) has no VEED-hosted route at all and always goes through fal. Both fal-charged paths still use the VEED login to host the local file for a URL, but the generation call itself bills the user's own fal key (the CLI's fal BYOK rail), never a VEED workspace. `npx @veedstudio/openedit-cli prep` — `meta.json` + `word-timings.json` + base frames (needs a transcript from any provider). `refs/` — `html/` refs + `tags.json` (v3, the RUNTIME INDEX — recipes only, facet taxonomy, `fit` = aspect SOT) + per-ref `recipe.md` (the prose recipe sheet a compiled recipe is derived from — the fast path runs the compiled module, never the sheet; the creative pass reads sheets as craft substrate and REMIX donors). -- `config.ts` — all machine paths (ffmpeg / ffprobe / veed-engine). `docs/` — FLOW (orchestration) · recipe-format (the recipe law). Engine support matrix = the `feature-support.md` asset downloaded with the engine release into `.veed-engine/` (not vendored here). +- `cli/src/config.ts` — the machine paths the CLI resolves (ffmpeg / ffprobe / the engine), and the two roots + it keeps apart: the CONTENT it reads (recipes, gates, brief — the package's own tree unless `OPEN_EDIT_ROOT` + names a directory that really carries `refs/tags.json`) and the WORKSPACE it writes (`runs/`, the recorded + provider choice). A checkout also has a top-level `config.ts` of its own, reading the same env vars, for the + substrate scripts that run outside the CLI. `docs/` — FLOW (orchestration) · recipe-format (the recipe law). Engine support matrix = the `feature-support.md` asset downloaded with the engine release into `.veed-engine/` (not vendored here). ## Hard rules (do not drift — these protect output quality) - Recipe runs are **deterministic** — the generate-recipe command is the only writer of the final .wv document; never diff --git a/NOTICE b/NOTICE index d8b25a6..cddd860 100644 --- a/NOTICE +++ b/NOTICE @@ -18,6 +18,20 @@ The installer places a copy of those terms alongside the binary at `.veed-engine/LICENSE-binary.md`. The canonical copy is `LICENSE-binary.md` in the releases repository above. +This project embeds woff2 subsets of two fonts in the login-success page, each +licensed under the SIL Open Font License, Version 1.1 +(https://openfontlicense.org): + + Inter — Copyright (c) 2016 The Inter Project Authors + (https://github.com/rsms/inter) + + STIX Two Text — Copyright (c) 2001-2023 by the STI Pub Companies + (https://github.com/stipub/stixfonts) + +The full license text accompanies each upstream project at the URLs above. + +--- + Transcription in this project is performed against the VEED service, which requires a VEED account and credits. Use of that service is governed by VEED's terms, separately from this project's license. diff --git a/README.md b/README.md index bf590a9..2afa28c 100644 --- a/README.md +++ b/README.md @@ -1,200 +1,282 @@ -

- - - - OpenEdit, powered by VEED - -

+# @veedstudio/openedit-cli -

Not the editor you rent, but the one you own.

+The Open Edit command-line tool: agent-driven video creation and editing, +powered by VEED. -

- License: Apache-2.0 - Platform: Apple Silicon and Windows x64 -

+The package carries the content it runs on — the recipe pool, the director's +brief, the design substrate and the gates — so a fresh install can draw a style, +build a document and gate it without cloning anything. 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. -

- Install · - Usage · - Examples · - VEED -

+## Usage -OpenEdit is an open-source, agent-driven editing pipeline that ships with VEED's HTML renderer — closed -source, but free to use. +```sh +npx @veedstudio/openedit-cli --help +``` -There is no GUI and no timeline. The pipeline is driven entirely through your coding agent — edit, -cut, and reframe footage; layer motion graphics and visual elements; turn slides or websites into -video; capture web pages; and pull in any [AI video/image generator](https://www.veed.io/tools/ai-video) -or MCP server when it helps. Source video is optional: stills, slides, generated media, or pure -motion graphics are enough when the brief calls for it. Be creative and fluid — try new ideas -rather than collapsing every ask onto captions. +## Commands -OpenEdit edits footage. Supply your own source files, or ask it to generate a talking-head clip with -[VEED Fabric](https://www.veed.io/ai/fabric-1-0) when you have none — that spends credits, and never -without your approval. +### login -OpenEdit launch video +Log in with VEED (OAuth 2.1 + PKCE via the browser; the token is stored locally +and refreshed automatically): -*This launch video was made in OpenEdit — click it to watch with sound.* +```sh +npx @veedstudio/openedit-cli login +``` -GPT-6 Astra title sequence made in OpenEdit +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. -*Also made in OpenEdit, with GPT-6 Astra driving the pipeline — pure motion graphics, no source -footage. Its prompt was written against the [OpenAI Brand Film](https://vimeo.com/1122006941) as a -visual reference.* +### token -## Requirements +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: -| | | -| --- | --- | -| Platform | Apple Silicon Mac or Windows x64 PC. Preflight requires one of the two and stops elsewhere | -| Intel Macs | Not supported — the renderer ships macOS-arm64 and windows-x64 only | -| Older macOS | Built and tested on Tahoe 26.0. Nothing checks the version, so earlier releases may work — untested | -| Windows | Windows 10 or newer (the installer extracts with the bundled `tar`). Git, Node, and ffmpeg via winget — preflight prints the exact commands and never runs them itself | -| Linux | Planned; prioritisation depends on demand | -| Transcription | needed only to caption speech — OpenEdit asks once and remembers: VEED ([sign up](https://www.veed.io/signup) / [login](https://www.veed.io/login)), WhisperX locally, or your own service. **VEED transcription consumes VEED credits**; WhisperX runs locally on your machine, and your own service is billed by whoever provides it | -| Generation | optional — a veed.io account, only if you ask OpenEdit to generate footage you do not have | - -## Installation -Download this repo, or install via the command line with: ```sh -npx skills add veedstudio/open-edit +npx @veedstudio/openedit-cli token ``` -## Agents -OpenEdit uses an agent-agnostic skill and repository guide. It supports Claude Code, Codex, and Gemini; -the installed skill prepares the runtime and loads its `AGENTS.md` instructions explicitly. +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`. There is no default +provider — the choice is the user's, recorded once with `--record`. Locally with +WhisperX (free, offline, nothing billed anywhere): -## Usage -Open your coding agent. For example, with Claude Code: ```sh -claude +npx @veedstudio/openedit-cli transcribe video.mp4 [...] [--model medium] [--language de] [--force] ``` -then ask it: -``` -Add subtitles to my video [VIDEO] +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 [...] ``` -The agent will automatically transcribe your video, analyse the transcript, create a suitable design for your video, and then render it. +`--record [--model ]` records the transcription +provider choice in `.open-edit-prefs.json` instead of running anything. -After 1-3 minutes, the agent will return your video with subtitles burned in, as well as launch a video previewer. It will also tell you where to find the final MP4. +### whisper -You can then ask the agent for subtitle amendments, for example: +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] ``` -I don't like the yellow colour, make it darker -Move the text up a bit +Word timestamps are required; the media argument may be a video or an audio +file. -When he says "go buy it now", make sure the 'now' really stands out. -``` +### prep -You can also hand the agent a reference image to copy a style from: +Probe the source canvas, synthesize `word-timings.json` from the transcript's +real per-word times, and cut one base frame per beat (the transcript must +already exist): -``` -Add subtitles that look like this [IMG-REF], to my video [VIDEO] +```sh +npx @veedstudio/openedit-cli prep video.mp4 [...] ``` -## Examples +### synth-timings -Real outputs, each with the prompt that produced it. Click any example to watch it with sound. +Even-split word reveal delays for a single beat window: +```sh +npx @veedstudio/openedit-cli synth-timings --start 1.2 --end 3.4 --words "A B C" [--out file.json] ``` -create viral subtitles with /open-edit and translate my video to 5 languages using VEED Lipsync 2.0 on Fal + +### generate / generate-set / sample-presenter + +Fabric generation — source footage from a script, when there is no video to +caption. Generating spends TWO of the named workspace's allowances — AI +Playground credits for the video and text-to-speech seconds for the voice — so +it is two commands: the first quotes both 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 ``` -One source clip, three languages, three caption styles — translated and re-lipsynced through -[VEED's Lip Sync API](https://www.veed.io/tools/lip-sync-api): +`--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 -| Spanish | French | German | -| --- | --- | --- | -| [![Spanish](docs/examples/happy3-ES-078.webp)](https://github.com/veedstudio/open-edit/releases/download/launch-examples/happy3-ES-078.mp4) | [![French](docs/examples/remix-FR.webp)](https://github.com/veedstudio/open-edit/releases/download/launch-examples/remix-FR.mp4) | [![German](docs/examples/happy2-DE-lowerthird.webp)](https://github.com/veedstudio/open-edit/releases/download/launch-examples/happy2-DE-lowerthird.mp4) | +Remove a video's background (VEED's free route by default; `--fast` uses a fal +model billed to your own fal key), or re-lipsync a video to a new audio track +(always fal-billed). Both use the VEED login only to host the local file: +```sh +npx @veedstudio/openedit-cli background-removal video.mp4 [--fast] [--mask-only] [--out ] +npx @veedstudio/openedit-cli lipsync video.mp4 narration.mp3 [--out ] ``` -generate 3 viral hooks in Seedance 2.0 on Fal and create dynamic motion graphics using /open-edit + +The fal key comes from `FAL_KEY`, or `OPEN_EDIT_FAL_KEY_FILE` pointing at a +file that holds it. + +### install-engine + +Download the veed render engine (checksum-verified, from its public GitHub +releases) into the app-data dir, or upgrade an existing install: + +```sh +npx @veedstudio/openedit-cli install-engine [weave-v] ``` -Three hooks generated with [Seedance](https://www.veed.io/tools/ai-video/seedance), three -motion-graphic treatments: +`VEED_ENGINE_BIN` overrides where the engine is looked for. The binary is +licensed separately (PolyForm Shield); its license installs beside it. + +### install-ffmpeg / install-whisperx -| | | | -| --- | --- | --- | -| [![News hook](docs/examples/news-comic.webp)](https://github.com/veedstudio/open-edit/releases/download/launch-examples/news-comic.mp4) | [![Desk hook](docs/examples/chair-remix.webp)](https://github.com/veedstudio/open-edit/releases/download/launch-examples/chair-remix.mp4) | [![Makeup hook](docs/examples/makeup-happy-v2.webp)](https://github.com/veedstudio/open-edit/releases/download/launch-examples/makeup-happy-v2.mp4) | +The other two installers. `install-ffmpeg` checks for a working FFmpeg first +(`VEED_ENGINE_FFMPEG`, then PATH, then a previous install) and only downloads +when nothing works — a checksum-verified static build into the app-data dir +(the download route is Windows-only; macOS points at `brew install ffmpeg`). +`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 [] ``` -use Figma MCP to study my BrandBook and create branded campaign graphics using /open-edit + +### mux-audio / mix-audio + +Put sound on a render. `mux-audio` lays a run's source audio (or `--audio +`) onto its silent render, levelled to -14 LUFS / -1 dBTP (`--no-loudnorm` +keeps the source level; the line it prints says which correction ran); +`mix-audio` first builds one track from many pieces — narration, music, +effects — per the run's mix spec, with music ducked under the voice: + +```sh +npx @veedstudio/openedit-cli mix-audio runs/ # → runs//audio/mix.m4a +npx @veedstudio/openedit-cli mux-audio runs/ --audio runs//audio/mix.m4a ``` -One brand book, three campaign cards: +### wcag-pass -| | | | -| --- | --- | --- | -| [![Race Fashion 1](docs/examples/race-card-1.webp)](https://github.com/veedstudio/open-edit/releases/download/launch-examples/race-card-1.mp4) | [![Race Fashion 2](docs/examples/race-card-2.webp)](https://github.com/veedstudio/open-edit/releases/download/launch-examples/race-card-2.mp4) | [![Race Fashion 3](docs/examples/race-card-4.webp)](https://github.com/veedstudio/open-edit/releases/download/launch-examples/race-card-4.mp4) | +Contrast-audit a rendered run through the engine's bundled analyzer, and (with +`--apply`) promote the remediated template after re-verifying it: -## Renderer +```sh +npx @veedstudio/openedit-cli wcag-pass --run runs/ [--apply] +``` + +Needs the installed engine (`install-engine`). `WCAG_REMEDIATE` can point at a +replacement remediation applier; by default the bundled one runs as its own +plain-node process. -Caption styles are authored in HTML and CSS. Rendering does not use a headless browser: there is no -browser to install, launch, or keep alive for the duration of a render. +### gates / expect-windows -Internal benchmarks measured the renderer up to 2.2x faster than Chrome-driven renderers. These -measurements are preliminary and not yet reproducible outside VEED; a documented benchmark and its -methodology will follow. +The whole gate chain — design → lint → verify → wcag → record → probe → mux — +as one command over a run directory (run it outside any sandbox; rendering +needs a real desktop session): -The renderer is integrated but not required. Composition does not depend on it, so Chrome can be used -as the render backend instead. +```sh +npx @veedstudio/openedit-cli gates runs/ [--doc ] [--audio ] [--no-loudnorm] +``` -## Transcription +`expect-windows` derives the `verify.expect` timing assertions from a +document's own gates (`--write` stamps them into the manifest); the chain runs +it automatically. The design and lint gates come from the content this package +carries, so they run with no checkout; `OPEN_EDIT_ROOT` pointed at one replaces +them with that checkout's. -OpenEdit asks once which provider to use and records the answer at the runtime root -(`.open-edit-prefs.json`); it does not ask again. Every provider writes the same file — -`runs//transcript.json`, with real per-word timings — and nothing downstream can tell which one ran. +### Editing and QA tools -**VEED** — best quality, and the default workflow. Requires a VEED account; usage limits are your -account's, and a free account covers about 10 minutes of transcription a month, beyond which it needs a -[plan](https://www.veed.io/pricing). The audio track is uploaded and stored in order to transcribe it; the -video is not uploaded. By default OpenEdit does not create a VEED project. The agent guides the one-time -browser login and stores a refreshable token in the platform's per-user app-data directory. +The remaining pipeline tools, each a direct port of its script: ```sh -npx @veedstudio/openedit-cli login -npx @veedstudio/openedit-cli transcribe --provider veed /path/to/video.mp4 +npx @veedstudio/openedit-cli concat-chapters --doc chapters/act-1 --doc chapters/act-2 +npx @veedstudio/openedit-cli concat-videos [--canvas WxH] [--fit letterbox|crop|open] [...] +npx @veedstudio/openedit-cli cut-frames