Building Ruxpin.
A voice-first reading companion I designed and built — from the thought I kept losing, to a working prototype in this playground, to an iPhone app on the App Store. Six chapters, about four minutes.
- Role — solo
- Design, engineering, product
- Timeline
- Jun → Aug 2026
- Stack
- ExpoNext.jsSupabaseAI pipeline
The thought you lose.
I read a lot, and I kept losing the best part — not the author’s sentences, mine. The reaction halfway down a page. The connection to something I’d read years earlier. The question I couldn’t answer yet. By the time I’d found a pen, or unlocked my phone and picked a notebook to put it in, it was gone. Highlighting saves the writer’s words; it doesn’t save yours. I wanted to say a thought out loud the second I had it, and have it land somewhere it would still make sense to me a year later.
The smallest thing that could work.
Rather than argue about it, I built the narrowest version that could test the idea: record a thought, get it transcribed, and let an AI reflect it back instead of summarizing it at you. It started here in this playground, next to the half-finished experiments, and ran in the browser for a couple of months — the original build, nothing cleaned up for anyone. That slice answered the only question that mattered early: whether speaking a half-formed thought felt natural enough to do again tomorrow.
Drawing all of it.
A working slice isn’t a product. Before I could tell whether the idea held together, I had to draw the whole thing — about fifteen screens: capture, a library of everything you’ve read, a portrait of you as a reader assembled only from your own entries, and Rux, the part that mirrors a thought back and asks one good question. Most of it didn’t exist yet. Drawing it is how I found out which pieces were load-bearing and which were me being clever.
Drag to pan the board · use a screen’s ⤢ to expand it, or open it full screen.
The part you can’t see.
The app is Expo on iPhone. Behind it, the server routes are thin wrappers around an AI pipeline that lives in its own framework-free package — so swapping models never requires an App Store release. The rule that shaped all of it: where a promise matters, it’s enforced in code, never in a prompt. Everything the AI returns is validated against a schema — the model fills a typed shape or the call fails; I don’t coax JSON out of prompts and hope. Any change to a prompt or model has to pass an eval gate of golden fixtures before it ships. Every database table enforces row-level security, so a reader can only ever reach their own record. And audio is transient by design: transcribed, then deleted, in code that runs even when the request fails. None of it shows up in a screenshot — which is why it gets a chapter.
Capture
A thought is spoken mid-page. A local queue holds it until it lands, so it survives the app being killed.
Land
Transcribed, and the audio deleted straight after. The entry lands raw, before anything analyses it.
Analyze
Structured, filed to its source, indexed for recall — into a typed shape, or not at all.
Enforced in code, never in a prompt
- Schema, not prompt
- every model return is validated
- Eval gate
- golden fixtures pass before a prompt ships
- Row-level security
- every table — you reach only your own record
- No audio kept
- deleted after transcription, success or failure
- Model swap, no release
- the pipeline is its own package
Asking permission, properly.
I submitted 1.0 in mid-August and Apple rejected it. The reason was fair: thoughts were being sent to an AI provider, and the disclosure lived only in the privacy policy — App Review wants the app itself to say what it sends and to whom, and to ask permission first. So that’s what I built: a screen right after sign-in that names the provider, lists what each feature sends and what never leaves — never your name, email, or payment details — and asks for an explicit “Allow and continue” before anything is sent. Saying no still lets you in; capture just waits for your OK. And the promise is enforced where the data actually leaves: the server refuses AI processing for any account without recorded consent, so the screen can’t drift into being decorative. Resubmitted the next day. Approved, and live on the App Store, three days after the rejection.

Your reading, remembered.
Ruxpin is a real iPhone app now, on the App Store. Speak a thought mid-page and it keeps it — filed to the book, in your words — whether you’re holding paper, a Kindle, or an audiobook. The portrait it builds comes only from what you actually said. Audio is deleted as soon as it’s transcribed, and none of it trains a model. A free first month, then $5.99 a month, with Family Sharing for up to five more readers, each with their own private record.



See what it remembers.
If you read and keep losing the good part, try it. Ruxpin is on the App Store for iPhone — free to download, and your first month is on me.
More about the product itself — what it does, and who it’s for — at ruxpin.app ↗
Want new features before everyone else? Reach out — I let a few readers try early builds.
Or head back to the rest of the playground.