Playback is a state machine, not a button
The naive model — playing or paused — breaks immediately in real use. A session that has to survive a commute needs to handle:
- Interruptions: calls, alarms, navigation prompts, other apps grabbing audio focus.
- Route changes: headphones disconnected, switching to a car system or speaker.
- Backgrounding and the app being evicted from memory entirely.
- Buffering on poor connectivity, if content is streamed.
- Lock screen and system controls operating independently of your UI.
Each needs a defined behaviour. Headphones unplugged should pause, not continue aloud — a small detail with real consequences for a meditation app in a public place. A brief interruption should duck and resume; a long one should pause and offer to resume from where it stopped.
Writing this state machine explicitly, before implementation, avoids the usual outcome: a pile of platform callbacks that each fix one report and collectively behave unpredictably.
Resume position is the feature nobody asks for
Users will not request it. They will abandon a product that gets it wrong.
What "correct" means here is more specific than it sounds:
- Persist position continuously, not only on clean exit. The app may be killed without warning.
- Resume slightly earlier than where they stopped. A few seconds back re-establishes context. Resuming exactly is disorienting.
- Treat near-complete as complete. Someone who stopped with thirty seconds left has finished; offering to resume there is annoying.
- Reset after long gaps. Resuming a session from four weeks ago at minute eleven is not what anyone wants.
Transitions are where quality is perceived
The difference between an audio product that feels professional and one that feels amateur is almost entirely in transitions, and it is inaudible when described.
Details that matter more than expected:
- Never start or stop at full volume. A short fade at both ends, always. An abrupt cut is jarring in a way people notice without identifying.
- Pause should fade out over a few hundred milliseconds, not cut. Same for resume.
- Crossfade between layered elements rather than hard-switching, if the session mixes background and guidance.
- Normalise levels across the library. Having to adjust volume between sessions is a constant small irritation, and in a relaxation product it undermines the entire purpose.
- Silence is content. Pauses in guided audio are deliberate. Trimming them to reduce file size destroys the pacing.
Offline is close to mandatory
People use these products where connectivity is poor by choice — outdoors, travelling, in bed with the phone on airplane mode. A wellness app that requires a connection fails at exactly the moment it is most wanted.
The design decisions worth making early:
- Download is explicit and visible. Users want to know what is available offline before they need it.
- Partial downloads must be handled cleanly, not presented as available and then failing mid-session.
- Storage management is part of the product. Audio libraries get large; users need to see and control what is stored.
- Progress syncs when connectivity returns, with the local record as the source of truth.
Building this into the architecture is straightforward. Retrofitting offline support to a streaming-first design is close to a rewrite of the playback layer.
The interface should get out of the way
Standard engagement patterns are counterproductive here. Streaks, badges, and nudges introduce pressure into a product whose purpose is reducing it.
What worked instead:
- Very short path to playing something. Most sessions start from an intention that lasts seconds. Three taps to audio is too many.
- A player that dims to near-nothing once playback starts. The screen should not compete with the audio.
- Gentle continuity rather than gamification. "You listened four times this week" as information, not as a score to protect.
- No notifications that create obligation. A reminder someone opted into is fine. "You haven't meditated in three days" is not.
Sequencing the build
The order that worked, and why it is worth resisting the temptation to reorder:
- Discovery and specification — the session journey and what the audio must do.
- Complete the UX before implementation. With so little interface, getting it wrong is expensive and hard to patch.
- Build the frontend and audio engine together, not sequentially. They are one experience, and integrating a finished engine into a finished interface at the end reliably produces the wrong result.
That last point is the one most teams get wrong. Audio is treated as a service to be plugged in, and the interruption handling, fades, and resume behaviour all end up as bug fixes rather than design. In a product where audio is the experience, that ordering shows.