Skip to content

Speak naturally, type effortlessly — local AI transcription for macOS

License

Apache-2.0, MIT licenses found

Licenses found

Apache-2.0
LICENSE-APACHE
MIT
LICENSE-MIT
Notifications You must be signed in to change notification settings

fredlahde/scribe

Repository files navigation

Scribe

Scribe

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.

Features

  • 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

Requirements

  • macOS 10.15 or later
  • Microphone access permission
  • Accessibility permission (for auto-typing)
  • A Whisper model file (see below)

Model Setup

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.

Download the Model Files

  1. Whisper model (required):

  2. CoreML encoder (recommended for Apple Silicon):

Install the Model

  1. Download ggml-medium.bin and place it in a convenient location (e.g., ~/Models/)
  2. Download and unzip ggml-medium-encoder.mlmodelc.zip
  3. Place the unzipped ggml-medium-encoder.mlmodelc folder in the same directory as the .bin file
  4. On first launch, configure the model path in the settings

Installation

From Release

Download the latest .dmg from the Releases page and drag the app to your Applications folder.

Build from Source

Prerequisites

  • Rust (latest stable)
  • Node.js (v18+)
  • just command runner (optional but recommended)

Build Steps

# Install dependencies
npm install

# Development mode
just dev
# or: npm run tauri dev

# Production build
just build
# or: npm run tauri build

The built app will be in src-tauri/target/release/bundle/macos/.

Usage

First Launch

  1. Launch the app - the main window will open
  2. Navigate to Settings and click Browse to select your ggml-medium.bin file
  3. Configure your preferred hotkeys (defaults: F2 for English, F4 for mute)
  4. Click Save
  5. Grant microphone and accessibility permissions when prompted

Recording

  1. Position your cursor where you want the text to appear
  2. Hold the English hotkey (default: F2) and speak
  3. Release the hotkey when done - the app will transcribe and output the result

Output Modes

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.

Transcription History

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).

System Tray

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.

Hotkeys

Default Action
F2 (hold) Record in English
F3 (hold) Record in German (if configured)
F4 Toggle mute

All hotkeys can be customized in Settings.

Development

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 tests

See just --list for all available commands.

Project Structure

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

Troubleshooting

"Microphone access denied"

Grant microphone permission in System Preferences > Security & Privacy > Privacy > Microphone.

Text not typing

Grant accessibility permission in System Preferences > Security & Privacy > Privacy > Accessibility.

Copy mode not pasting

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.

Slow transcription

Ensure the CoreML encoder (ggml-medium-encoder.mlmodelc) is in the same directory as your model file. This enables GPU acceleration on Apple Silicon.

Model fails to load

Verify the model file path is correct and the file is not corrupted. Try re-downloading the model.

Text not typing after installing a release build (developers)

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.app

If you use Copy mode and pasting stops working, reset Automation (System Events) permissions so macOS prompts you again:

sudo tccutil reset AppleEvents com.scribe.app

After 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.

License

MIT or Apache-2.0, at your option.

About

Speak naturally, type effortlessly — local AI transcription for macOS

Resources

License

Apache-2.0, MIT licenses found

Licenses found

Apache-2.0
LICENSE-APACHE
MIT
LICENSE-MIT

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •