Scribe is a lightweight macOS menu bar app that turns your voice into text instantly. Simply hold a hotkey, speak, and release—your words are transcribed locally using Whisper with Apple Silicon acceleration and typed directly at your cursor. No cloud services, no latency, just fast and private voice-to-text.
A macOS push-to-talk voice transcription app built with Tauri. Hold a hotkey to record, release to transcribe using OpenAI's Whisper model with CoreML/Metal acceleration, and automatically type the result.
- Push-to-talk recording - Hold a configurable hotkey to record, release to transcribe
- Fast local transcription - Uses Whisper.cpp with CoreML and Metal GPU acceleration
- Multi-language support - Separate hotkeys for English and German transcription
- Flexible output modes - Type text directly or copy-and-paste via clipboard
- Transcription history - View, copy, and manage your recent transcriptions
- System tray app - Lives in your menu bar with status indicators
- Mute toggle - Quickly disable/enable the microphone with a hotkey
- Configurable hotkeys - Set custom keyboard shortcuts for each action
- macOS 10.15 or later
- Microphone access permission
- Accessibility permission (for auto-typing)
- A Whisper model file (see below)
You need to download a Whisper model to use this app. The recommended model is ggml-medium.bin with its CoreML encoder for optimal performance on Apple Silicon.
-
Whisper model (required):
-
CoreML encoder (recommended for Apple Silicon):
- Download
ggml-medium.binand place it in a convenient location (e.g.,~/Models/) - Download and unzip
ggml-medium-encoder.mlmodelc.zip - Place the unzipped
ggml-medium-encoder.mlmodelcfolder in the same directory as the.binfile - On first launch, configure the model path in the settings
Download the latest .dmg from the Releases page and drag the app to your Applications folder.
# Install dependencies
npm install
# Development mode
just dev
# or: npm run tauri dev
# Production build
just build
# or: npm run tauri buildThe built app will be in src-tauri/target/release/bundle/macos/.
- Launch the app - the main window will open
- Navigate to Settings and click Browse to select your
ggml-medium.binfile - Configure your preferred hotkeys (defaults: F2 for English, F4 for mute)
- Click Save
- Grant microphone and accessibility permissions when prompted
- Position your cursor where you want the text to appear
- Hold the English hotkey (default: F2) and speak
- Release the hotkey when done - the app will transcribe and output the result
Scribe offers two ways to deliver transcribed text, configurable in Settings:
| Mode | Description |
|---|---|
| Type (default) | Text is typed character-by-character at your cursor position using simulated keystrokes |
| Copy | Text is copied to clipboard and automatically pasted at your cursor position |
When to use each mode:
- Type mode works in most applications and preserves your clipboard contents. However, some applications with custom text input handling may not receive keystrokes correctly.
- Copy mode is more reliable in applications that don't respond well to simulated typing (e.g., some Electron apps, terminals, or IDEs with aggressive autocomplete). The tradeoff is that it overwrites your clipboard with the transcribed text.
The main window displays your recent transcriptions with:
- The transcribed text
- Language used (English/German)
- Recording duration
- Word count
- Relative timestamp
You can:
- Copy any transcription to clipboard with one click
- Delete transcriptions with undo support (5 second window)
History is stored locally in a SQLite database (up to 50 entries).
The app lives in your menu bar with status icons:
- Idle - Ready to record
- Recording - Currently capturing audio
- Transcribing - Processing speech to text
- Muted - Microphone disabled
Click the tray icon menu for options (Open, Quit). Closing the window hides it to the tray rather than quitting.
| Default | Action |
|---|---|
| F2 (hold) | Record in English |
| F3 (hold) | Record in German (if configured) |
| F4 | Toggle mute |
All hotkeys can be customized in Settings.
just dev # Run in development mode
just check # Check for compile errors (fast)
just fmt # Format code
just lint # Run clippy linter
just test # Run testsSee just --list for all available commands.
scribe/
├── src/ # Frontend (Vue.js + TypeScript)
│ ├── components/
│ │ ├── AppHeader.vue # Navigation header
│ │ └── TranscriptionItem.vue # History list item
│ ├── stores/
│ │ └── pendingDelete.ts # Undo deletion state management
│ ├── views/
│ │ ├── HistoryView.vue # Transcription history list
│ │ └── SettingsView.vue # App configuration
│ ├── styles/
│ │ └── main.css # Global styles
│ ├── App.vue # Root component
│ ├── main.ts # App entry point
│ └── router.ts # Vue Router configuration
├── src-tauri/ # Rust backend
│ └── src/
│ ├── lib.rs # App setup, shortcuts, orchestration
│ ├── audio.rs # Microphone capture, resampling
│ ├── history.rs # SQLite transcription storage
│ ├── transcribe.rs # Whisper integration
│ ├── input.rs # Text typing simulation
│ ├── settings.rs # App state management
│ ├── tray.rs # System tray handling
│ └── error.rs # Error types
├── index.html # App entry HTML
└── justfile # Build commands
Grant microphone permission in System Preferences > Security & Privacy > Privacy > Microphone.
Grant accessibility permission in System Preferences > Security & Privacy > Privacy > Accessibility.
Copy mode uses AppleScript to simulate Cmd+V. If pasting fails, ensure Scribe has permission to control System Events in System Preferences > Security & Privacy > Privacy > Automation.
Ensure the CoreML encoder (ggml-medium-encoder.mlmodelc) is in the same directory as your model file. This enables GPU acceleration on Apple Silicon.
Verify the model file path is correct and the file is not corrupted. Try re-downloading the model.
When testing production builds (just build), you may need to reset accessibility permissions after each rebuild. This happens because macOS ties accessibility permissions to the app's code signature, and ad-hoc signed development builds get a new signature on each build.
sudo tccutil reset Accessibility com.scribe.appIf you use Copy mode and pasting stops working, reset Automation (System Events) permissions so macOS prompts you again:
sudo tccutil reset AppleEvents com.scribe.appAfter running these commands, re-grant the permission(s) when prompted. This is expected behavior for local development builds and does not affect end users installing signed releases.
MIT or Apache-2.0, at your option.
