Yap – free offline voice dictation for Mac/Windows/Linux (Wispr Flow alt) Yap, a free and open-source offline voice dictation tool for Mac, Windows, and Linux, has been released as an alternative to Wispr Flow and SuperWhisper. It runs locally using Whisper for transcription, requires no account or subscription, and does not send audio or screenshots to the cloud unless the user opts in. The tool is MIT-licensed and supports custom endpoints for cloud engines and LLM cleanup. Hold a key, talk, and what you said lands at the cursor: your editor, browser, a chat box, the terminal, wherever you're typing. It's a free, open-source alternative to Wispr Flow and SuperWhisper, and it runs offline by default. What you get: It stays private. Transcription runs locally with Whisper, so there's no account, no cloud, no telemetry, and nothing screenshots your screen. Audio only leaves your machine if you deliberately switch to a cloud engine. No word caps, no subscription. Wispr's free tier stops at 2,000 words a week and then runs $12–15/mo. yap is MIT-licensed, with no meter and nothing to upsell. Same on every OS. macOS, Windows and Linux share one config file. Quick. Faster than real time on CPU with the base model, near-instant with a GPU or a cloud key. Your keys, your endpoints. Point it at OpenAI, Groq, or a Whisper server you host yourself. There's an optional LLM cleanup pass too, against any OpenAI-compatible API. you: hold Right Option ⌥ "send him the q3 numbers by friday" yap: Send him the Q3 numbers by Friday. ← typed at your cursor Grab it, unzip, open. That's the whole thing: | |---| ⬇ Windows https://github.com/AkuchiS/yap/releases/latest/download/yap-Windows.zip ⬇ Linux https://github.com/AkuchiS/yap/releases/latest/download/yap-Linux.tar.gz macOS:not Apple-signed yet, so the first timeright-click the app → Open not double-click , then grant Microphone + Accessibility once. Comfortable with a terminal? See Install below. | Wispr Flow | yap | | |---|---|---| | Price | $12–15/mo free tier: 2k words/wk | Free, unlimited | | Offline mode | ❌ cloud only | ✅ local Whisper by default | | Sends audio to a server | Always | Only if you opt into a cloud engine | | Screenshots active window | Yes for "context" | Never | | Open source | ❌ | ✅ MIT | | Platforms | Mac/Win/iOS/Android | Mac/Win/Linux | Requires Python 3.9–3.13 3.14 is too new — some native deps don't have wheels for it yet . The local engine downloads a small Whisper model on first use. Clone, run the installer, go: git clone https://github.com/AkuchiS/yap.git cd yap ./install.sh yap run ./install.sh sets up an isolated pipx https://pipx.pypa.io environment so nothing pollutes your system Python. Then hold Right Option , speak, and let go; your words land at the cursor. Prefer a one-liner? pipx install "yap-dictation full @ git+https://github.com/AkuchiS/yap" does the same thing. The full extra pulls in the macOS menu-bar bits rumps ; plain git+… installs the core CLI only, so yap app won't start without it. macOS — grant your terminal Accessibility and Microphone permission: System Settings → Privacy & Security → Accessibility / Microphone . Without Accessibility, the paste keystroke is silently ignored. Linux X11 — works out of the box. For clipboard fallback install one of xclip / xsel . On Wayland , install wl-clipboard ; some compositors restrict synthetic keystrokes — use --engine local with inject.method = "type" if paste doesn't land. Windows — no extra steps; run from a normal terminal. yap run start the daemon; hold your hotkey and talk yap app tray app: menu-bar macOS / system tray Win/Linux yap transcribe meeting.m4a one-shot: transcribe a file, print the text yap vocab add PostgreSQL teach it your words see below yap hardware show your specs + the model it'll auto-pick yap doctor diagnose permissions / hotkey / mic / clipboard yap devices list microphones yap config show print effective config yap license show your install date + early-adopter code yap update check GitHub for a newer release The default model is "auto" — yap detects your CPU/RAM/chip and picks a size that stays responsive: tiny.en on very old/light machines, base.en on a 2019-era laptop, small.en on modern hardware, GPU-accelerated if you have CUDA. Run yap hardware to see the pick, or pin one with yap config set local.model '"small"' . yap uses your system default mic, which is usually fine. Where it bites is docking a laptop to a monitor. Plenty of monitors, USB-C docks and webcams have their own mic built in, and the OS tends to make that the default the moment you plug in, so you end up recording from a mic across the room or one that doesn't really work . It's not a mac quirk; Windows and Linux docks do the same thing. The fix is to pin the mic you actually want: yap devices list mics, and show which one yap picks yap config set audio.device '"Studio Display"' match by name substring, case-insensitive If you dock and undock a lot, give it a list instead of one name. yap re-checks on every keypress and uses the first one that's actually plugged in, so closing the lid built-in mic gone just falls through to the next: yap config set audio.device ' "MacBook Pro Microphone", "Studio Display" ' yap config set audio.device ' "Built-in", "Dell Monitor", "USB" ' Windows/Linux style yap devices prints a yap will use: … line so you can see what it picked. Some external mics only run at 48 kHz. yap records at whatever rate the mic offers and resamples to 16 kHz itself, so those are fine. If the recording light comes on but nothing gets typed, run yap run --debug in a terminal and it'll say why: it couldn't open the mic, no audio arrived, or what it heard was silent. yap only holds the mic while you hold the hotkey , so it doesn't fight your other tools. If you run your own always-listening assistant, point the integration hooks at it so it pauses while you dictate and resumes after: yap config set integration.on record start '"myassistant pause"' yap config set integration.on record stop '"myassistant resume"' Each hook runs with context in its environment, so the handoff can be smart about the OS and which app you're dictating into : | var | value | |---|---| YAP EVENT | start or stop | YAP OS | darwin / win32 / linux | YAP ACTIVE APP | the frontmost app e.g. Slack , Code , Terminal | For example, don't pause your assistant when you're dictating into it: yap config set integration.on record start \ '" \"$YAP ACTIVE APP\" = \"MyAssistant\" || myassistant pause"' yap config set integration.on record stop \ '" \"$YAP ACTIVE APP\" = \"MyAssistant\" || myassistant resume"' Same context is written to integration.state file as {"active": bool, "os": "...", "active app": "..."} if you'd rather poll. By default yap is push-to-talk on a single key like Wispr's "hold to dictate" : hold Right Option ⌥ on macOS Right Ctrl elsewhere , speak, and release to transcribe. Dictating into different apps? Give each one its own settings. yap merges the matching app's overrides over your base config for that utterance , matched by the frontmost app's name — perfect for app-specific jargon, or turning the LLM cleanup on in chat but off in your terminal: yap config set 'app profiles.Slack.cleanup.enabled' true yap config set 'app profiles.Terminal.vocabulary' ' "kubectl","stderr","grep" ' yap config set 'app profiles.Code.local.language' '"en"' Matching is exact first, then a case-insensitive substring so Slack also matches an app reported as Slack — chat . Anything you don't override falls back to base. yap config set hotkey.combo '"