laud
Press a chord, speak, press it again: the words land in the field you were in. One session at a time, pinned to the field it started on. Recognition and the cleanup pass both run on the Mac.
Dictation on macOS puts text wherever the system thinks focus is, which is not always where you were looking. laud captures one text field the moment you press the chord and pins the session to it: everything you say, and every confirmation you press or speak, lands there and nowhere else. It is not a voice assistant — no background listening, no wake word, nothing talks back. Built as a companion to dwell, works without it.
how it works
Hotkeys are Carbon RegisterEventHotKey, never an event tap, so laud has no
mechanism for observing your typing — only the chords it registered. At commit
it brings the captured app forward and waits until that app actually owns the
front before posting a keystroke; if the app never comes forward, the transcript
goes to the log instead of into whatever happens to be there. Synthetic events
carry cleared modifier flags, because the activation chord is usually still held
and a stray shift turns Return into a line break.
Recognition is on-device: SpeechAnalyzer on macOS 26 for real punctuation,
SFSpeechRecognizer below it. One cleanup pass runs at commit — Apple’s
on-device model by default, the Anthropic API as an explicit opt-in — fixing
capitalization and dropping filler while keeping the speaker’s words. An answer
that comes back empty, truncated, or nothing like a cleanup of what was said is
refused and the raw transcript used instead. Prewarming the on-device model
while you are still speaking took a measured commit from about 3.1s to 370ms.
running it
./dev.sh install
laud
Three grants at startup, in order: Accessibility, Microphone, Speech
Recognition. laud check reports which are held and what to do about the rest.
status
Working and in daily use. macOS 13 builds and runs; macOS 26 is where the
current recognizer and the on-device cleanup live. Configuration is a TOML file
whose annotated reference is generated from the binary, so laud defaults and
laud check cannot drift from the code.