Case studyiOS · Audiobooks · SwiftUI · In progress
BookMurmur
A quiet home for the audiobooks you already own. BookMurmur turns a folder of audio files into a personal library, with remembered positions, chapter navigation and a player made for the last hour of the day. Built for iPhone and iPad, with an Apple Watch remote and an optional sleep-data rewind that is honest about when the data arrives.

A home for the books you already own
A folder of audiobooks is a collection, but it is not yet a library. Chapters arrive with different names, a file disappears into iCloud, and the place you stopped matters more than the name of the file you stopped in.
BookMurmur gives that collection a home. Choose a folder through Files, and the app groups supported audio into books, remembers progress and keeps chapters, bookmarks and character notes together. It is a native iPhone and iPad app built around personal files, with no account required.
Designed for the last hour of the day
The interface is dark blue, warm gold and quiet typography. A compact player stays close while you browse. The full player gives the cover and the narrator room, with chapter navigation, adjustable speed, skip controls, a sleep timer and a way to bookmark a moment.
The library puts unfinished listening first. A recent refinement gives long titles and author names more space instead of letting a timestamp compete with them. The aim is a familiar place to return to when you are tired, rather than another catalogue asking you to choose something new.

Remembering where sleep began
The optional sleep feature uses authorised sleep data from HealthKit to move a book back towards the point at which the listener fell asleep. That data can arrive hours later. The app therefore records recent stretches of playback, including their positions and speeds, so a later sample can be matched to the right point in the story.
This is not instant sleep detection. Availability and timing depend on the user's devices, permissions and Health data. A conventional sleep timer remains useful on its own. The Apple Watch companion is a remote for the iPhone player; it does not promise a separate offline audiobook library on the watch.
The important work was underneath
An independent Claude Opus audit found that an incomplete folder scan could be mistaken for deleted books. It also found that switching folders during a scan could apply the old folder's result, and that a chapter with an unknown duration could lose its saved position on resume.
The scanner now reports folder-level failures explicitly and leaves the saved library alone when enumeration is incomplete. Individual unreadable files remain issues without blocking readable books. Missing books and chapters are retained as unavailable, with their progress, bookmarks and notes intact, rather than being deleted by a scan. Folder changes are guarded while scanning. Playback preserves a known position while duration is still unknown.
Sleep recovery needed the same care. A segment left open by a terminated app is now bounded by the last saved playback time. A seek boundary resolves to the newer position, separate nights can each be handled, and a rewind must be saved before it is reported as successful.
Optional means explained
Open Library can supply missing metadata and covers, but internet lookup starts off. Enabling it also allows automatic missing-metadata lookups during later library scans. The interface now explains that scope and that a query may contain a title derived from a folder name, an author or an ISBN. Audio files are not uploaded.
Failed network requests no longer consume the seven-day interval used for completed lookups. The enrichment loop checks the preference before each book and before applying its metadata response. A request already in flight may still finish.
Testing the app, not an imitation
The earlier test setup contained copies of the rules it meant to test. A passing test could therefore say nothing about the running app. Those copies have been removed: the tests now import the production implementations directly.
Verification includes incomplete and unreadable scans, sleep-log recovery, consecutive nights, the actual audio equalizer and real audio playback in the iOS simulator. The playback regression opens a generated audio file, resumes from a saved position while duration is unknown, advances, pauses, restores the session in a new player and rewinds it.
Still a work in progress
BookMurmur uses SwiftUI, SwiftData and AVFoundation, with companion code for Apple Watch, widgets and Live Activities. All 60 Debug tests and the Release simulator build pass. The screens shown here are captured from the real interface with a separate, in-memory sample library and original demonstration covers.
Physical-device checks for iCloud eviction and reconnection, overnight HealthKit delivery, background playback, interruptions and the paired Watch remain before a release. A focused Opus follow-up confirmed the original critical fixes and caught an overcorrection: one bad file could block all library updates. The final reconciliation policy and history-save cleanup were corrected and verified locally after that review. This is not a claim of a completed hardware or App Store review.