Skip to content
Naoufal Andichi
Projects/mobile-app

Radio Naoufal

A skeuomorphic 1980s boombox on your Mac with 35+ Dutch radio stations and live audio-reactive VU meters.

No image

A boombox that isn't a picture

Most radio apps look like a Spotify clone. Radio Naoufal does the opposite: a native macOS app whose centrepiece is a complete 1980s boombox, drawn in SwiftUI. Twin speakers with pulsing dust caps, analog VU meters with live needle movement, a cassette deck as the Now Playing display with spinning reels, an FM tuner dial and chrome volume/balance knobs. The power LED breathes.

Skeuomorphism as a deliberate choice — not as a joke, but because the tactile metaphor turns listening into something physical.

Real audio reactivity, not fake FFT

The VU meters and EQ bars are not fake animations on a timer. Under the hood an MTAudioProcessingTap intercepts raw audio frames from AVPlayer and forwards them to a vDSP FFT, with per-channel RMS for the VU meters and 16 logarithmically spaced frequency bands for the EQ bars. The result: meters that genuinely respond to the signal, even during silences in a talk show.

A serious Dutch station list

The curated list contains 35+ Dutch stations: every NPO channel, FunX, Sky Radio, 538, Qmusic, Radio 10, Veronica, 100% NL, SLAM!, BNR, Sublime, KINK, JOE, Arrow Classic Rock, RADIONL, Radio Decibel, Radio Noordzee, and every regional broadcaster. On top of that, Radio-Browser integration adds thousands of international streams.

Casting without the hassle

AirPlay is native via AVRoutePickerView. Chromecast runs through ChromecastKit, with a Bonjour-only fallback when ChromecastKit hiccups. Everything mirrors to the macOS Now Playing widget, and the function-row media keys work as expected. A menu bar mini player handles play/pause + volume without switching apps.

Native distribution is its own craft

On macOS 15 (Sequoia) and macOS 26 (Tahoe), Gatekeeper blocks apps without an Apple Developer ID by default. The build script does ad-hoc code signing with hardened runtime — enough to run, not enough to convince Gatekeeper. The DMG therefore ships with a FIRST RUN file containing an xattr command that strips the quarantine attribute. Ugly but transparent: I don't want to pay USD 99 per year for notarisation just to run my own radio.

What it is

Radio Naoufal is a labour of love: native code, no webview, no Electron, just SwiftUI + AVFoundation + Accelerate. An excuse to dive deep into Swift 6 strict concurrency, audio processing and macOS distribution — and an app I use every day while working.

Highlights

  • 01Skeuomorphic boombox UI in SwiftUI: pulsing dust caps, analog VU needles, spinning cassette reels and chrome knobs.
  • 02Live audio-reactive visualisers via MTAudioProcessingTap + vDSP FFT with 16 logarithmically split EQ bars.
  • 0335+ curated Dutch stations (NPO Radio 1-5, FunX, 3FM, 538, Qmusic, Radio 10, plus every regional broadcaster) + Radio-Browser.
  • 04ICY metadata parser for Shoutcast/Icecast streams: artist and track name live in the cassette display.
  • 05Native AirPlay via AVRoutePickerView + Chromecast via ChromecastKit with Bonjour fallback.
  • 06Now Playing widget in macOS Control Center and media-key support via MPNowPlayingInfoCenter.
  • 079 favourite presets with cmd+1..9 shortcuts, recently played, sleep timer with fade-out.
  • 08Full Swift 6 strict concurrency, MIT-licensed, distributed as DMG via GitHub Releases.