The problem
I read on a screen and listen on the go, and I wanted one book, one place, one bookmark across both. Off-the-shelf tools each bring their own siloed library and progress tracking, so switching from reading to listening requires manual place-seeking. Pre-baked audiobook generators don't sync reading position at all. The primary engineering challenge isn't speech synthesis—it's maintaining bi-directional state synchronization between the e-reader and audio player in real time.
What I built
Echo reads my current position from my e-book reader, synthesizes the book from that paragraph using a local text-to-speech engine, and plays it on my phone with lock-screen controls. When I pause, it writes listening progress back to the e-reader, ensuring both formats remain aligned. Active books are synthesized continuously in the background so playback starts instantly. The entire solution runs containerized on my self-hosted hardware.
Violet is read-and-play; teal is the progress write-back that keeps both sides on one bookmark.
Decisions worth defending
-
Build an integration bridge instead of replacing the reader
Most commercial audio tools attempt to own both the library and bookmark state. Because my reading app remains the primary interface, I chose to architect a lightweight sync bridge rather than build a redundant reader. System scope remains tight, and single-source-of-truth integrity is preserved.
-
Paragraph-level bookmarking over sentence-exact precision
Sentence-exact resumption sounds optimal in theory, but in practice it forces guesswork around exact visual stopping points. I specified paragraph-level resume with slight deliberate overlap, delivering a natural re-entry experience without dropping context mid-thought.
-
Technical pivot: Abandoning Opus for reliable MP3 concatenation
Initial architectural spikes targeted Opus for stream efficiency. However, mobile browser testing revealed that concatenated Opus chunks failed after the first segment without throwing explicit errors. Because MP3 frames are self-contained, simple byte-concatenation plays seamlessly across all mobile clients. Validating technical constraints via early spikes avoided silent audio failures in production.
-
Background batch synthesis & local audio retention
Rather than synthesizing chapters on-demand, active books are synthesized asynchronously in the background. With negligible storage costs, queueing audio during reading sessions guarantees instant playback on demand. Generated audio files are retained locally, making re-listening free of compute overhead.
How this was built
As part of my self-hosted lab, the value lies in the ownership workflow: I directed the product discovery, co-developed the technical specification with AI via structured "grill me" sessions, and executed early go/no-go spikes (mobile audio formats, undocumented API behavior, TTS throughput). Autonomous AI agents implemented the code against the finalized spec. I validated integration behavior, managed test coverage, and operate the system daily—owning architecture, state management, and system integration end to end.