◔Clawfog

In production

MADHOUSE

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 album22generated per run
Output1920 × 1080 · H.264≈ 1 hour, AAC 256k
Render rate197 fpspreset 04, NVENC
Shader presets4hand-written GLSL
Publishing pace2 / day / channelscheduled automatically
Hosts1private network only

Preset 04 — spectrum, 56 bands06 · After Hours Pressure

20 Hz2001k5k20 kHz

Tracklist

  1. 04Locking Up the Warehouse
  2. 05Night Shift Groove
  3. 06After Hours Pressure
  4. 07Warehouse After Hours
  5. 08Late Shift Grooves

01

Eight stages, each fed by the one before it

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.

StageProducesWorked 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

Four scenes, written by hand in GLSL

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.

PresetTreatmentTechnique
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

Measurements, with the method attached

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.

FigureValueHow it was obtained
Encoder gain2.5 ×

NVENC 235 fps against x264 95 fps, same scene, same source, same machine.

Render rate197 fps

Preset 04 at 1080p with tracklist and per-song artwork drawn, 180-frame run.

Scheduling cost51 units

One read plus one write per video. Description rides the same write, which is why it is 51 and not 102.

Playlist cost50 units

Per video inserted — as expensive as scheduling it, so inserted videos are recorded and never re-sent.

04

One machine, and it is not on the internet

What it runs on

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.

  • SQLite per workspace in WAL mode — no database server to operate
  • The render daemon is its own process, so restarting the web app cannot strand a job
  • Every stage records where it stopped, so a restart resumes instead of repeating

Reachable only from its own network

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.

  • Google credentials never leave the machine and never reach the browser
  • Uploads are done by hand in YouTube Studio — the app never uploads for you
  • The privacy policy lists exactly what is stored

05

Built for one operator, on purpose

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.

hello@clawfog.com →