Luke MacNeil

On airPlaying tonight — Planet Marfa

Software

The Roost engine

Live call-in radio where every caller is a language model — ten concurrent audio streams, five-provider failover, and a post-production pipeline that runs itself.

shippedFastAPI · asyncio · SignalWire · Whisper · Multi-model LLM

Luke at the Roost is a late-night call-in show. The callers are AI. The show is live, which means everything has to work the first time, on air, with no second take.

The constraints are the interesting part

Ten concurrent WebSocket audio streams, each a caller with their own voice, their own generated backstory, and their own reason for calling — all of it running while I talk over the top of it.

Five-provider LLM failover. A model that goes down mid-episode cannot end the episode. A retired model id is worse than an outage: the request 404s, the error gets swallowed, and the caller simply goes silent with nothing in the logs. That one cost a show before it got a regression test.

Seven audio channels recorded concurrently — host, callers, music, effects, ads — as separate stems, so post-production has something to work with. The recorder is lock-free: audio callbacks only append to deques, and a background writer drains them to disk. An earlier version took a lock inside the audio callback and crashed under load, which is exactly the mistake the architecture now makes impossible.

Post-production runs unattended: gap removal, voice compression, music ducking, stereo mix, and loudness normalisation to −16 LUFS.

59 episodes in production. Roughly $3–4 of inference per show.

All software