Drift
A dream journal that respects sleep. One-tap voice capture, then the mumble becomes three layers you can revisit: the audio, the transcript, and a quiet illustrated tale.
Dreams disappear in 90 seconds.
Most mornings I wake remembering a dream, and within a minute and a half it's gone — even when I try to hold it. The act of reaching for my phone and typing is the thing that disperses it.
I looked for an app that fit this moment. What I found were habit-trackers in dream costume — streaks, badges, ML "interpretations" that treated dreams like puzzles to solve. None of them felt like the thing dreams actually are: half-remembered, private, half-language.
So I designed and vibe-coded the thing I wanted.
What I refused to build.
Every NO is a design decision. These six are the spine of Drift — they're what made the rest of the product obvious.
Streaks turn the app against you on the nights you don't dream. Drift respects the gaps.
Nothing pushes. The app exists only when you reach for it. Quiet by default.
No "what your dream means." Dreams are records, not riddles. The app preserves them; you decide what they are.
Nothing to sign up for. The phone is the only place a dream lives. The app loads to your bedside instantly.
A hard rule for the SVG illustration system: imply presence through trace (an empty boat, a coat on a rock) instead of generating uncanny faces.
Recording a dream will never be behind a paywall, quota, or login. Everything else is negotiable.
Three layers, one tap.
The same dream, recorded once, rendered three ways. You choose which one you want to revisit.
The original recording — your half-awake voice, exactly as you said it.
The dream in your words. Lightly cleaned, no editorial choices, no rewrite.
A short story in present tense, first person. Dream-logic preserved. No moralizing.
Muji meets Hogwarts.
Parchment, candlelight, literary serif type. A small palette that signals "this respects you" before you read a word.
An SVG language for dreams.
Every dream gets an illustration generated as pure SVG — no raster image model, near-zero cost. To make this work at scale I wrote a system prompt that encodes the visual language, then validated each response and fell back gracefully when it didn't.
The pipeline behind these: system prompt → LLM response → schema validation → SVG parse check (viewBox + DOM integrity) → one retry on failure → mood-keyed fallback if it still fails. Plus a runtime namespacing pass so multiple illustrations on one page can't collide on gradient IDs. All ~80 lines of TypeScript I wrote with Claude.
The phone is the server.
Almost nothing leaves the device. The only costs are Apple's storefront fee and a few cents of AI per dream. Designers don't usually talk about infrastructure or unit economics — but here they are the design.
1 · Catch a murmur
Tap once, mumble the dream. Audio saved straight to local storage — it never uploads.
$02 · Transcribe
Sent to a speech-to-text API for the words. Nothing retained or trained on.
≈ $0.005–0.013 · Make the Tale
One model call returns the Memory, Tale, title, and the illustration as generated SVG.
≈ $0.01–0.044 · Keep it in your book
Everything stored locally. No accounts, no server, no database bill.
$0No backend, no database, no privacy-policy lawyer, no payments infrastructure. The architectural choice is the business model.
Shippable in slices.
The flow is the destination; the slices are the route. Each slice is a real product on its own. I won't start the next until I understand the last.
The spine — record & keep
One screen: tap, record, save to the device, prove it survives a restart. No design, no AI, no other screens — just UI, state, and local storage in the smallest form.
The magic — make the Tale
Add the two off-device calls — transcription, then the model for Memory / Tale / title / SVG — stored locally. Now it does the thing that makes it Drift.
The shelf — read & return
The reading view with the layer switcher, the Library, then Home. Now it's a real app you'd use every morning — and the aesthetic lands here.
The depth — only if you still want to
Threads map, sharing, polish, animation. Everything here is optional and additive. Ship slice 3 first; let real use decide if slice 4 earns your evenings.
Status today: Slice 1 (record + persist) is working — the live prototype at the top of this page is the real built thing. Slice 2 (the AI pipeline) is in progress. Slice 3 (Library + reading view) is designed. Slice 4 is optional.
What vibe-coding taught me about design.
Building this solo with Claude as my engineer changed the questions I ask earlier and the ones I stop asking at all.
I now spec by example, not by Figma. Working code is the wireframe.
I make architectural decisions earlier — because they're now mine to make, not someone else's to argue about.
Constraints I would have negotiated with an engineer (cost, latency, storage) now arrive as my first design moves.
The taste in the code matters as much as the taste in the pixels. A 200-line file with one clear idea reads better than a 600-line file with three.
Drift is what I'd build if I owned a product team — a craft object that respects the user, ships in slices, and earns its place quietly.