← All projects

Fast Notes

A personal iPhone notes app that mirrors my Obsidian vault, with only the features I need. It opens on a blank note with the keyboard up, saves before it touches the network and turns voice into Markdown in the folder I choose.

Film 01 / 0:56 An audience of one A 56-second demo film made with Claude in Remotion. The app screens are rebuilt in code from the Swift views, the notes are made up, the narrator is an ElevenLabs voice and the music is synthesised from scratch. The last scene is the next design idea, not a shipped feature.

The short version

commits in the first two weeks
139
folder matching, down from 23 ms
0.6 ms
pencil icon colourways
25
target AI spend a month
£0

What it is

Fast Notes is the notes app I wanted and nobody sells: open it and you're typing. There's no home screen, no picking a template and no waiting for sync. The note saves on the phone first, then lands as a plain Markdown file in my existing vault, so Obsidian and Reflect on my laptop see it like any other note.

Voice is the other half. I can start a recording from the Lock Screen, the widget or the app icon, lock the phone and keep talking. It transcribes on the phone in British English, keeps the audio until the text is safe and appends dictation to whatever note I'm already in.

What I had to steer

Capture had to feel instant, so the rule from day one was that nothing on the network or AI side is allowed to slow down the editor. Titles, folder suggestions, sync and transcription all happen behind it, and if they fail, the note is still there.

I also kept saying no. It's for me, so there's no sign-up, no sharing, no paid AI fallback and no feature I wouldn't use this week. When dictation started turning "um" into hashtags, the fix was a guard that rejects any AI correction that changes the words, numbers or tags.

What I wired together

Swift and SwiftUI, with UIKit where the editor needed it. Apple's Speech framework for on-device transcription, ActivityKit for the Live Activity while recording, App Intents for Shortcuts and the Lock Screen control, WidgetKit for the Home Screen widget and a Share extension. Google Drive for the files, with an exact byte-for-byte read-back before an upload counts as done. Short titles and a quiet "ask this note" chat run through my existing ChatGPT plan, read-only.

Where I pushed it

I don't write Swift, and this is a real native app on my phone, signed and installed. When the folder list stalled, a Time Profiler trace on the phone found the culprit: folder suggestions running on the main thread. Moving that work into the background and rewriting the matcher took it from 23 ms to 0.6 ms on a 5,000-note test vault.

Signing a personal app expires every seven days, so there's a daily check that warns me before it does.

The build log

Blank note first

I write in an Obsidian vault on my laptop, and getting a thought into it from my phone was always the slow bit. So I sat through a product interview with an agent, answered every question about how I actually capture things, and turned the answers into a brief.

The brief is short. Open the app and the keyboard is up. Save to the phone before anything else happens. Write each note as a Markdown file into the folders I already have, so Obsidian and Reflect keep working. Start voice from the Lock Screen, a widget or the app icon, and don’t make me press Save.

It’s a native Swift app because speed was the whole point. Text saves atomically on the phone, and empty drafts never become files. Voice records through the lock with a Live Activity Stop button, transcribes on the phone and keeps the audio until the text is safe. If there’s already text in the note, dictation appends to it with a small marker instead of starting a new note.

Sync goes through Google Drive, and an upload only counts as done once the file reads back byte for byte. The first real test note turned up in both Obsidian and Reflect on my Mac.

These screenshots are from the simulator test runs, with made-up notes. My real notes stay out of them.

Asking my notes, and finding the stall

Once capture worked, I wanted to ask questions of what I’d written. Open a note and choose “Ask this note”, hold a folder for “Ask this folder”, or ask the whole vault. It runs through the ChatGPT plan I already pay for, with no paid API behind it, and it can read notes but has no way to change them. Conversations save on the phone and get short names in the background.

Then the folder list started to stall. Rather than guess, I ran Time Profiler against the installed app on my phone. Almost every sample in a 15-second trace was the folder suggestions doing slow string matching on the main thread, every time the screen refreshed.

The fix moved browsing, search and date grouping into background work, reused results that hadn’t changed and rewrote the matcher to prepare folder names once. On a test vault of 5,000 notes the matcher went from about 23 ms to 0.6 ms. That’s the matcher, not the whole app.

Since then it has picked up smarter folder suggestions, a guard that stops dictated filler words becoming hashtags, 25 rotating pencil app icons and a Recents view across every folder. It’s installed on my phone. A few acceptance checks are still open, including offline transcription and my work laptop.