Kristopher Baker iOS roots · Product systems · AI-assisted workflows
← The workshop
active updated 1w ago

Aoede

A local-first, privacy-first reading app for macOS and iOS. Import txt, EPUB, or PDF and move through it your way, reading aloud with synchronized word highlighting or pacing yourself silently with no audio at all. Speech is synthesized on-device and your library stays on your own machine. No account, no subscription, no cloud.

SwiftmacOSiOSSwiftUITTSMLXKokoro

I wanted to read a book on my Mac the way Speechify does it, a voice reading aloud with the words highlighting as it goes, but I did not want to pay for yet another subscription to get it. From other project work I had recently learned that I could run genuinely good-sounding text-to-speech locally with Kokoro, a small open neural model. So I built my own reader around that.

Most read-aloud products assume your books live in someone else's cloud and that listening to them takes a subscription. Aoede takes the opposite approach. Import a document, synthesize the speech locally, follow along with synchronized word highlighting, and keep your library on your own device. No account, no subscription, no cloud.

Aoede reading Accelerando, with the chapter's headings and list preserved and the active word lit by an amber highlight. Aoede reading Accelerando, with EPUB structure preserved, synchronized word highlighting, and floating playback controls.

The name is the idea. Aoede is the Muse of voice and song. I do not need a celebrity reading to me, just a few simple, good-sounding voices that I own. Under the hood it uses both Apple's built-in voices and Kokoro running locally through MLX. The goal is not hundreds of voices. It is a small set of genuinely good ones that work offline, with the door left open to a cloud option like ElevenLabs later if I ever actually want it.

What started as a way to listen has become a way to read. Aoede now handles Japanese as well as English, with furigana and corrected pronunciation, and it gives you more than one way to move through a page: a voice reading aloud, or a silent Reading Pacer that just advances the highlight at your pace with no audio at all. The voice was the starting point. The reading experience is what it is turning into.

It runs on modern Apple silicon, on macOS 26 and now iOS 26, sharing a single core between the Mac app and iPhone and iPad. For now it is a personal project, and I am still deciding whether to put it in front of a small group through TestFlight if there turns out to be interest.

The updates below are the build log: the foundation wired end to end, the move from a CoreML Kokoro runtime to MLX, reading Japanese with furigana and corrected pronunciation, extracting the whole core into a package so it could run on iOS, a memory cache that idled at tens of gigabytes until I capped it, and the silent reading pacer that made me realize this was becoming a reading app, not just a voice.

Updates 37

Two kinds of wrong furigana One cell per paragraph A TextKit 2 reader, for the scroll Furigana That Steps Back as You Learn Mark It Now, Make Cards Later Notes That Survive Their Own Edits From Reading to Reviewing Ask Aoede About the Passage A Dictionary Inside the Reader The Voice Kept Reading, the Page Didn't When the Book Has Pictures Finding Books Without Leaving Aoede Rotate to Read "16%" Came Out "Sixteen" Shimmer, Wave, or Just a Tint Words That Dissolve as You Read Them Find in the Book, Search the Whole Library When the Voice Said "I Reed It Yesterday" Following the Voice, Line by Line What a Full Code Review Found in Aoede Open With Aoede A Reading Mode With No Voice Switching Voices Without Opening Settings The Book Was Closed, but Kokoro Kept Going Aoede Comes to iOS Furigana That Matches the Voice Now It Reads Watashi, Not Watakushi The 49 GB Was a Cache, Not a Leak Aoede Reads Japanese Now Localizing the App Without Translating the Books A First Run That Sets Up Its Own Voice Reading Along, End to End Reading Real Books, Not Just Text Files Books Should Look Like Books Switching Kokoro From CoreML to MLX The Robotic Voice Was a Dependency, Not My Code Typography Is the Interface

Next

KiFinder See the build log