# yap

Yap is a menu-bar dictation app for macOS. Press a shortcut (`⌘⇧D` by default, rebindable, and it will accept a bare modifier such as right shift), talk, press it again, and the transcript is inserted into whatever text field had focus. A small window near the bottom of the screen shows a live waveform and a running partial transcript while you speak, so a bad take can be cancelled with a double-press of escape before anything is typed. Transcripts are kept locally with search, copy, and delete. Frigade built it and uses it internally, mostly for prompting coding agents and writing messages.

## The design decision: no model

Every other tool in this category downloads weights. Whisper models run to hundreds of megabytes, occupy RAM for as long as the app is open, and on an older Mac a single paragraph can take thirty seconds to a minute. macOS 26 changed the calculus by adding two APIs, `SpeechAnalyzer` and `SpeechTranscriber`, which do streaming on-device speech-to-text against models the OS ships and manages. Yap carries none of its own, loads nothing before the first word, and needs no API key or per-minute cost. The result is roughly three thousand lines of Swift in a 4 MB app that idles around 60 MB of memory, with no browser engine involved — a contrast the README draws explicitly against the Electron-based menu-bar apps.

Whether Apple's model is good enough is the load-bearing question, and the README cites an external benchmark rather than its own: 2.12% word error rate on clean audio and 4.56% on noisy, against 3.74% and 7.95% for Whisper Small, roughly three times faster, across 5,559 LibriSpeech clips. That is one third-party measurement on read speech, not a general claim about dictation accuracy.

## How it works

Audio comes off the default input through `AVAudioEngine` and is converted to whatever format the analyzer requests. Capture starts before the speech stack has finished initializing, and buffers recorded during that window are held and flushed once the transcriber attaches, so the first word of a sentence is never clipped. Transcription runs through `SpeechAnalyzer` with volatile results enabled, which is what produces the live preview. There is no fallback path: the older `SFSpeechRecognizer` can send audio to Apple's servers when a locale has no on-device model, so Yap does not use it at all. If `SpeechAnalyzer` cannot handle your language on device, dictation stops rather than going to the network.

Insertion is the ugly part, and the README is honest about it. Yap writes the text to the clipboard, drives `⌘V` through System Events, then restores the previous clipboard contents — with a delay before restoring, because Chromium-based apps read the pasteboard asynchronously and more than once, and restoring too early hands the renderer stale data. That timing detail is the difference between working everywhere and working only in native apps. State lives in a single `RecordingCoordinator` state machine whose dependencies are all protocols, so the logic is unit-tested without a microphone.

Four permissions are requested on first launch: microphone, speech recognition, accessibility (to know which app you are typing into), and automation (to paste into it). Accessibility has to be granted by hand in System Settings; macOS offers no programmatic path for anything that types on your behalf.

```bash
brew install --cask frigadehq/tap/yap
```

Building from source is `git clone https://github.com/FrigadeHQ/yap.git && cd yap && ./install.sh`, which installs XcodeGen if needed, builds, and drops the app in `/Applications`. The Xcode project is generated from `project.yml` rather than committed, so config changes stay readable in a diff. Local builds are signed ad-hoc, meaning macOS treats each rebuild as a new application and silently forgets granted permissions — the checkbox still looks enabled in System Settings while pasting stops working. Settings has a "Reset and re-grant" button for exactly that; released builds are properly signed and notarized and do not have the problem.

## Constraints

macOS 26 (Tahoe) or later, on Apple Silicon. Intel is not supported and the removal was deliberate: `SpeechAnalyzer` only runs on device on Apple Silicon, and the Intel-compatible path was `SFSpeechRecognizer`, which sends audio to Apple. Version 0.1.4 and earlier still work on Intel and do make those API calls. Building needs Xcode 26. The roadmap is intentionally close to empty, with a language picker as the most likely addition since Yap follows the system locale today.

That combination — one platform, one OS version, one vendor's API, and a company-side project with a stated no-roadmap policy — puts it on [[toolbox/watchlist]]. The technical bet is sound, but nothing here survives Apple deprecating or changing `SpeechAnalyzer`, and the whole value proposition disappears if a cross-platform option matures. [[moonshine]] makes the same kind of trade in the other direction, betting entirely on Wayland, Vulkan, and systemd to get a capability that would otherwise need a lot more code. [[toolbox/kokoro]] is the same on-device bet pointed the other way — speech synthesis rather than recognition, at 82M parameters — and because it ships its own weights it runs anywhere, which is precisely the property Yap gave up.

[github.com/FrigadeHQ/yap](https://github.com/FrigadeHQ/yap) — 257 stars, MIT.
