Why this app exists
Filing a thought costs more than having it.
Almost every note-taking app asks the same thing before it will listen to you: pick a folder, a type, a category. The friction arrives before the thought does, and the thought is lost on the way.
CocoMind turns that around. You press the mic and talk the way you actually talk, including the loose, half-finished, dictated-in-a-hurry version. The assistant transcribes it, works out the intent and creates the right object, in the right place, with the right date.
It tells a task from a habit, a project from a note, an appointment from a reminder. It handles awkward recurrences like "the first Tuesday of every month" and relative deadlines like "in three weeks".
The engineering challenges
What the model files badly, the server has to catch.
A thought captured before the app was ready. On a cold start, a thought typed in the first second arrived before authentication had resolved, so it only ever lived in memory. Writes are now queued and replayed the moment the account is known. The same trap hit undo: tapping "Cancel" brought the item back on screen, then the first snapshot from the server silently deleted it again.
Two races inside the microphone. The native recorder takes real time to spin up. Inside that window a second press restarted recording on a new file and the first words vanished; a cancel, meanwhile, did nothing at all, the recorder finished starting and nothing ever stopped it, leaving the mic hot and the orange indicator on. A starting flag makes the call safe to re-enter, and a generation counter lets a finish invalidate a start still in flight.
Recurrence dropped by the model. "Every Tuesday" came back as a one-off task. A server-side guard and a corrective retry now write a real rule, and a deterministic engine advances it on a fixed heartbeat, server side: occurrences are recomputed daily rather than frozen, and a rule stops producing when the goal it served is gone.
A two-hour drift on every postpone. The context sent to the model showed existing items in universal time, so "move it to the same time" silently drifted by the timezone offset. The context is now built in local time, and postponing an event moves both start and end while preserving the hour and the reminder offset.
An anti-abuse guard that blocked everything. Device attestation was switched on one evening. The next morning every capture was being rejected, in development and in internal testing alike, because attestation had not yet been registered on the console side. It was turned off immediately, and a strict order now governs turning it back on: register first, observe without enforcing, and only lock it down once the success rate has been verified.
Packaging blockers, found before Apple found them. Version numbers that disagreed between the watch app and the phone app made the binary impossible to upload at all. A location permission was declared with an empty purpose string while no code used it. iPad was enabled despite never having been tested. And the push environment was still set to development: not a rejection reason, which is worse, because notifications would simply have stopped working in production with nothing to signal it.