Journaling · Privacy

Drift

A private journal with local voice capture and full-text search.

FastAPI · SQLite (FTS5) · whisper.cpp · Apple Shortcuts · Docker

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.

Decisions worth defending

  1. 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.

  2. 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.

  3. 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.

  4. 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.

← Back to all work