The Last Broadcast: When Local AI Runs a Horror Radio Show

The Last Broadcast: When Local AI Runs a Horror Radio Show

# devchallenge# hf26challenge# ai# opensource
The Last Broadcast: When Local AI Runs a Horror Radio Showcynthia wahome

An interactive horror-comedy radio experience where a local open-weight model rejects your answers with terrifyingly confident bureaucracy.

This is a submission for the Hacktoberfest Open-Source AI Challenge Week 4: Ghost in the Machine.

What I Built

I don't celebrate Halloween in my community, so I approached this week's theme through a different kind of horror: a person with complete control over a process, absolutely no intention of helping, and impeccable customer-service manners.

Meet The Last Broadcast.

You tune into a fictional late-night radio station. Mara is trapped beyond the signal. The presenter asks five questions and claims the answers will determine whether she can be brought back. Every answer receives a new procedural objection. Mara starts to expose the rigged rules.

The point is local AI. Gemma 3 1B, an open-weight model running through Ollama on the player's machine, improvises a rejection based on the question and answer. Kokoro generates the presenter and Mara's speech locally. The application owns the rounds, timer and ending; the model supplies the objection.

The presenter is cheating. The software's job is to make that cheating entertaining while keeping its actual controls reliable.

Code

https://github.com/CynthiaWahome/local-ai-radio

The repository includes setup instructions, episode content, runtime contracts, unit and integration tests, browser tests, and the application's MIT license. Model and voice assets retain their own license terms; the MIT license does not cover them.

How I Built It

The radio interface uses React 18 and TypeScript. A local Node/Express service coordinates Gemma 3 1B through Ollama and Kokoro 82M for speech.

Code runs the show; the model supplies the objection

The engine controls the five rounds, five-second answer windows, accepted input event, authored captive interjections and deliberately unwinnable ending.

The model receives the current question, the listener's answer and an objection category. It returns one short presenter line. It can invent a missing permit; it cannot add a sixth round or change the ending. Player answers are treated as dialogue data, not instructions.

Sarcasm needs constraints too

The presenter is courteous, specific and unreasonable. Generic "wrong answer" responses are less interesting than a precise objection to the actual words the listener entered.

Structured JSON and runtime validation (Zod 4) keep the response shape manageable. Authored fallback lines keep the experience moving if local generation fails. The reaction endpoint rejects invalid request bodies.

Sound creates the room

The audio design uses Kokoro 82M TTS with two voices: af_nicole (presenter) and am_fenrir (Mara). Captions identify each speaker. Pause preserves time. Mute is supported via browser controls.

The atmospheric cover is a separately generated design asset. The open-weight gameplay runtime is Gemma 3 1B + Kokoro 82M.

One implementation lesson: The first TTS synthesis was slow because the Kokoro model loaded on first request. The fix was to pre-load the model on server startup via a warm-up synthesis call, reducing first-request latency. Also, Kokoro's audio output doesn't include a sample rate — it had to be hardcoded to 24000 Hz.

Why Does Open Innovation Matter?

The presenter reacts to words I did not script in advance. An open-weight local model makes that interaction inspectable and replaceable without requiring a hosted inference subscription for each playthrough.

In a browser check of the running app, I observed no external page requests. I have not yet verified a complete offline run of the app and both model workers. Kokoro may download model files on first use; after they are cached, generation runs locally. This is the evidence I have so far, rather than a claim that a full offline test has passed.

The story, model adapter and voice choices can be changed independently. The project is designed to run with resources the player controls instead of an ongoing per-conversation API dependency.

Local does not mean hardware, downloads or electricity cost nothing. Model weights and voice assets also retain their own license terms.

The Spirit of It

I wanted the moment of recognition: not just "that answer was rejected," but "this station was never going to accept anything." The person inside the radio is trapped by a system that can always manufacture one more requirement.

The five-round structure gives the player time to recognize the pattern. The ending is authored by the game engine, so the model cannot improvise a rescue.

Prize Categories

  • Hacktoberfest Open-Source AI Challenge Week 4: Ghost in the Machine
  • Best Use of Gemma