A local, private voice-to-text app for macOS. Press ⌘\ anywhere, speak, release — your transcription lands on the clipboard, ready to paste.
Runs entirely offline using Whisper via faster-whisper. No accounts, no cloud, no telemetry.
- Global hotkey —
⌘\to start/stop recording from any app - Local Whisper — choose from
small(240 MB, fast) up tolarge-v3-turbo(1.5 GB, ChatGPT-grade) - English + Indonesian — selectable from the menu bar (Whisper supports 99 languages — only EN/ID exposed in the UI)
- Floating overlay — ChatGPT-voice-mode-style pill at the bottom of your screen, with live audio levels
- Main window — animated orb showing current state + last transcript
- Menu bar item — quick access to language, model, microphone
- Microphone picker + test mode — works with any input device on your system
- Fully local — model weights cached at
~/.cache/huggingface, used offline forever after
- macOS 13 (Ventura) or later. Tested on macOS 14 / 15.
- Python 3.11+ (only needed to build from source — the bundled
.dmgships its own Python) - ~2 GB of disk for the largest model
git clone https://github.com/sanwidee/typeflow.git
cd typeflow
./run.shrun.sh creates a virtualenv, installs dependencies, and launches the app. The first transcription downloads the Whisper model (one-time, ~240 MB for small).
./build_app.shThis produces ~/Applications/TypeFlow.app — a thin launcher that points at your local venv. Double-click to run. macOS will prompt for:
- Microphone (for recording)
- Accessibility + Input Monitoring (for the global hotkey)
Grant all three, then quit and relaunch the .app.
./scripts/build_release.shThis uses PyInstaller to produce a fully self-contained .app that bundles its own Python + dependencies (no Anaconda or system Python needed). Then:
./scripts/make_dmg.sh…packages that .app into dist/TypeFlow.dmg, ready to upload to GitHub Releases.
The DMG is not signed by Apple (paying $99/yr for a Developer ID isn't reasonable for a free hobby project). The first time someone downloads it, macOS will refuse to open it. Two ways to bypass:
Option A — right-click → Open (recommended):
- Drag
TypeFlow.appto/Applications - Right-click → Open
- Click Open in the warning dialog
- After this, double-click works normally
Option B — strip the quarantine flag (for "App is damaged" errors):
xattr -dr com.apple.quarantine "/Applications/TypeFlow.app"| Action | How |
|---|---|
| Start/stop recording | ⌘\ |
| Change language | Menu bar TF → Language |
| Change Whisper model | Menu bar TF → Model |
| Pick microphone | Menu bar TF → Microphone |
| Test microphone (3s) | Menu bar TF → Test Microphone |
| Show main window | Menu bar TF → Show Window, or click the Dock icon |
| Quit | Menu bar TF → Quit |
| Logs | ~/.typeflow.log |
| Settings file | ~/.typeflow.json |
app.py — main entry point, rumps menu bar, state machine
main_window.py — animated NSWindow with orb, status, transcript
overlay.py — floating NSPanel pill (ChatGPT-voice-mode style)
build_app.sh — wraps the venv into a clickable .app
assets/icon.svg — source for the .icns app icon
scripts/
build_icon.sh — SVG → .icns via qlmanage + sips
build_release.sh — PyInstaller bundle (self-contained .app)
make_dmg.sh — wraps the .app into a .dmg
install_launcher.sh — internal helper for build_app.sh
MIT — see LICENSE.
This project bundles open-source components under MIT, BSD, Apache-2.0, and LGPL-3.0. See NOTICE for full attribution and LGPL compliance details.
- OpenAI for Whisper
- SYSTRAN/faster-whisper for the fast CTranslate2 backend
- Inspired by Wispr Flow, Superwhisper, and ChatGPT voice mode