Skip to content

Build log · macOS app

How I built Sayntax.

Built, not released yetmacOSJun 2026

In short

Sayntax is voice dictation for developers on macOS that reads the project you’re working in. It collects file and symbol names from the open repo and uses them to steer transcription and correct technical terms, so identifiers come out spelled right. It’s a fork of unmute, an open-source dictation app by Arpit Patel, and it isn’t released yet.

Forked from unmute, extended by me. Sayntax is a fork of unmute, an open-source dictation app by Arpit Patel, released under the MIT licence. I kept its Swift helpers, audio pipeline and Groq integration. What I added: the context engine, correction memory, the output modes, project folders, the Stats and Dictionary screens, and the rebrand. Original repo: github.com/arpitpatel25/unmute-dictation(opens in a new tab)

The problem

Developers now dictate long prompts to AI coding agents, and generic dictation mangles the words that matter most: file names, function names, CLI flags. “cart drawer dot liquid” arrives as four words, and fixing it by hand eats the time dictation was meant to save.

What I built

  • A context engine that detects the app in front, works out the open project from the window title, and collects file names and exported identifiers into a vocabulary of about 300 terms.
  • Transcription steering: the vocabulary goes into Whisper’s prompt, trimmed to fit its budget, and a local fuzzy-correction pass fixes the transcript before it is pasted.
  • Correction memory: fix a term once, in the dictionary or by editing what was pasted, and it’s applied everywhere after that.
  • Output modes per app: verbatim prompts for terminals and editors, casual for Slack and Discord, full sentences for mail, raw for browsers.
  • 31 unit tests for the context engine, the prompt budgeter, the repo harvester and the clipboard learner.

Key decisions

  1. Fork an open-source dictation app instead of starting over.

    unmute already had working key capture, audio and Groq transcription under an MIT licence. Forking it let me spend the time on the part that makes Sayntax different: context.

  2. Correct terms in code, not with a second AI pass.

    A fuzzy match against the repo vocabulary is fast, free and predictable. It turns “cart drawer dot liquid” into cart-drawer.liquid without sending anything anywhere.

  3. Your own Groq key, and no accounts.

    Audio goes only to Groq, on your key. History, the dictionary and the vocabulary stay in a local SQLite database, and without a key it falls back to on-device whisper.cpp.

More of how I build.

Every product here has a build log: the problem, the decisions and the stack.