Direct naar inhoud
Naoufal Andichi
Projecten/mobile-app

Radio Naoufal

Een 1980s skeuomorfische boombox op je Mac met 35+ Nederlandse zenders en live audio-reactieve VU-meters.

No image

Een boombox die geen plaatje is

De meeste radio-apps zien eruit als een Spotify-kloon. Radio Naoufal pakt het andersom aan: een native macOS app waarvan het hart een complete 1980s boombox is, getekend in SwiftUI. Twee speakers met pulserende dust-caps, analoge VU-meters met live wijzer-bewegingen, een cassette-deck als Now Playing display met draaiende reels, een FM tuner-dial en chrome draaiknoppen voor volume en balans. De power-LED ademt.

Skeuomorfisme als bewuste keuze — niet als grap, maar omdat de tactiele metafoor luisteren tot iets fysieks maakt.

Echte audio-reactiviteit, niet faux-FFT

De VU-meters en EQ-bars zijn geen gefakte animaties op een timer. Onder de motorkap zit een MTAudioProcessingTap die rauwe audio-frames uit AVPlayer onderschept en doorstuurt naar een vDSP FFT, met per kanaal een RMS-berekening voor de VU-meters en 16 logaritmisch verdeelde frequentiebanden voor de EQ-bars. Resultaat: meters die écht reageren op het signaal, ook tijdens stiltes in een talkshow.

Een serieuze NL-zenderlijst

De curated lijst telt meer dan 35 Nederlandse zenders: alle NPO-zenders, FunX, Sky Radio, 538, Qmusic, Radio 10, Veronica, 100% NL, SLAM!, BNR Nieuwsradio, Sublime, KINK, JOE, Arrow Classic Rock, RADIONL, Radio Decibel, Radio Noordzee, en alle regionale omroepen (RTV Noord-Holland, Omroep Brabant, Radio Rijnmond, Omroep West, Radio M Utrecht, Radio Gelderland, Radio Oost, RTV Drenthe, RTV Noord, Omrop Fryslân, L1, Omroep Zeeland). Daar bovenop zit Radio-Browser integratie voor duizenden internationale streams.

Casting zonder gedoe

AirPlay is native via AVRoutePickerView. Chromecast werkt via ChromecastKit, met een Bonjour-only fallback wanneer ChromecastKit haperingen heeft. Alles wordt gespiegeld naar het macOS Now Playing widget, en de fn-mediakeys werken zoals je zou verwachten. Een MenuBar mini-player geeft play/pause + volume zonder dat je naar de app hoeft te switchen.

Native distribueren is een vak apart

Op macOS 15 (Sequoia) en macOS 26 (Tahoe) blokkeert Gatekeeper standaard apps zonder Apple Developer ID. Het build-script doet ad-hoc code signing met hardened runtime — voldoende om te draaien, niet voldoende om Gatekeeper te overtuigen. De DMG bevat daarom een EERSTE GEBRUIK.txt met een xattr-commando dat het quarantine-attribuut verwijdert. Lelijk maar transparant: ik wil ergens niet 99 USD per jaar voor een notarisatie betalen om mijn eigen radio te draaien.

Wat het is

Radio Naoufal is een liefdesproject: native code, geen webview, geen Electron, gewoon SwiftUI + AVFoundation + Accelerate. Een excuus om diep in Swift 6 strict concurrency, audio-processing en macOS-distributie te duiken — én een app die ik dagelijks zelf gebruik tijdens het werken.

Hoogtepunten

  • 01
  • 02
  • 03
  • 04
  • 05
  • 06
  • 07
  • 08