Six bash scripts, a $10 Pi, and a personal FM station

Six bash scripts, a $10 Pi, and a personal FM station

Trwmato's Pi-FM-Kitchen-Radio turns a Raspberry Pi Zero W and a $10 car Bluetooth FM transmitter into a 24/7 personal radio station — no soldering, no PCB, no GPIO. Six shell scripts handle playlist generation, RSS podcast downloading, content rotation, and Bluetooth routing, all managed by a systemd service that starts on boot. Full BOM is $30–50; build time is 2–4 hours. The project hit 550 Reddit upvotes and 148 Hacker News points within three weeks of its original post.

Hardware Hackers DIY Pick
14/6/2026 · 1:20
4 suscripciones · 5 contenidos
Difficulty: Beginner-to-Intermediate · BOM total: $30–70 · No soldering · No PCB · Source code on GitHub (Shell)
The premise is almost absurdly simple: a Raspberry Pi Zero W, a cheap car Bluetooth FM transmitter, and any kitchen radio you already own. No PCB, no GPIO wiring, no soldering iron. Six bash scripts run a 24/7 curated radio station that broadcasts your own mix of podcasts, hourly news, music, and station jingles — received on any FM receiver in the house, the same way commercial radio has worked for a hundred years.
Trwmato (Reddit user Important_Sector_905), a UK transplant living in New Zealand, built this to escape what he called a screen-time problem and a local-radio problem at once. New Zealand stations couldn't satisfy his appetite for British content and niche podcasts, and Spotify required a screen. 1 His solution: make the kitchen radio play exactly what he wanted, passively, without looking at anything.
Hackaday covered the project on June 9, 2026 under the headline "Custom FM Radio Station Powered By Shell Scripts." 2 Reddit gave the original post 550 upvotes at a 98.6% ratio, and Hacker News independently surfaced it to 148 points and 55 comments. 1 3 The author's own framing is worth keeping:
"I'm new to both Linux and Raspberry Pi so I've probably developed some hacky ways of making things work. Built using bash as I don't know anything else."
— Trwmato, GitHub README 4
That's not false modesty — the project genuinely runs on nothing but shell, and it works.

What makes this stand out

Most Pi radio projects take one of two routes: they run an Icecast streaming server (requires an app or a browser on the listener end) or they use a dedicated FM transmitter HAT wired to the GPIO (requires hardware assembly and licensing scrutiny). This project does neither. The Pi pairs over Bluetooth to a commodity 12V car FM transmitter — the same £10 gadget you'd use to play phone music through an old car stereo. The transmitter then rebroadcasts on whatever FM frequency you tune it to, and the kitchen radio picks it up a few metres away.
The coverage radius of a car-type FM transmitter is a handful of metres, not a city block. That keeps it entirely in personal-use territory. As Korben.info's Vincent Lautier put it: "No need to worry about legality — the transmitter carries a few metres, like the ones in cars, far from the pirate radio that blankets a whole neighbourhood." 5
The other thing that stands out is the content model. This isn't just a music shuffler. make_playlist.sh generates each play session from a configurable block sequence — the default being JINGLE → NEWS → MUSIC → JINGLE → SHOW → MUSIC → JINGLE → NEWS → MUSIC → SHOW → MUSIC → JINGLE → MUSIC → SHOW → MUSIC → EGG — where each block type draws from a different content directory. 6 7 NEWS slots pull the latest BBC or RNZ hourly bulletins downloaded by podget. SHOW slots grab your subscribed podcasts, prioritising fresh episodes and falling back to a backup library when the queue runs dry. EGG slots play hidden audio oddities ("Easter eggs") you drop in a dedicated folder. The whole thing feels like radio because it's programmed like radio.

Bill of materials

No distributor order required beyond your existing channels — every part here ships from Amazon or AliExpress in a day or two.
PartRoleQtyEst. cost
Raspberry Pi Zero WMain compute; runs Raspberry Pi OS + all scripts1$10–15
Bluetooth FM transmitter (12V car type)Converts Bluetooth audio to FM broadcast1$10–15
microSD card (16 GB+, 32 GB recommended)OS + podcast/music storage1$5–10
Micro USB power adapter (5V/2A)Powers the Pi Zero1$5–10
FM radio receiverReceives the broadcast1$0 if you have one; $10–20 new
Core new-purchase total: $30–50. If you already own an FM radio (which is the point — most kitchens do), the transmitter and Pi are the only real expenses. 4
No NAS is required for a basic setup — the Pi itself can hold a music library on its SD card, or you can mount a Samba share from any machine on your network. samba is listed as a dependency in the README for exactly this use case.
Raspberry Pi Zero W labeled 'KITCHEN FM' on a kitchen counter next to a car FM transmitter and a vintage Roberts radio with glowing FM dial
The full hardware kit: Pi Zero W, a $10 car Bluetooth FM transmitter (showing 94.3 FM), and a vintage kitchen radio receiving the broadcast. AI-generated illustration.

Signal path and "schematic"

This project has no circuit schematic in the traditional sense — there is no GPIO wiring, no breadboard, no custom PCB. The signal path is:
RSS feeds / local files → podget download → bash scripts → cvlc (VLC command line) → BlueALSA → Bluetooth → FM transmitter → FM radio
The system-level "wiring" is the Bluetooth pairing between the Pi and the transmitter. Once that bond is stored on the Pi, current_bt_speaker.sh detects the transmitter's MAC address at startup and radio_loop.sh routes audio to it via BlueALSA (the Bluetooth ALSA backend). 8 9
The directory layout is the other half of the "schematic." A ~/radio/ tree holds 12 subdirectories that define what goes on air:
~/radio/
  dailyshow/      podcasts: play once, then delete
  weeklyshow/     podcasts: play once, then archive
  backupdaily/    fallback pool — up to 25 files
  backupweekly/   fallback pool — up to 50 files
  news/           hourly bulletins from BBC/RNZ
  music/          your music library (or Samba mount)
  maintenance_music/  plays while podget runs
  jingles/        station idents/transitions
  eggs/           hidden audio surprises
  playlists/      generated .m3u files (runtime)
  logs/           podget and script output
  config/         playlist_blocks, podcast URLs
  scripts/        all six .sh files

The six scripts

Cargando tarjeta de contenido…
Each script has a single responsibility. Together they implement a simple state machine: play → maintain → play.
ScriptWhat it does
radio_loop.shMain loop: waits for Bluetooth connection, calls make_playlist.sh, plays the playlist with cvlc via BlueALSA, then hands off to maintenance.sh
make_playlist.shGenerates a .m3u by reading config/playlist_blocks and randomly picking one file from each block's content directory, avoiding repeats within a session
maintenance.shRuns podget to download new RSS episodes, calls curl_retry_failed_podget.sh for any failures, cleans up old files, calls cleanup_show.sh, then returns to radio_loop.sh
cleanup_show.shEnforces content quotas: daily shows deleted after play (max 5/feed kept); weekly shows moved to backupweekly (max 8/feed kept); backup caps: 25 daily, 50 weekly
curl_retry_failed_podget.shReads podget's error log, re-fetches failed URLs with a browser User-Agent; handles mp3, m4a, aac, ogg, opus
current_bt_speaker.shScans for a trusted, connected Bluetooth device and returns its MAC address for the audio routing commands
A systemd service file (radio.service, Type=simple, Restart=always) ensures the whole thing starts on boot and restarts after any crash without manual intervention. 10
One known rough edge worth calling out: podget sometimes fails on BBC feeds, particularly when they use generic filenames like media.mp3. The curl_retry mechanism usually catches these, but the author notes that occasional duplicate episodes slip through — "not enough to be annoying in my experience." 4

Reproduction difficulty

Rating: Beginner-to-Intermediate.
The hardware side is genuinely beginner territory. You flash an SD card, plug in a USB charger, and pair a Bluetooth device — the same three steps as setting up any Pi project. There is no soldering, no level-shifting, no custom PCB.
The intermediate label comes from three specific tasks:
  1. BlueALSA configuration. Getting Bluetooth audio output reliably routed through ALSA on Raspberry Pi OS is the most common sticking point in Pi audio projects, and the author is candid about it: "Getting Bluetooth to work is very annoying — I'd consider removing all the bluetooth functionality and outputting to a USB DAC." 4 Budget an hour for this; search "bluealsa raspberry pi" for current community solutions before starting.
  2. Systemd service setup. Copying a .service file and running systemctl enable is straightforward once you've done it once. First-timers should budget 20–30 minutes to understand the unit file syntax.
  3. RSS feed curation. The podget configuration expects a specific format for feed URLs. Most public podcasts and BBC/RNZ bulletins work without issue, but private or Patreon feeds require token URLs.
Estimated build time: 2–4 hours for a working station; add 1–2 hours to configure your RSS subscriptions and organise a music library. The author built this as a Linux/Pi newcomer, which is a meaningful signal about the ceiling.
No special tools needed beyond a laptop, a microSD card writer, and a phone or another Bluetooth device for initial pairing tests. 2

Community reception

Cargando tarjeta de contenido…
The numbers are unusually strong for a project with no visual demo video and no custom PCB. Reddit's r/digitalminimalism gave it 550 upvotes at a 98.6% ratio with 39 comments, most expressing straight admiration or sharing their own FM transmitter experiments from the early MP3 era. 1 One commenter, PunkRock_Platypus, summarised a common reaction: "Was forwarded this by a friend, awesome project!" 1
On Hacker News, dredmorbius — the submitter — wrote: "I particularly like the idea of curating my own set of podcasts to play as I want to schedule them." 11 The thread drew two independent accounts of builders who had done similar things years earlier: tombert described writing an Erlang-based Icecast server for a comparable use case, 12 and EvanAnderson recalled using a low-power FM transmitter to synchronise music across a wedding venue in 2007. 13 Those responses suggest the project hit a nerve with a specific cohort of builders who had wanted exactly this but never shipped it.
Hackaday noted the extensibility angle: "We could see this as the start of a cool project to have a 'radio station' for a school, organization, or company. It is easy to understand and modify." 2
The GitHub repository had 111 stars and 5 forks at time of research — modest by viral-project standards, but the project is less than a month old and has no LICENSE file yet, which may be limiting forks. 4 If you adapt the code, treat it as rights-reserved until the author clarifies.

Build resources


Añade más opiniones o contexto en torno a este contenido.

  • Inicia sesión para comentar.