How many good ideas did you lose this week?
Not bad ideas. Good ones. The kind that show up in the shower, on a walk, or just before you fall asleep, when your phone is nowhere near you. You tell yourself you'll remember. You don't.
The mind is for having ideas, not for holding them.
Every note app has the same flaw: it asks for work at the exact moment you have the least patience for it. Find the phone. Unlock it. Open the app. Start typing. By then, the idea has cooled.
The best tools don't ask for your attention. They get out of its way.
So I set one rule: one tap, one sentence.
That became Ember.
What it is
Ember is an Apple Watch app, a small Python server, and a Flash extension.
Apple Watch your computer Flash
----------- ------------- -----
tap, speak, save -- Wi-Fi --> ember serve <-- extension --- "what ideas did I
kept on the watch notes.db, recordings have this week about
until home a banner on each new idea my game engine?"
- Standalone watch app. No iPhone app, and no iPhone needed at all. It even works on a Family Setup watch.
- Local. The server is one SQLite file on your computer. Nothing goes anywhere else.
- Queryable by an AI agent. Flash, my local agent, can search, add to, and act on your ideas.
The payoff is the last part. I can ask Flash, "What ideas did I have this week about my game engine?" and it searches my notes and quotes them back with dates. It asks me before it saves, changes, or deletes anything.
A note stops being a note and becomes a working memory.
A note you never reread is just a memory with extra steps.
The five problems that made this interesting
1. watchOS has no speech recognition API
I assumed I'd use Apple's Speech framework. I was wrong. SFSpeechRecognizer and the newer SpeechAnalyzer exist on iPhone, iPad, Mac and Vision Pro. Not on watchOS.
So Ember uses the watch's own system dictation through SwiftUI's TextFieldLink. It's the same engine as Messages. On Apple Watch Series 9 and later, and Ultra 2, it runs entirely on the wrist.
For everything else there's a Record button. The watch saves a 16 kHz WAV, and when it syncs, the server transcribes it locally with Moonshine or Vosk. The text then syncs back to the watch.
2. A note must never be lost
Every idea is written to SwiftData on the watch first, before anything touches the network. If you're on a trail with no signal, it waits and keeps trying.
watchOS also wakes the app about every half hour to retry in the background, so notes go up even if you never open it.
3. Syncing flaky networks without duplicates
The client makes the note's UUID, so sending the same note twice saves it once. The API is idempotent by design:
POST /notes
{ "id": "4a9c...", "text": "Chunked terrain streaming for the #engine",
"created_at": "2026-10-21T08:15:00.000000Z", "source": "watch",
"tags": ["engine"], "audio": false }
The watch pulls changes with GET /notes?since=<rev>. Every write bumps a revision number, and deletions come back as tombstones, so a note deleted on your computer disappears from the watch too.
4. Pairing without typing an IP address
Nobody wants to type 192.168.1.42 on a watch keyboard.
ember pair prints a code like 2232 4829 136. The code carries your computer's address, so you never type an IP or a .local name, and the last digit catches typos. It works once, for ten minutes, and five wrong tries use it up. The token then goes into the watch's Keychain.
If your router later hands the computer a new address, the watch falls back to the .local name it learned while pairing.
5. Making it feel instant
The watch has a big capture button, complications for any watch face, Siri ("New idea in Ember"), the Smart Stack, and the Action Button on an Ultra. Say "hashtag engine" and the note is tagged #engine.
On the computer, ember opens a full-screen terminal browser with search-as-you-type, tag filtering, and playback of recordings. Ideas from your watch slide in while it's open.
Why local?
Your thoughts are the most personal data you have. They should live where you do.
There's no account to create, no subscription, and no third party holding a copy. The cost is that you run a server. I think that's a good trade, and scripts/server.sh makes it a one-liner.
What I'd tell you if you build something like this
- Save first, sync later is a better rule than I expected. Treat the network as an optimization, never a dependency.
- Idempotency is a gift. Let the client pick the ID and a whole category of sync bugs disappears.
- Platform limits help. No Speech API on the watch forced a simpler, more robust design than I'd have chosen.
What's next
I want Ember to do more with what it holds: connecting related ideas and surfacing an old one at the right moment.
The future won't belong to those with the most ideas. It will belong to those who keep them.
Try it
Ember is MIT licensed. Natuworkguy/Ember
Every tool you trust began as a thought someone almost let go.
If you've ever lost a great idea in the shower, I'd love to hear how you capture them. Tell me in the comments.
This is part of my series on building Flash. Follow along at dev.to/natuworkguy.
Catch the ember before it goes out.













