Paste a URL or a prompt, get a launch video. Opus 5.5 writes HTML and renders a video out of it locally via ffmpeg
TypeScript
1
14 commits
updated Sep 25, 2026
Paste a URL or a prompt, get a 20 to 40 second launch video. No video model:
Claude Code writes a single HTML film, then this Mac renders it frame by frame
in headless Chromium and encodes it with ffmpeg. It uses the existing Claude
Code login, so it does not require ANTHROPIC_API_KEY, Vercel, or a Blob
store.
This fork is intended for local use. It launches Claude Code and renders video on the same machine running the Next.js app.

local/ local Claude Code worker and Playwright + ffmpeg renderer
web/ Next.js app, local job API, and local MP4 streaming route
Requirements:
# Clone your fork and use the local-first branch.
git clone git@github.com:ndom91/shipvideo-local.git
cd shipvideo-local
git switch local-claude-run
# Install deps including playwright and it's copy of headless chromium
npm run setup-local
# Start the web app where you can enter any prompt / URL input to generate a video
cd web && npm install && npm run dev
Open http://localhost:3000 and submit either a URL or a brief.
The defaults require no environment file. Optional environment variables:
| Variable | Default | Purpose |
|---|---|---|
CLAUDE_MODEL | opus | A Claude Code model alias, such as sonnet or opus. |
CLAUDE_COMMAND | claude | Path to the Claude Code executable if it is not on PATH. |
For example:
CLAUDE_MODEL=sonnet npm run dev
Run that command from web/ after installing dependencies.
Each request gets an isolated directory at web/.local-jobs/<job-id>/:
job.json: validated form input.scene.html and scene.json: Claude's generated film and duration.claude.log: Claude Code and renderer output for debugging.video.mp4: completed output.state.json: job status consumed by the UI.These directories are ignored by Git. The completed MP4 is streamed locally at
/api/videos/<job-id>; it is not uploaded anywhere.
POST /api/jobs validates the input, creates an isolated job folder, and
launches a detached local worker.claude -p in that folder. Claude uses its existing
subscription login to research the source and write scene.html.local/render.mjs --check and the worker then
renders it with Playwright's Chromium headless shell and ffmpeg-static.GET /api/jobs/<id> reads the local state file for progress, and
GET /api/videos/<id> streams the finished MP4 with range support.Rendering runs at roughly real time: a 30 s film takes 30-40 s on a MacBook Pro.
<video>, <audio>, <iframe>, CSS transitions, Math.random, or
external images in a scene; the worker prompt and renderer enforce this so
renders stay deterministic.node scene-check command. It does not grant arbitrary shell access.| Problem | Check |
|---|---|
| Job fails immediately | Run claude auth status; it must report loggedIn: true. |
| Renderer cannot launch Chromium | Re-run npm run setup-local from the repository root. |
| Job says scene validation failed | Read web/.local-jobs/<job-id>/claude.log; Claude's generated scene.html is alongside it. |
claude is not found | Set CLAUDE_COMMAND to its full path before starting npm run dev. |
10 commits
4 commits
TypeScript
65.6%
JavaScript
32.8%
CSS
1.6%
Paste a URL or a prompt, get a launch video. Opus 5.5 writes HTML and renders a video out of it locally via ffmpeg
TypeScript
1
14 commits
updated Sep 25, 2026
Paste a URL or a prompt, get a 20 to 40 second launch video. No video model:
Claude Code writes a single HTML film, then this Mac renders it frame by frame
in headless Chromium and encodes it with ffmpeg. It uses the existing Claude
Code login, so it does not require ANTHROPIC_API_KEY, Vercel, or a Blob
store.
This fork is intended for local use. It launches Claude Code and renders video on the same machine running the Next.js app.

local/ local Claude Code worker and Playwright + ffmpeg renderer
web/ Next.js app, local job API, and local MP4 streaming route
Requirements:
# Clone your fork and use the local-first branch.
git clone git@github.com:ndom91/shipvideo-local.git
cd shipvideo-local
git switch local-claude-run
# Install deps including playwright and it's copy of headless chromium
npm run setup-local
# Start the web app where you can enter any prompt / URL input to generate a video
cd web && npm install && npm run dev
Open http://localhost:3000 and submit either a URL or a brief.
The defaults require no environment file. Optional environment variables:
| Variable | Default | Purpose |
|---|---|---|
CLAUDE_MODEL | opus | A Claude Code model alias, such as sonnet or opus. |
CLAUDE_COMMAND | claude | Path to the Claude Code executable if it is not on PATH. |
For example:
CLAUDE_MODEL=sonnet npm run dev
Run that command from web/ after installing dependencies.
Each request gets an isolated directory at web/.local-jobs/<job-id>/:
job.json: validated form input.scene.html and scene.json: Claude's generated film and duration.claude.log: Claude Code and renderer output for debugging.video.mp4: completed output.state.json: job status consumed by the UI.These directories are ignored by Git. The completed MP4 is streamed locally at
/api/videos/<job-id>; it is not uploaded anywhere.
POST /api/jobs validates the input, creates an isolated job folder, and
launches a detached local worker.claude -p in that folder. Claude uses its existing
subscription login to research the source and write scene.html.local/render.mjs --check and the worker then
renders it with Playwright's Chromium headless shell and ffmpeg-static.GET /api/jobs/<id> reads the local state file for progress, and
GET /api/videos/<id> streams the finished MP4 with range support.Rendering runs at roughly real time: a 30 s film takes 30-40 s on a MacBook Pro.
<video>, <audio>, <iframe>, CSS transitions, Math.random, or
external images in a scene; the worker prompt and renderer enforce this so
renders stay deterministic.node scene-check command. It does not grant arbitrary shell access.| Problem | Check |
|---|---|
| Job fails immediately | Run claude auth status; it must report loggedIn: true. |
| Renderer cannot launch Chromium | Re-run npm run setup-local from the repository root. |
| Job says scene validation failed | Read web/.local-jobs/<job-id>/claude.log; Claude's generated scene.html is alongside it. |
claude is not found | Set CLAUDE_COMMAND to its full path before starting npm run dev. |
10 commits
4 commits
TypeScript
65.6%
JavaScript
32.8%
CSS
1.6%