πŸ“ˆ GH Trending Explorer 🎲 Surprise me

← all repos

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)

2026-10-20 Β· 2,947 β˜… 2026-10-23 Β· 3,280 β˜…
LanguageTypeScript
LicenseMIT
Created2026-09-24 (28d ago)
Last push17d ago
Watchers10
OwnerUser

Links

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