A macOS menu-bar dictation app that inserts text into your current app.
Local-first speech, optional AI help, and simple setup.
KeyScribe is a menu-bar app for macOS.
You press a shortcut, speak, and KeyScribe inserts the text into the app you are using right now. It is built for fast dictation, low friction, and local-first use.
Important behavior today:
- It runs as a menu-bar utility with no Dock icon.
- The menu-bar popover gives quick actions for dictation, history, AI Studio, and Settings.
- It can insert text directly, paste through a temporary clipboard, or fall back to typed keystrokes.
- It keeps recent transcript history on your Mac.
- It can learn from quick fixes you make after insertion.
- It supports both local and cloud-based speech/AI flows.
- Apple Speech with selectable recognition mode (
Local Only,Cloud Only,Automatic) - Local
whisper.cppwith curated model downloads, Core ML support, and idle unload controls - Cloud transcription providers:
- OpenAI
- Groq
- Deepgram
- Google Gemini (AI Studio)
- Direct Accessibility-based insertion when possible
- Privacy-friendly transient clipboard fallback when clipboard copy is off
- Optional "also copy transcript to system clipboard" mode
- Hold-to-talk and continuous dictation modes
- Paste last transcript shortcut
- Transcript history window with search, copy, delete, and reinsert actions
- Optional AI prompt correction before insertion
- Suggestion preview when auto-insert is not used
- Optional auto-insert for high-confidence suggestions
- Optional Markdown-preserving output for structured suggestions
- Rewrite provider options:
- Ollama (local)
- OpenAI
- Anthropic
- Google AI Studio (Gemini)
- Groq
- OpenRouter
- Built-in AI Studio for provider setup, model selection, timeouts, and conversation controls
- Rewrite style presets such as
Balanced,Formal,Casual,Architect, and more - OpenAI and Anthropic OAuth support, plus API-key support where needed
- Optional conversation-aware rewrite history with timeout and turn-limit controls
- Pinned or automatic rewrite context selection in AI Studio
- Cross-IDE conversation sharing for matching coding contexts
- Context mappings and conversation inspection are available in AI Studio
- External memory indexing exists, but it is still behind the
KEYSCRIBE_FEATURE_AI_MEMORY=1feature flag
- Adaptive corrections that learn from your edits
- Custom correction management
- Configurable sounds, waveform themes, and app chrome themes
- Sparkle-based update checks from the app
- No account is required for local dictation
- No telemetry is enabled by default
- Settings, transcript history, and learned corrections stay on your Mac
- API keys and OAuth sessions are stored in macOS Keychain
- If you choose cloud transcription or cloud rewrite providers, your audio/text is sent to that provider
- Clipboard copying is off by default, so KeyScribe tries to avoid leaving dictation in clipboard history
- Local crash logs stay on disk in
~/Library/Logs/KeyScribe/
- macOS 13.3 or newer
- Microphone permission
- Accessibility permission for reliable insertion and global shortcuts
- Speech Recognition permission when using the Apple Speech engine
You may also need internet access for:
- cloud transcription
- cloud rewrite providers
- downloading
whisper.cppmodels - local AI runtime/model setup
- app update checks
| Action | Default shortcut |
|---|---|
| Hold-to-talk | ⌥⌘Space |
| Toggle continuous dictation | ⌃⌥⌘Space |
| Paste last transcript | ⌥⌘V |
All shortcuts can be changed in Settings.
- Download the latest release from GitHub Releases.
- Open
KeyScribe.app. - Grant Accessibility and Microphone access when prompted.
- If you use Apple Speech, also grant Speech Recognition.
- Open Settings from the menu bar.
- Choose your transcription engine:
Apple Speechfor built-in system speechwhisper.cppfor fully local speech after model installCloud Providersfor OpenAI/Groq/Deepgram/Gemini transcription
- If you only want plain dictation, you can turn off AI prompt correction in Settings -> AI & Models.
- If you want AI rewrite, open AI Studio and either:
- connect a cloud provider, or
- install local AI with the built-in Ollama setup flow
For a step-by-step walkthrough, see the User Guide.
- This repo is a Swift Package Manager macOS app
- Xcode 15+ or Apple developer tools with Swift 5.9 support
- Node/npm only if you want to create a DMG with
--make-dmg - A Developer ID certificate plus Apple notarization credentials only if you want a public signed release
./build.shThis creates:
dist/KeyScribe.app
What build.sh does today:
- Downloads
Vendor/Whisper/whisper.xcframeworkautomatically if it is missing - Runs
swift build -c release - Bundles the app into
dist/KeyScribe.app - Uses ad-hoc signing by default unless
DEVELOPER_IDis set
./build.sh --install
./build.sh --make-dmg--installcopies the app to/Applications/KeyScribe.app--make-dmgalso createsdist/KeyScribe.dmg--installalso resets Accessibility permission, so you will need to grant it again after install
export DEVELOPER_ID="Your Name (TEAMID)"
./build.sh --make-dmg
Scripts/notarize.shThere is also a project-specific helper:
./build-local.sh --make-dmgScripts/notarize.sh notarizes dist/KeyScribe.dmg and expects these environment variables:
APPLE_IDAPPLE_TEAM_IDAPPLE_APP_PASSWORD
Run package tests with:
swift testRun the smoke/regression suite with:
Scripts/run-tests.shRun insertion reliability checks directly with:
Scripts/run-insertion-reliability.sh --regressionThe repo also contains XCTest coverage for some conversation and settings behavior in Tests/KeyScribeTests/.
If insertion is not behaving the way you expect, you can enable insertion diagnostics:
- Turn it on in app settings, or set
KEYSCRIBE_INSERTION_DIAGNOSTICS=1 - Default log path:
/tmp/keyscribe-insertion-diagnostics.log - You can override the log path with
KEYSCRIBE_INSERTION_DIAGNOSTICS_PATH
Crash logs, when present, are stored locally at ~/Library/Logs/KeyScribe/crash.log.
Sources/KeyScribe/ App code
Resources/ Info.plist, icons, entitlements
Scripts/ Build, test, release, and utility scripts
Tests/KeyScribeTests/ XCTest coverage
Docs/ User-facing docs
Wiki/ Extra product notes
Vendor/Whisper/ Bundled whisper.cpp XCFramework
Main app areas:
Sources/KeyScribe/App.swiftwires the app lifecycle, menu bar, settings, and windows.Sources/KeyScribe/Services/contains transcription, insertion, AI, memory, and settings logic.Sources/KeyScribe/Views/contains SwiftUI screens such as the status popover and AI Studio.Sources/KeyScribe/Support/contains feature flags, permissions, and window helpers.
- The app currently supports three speech paths: Apple Speech, local
whisper.cpp, and cloud providers. - AI Studio is already integrated and is the main place for rewrite provider setup and local AI setup.
- The advanced external memory-indexing workflow is present in the codebase, but it is still gated behind
KEYSCRIBE_FEATURE_AI_MEMORY=1. - The old README said the default build created both
.appand.dmg; today, the default build creates the.app, and DMG creation is opt-in with--make-dmg.
