The problem
A journal only works if it's genuinely private and effortless to add to. Most journaling apps sync to a third-party cloud, and most voice dictation quietly sends your audio to external servers for transcription. I wanted to capture a thought by voice or text, sometimes from a watch, and have it transcribed and stored without any data leaving hardware I control. Private and convenient usually pull against each other; the product challenge is engineering both without compromise.
What I built
Drift is a personal journal featuring rich text, images, tags, and full-text search. Voice notes are recorded on a phone or watch, transcribed locally by a speech-to-text service running on my own hardware, and attached to the entry alongside the original audio — nothing ever leaves my private network. A permissioned link can share a single entry with my assistant, Sage, but only when explicitly authorized; everything else stays sealed inside Drift. The entire application runs containerized on self-hosted infrastructure.
Violet is capture-to-entry, entirely on my hardware. The teal path is the optional, per-entry share to the assistant — dashed because it's off unless explicitly enabled.
Decisions worth defending
-
Local transcription over native browser dictation
Built-in Web Speech APIs were the easiest implementation path, but I rejected them: mobile OS implementations ship audio to third-party servers, timeout after ~60 seconds, and do not provide raw audio retention. Because Drift's core requirements are strict privacy and audio preservation, I specified a self-hosted speech-to-text service instead. Convenience that violates core privacy promises is unacceptable design.
-
Accuracy over speed: catching bilingual edge cases
I initially benchmarked a smaller, distilled model during proof-of-concept testing. However, real-world testing revealed a critical flaw: when switching between English and Spanish mid-sentence, the lighter model locked onto one language and silently dropped words from the other. I opted for the full transcription model—slower and heavier, but accurate. For a private journal, silent data loss is a fatal flaw, so precision beats latency every time.
-
Human-in-the-loop: Record, then review
Capture requires a single tap, but transcripts always land in a review composer before saving. Auto-committing voice notes risks saving unverified transcripts unseen. If transcription ever fails, raw audio remains permanently attached so entries can be reviewed or edited later.
-
Lightweight watch capture via native Apple Shortcuts
Wrist recording seemed to require a standalone watchOS app. A quick architectural spike proved a native Apple Shortcut could handle the entire pipeline—recording, payload transmission, local transcription, and database entry—without requiring a separate codebase or app deployment. Keeping solution architecture lean avoids unnecessary maintenance overhead.
How this was built
As part of my self-hosted lab, the value lies in the ownership workflow: I directed the product discovery session, co-developed the specification with AI through structured "grill me" sessions to stress-test architectural decisions and privacy boundaries, and validated technical risks (local STT pipelines, Apple Watch webhooks) through targeted spikes. Autonomous AI agents then executed the code against the finalized spec. I validated system behavior, managed integration tests, and operate the platform daily—owning product strategy, data integrity, and privacy guardrails from end to end.