/how-it-worksNo mystery meatA Rust core, a React face, and exactly three network calls.
Wisspa is a Tauri app: a Rust backend doing the listening, thinking, and pasting, with a small React WebView for the interface. Here’s the whole machine — what runs where, what leaves your Mac (less than you’d think), and the odd corners we sanded down so you never have to know they existed.
The pipeline
hold hotkey ──▶ record audio (WebView)
│
▼
release ──▶ Groq Whisper (transcribe) ← your key, your call
│
├── dictation ──▶ Claude Haiku (cleanup) ← your key, your call
├── action ──▶ local YAML registry ← no network at all
└── prompt ──▶ Claude Sonnet (rewrite) ← your key, your call
│
▼
clipboard write + System Events ⌘V ──▶ text at your cursor
│
▼
clipboard restored (all flavors). history row written. done.Median time from release to inserted text is engineered to be under a second — the clipboard alone was re-plumbed to poll for paste completion instead of sleeping a fixed 250 ms. Warm system prompts are cached at Anthropic so repeat presses cost less and answer faster.
What runs where
On your Mac
- Hotkey daemon. Global shortcuts registered with macOS, paused while you reassign them, re-registered live.
- Audio capture. MediaRecorder in the WebView records while you hold the key. The buffer is discarded after transcription.
- Action matcher + executor. Exact-then-fuzzy trigger matching and all five action types run entirely offline.
- Settings. A versioned JSON file in Application Support. Read it, diff it, back it up — it’s just a file.
- History. SQLite on disk: transcripts, outputs, latency, token usage. Searchable, exportable, prunable.
- API keys + license key. macOS Keychain, via the system keyring. Never written to disk, never synced anywhere.
- Voice action registry. Plain YAML files, file-watched, hot-reloaded. Delete them all and the app still works.
In the cloud (with your keys)
- Groq — Whisper STT. Your audio, your API key, straight from your Mac. whisper-large-v3-turbo by default.
- Anthropic — Haiku cleanup. Your transcript, your API key. Punctuation, filler removal, tone matching.
- Anthropic — Sonnet rewrite. Prompt mode and command mode. The expensive-sounding one; it’s fractions of a cent per press.
- GitHub — update check. A plain file download of a manifest on Releases. Nothing about you or your usage is sent.
The privacy posture, in one paragraph
There is no Wisspa backend. No account, no telemetry, no analytics SDK, no crash reporter. Network egress is exactly what you see above: Groq and Anthropic under your own API keys (their privacy policies apply to those calls), an optional update check, and an optional license validation. Audio is only captured while you hold the key and discarded after transcription. History lives in a SQLite file you can delete. We couldn’t see what you say to it if we wanted to — and the code is MIT-licensed, so you don’t have to take that on faith.
The interesting bits
Why AppleScript presses ⌘V for us
Simulating keystrokes from Rust (enigo) worked great — except when it didn’t. Focus quirks, secure input fields, IME edge cases. macOS’s own System Events keystroke dispatch is the path every other automation tool uses, so that’s what dispatches your paste now. Boring, battle-tested, correct.
The pill that refuses to hide
WKWebView aggressively throttles JavaScript in fully hidden windows — including the code that records your audio. So the runtime window stays technically visible at all times, parked behind the always-on-top overlay pill you actually see. Two windows, one illusion, zero throttling.
Why the app never pastes into itself
When you dictate into Wisspa’s own windows (say, the onboarding test box), the normal paste path would re-activate whatever app was previously focused and type there instead. So our own windows get a direct internal channel: the text is delivered straight to the field, no clipboard, no focus gymnastics. You only notice it by it working.
The stack
Tauri 2 · Rust (reqwest, rusqlite, keyring) · React 18 + Vite + TypeScript · Tailwind · Zustand · Groq Whisper · Anthropic Messages API · SQLite · macOS Keychain · AppleScript via System Events. Performance budgets we engineer against: ≤ 800 ms median from key release to inserted text, ≤ 1 s to menu-bar-ready, ≤ 150 MB idle memory. Targets, not marketing numbers — the history tab shows you the real latency of every single press.
Want the receipts? The whole codebase is on GitHub — 250 automated tests, CI on every merge, MIT license. Or just try it.