mexicat / pdoom-video
git clone https://github.com/mexicat/pdoom-video.git
Code-rendered music video for "I'm Upping My P(doom)"
+92
stars, 24h Β· #409
+~777
stars, 7 days Β· #278
+3.3k
stars, 30 days Β· #255
3.3k
β
total Β· +31% this week
359
forks Β· 2 open issues
Star history (as recorded here)
LanguageTypeScript
LicenseMIT
Created2026-09-24 (28d ago)
Last push17d ago
Watchers10
OwnerUser
Links
- GitHub: github.com/mexicat/pdoom-video
- Releases Β· Issues Β· Hacker News mentions
README excerpt
# I'm Upping My P(doom) β music video A generative, code-rendered music video with word-synced karaoke typography. Every frame is a deterministic function of song time, so the live preview in the browser and the offline 1080p60 (or 4K60) export are identical. **Watch it in 4K on YouTube:** https://www.youtube.com/watch?v=5EoO5413dBY The YouTube upload is a slightly outdated render. For the latest and best-quality version, render it locally (see Render the video). The video was made with Claude (Opus 5.5) in Claude Code: the concept and treatment, the lyric alignment and audio analysis, the renderer, every scene and the renders were all worked out in conversation with Claude. The song is not ours: see Credits for who wrote and made it. The concept, style bible and plate-by-plate treatment are in `docs/TREATMENT.md`. The engine and scene API are documented in `docs/ENGINE.md`. ## Layout - `audio/pdoom.mp3` β the song (the Claude-Pop version, see Credits). - `lyrics/lyrics.src.js` β the original line-level lyrics (approximate timings). - `analysis/` β Python (uv) tools that produced the timing data: Demucs stem separation, CTC forced alignment cross-checked with Whisper, beat/downbeat/onset analysis. See `analysis/align.py` and `analysis/analyze.py`. - `data/lyrics.json` β word-level (and some syllable-level) lyric timings. - `data/audio.json` β tempo (132.007 BPM), beats, downbeats, sections, drum/vocal onsets and loudness envelopes. - `app/` β the renderer: TypeScript + three.js, bun + Vite. - `src/engine/` β renderer core: timeline playback, post-processing (bloom, halation, grain), typography (Archivo, IBM Plex Mono, Cormorant Garamond, single-stroke plotter fonts), GPU line batches, HUD. - `src/scenes/` β one module per plate (`open`, `loss`, `prompt`, `hook`, `room`, `shoggoth`, `spacetime`, `ascent`, `bureau`, `leftturn`, `paperclips`, `fuse`, `stack`, `dense`, `loom`, `ilya`, `outro`) plus shared motifs. - `src/timeline.ts` β the edit: scene windows anchored to lyric lines and snapped to the beat grid. - `scripts/render.ts` β offline renderer (headless Chrome β raw frames over WebSocket β ffmpeg). - `out/` β renders (not in the repo). ## Requirements bun, Google Chrome (the offline renderer drives it headless through playwright-core) and ffmpeg with libx264. The analysis tools need uv; the renderer doesn't. ## Preview [code] Open http://localhost:5173 and use the keys below. `?t=23` starts at a given time. | Key | Action | |---|---| | space | play / pause | | β / β | seek Β±1 s (Β±5 s with shift) | | `,` / `.` | step one frame | | `[` / `]` | previous / next scene | | `l` | loop the current scene | | `h` | hide the UI | The preview renders in real time on a recent Mac. The export is not real time and is heavier. ## Render the video [code] - **Output:** 1920Γ1080 at 60 fps, x264 CRF 16, AAC audio. - **Motion blur:** every frame is the average of many sub-frames spread over a short shutter (`--shutter 0.2`, a fifth of the frame time), so