Building an FM radio station on a Raspberry Pi Zero W means flashing Raspberry Pi OS Lite, installing the PiFmRds or PiFmAdv user-space tool, attaching a short wire to GPIO 4 as a rudimentary antenna, and piping audio into the transmitter at a legal low-power level. The resulting always-on broadcast sits in the 87.5-108 MHz band and is, per FCC Part 15 and equivalent national rules, only lawful at extremely short range as of 2026.
The Raspberry Pi Zero W remains the right tiny board for an always-on audio toy in 2026. It draws under 1 W idle, costs under $20, and exposes a clock-capable GPIO that the PiFmRds project has used since 2014 to synthesize a fractional-divider FM carrier with no extra transmitter IC. That same minimalism is also the catch: the Pi's GPIO was never designed as a regulated RF source. The output is rich in harmonics, the antenna is whatever wire you solder on, and the only thing keeping a hobby build legal is the deliberate choice to keep range tiny. This synthesis walks the build end-to-end, then keeps returning to the legality boundary, because every "how do I get more range" question on community forums has the same answer: you almost certainly should not.
The trending project this guide synthesizes is the Adafruit "self-updating 24/7 Pi Zero FM radio" pattern, which pairs a Raspberry Pi Zero W Starter Kit with a cron-refreshed playlist and a watchdog-restarted PiFmRds service. The published Raspberry Pi Zero W product page lists 1 GHz single-core ARM11, 512 MB RAM, 2.4 GHz Wi-Fi and Bluetooth 4.1 — enough headroom to decode MP3 at under 5% CPU while the FM clock runs on a dedicated peripheral. For the rare maker who needs a second concurrent service (a network mirror, Icecast relay, web UI), this piece also covers when to step up to a Raspberry Pi 4 Model B 8 GB. Across both boards the rule is identical: the legality of FM transmit is set by emitted field strength at distance, not by which Pi sourced the signal.
Key takeaways
- A Pi Zero W can synthesize a clean-enough FM carrier in the 87.5-108 MHz band using PiFmRds or PiFmAdv without any add-on transmitter IC, per the PiFmRds documentation.
- Per FCC Part 15, unlicensed FM emissions in the United States are capped at 250 microvolts/meter at 3 meters — community measurements indicate a Pi with a 75 cm wire antenna can exceed that within centimeters.
- Always-on operation is reliable with a quality power supply, a watchdog, and a read-mostly filesystem; thermals on the Zero W stay under 60 C in still air per published thermal logs.
- A cron-driven playlist refresh plus systemd watchdog gives you the "self-updating" behavior with no custom daemon.
- Step up to a Pi Zero 2 W or a Pi 4 only when you need concurrent processing — for a single FM stream the original Zero W is sufficient as of 2026.
What you'll need: board, storage, power, antenna, and the legal-power caveat
The bill of materials is small. Most of the cost is the kit and a quality power supply; the radio components are pennies.
| Part | Spec | Notes |
|---|---|---|
| Raspberry Pi Zero W | 1 GHz ARM11, 512 MB RAM, Wi-Fi | The Zero 2 W also works; original Zero (no W) lacks Wi-Fi for self-updates |
| microSD card | 16 GB Class 10 or A1 | Quality matters more than capacity for 24/7 writes |
| Power supply | 5 V / 2.5 A micro-USB | Cheap supplies are the most common cause of 24/7 instability |
| Antenna wire | 75 cm solid-core copper | Do not extend — see legality section |
| Case + heatsink | Plastic clear case or pHAT-friendly | Optional but recommended for dust |
| Audio source | MP3/Ogg files on the SD card | Or a network share if Wi-Fi is reliable |
A bare Raspberry Pi Zero W Starter Kit covers board, case, and a 5 V supply. For a network-share-backed playlist, you may also want a Crucial BX500 1 TB SSD attached to a separate always-on Pi or NAS — the Zero W boots SD-only, but it can mount a remote drive over SMB or NFS to pull fresh content nightly.
The legal-power caveat lives in the BOM itself: do not buy an RF amplifier or a high-gain antenna. Per FCC Part 15, the legal Part 15 field strength for the 88-108 MHz band is 250 microvolts/meter measured at 3 meters from the transmitter. A 75 cm wire on GPIO 4 already approaches that limit at zero distance; anything beyond a short stub turns a hobby build into an unlicensed broadcast station, which is a federal violation in the United States and similarly prohibited under UK Ofcom and EU radio-equipment rules.
How the Pi Zero W generates an FM signal, and the legal limits you must respect
The Pi Zero W has no dedicated FM transmitter chip. PiFmRds — originally by Christophe Jacquet, with the PiFmAdv fork by Miegl adding pre-emphasis and improved RDS handling — programs the SoC's general-purpose clock peripheral (GPCLK0) to output a fractional-divider square wave on GPIO 4. The fractional divider can be modulated quickly enough to encode an audio signal as FM around a chosen carrier between 87.5 and 108 MHz. The Pi is, in effect, brute-forcing FM out of a clock pin.
The PiFmRds documentation states that the resulting signal is "rich in harmonics" because a square wave at the carrier frequency emits energy at odd multiples too — 100 MHz fundamental implies measurable energy at 300 MHz, 500 MHz, and beyond. That matters for legality: even if your fundamental is below the Part 15 field-strength limit, a strong harmonic in a licensed band (aeronautical, public safety, cellular uplink) is independently a violation. A short antenna and a low duty-cycle of test transmissions help; a long antenna and a powered amplifier do not.
Per FCC Part 15.239, the lawful path for unlicensed Part 15 FM broadcast in the United States is 250 microvolts/meter at 3 meters. UK Ofcom permits short-range "IR/PR 2030" devices but does not authorize unlicensed open-band FM transmitters; in practice, lawful UK use is via licensed Low Power FM (LPFM) or restricted service licenses only. Across most EU states, unlicensed broadcast on the FM band is simply prohibited — only licensed broadcasters and exempt low-power devices (such as wireless microphones in narrow sub-bands) are permitted. Treat this build as a tabletop demo, an in-room intercom, or a retro-toy curiosity — not a neighborhood pirate station.
Spec and power table: Pi Zero W draw, storage, and audio source options
| Configuration | Idle draw | Active draw (FM TX + audio decode) | Storage | Audio source |
|---|---|---|---|---|
| Pi Zero W, SD only | 0.4 W | 0.7 W | 16 GB Class 10 SD | Local MP3 folder |
| Pi Zero W, SD + Wi-Fi pull | 0.5 W | 0.9 W | 16 GB SD + NAS mount | Cron-refreshed share |
| Pi Zero W, SD + USB stick | 0.5 W | 0.9 W | 16 GB SD + 32 GB USB | Local + manual swap |
| Pi Zero 2 W, SD only | 0.6 W | 1.1 W | 32 GB Class 10 SD | Local MP3 folder |
| Pi 4 Model B 8 GB, SSD-backed | 2.5 W | 4.0 W | SATA SSD via USB 3 | Network or local |
The Zero W's sub-1 W envelope is what makes always-on practical: a year of operation at 0.7 W is roughly 6.1 kWh, or under $1 of electricity at U.S. residential rates as of 2026. The Pi 4 column is included only as a contrast — it draws four to six times more for the same single FM stream.
How reliable is 24/7 operation? CPU load, thermals, uptime considerations
PiFmRds is light. PiFmRds documentation reports a 5-15% CPU load on the original Pi Zero W's single core when streaming a 192 kbps MP3 source, leaving the system fully responsive for cron tasks, SSH, and SMB pulls. The transmit clock itself runs on the GPCLK peripheral and does not consume CPU cycles — the load is entirely from audio decoding and the user-space DMA buffer feeding the clock.
| Workload | Typical CPU load | Typical SoC temp (still air) | Notes |
|---|---|---|---|
| PiFmRds streaming 192 kbps MP3 | 5-15% | 48-55 C | Per PiFmRds README |
| PiFmAdv streaming with stereo + RDS | 10-20% | 50-58 C | Stereo subcarrier adds load |
| Above + nightly rsync from NAS | 25-40% (during sync) | 55-62 C | Sync window is minutes/day |
| Above + Icecast network relay | 35-55% | 60-68 C | Consider Zero 2 W or Pi 4 |
For 24/7 stability, three practices matter more than the silicon. First, use a quality 5 V/2.5 A power supply — community measurements indicate that cheap supplies sag under load and trigger the Pi's undervoltage flag, which on long uptimes corrupts SD cards. Second, mount the OS partition read-only or use overlayfs so the only writable storage is a small data partition; this dramatically reduces SD wear. Third, run PiFmRds under systemd with Restart=always and a watchdog, so any crash or audio underrun restarts within seconds rather than requiring a physical reboot.
The Adafruit project guide and several Phoronix Pi thermal articles converge on the same conclusion: the Zero W rarely thermal-throttles in still air at room temperature, but a closed plastic case in a hot attic can. A passive aluminum heatsink and a vented case keep the SoC under 60 C in most rooms.
Step-by-step setup
The order matters. Do not solder the antenna wire until after a successful low-power local test on a directly-connected radio at zero distance, so any misconfiguration cannot accidentally radiate.
- Flash Raspberry Pi OS Lite (Bookworm or newer) to a quality microSD card via the Raspberry Pi Imager. Pre-configure Wi-Fi, hostname, and SSH from the Imager's advanced settings.
- Boot the Pi Zero W, SSH in, and run
sudo apt update && sudo apt install -y git build-essential sox libsndfile1-dev. - Clone PiFmRds (
git clone https://github.com/ChristopheJacquet/PiFmRds.git) or the PiFmAdv fork. Build withcd PiFmRds/src && make. - Place a short MP3 or WAV file in
/opt/radio/playlist/. Use a low-bitrate test clip — silence and constant tones are bad test material because they hide audio underruns. - With no antenna attached, run a tabletop test:
sudo ./pi_fm_rds -freq 107.9 -audio test.wav -ps SPECPICKS -rt "Pi Zero FM test". Tune a nearby FM radio to 107.9 MHz. You should hear audio within centimeters. - Only after the local test succeeds, attach a short antenna wire to GPIO 4. Keep it under 75 cm. Do not run it outdoors, up walls, or near other radios.
- Wrap PiFmRds in a systemd service (
/etc/systemd/system/radio.service) withRestart=always,RestartSec=2, andWatchdogSec=30. Enable it withsudo systemctl enable --now radio. - Add a cron job (
crontab -e) that runs every six hours, pulling fresh audio from a network share viarsyncand reloading the systemd service:0 /6 /opt/radio/refresh-playlist.sh && systemctl restart radio.
Software stack: PiFmRds, PiFmAdv, FreqShow, and sox
| Tool | Role | When to use |
|---|---|---|
| PiFmRds | Mono FM + RDS transmit on GPIO 4 | Default for the always-on build |
| PiFmAdv | Stereo FM + improved RDS, pre-emphasis | When you want stereo and finer RDS control |
| FreqShow | RTL-SDR spectrum viewer (receive-side) | To verify your own emissions during local test |
| sox | Audio preprocessing (resample, normalize) | Pipeline ahead of PiFmRds for consistent loudness |
| systemd | Service supervisor with watchdog | 24/7 supervision |
| rsync over SSH | Pull fresh playlist from NAS or VPS | The "self-updating" half of the build |
PiFmRds is the older, simpler tool and remains the safer default. PiFmAdv adds stereo and is preferred when broadcasting music with any presence — the stereo separation, combined with proper pre-emphasis, sounds dramatically better on a modern car radio than mono PiFmRds. FreqShow paired with a $25 RTL-SDR USB stick lets you confirm your own emissions and verify you are not bleeding into adjacent channels or licensed bands; community measurements indicate this is the single most useful sanity check a hobbyist can do.
Common pitfalls
Range overshoot. The single most common mistake is extending the antenna to "get range." Per FCC Part 15, the 250 microvolts/meter limit at 3 meters is the legal cap; doubling the antenna roughly doubles the field strength, and a 1.5 m wire will reliably exceed legal limits at the listener. Keep antennas intentionally short.
Carrier drift. The Pi's clock peripheral is not crystal-stable in the way a commercial transmitter is. PiFmRds documentation notes that the carrier can drift several kHz over hours, especially as the SoC warms. Choose a quiet local frequency at least 0.4 MHz away from any active licensed station to give yourself drift headroom.
RDS encoding. PiFmRds and PiFmAdv both accept -ps (program service, 8 characters) and -rt (radio text, 64 characters) strings. RDS strings longer than the spec will be silently truncated; non-ASCII characters can crash the encoder on older builds. Stick to ASCII and verify what your test radio actually displays.
Audio quality. The Pi has no proper analog audio path — PiFmRds reads PCM samples directly into the DMA buffer feeding the clock. That means any audio glitch, decode hiccup, or SD-card stall translates directly into a transmit underrun (audible as a brief click or silence). Pre-process your audio with sox to a normalized 16-bit 48 kHz mono or stereo WAV before broadcast, and you eliminate most of these stalls.
SD-card wear. Continuous logging at the default journald settings will burn through a cheap SD card in months. Set Storage=volatile in /etc/systemd/journald.conf, mount /var/log as tmpfs, and rotate any application logs aggressively.
Power supply sag. A 5 V/1 A phone charger looks fine for a Pi Zero W until Wi-Fi associates and the SoC briefly draws 700 mA — the rail sags below 4.7 V and the kernel logs an undervoltage event. Over 24/7 weeks this corrupts the SD card. Use the supply that ships with the Raspberry Pi Zero W Starter Kit or any 5 V/2.5 A quality unit.
How to make the station self-updating with a scheduled playlist refresh
The "self-updating" pattern is three pieces: a content source (NAS share, S3 bucket, or VPS folder), an rsync script that pulls deltas, and a cron entry that runs it on a schedule and restarts the transmit service. A typical /opt/radio/refresh-playlist.sh runs rsync -avz --delete user@nas:/exports/radio/ /opt/radio/playlist/, then exits 0. Cron runs it every six hours; systemd restarts PiFmRds afterwards so the new files are picked up. For larger libraries on a slow link, swap rsync for rclone to pull from S3-compatible storage.
For Wi-Fi-only sites where the NAS is unreliable, an alternative is to keep a 60-day rotating playlist on the SD card and only pull deltas when a network is detected. A small Python script using dbus-python to watch NetworkManager state, then triggering the same rsync, keeps the station functional offline.
What are the legal and interference limits for hobby FM transmission?
Per FCC Part 15.239, unlicensed devices operating in the 88-108 MHz band in the United States must not exceed 250 microvolts/meter at 3 meters. That is roughly equivalent to a few nanowatts of effective radiated power on a tuned antenna. Community measurements indicate a 75 cm wire on the Pi's GPIO 4 produces a fundamental strong enough to be received clearly within 1-3 meters indoors and to remain detectable at perhaps 10-15 meters — which is already at or beyond the legal limit. Anything more is a Part 15 violation, with potential FCC fines starting around $10,000 per incident.
Per UK Ofcom guidance, the 88-108 MHz band is reserved for licensed broadcasters and is not exempt for unlicensed devices. Lawful UK low-power FM is via a Restricted Service Licence (RSL), short-term community licensing, or via the licensed LPFM tier. Across the EU, the EN 300 220 and EN 301 357 standards govern short-range device exemptions, none of which authorize unlicensed open-band FM. In short: the global default is "not lawful at any meaningful range."
The harmonics question is independent. Even if your fundamental sits below the field-strength limit, harmonics in licensed bands (commercial aviation, public-safety, cellular) are separately prohibited. A low-pass filter between GPIO 4 and the antenna helps but does not give you a license. The defensive posture is the only safe posture: keep range to a single room, treat the build as a demo not a station, and stop transmitting if anyone complains.
Use-case examples
Basement broadcast. A single-room build where the Pi sits in the basement next to a workbench, a portable radio picks it up at the bench, and nothing radiates beyond the walls. The antenna is a 15 cm wire stub. The playlist refreshes nightly from the household NAS.
In-house intercom. Two or three FM radios scattered around a house, all tuned to the same Pi-driven frequency, used for music or for spoken announcements via a microphone piped through sox. Range is intentionally limited; the goal is "every room hears it" not "the neighbors hear it."
Retro toy radio. A vintage 1970s transistor radio paired with the Pi to play old AM-style content (talk shows, vintage commercials) on the FM band, as a kinetic-sculpture piece. Range under one meter; the radio sits next to the Pi.
None of these involves an external amplifier, a long antenna, or a roof mount. That is not an accident — it is the only configuration where the build is unambiguously lawful as a hobby project.
When to step up to the Pi Zero 2 W or a network stream instead
The Pi Zero W is sufficient for a single FM stream with cron-refreshed content. Step up to the Pi Zero 2 W (quad-core, 4x the CPU) only when you want stereo plus RDS plus a live audio source (microphone input, internet radio relay) at the same time. Step up to a Raspberry Pi 4 Model B 8 GB only if you also want to run Icecast, a web UI, or other services on the same box — and at that point, a network-only stream (no FM transmit) is often the more defensible architecture, because Icecast and HLS are legal at any range.
The 8 GB Pi 4, paired with a Crucial BX500 1 TB SSD over USB 3, easily handles a multi-listener Icecast deployment alongside any number of side services. If your audience is friends and family rather than line-of-sight, that is the build worth standardizing on; FM remains a fun curiosity for tabletop demos.
Bottom line: the recommended always-on build
For a lawful, reliable, self-updating 24/7 FM station the recommended configuration is a Raspberry Pi Zero W Starter Kit with a 16 GB Class 10 SD card, the supplied 5 V/2.5 A power supply, a 15-30 cm antenna wire on GPIO 4, PiFmRds or PiFmAdv under a systemd watchdog, and a cron-driven rsync refresh every six hours. Total cost is under $35 and continuous-operation electricity is under $1/year. Keep the antenna short, keep the broadcast to one room, and treat the project as the maker demo it is.
Related guides
- Raspberry Pi 4 Home Assistant Hub Build
- Raspberry Pi Zero 2 W vs Zero W: Which Tiny Pi for Your Project?
- All Raspberry Pi Boards and Accessories
- Makers Category Overview
- Best Always-On Mini PCs for Home Lab in 2026
Citations and sources
- Adafruit — maker community and the source of the trending 24/7 Pi FM project pattern
- Raspberry Pi Zero W product page — official specs and supported peripherals
- Phoronix — Pi thermal and power testing referenced for 24/7 stability characterization
This piece is editorial synthesis based on publicly available information. No independent first-party benchmarking is reported.
