Voicebar
A voice-first keyboard for Android that works alongside Gboard. Tap Voice, talk, and a tidy message lands in the box.
You speak faster than you type. Local Flow keeps all voice dictation private. Nobody will train on your data, and all transcription runs locally.
ProductivitySwift · PythonGitHub @jzone3OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
You speak faster than you type. Local Flow keeps all voice dictation private: open-source, native macOS dictation that runs Whisper locally.
Taken from the repository README
Loading the full README.
Read the full README ↗You speak faster than you type. Local Flow keeps all voice dictation private. Nobody will train on your data, and all transcription runs locally.
~/.zshrc, ~/.zprofile, … and the files they source) and shows what it found; nothing is saved until you click Import from shell.git status, example.com); chat apps skip the final period. On by default, one toggle to turn off.Download the latest Local-Flow.dmg from Releases, drag Local Flow to Applications and open it. Grant Microphone and Accessibility access when asked (Accessibility is what lets it see the hotkey in other apps and paste the text).
Requires macOS 14 or later. Liquid Glass needs macOS 26; older systems get a frosted bar.
brew install xcodegen
scripts/fetch-whisper.sh # downloads the pinned whisper.cpp xcframework into Vendor/ (checksum verified)
xcodegen generate
xcodebuild -project LocalFlow.xcodeproj -scheme LocalFlow -configuration Debug -derivedDataPath build CODE_SIGNING_ALLOWED=NO build
open "build/Build/Products/Debug/Local Flow.app"
Tests for the pure-Swift core (cleanup rules, dictionary spelling fixes, env-key scan, version compare) run with scripts/test-core.sh.
LocalFlow/
App.swift menu bar app, windows
Core/ TextCleanup, CleanupProfile, Vocabulary(+Packs), EnvironmentKeys, Hotkey, MixtureOfExperts, AudioChunker, Version — no AppKit, covered by Tests/
Capture/ HotkeyMonitor, AudioRecorder (16 kHz mono), AudioInputDevice, TextInserter (paste), DictationController
Transcription/ TranscriptionProvider protocol, LocalWhisper (+ model downloader), CloudProviders, TranscriptionService
Model/ AppSettings, Keychain, HistoryStore (wiped on quit, 12 h purge), UpdateChecker, Welcome
UI/ DictationBar (Liquid Glass), Settings, Onboarding, History, PackPicker, Glass (styles), Icon
CloudProviderID in LocalFlow/Transcription/CloudProviders.swift with its models, key URL and env var names.TranscriptionProvider that turns a TranscriptionRequest (16 kHz samples + WAV + dictionary) into text. Throw TranscriptionError.http/.network so retries and fallback work.makeProvider(model:). Settings and onboarding pick it up automatically.Local engines work the same way: LocalWhisper is just another TranscriptionProvider.
~/Library/Application Support/Local Flow/History) is one history.json plus one .wav per dictation, nothing else. The whole folder is emptied when the app quits and again at launch (so a crash leaves nothing behind); Delete removes files right away; while running, the purge runs every minute (recordings go after 5 minutes, text after 12 hours), on wake and whenever the app comes to the front, and also removes orphaned audio. The folder is excluded from Time Machine so backups never keep a copy.Drag Local Flow from Applications to the Trash. That leaves behind:
~/Library/Application Support/Local Flow/ — the downloaded Whisper models (0.5–1.6 GB each) and the session history.defaults delete com.jzone3.LocalFlowcom.jzone3.LocalFlow.keys (accounts openai.apiKey, elevenlabs.apiKey, gemini.apiKey; builds before 0.0.7 used com.jzone3.LocalFlow): remove them in Keychain Access, or security delete-generic-password -s com.jzone3.LocalFlow.keys -a openai.apiKey (same for the other two).Settings → About → Remove All Data… does all three and quits, so only the drag to the Trash is left.
Same pipeline as New Media Writer: release.yml builds, signs, notarizes and publishes Local-Flow-<version>.dmg plus a stable Local-Flow.dmg on every push to master (or a v* tag). Push a release-dry-run/** branch to get the DMG as a workflow artifact without publishing.
Secrets the workflow needs:
| Secret | Purpose |
|---|---|
MAC_CERT_P12 | base64 Developer ID Application certificate |
MAC_CERT_PASSWORD | password for the certificate |
APPLE_TEAM_ID | Apple Developer team ID |
NOTARY_KEY_P8 | base64 App Store Connect .p8 key |
NOTARY_KEY_ID | App Store Connect key ID |
NOTARY_ISSUER_ID | App Store Connect issuer ID |
MIT