macOS meeting transcription tool. Captures Zoom, Teams, Google Meet, and any browser tab in real-time using a local Whisper model — no data leaves your machine.
- macOS 15 (Sequoia) or later
- Xcode 16+ Command Line Tools —
xcode-select --install - Rust — rustup.rs
- Tauri CLI —
cargo install tauri-cli --version "^2.0"
git clone https://github.com/mkarvan/ScribeBuddy.git
cd ScribeBuddy
./build.shOn the first run, build.sh automatically creates a local code-signing certificate in your Keychain so macOS retains the Screen Recording permission across rebuilds. macOS will ask for your login password once to set the trust — that's normal and only happens this one time.
After that, every subsequent ./build.sh builds silently with no prompts.
To build and copy straight to /Applications:
./build.sh --installThe app is signed with a local certificate, not notarized by Apple, so Gatekeeper blocks it the first time:
- Double-click ScribeBuddy.app — dismiss the "cannot be opened" dialog
- Open System Settings → Privacy & Security
- Scroll down and click Open Anyway
This only happens once.
On first launch macOS will ask for:
- Microphone — to capture your voice
- Screen & System Audio Recording — to capture meeting audio (no screen content is recorded)
Click Allow for both.
- In the settings bar, choose a Model size (
smallis a good default — 461 MB, ~4 s latency) - Click the ↙ Download button and wait for it to complete
Models are stored in ~/Library/Application Support/ai.scribebuddy.app/ and reused across launches.
# Hot-reload dev window (no signing needed)
cargo tauri dev
# Run the test suite
cargo test -p scribebuddy-core
# Type-check without a full build
cargo check --workspaceThe test suite runs automatically before every ./build.sh via beforeBuildCommand in tauri.conf.json.
This means the app was built without the signing certificate (e.g. with cargo tauri build directly instead of ./build.sh). Always use ./build.sh — it signs the app with a stable local identity so macOS retains the permission.
If the permission is stuck in a denied state, reset it and re-grant:
tccutil reset ScreenCapture ai.scribebuddy.appThen relaunch and click Allow when prompted.
Start the app first (so macOS registers it), then open System Settings → Privacy & Security → Screen & System Audio Recording.
Open System Settings → Privacy & Security → Microphone and confirm ScribeBuddy is enabled.
You're running the app without signing it first. Always use ./build.sh — it signs the app automatically.
[Microphone] ──► cpal (ring buffer) ──┐
├──► AudioProcessor ──► Transcriber ──► Transcript
[Meeting App] ──► ScreenCaptureKit ────┘ │
(48 kHz stereo → mono) rubato resampler
(source Hz → 16 kHz)
│
WhisperEngine
(Metal / CPU)
AudioProcessor::run_with<T: Transcriber>is generic over the transcription engine —WhisperEnginein production,MockTranscriberin tests- Session lifecycle (
Idle → Recording → Paused → Stopped) is owned bySessionManager; Tauri commands are thin wrappers - All file writes use write-to-temp-then-rename for crash safety
| Crate | Purpose |
|---|---|
| whisper-rs 0.16 | Whisper.cpp bindings with Metal acceleration |
| screencapturekit 0.3 | macOS system audio capture |
| cpal 0.15 | Microphone capture |
| rubato 0.14 | Audio resampling to 16 kHz |
| ringbuf 0.4 | Lock-free SPSC ring buffers |
| Tauri 2 | App framework, system tray, native dialogs |
MIT