Press a shortcut. Speak. Your words appear wherever you're typing.
Website · Download · Changelog
TTP is a lightweight desktop app that turns speech into text in any app. Hold a shortcut, speak, and your words are transcribed and pasted wherever your cursor is. No switching apps, no copy-pasting, just talk.
Built for long dictations: minutes of speech, with pauses to think, come back whole.
Free. No account required. Bring your own Groq API key.
- Accurate on long dictations — Whisper large-v3 on Groq. Pauses and quiet speech are kept, not dropped as silence.
- Works everywhere — Paste into Slack, VS Code, Gmail, Notion, any app where you type.
- AI polish — Removes filler words and fixes grammar with a Groq LLM pass.
- Smart dictionary — Learns your names, jargon, and technical terms post-paste.
- Any shortcut — Fn, a key, a modifier or a mouse button, plus an optional second one. Hold to talk, or double-tap for hands-free.
- Auto-stop after silence (opt-in) — End the recording automatically when you've stopped speaking.
- Mac + Windows — Native app, lives in your menu bar / system tray. Speaks English and French.
- Clear about your data — Your voice goes to Groq for transcription, with your own key. There is no TTP server. Keys live in your OS keychain, history stays local, crash reports are opt-in.
- Updates without interruption — Minisign-verified updates download in the background and install during a two-minute pause.
TTP runs on your machine and handles your voice and your API keys, so we treat the security pipeline as a feature.
- Signed + notarized macOS builds — every release is code-signed with an Apple Developer ID certificate and notarized through Apple's notary service before shipping.
- Code-signed Windows installers —
.msiand NSIS-setup.exeartifacts are signed in CI when the Windows certificate is configured. - Minisign-verified auto-updates — the Tauri updater verifies every update payload against a minisign public key embedded in the app at install time; tampered updates are rejected.
- OS keychain for API keys — your Groq API key lives in the macOS Keychain (and Windows Credential Manager on Windows), not in plaintext config files.
- HMAC-signed local caches — the offline licence cache (for the optional supporter licence) is HMAC-signed with a per-machine secret stored in your OS keychain, so a licence file forged on one machine won't be accepted on another.
- Telemetry off by default — Sentry crash reporting is opt-in and disabled until you explicitly enable it in Settings. No usage analytics are collected.
- Strict CSP, no remote webview content — the embedded webview only loads bundled assets; the only outbound endpoints reachable from the renderer are Groq and Sentry.
- Third-party calls are listed in the privacy policy — Groq, Lemon Squeezy, GitHub (updater feed), Sentry. No other network calls are made.
Found a security issue? Please report it privately — see SECURITY.md. The threat model that scopes "in scope" vs "out of scope" reports lives in THREAT_MODEL.md.
- Hold your shortcut —
Fnby default on Mac; any key, modifier or mouse button you choose. - Speak — Talk naturally. TTP records your voice in the background.
- Text appears — Your words are transcribed and pasted into the active app, typically about a second and a half after you let go.
Grab the latest release for your platform:
- Install the app
- Get a free API key from Groq Console
- Paste the key in TTP's setup screen
- Start talking
# Clone the repo
git clone https://github.com/AmirK-S/TTP.git
cd TTP
# Install dependencies
npm install
# Run in development
npm run tauri dev
# Build for production
npm run tauri build| Layer | Technology |
|---|---|
| Framework | Tauri 2 |
| Frontend | React + TypeScript |
| Backend | Rust |
| Styling | Tailwind CSS |
| Transcription | Groq Whisper (whisper-large-v3) |
| AI Polish | Groq LLM (openai/gpt-oss-120b) |
| Landing Page | Astro |
TTP/
├── src/ # React frontend
│ ├── components/ # UI components + design primitives (Button, Modal, ...)
│ ├── hooks/ # Recording / transcription / updater / Tauri events
│ ├── lib/ # Pure helpers (theme, i18n, PII scrub, ...)
│ ├── stores/ # Zustand settings store
│ ├── windows/ # Settings · Onboarding · FloatingBar · PermissionHelper
│ └── i18n/ # EN + FR translation tables
├── src-tauri/ # Rust backend
│ └── src/
│ ├── transcription/ # Whisper + LLM polish + cleanup + dictionary apply
│ ├── dictionary/ # Smart dictionary with auto-detection
│ ├── audio_capture.rs / audio_monitor.rs / vad.rs # cpal + RMS + VAD
│ ├── fnkey.rs / fnkey_fsm.rs # macOS Fn key (FSM is pure + unit-tested)
│ ├── state.rs / shortcuts.rs / tray.rs # Recording lifecycle
│ ├── settings/ + usage/ + history/ + licensing/ # Persistence layers
│ └── telemetry/ + logging.rs # Observability
├── docs/architecture.md # Runtime architecture + diagrams
├── THREAT_MODEL.md # In-scope vs out-of-scope security boundaries
└── landing/ # Astro landing page (ttp.amirks.eu)
- Frontend —
npm run test:run(vitest + happy-dom, ~150 tests). - Rust —
cd src-tauri && cargo test --lib(~470 tests across the Fn FSM, HMAC, settings, pipeline classifiers, silence gate, dictionary, VAD). - Build-time gates —
npm run i18n:checkvalidates locale parity AND that everyt('xxx')callsite resolves against a real key. Wired intonpm run build.
Amir Kellou-Sidhoum — AI Engineer / Builder / Consultant
Made with care.
