
▲ 17 r/wiim
AirPlay 2 on the WiiM Ultra via Docker — lossless, cover art on display, and videos won't interrupt your music
Like many here, I love my WiiM Ultra but miss AirPlay. This is the AirPlay 2 equivalent: no spare device needed, and with a few extras that only AirPlay 2 makes possible.
What you get
- A real AirPlay 2 endpoint in Control Center. The key difference from AirPlay 1 / Bluetooth / USB: AirPlay 2 routes audio per-app, so your music keeps playing on the Ultra while you scroll short videos or game on your phone
- Lossless CD quality: the AirPlay PCM is repackaged as FLAC — no lossy transcoding anywhere in the chain
- Now playing on the Ultra's display: title, artist, album and full-size cover art, refreshed on every track change (also visible in the WiiM Home app)
- Volume integration: the iPhone volume slider drives the Ultra's hardware volume, with a configurable safety cap
- Fully automated: pick the endpoint, press play — the bridge starts/stops the Ultra by itself
What you need
- Any always-on box on your LAN that runs Docker: a NAS (Synology/QNAP/Unraid), a Pi, a mini PC…
- The Ultra and the Docker host on the same subnet (mDNS needs to reach both)
That's it — two containers, ~90 MB total, negligible CPU.
Setup
git clone https://github.com/shinn-y/airplay2-dlna-bridge
cd airplay2-dlna-bridge
cp .env.example .env # edit two lines: HOST_IP (Docker box) and RENDERER_IP (your Ultra)
docker compose up -d --build
Pick "AirPlay 2 Bridge" on your iPhone and play. (The name is changeable in shairport-sync.conf.)
How it works
iPhone ──AirPlay 2──▶ shairport-sync ──PCM──▶ bridge ──FLAC/HTTP──▶ WiiM Ultra (DLNA)
shairport-sync does the AirPlay 2 heavy lifting; a small Python bridge re-serves the audio as a FLAC stream and drives the Ultra over standard UPnP.
Honest limitations
- Latency is ~4–6 s (AirPlay 2 clock + the Ultra's own HTTP prebuffer). Perfect for music, useless for video sync — keep using BT/optical for that
- Track changes have a ~2–4 s gap when display updates are on. This one is a WiiM firmware constraint, not a bridge bug: the display only renders DIDL metadata (it ignores ICY in-stream tags in every mode — verified via the HTTP API), and the firmware restarts the stream on every metadata update. If you'd rather have fully gapless audio with a static display, set
DIDL_PUSH=0in.env— your choice - No multiroom with real AirPlay 2 speakers (HomePods etc.) — the Ultra's buffering makes sync impossible, protocol-level, unfixable. Grouping other WiiM/LinkPlay speakers behind the Ultra in the Home app works fine though
u/Brief_Mud_5882 — 3 days ago