Personal · Dream capture · 2026

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.

The Drift prototype — “the room of televisions” — on a phone resting on concrete
Role
Sole designer + builder
Built with
Vibe-coded with Claude Code · iOS · 2026
Status
Slice 1 shipped · Slice 2 in progress
01 — The pain

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.

02 — Decisions made by negation

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.

No streaks

Streaks turn the app against you on the nights you don't dream. Drift respects the gaps.

No notifications

Nothing pushes. The app exists only when you reach for it. Quiet by default.

No interpretation

No "what your dream means." Dreams are records, not riddles. The app preserves them; you decide what they are.

No accounts

Nothing to sign up for. The phone is the only place a dream lives. The app loads to your bedside instantly.

No human figures in illustrations

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.

Capture is always free

Recording a dream will never be behind a paywall, quota, or login. Everything else is negotiable.

03 — The product concept

Three layers, one tap.

The same dream, recorded once, rendered three ways. You choose which one you want to revisit.

Audio
Murmur

The original recording — your half-awake voice, exactly as you said it.

Transcript
Memory

The dream in your words. Lightly cleaned, no editorial choices, no rewrite.

Literary version
Tale

A short story in present tense, first person. Dream-logic preserved. No moralizing.

04 — Visual language

Muji meets Hogwarts.

Parchment, candlelight, literary serif type. A small palette that signals "this respects you" before you read a word.

Night
#14110F
Parchment
#F0E8D8
Candlelight
#C9A961
Ink
#2A2520
Display · Cormorant Garamond Italic
a quiet record of the nights
Body · EB Garamond
A wooden staircase stands in a field that has no edges.
Handwriting · Sacramento
catch a murmur
05 — Hand-coded illustration

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 hard rule
Never depict people. Presence is implied through trace — an empty boat, a coat on a rock, a lantern set down on a step. This sidesteps uncanny-face problems and gives every dream the same dignified treatment.

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.

06 — Local-first architecture

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.

On device

1 · Catch a murmur

Tap once, mumble the dream. Audio saved straight to local storage — it never uploads.

$0
Leaves briefly

2 · Transcribe

Sent to a speech-to-text API for the words. Nothing retained or trained on.

≈ $0.005–0.01
Leaves briefly

3 · Make the Tale

One model call returns the Memory, Tale, title, and the illustration as generated SVG.

≈ $0.01–0.04
On device

4 · Keep it in your book

Everything stored locally. No accounts, no server, no database bill.

$0

No backend, no database, no privacy-policy lawyer, no payments infrastructure. The architectural choice is the business model.

07 — Build plan

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.

1

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.

2

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.

3

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.

4

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.

08 — What changed

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.

01

I now spec by example, not by Figma. Working code is the wireframe.

02

I make architectural decisions earlier — because they're now mine to make, not someone else's to argue about.

03

Constraints I would have negotiated with an engineer (cost, latency, storage) now arrive as my first design moves.

04

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.

— Manjia Zhao · 2026