In production
A self-hosted pipeline that writes, renders and publishes hour-long music videos.
One recipe goes in. What comes out is an album of original songs, its own cover art, a shader-rendered video, a description with real timestamps, and a slot on the publishing calendar. Nobody sits in the middle of it.
| Songs per album | 22 | generated per run |
| Output | 1920 × 1080 · H.264 | ≈ 1 hour, AAC 256k |
| Render rate | 197 fps | preset 04, NVENC |
| Shader presets | 4 | hand-written GLSL |
| Publishing pace | 2 / day / channel | scheduled automatically |
| Hosts | 1 | private network only |
Preset 04 — spectrum, 56 bands06 · After Hours Pressure
20 Hz2001k5k20 kHz
01
Every stage is resumable on its own. A service restart, a rate limit, or a provider returning an ambiguous 500 does not cost the album — the daemon resumes where it stopped rather than starting over.
| Stage | Produces | Worked by |
|---|---|---|
| 01 Recipe | Genre, mood, market, language, song count Saved per channel and reused for every run on it. |
operator |
| 02 Songs | 22 original tracks with lyrics One job per slot, sent in parallel; failed slots retry without losing finished ones. |
Lyria / useapi |
| 03 Cover | One 2K album cover Upscaled from one of the album's own song covers, so the video's face comes from its own music. |
Google Flow |
| 04 Titles | Album and track titles Written against the target market, deduplicated against everything the channel already published. |
LLM gateway |
| 05 Mix | One continuous audio file Only the ticked songs, in order, with timestamps computed from real durations. |
ffmpeg |
| 06 Render | The finished video A shader scene reads the spectrogram and draws each frame on the GPU. Preview and export share one render spec. |
OpenGL · NVENC |
| 07 Publish | A scheduled, described video The upload is matched to its album by title; schedule and tracklist description travel in one API call. |
YouTube Data API |
| 08 Playlist | Position in the channel playlist Added oldest first, so the order on the page matches the order it was made. |
YouTube Data API |
02
No stock templates and no video editor. Each frame is drawn from the audio itself: the spectrogram, the running volume, and the standard deviation that spikes on a snare.
| Preset | Treatment | Technique |
|---|---|---|
| 01 Visualizer | Radial spectrum around a circular hole The cover breathes behind it; blur only appears when the track gets loud. |
polar · waveform |
| 02 Music Bars | Linear stereo spectrum Left channel below the axis, right above, over a dimmed cover. |
linear · stereo |
| 03 Motion Trails | Reactive ring over its own past frames Movement leaves a tail; the only preset that keeps state between frames. |
temporal · multi-pass |
| 04 Vinyl Pulse | Full-screen cover on a heartbeat envelope Sharp mini cover, title, spectrum and the full tracklist sit on top, with the playing track in red. |
atlas · per-song art |
03
Nothing here is an estimate. Frame rates were sampled on the machine under real load; quota figures are counted per call by the application itself against Google's published table.
| Figure | Value | How it was obtained |
|---|---|---|
| Encoder gain | 2.5 × | NVENC 235 fps against x264 95 fps, same scene, same source, same machine. |
| Render rate | 197 fps | Preset 04 at 1080p with tracklist and per-song artwork drawn, 180-frame run. |
| Scheduling cost | 51 units | One read plus one write per video. Description rides the same write, which is why it is 51 and not 102. |
| Playlist cost | 50 units | Per video inserted — as expensive as scheduling it, so inserted videos are recorded and never re-sent. |
04
A single Linux host with an NVIDIA GPU. A FastAPI service owns the data, a separate daemon owns the render queue and the pipeline tick, and a React dashboard drives both.
The dashboard and the API are published to a private network and nothing else. There is no public port, no shared tenancy, and no third party holding the data.
05
MADHOUSE is Clawfog's own production system, not a product you sign up for. If the approach is useful to you, say so and we can talk.