
MoodFM
Radio that doesn't exist until you hear it.
Apple Silicon, macOS 14 or later · runs from a checkout: make setup fetches the model weights and builds the Python engine (magenta-rt with MLX) the menu-bar app drives
MoodFM is a menu-bar radio for the Mac whose music is not streamed, licensed, or looped — it is synthesized on the spot, on-device, by Google's Magenta RealTime 2 running under MLX on Apple Silicon. A station here is not a playlist but a JSON file: five prompt anchors (focus, airy, energy, evening, late-night), each a text description of a sound, plus rules for when each one should lead. The engine embeds the anchors once, then continuously blends them into a conditioning vector and generates audio a couple of seconds at a time, forever. In auto mode the blend is steered by context — what app is frontmost, what the calendar says, what time it is — so the music leans toward focus while you work and thins out late at night. Six stations ship: warm analog, lofi hip-hop, jazz, classical, ambient, and acoustic. Editing a station is sound design with a text editor — save the JSON and the engine hot-reloads it mid-stream.
Features
- Generated, not streamed — Magenta RealTime 2 (MLX) synthesizes the audio on-device in real time; no cloud, no catalog, no repeats
- Six stations — warm analog, lofi hip-hop, jazz, classical, ambient, acoustic — each a JSON spec of five prompt anchors, not a playlist
- Auto mode reads the room: frontmost app, calendar, and hour of day drive a mood vector (focus / energy / warmth / density) that picks the blend
- The popover shows its work — current anchor blend with live weights, the mood vector, and what signal produced them
- Stations hot-reload: edit the JSON, save, and the running stream takes the new prompts without a restart
- A station's style suffix carries the genre's hard constraints (ambient's is "no drums, no percussion") so anchors only describe mood
- The engine is a separate daemon on a Unix control socket, with a full CLI — pause, switch stations, set the mood vector by hand
- Adding a station is dropping one JSON file in a folder; the app and engine discover it on their own