iOS Safari does not hate your app. It hates idle audio graphs, background tabs, and anything that looks like it's trying to be a native radio without paying the App Store toll. We spent an unreasonable number of evenings discovering that "the channel went silent" almost never meant the server died — it meant Apple's platform decided our AudioContext had overstayed its welcome.

The failure mode is subtle. Everything looks connected. The WebSocket is fine. Roster updates still flow. But playback stops because the audio pipeline got suspended while the user switched to Messages, locked the phone, or simply stared at a different tab long enough for Safari to get ideas. From the operator's perspective the channel is dead. From our perspective the channel is very much alive and shouting into a muted graph.

Parked listening is our answer to "I want the radio open while I do other things." It's not a hacky autoplay loop so much as a recovery contract: detect suspension, surface it honestly, and give the operator a one-tap path back to live audio without making them rejoin the channel from scratch. We stopped pretending background tabs are first-class citizens on iOS. They're tolerated guests — and guests need a clear way to ring the doorbell again.

Headset and lock-screen behavior adds another layer of comedy. Sometimes the OS routes audio like a pro. Sometimes it routes it to nowhere and waits for you to blame the devs on Discord. We lean on user-visible state — parked, live, recovering — instead of silent auto-healing that fails invisibly. Radio operators trust meters and indicators. Web apps should steal that instinct.

Android has its own gremlins, but iOS is where platform policy meets product promise most aggressively. We're still iterating on parked-listen recovery when networks flap or codecs stall. The north star hasn't moved: a channel should feel like a channel, not a fragile web toy that dies the moment you check your email.