HomeAboutExperienceProjectsContactBlog
RésuméDex0/17
← Projects

Whisp

A private dictation keyboard for iPhone. Speech becomes text on the Neural Engine and never leaves the phone.

KEYBOARDAPP GROUPWHISP APPRESULT7F3ACONSUMEDREQUEST7F3APARAKEETMICSTART · STOPRESULT READY

Dictate once, then try it with the keyboard rebuilt or away.

Nothing here listens to your mic. The IDs and the checks before an insert are the keyboard's own, ported from the repo.

The keyboard writes a request ID before it starts; the app stamps the result with it, and a consumed-marker file means a result is inserted at most once, even if iOS recreates the keyboard mid-dictation. A result that waits more than 15 seconds for the keyboard to come back is dropped. A liveness ping catches the case where iOS killed the app but its last state file still says ready.

In any app, tap the Whisp keyboard's mic, talk, and cleaned-up text lands at the cursor. An NVIDIA Parakeet model runs in the companion app on the Neural Engine, then rule-based and on-device-model cleanup fix punctuation and filler, and Whisp learns your spellings from the corrections you make.

The constraint that shaped everything

iOS keyboard extensions can't use the microphone, and they're capped near 60 MB of memory, far too little for a speech model with hundreds of millions of parameters. So the keyboard is a remote control. The companion app owns the mic and the model and stays alive in the background; the two talk through payload-free Darwin notifications and a few small files in a shared App Group container.

The exchange never polls. The keyboard posts a signal, the app does the work and writes the result, and posts one back. Only the level meter reads a small file while you speak.

How it's put together

IPHONEANY APPKEYBOARDNO MIC60 MBDARWIN PINGSAPP GROUPWHISP APPMIC 16 KHZPARAKEETCLEANUPDICTIONARYMODELDOWNLOADONE TIME
iOS keyboards can't use the microphone and are capped near 60 MB, so the keyboard only sends payload-free Darwin signals and trades a few small files with the app through the shared App Group. The Whisp app records, runs Parakeet on the Neural Engine and both cleanup passes, and keeps your dictionary in its own sandbox; the only network call is the one-time model download.

Trade-offs

Files plus Darwin pings instead of shared UserDefaults. Shared defaults reach the other process asynchronously, so a notification can arrive before the value does. An atomic file write finishes before the signal is sent. The downside: A few hand-managed files, and read-modify-write races on the learning queue (harmless there).

One model pass after you stop, no streaming. Battery. Streaming partials would keep the Neural Engine busy the whole time you talk. The downside: No live text while you speak.

Optimistic UI with a liveness check. The mic button shows the expected state instantly, and a state file is only trusted if it was updated after the keyboard's ping. The downside: Extra state to reason about in the keyboard.

Next: InviewA marketplace where creators auction product placement in the rooms they film in.

Year
2026
Platform
iPhone
Status
Personal build
Code
Private
Built with
Swift, SwiftUI, UIKit keyboard extension, FluidAudio (Parakeet), Core ML, Foundation Models, App Groups, Darwin notifications
  • 5,250 lines of Swift
  • 80 unit tests
  • 60 MB keyboard memory cap, worked around
  • 0 network calls while dictating

The code is private, so this page is an overview.