diggerhq / shipvideo
git clone https://github.com/diggerhq/shipvideo.git
Paste a URL or a prompt, get a launch video. Opus 5.5 writes HTML, an OpenComputer serverless agent renders it.
+3
stars, 24h · #8,210
+~28
stars, 7 days · #6,284
+366
stars, 30 days · #2,261
366
★ total · +8% this week
40
forks · 1 open issues
Star history (as recorded here)
LanguageTypeScript
License—
Created2026-09-24 (29d ago)
Last push22d ago
Watchers1
OwnerOrganization
Links
- GitHub: github.com/diggerhq/shipvideo
- Homepage: opencomputer.dev
- Releases · Issues · Hacker News mentions
README excerpt
# LaunchVideo (launchvideo.io)
Live: https://launchvideo.io
Paste a URL or a prompt, get a 20 to 40 second launch video. No video model:
Opus 5.5 writes a single HTML film and a serverless agent on OpenComputer
renders it frame by frame in headless Chromium, encodes it with ffmpeg, and
saves the MP4 to the session workspace so it can be downloaded straight away.
Same mechanism as the "Opus 5.5 is incredible at instructional video
generation" demo (Opus wrote JS, rendered via a headless browser + ffmpeg),
packaged behind a one-field form.
[code]
## Deploy the agent to your own OpenComputer account
One click: https://app.opencomputer.dev/new?repository-url=https%3A%2F%2Fgithub.com%2Fdiggerhq%2Fshipvideo
Or from a terminal:
[code]
The agent works on its own in the playground or the CLI: it writes the MP4 to
`/workspace/videos/ .mp4`, the session's shared workspace, and reports the
path. Download it from the session's workspace files in the dashboard, or with
`opencomputer session files download videos/ .mp4`. The
`web/` frontend adds the form and signs that same file for download.
## How a job flows
1. `POST /api/jobs` validates the input, mints a job id, creates an
OpenComputer session, waits for `runtime.connected`, and sends one turn
whose text is a `JOB` block (job id, mode, input).
2. The agent (url mode) fetches the page with `web_fetch`, which also extracts
title, description, headings, the most used hex colors, and Google Fonts.
3. It writes the film as one HTML document (1920x1080, CSS keyframes or a
rAF loop), runs `check_scene` (loads it under the virtual clock, reports JS
errors and the visible text at several timestamps), fixes, then calls
`render_video`.
4. `render_video` renders every frame with Playwright's arm64 headless shell
under an injected virtual clock (rAF, timers, Date, and CSS/WAAPI animations
are all driven by `__seek(t)`), pipes JPEG frames into a static ffmpeg
(libx264, crf 18, yuv420p, faststart), and copies the finished MP4 to
`/workspace/videos/ .mp4` in the session workspace.
5. `GET /api/jobs/ ?session= ` reads the session's events to derive a
phase, and reports `done` with a signed download URL as soon as
`POST /sessions/ /workspace/download` finds the MP4.
The runtime is a fresh Amazon Linux 2023 arm64 microVM per session (node 22,
dnf, no browser), so the first tool call installs playwright-core, ffmpeg-static,
the Chromium shared libs, and Noto fonts into ~/.shipvideo on the local disk
(about a minute). Rendering runs at roughly real time: a 30 s film takes 30-40 s.
## Run it
[code]
That is the whole setup: the web app needs nothing but the OpenComputer API
key. No object storage, no tokens to hand the agent — the video lives in the
session workspace and the API signs a download for it.
## Gotchas
- Turns carry a plain string (`POST /sessions/:id/turns {input}`), so the job
fields ride in the prompt text and the model copies the job id into
`render_video`.
- No ` `, ` `, ` `, CSS transitions,