A native macOS app for voice dictation anywhere. An open-source alternative to Wispr Flow and Superwhisper. Press and hold Fn (or a custom shortcut) to dictate text directly into any app using on-device speech recognition.
32
stars
211
commits
Swift
primary language
Sep 10, 2026
updated
A native macOS app for voice dictation anywhere. Press and hold Fn (or a custom shortcut) to dictate text directly into any app using on-device speech recognition, with optional transcript cleanup through S1-mini by Superwhisper, Apple Intelligence, Ollama, or OpenRouter.
![]() | ![]() |
![]() | ![]() |
.dmg from ReleasesDictate Anywhere always transcribes audio locally with FluidAudio. Cleanup happens only after transcription, so your raw audio stays on your Mac even when you enable Ollama or OpenRouter. Context Awareness keeps surrounding text local by default; sharing it with a remote cleanup provider requires a separate opt-in.
| Provider | Runs Where | Best For | Benefits |
|---|---|---|---|
| None | Nowhere | Fastest raw dictation | Uses the local FluidAudio transcript as-is |
| FluidAudio Vocabulary | On-device | Lightweight terminology correction | Applies vocabulary rescoring to Parakeet TDT final transcripts without an LLM |
| Apple Intelligence | On-device | Native macOS cleanup | On-device cleanup on supported Macs |
| S1-mini by Superwhisper | On-device | Compact English transcript normalization | One-click 462 MB download, fixed style/structure/context controls, and no separate server |
| Ollama | Local or self-hosted server | Privacy-first LLM cleanup | Local model choice, optional reasoning controls, and in-app model management for local Ollama setups |
| OpenRouter | Cloud | Broad hosted model access | Large model catalog, model search, secure key storage, and structured-output-aware selection |
S1-mini by Superwhisper is a compact model trained specifically to normalize speech-to-text transcripts.
Use Ollama when you want transcript cleanup with a local model or your own hosted Ollama server.
Recommended models:
gpt-oss:120b-cloud for the best cleanup quality when you have access to a large hosted/self-hosted Ollama-backed model
mistral-nemo:12b as the recommended local model when you want a much lighter on-device setup
Runs cleanup against the configured Ollama server URL, with http://127.0.0.1:11434 as the default local address
Lets you enter any installed model manually or select from detected installed models
Shows recommended models in the app, including size guidance and quality/latency tradeoffs
Can download recommended models directly from the app when the Ollama CLI is installed and the server is local
Can delete installed models from the app through the Ollama CLI
Exposes reasoning controls for models that report Ollama thinking support
Supports provider-specific cleanup prompts and shared custom vocabulary
Sample cleanup prompt for Ollama or OpenRouter:
Avoid em dashes entirely.
If the speaker corrects themselves or revises what they said, preserve the final intended meaning. Replace only the portion that is clearly superseded, and leave the rest unchanged.
Add paragraph breaks and bullet points when the dictation clearly calls for structure. Otherwise, keep it as regular prose.
Convert spoken numbers to numerals when that improves clarity, while preserving intended units and symbols. Example: "thirteen point five percent" -> "13.5%".
Remove only accidental duplicate words or obvious speech-recognition repetitions. Keep intentional repetition when it appears to be deliberate.
Preserve the speaker's tone, meaning, and intent.
Treat custom vocabulary as a strong hint, not a hard rule. Use it when it clearly fits the surrounding context. If it does not, prefer the wording that best matches the sentence.
Benefits of using Ollama:
Getting started with Ollama:
Use OpenRouter when you want access to hosted models without managing local model downloads.
Recommended model:
google/gemini-3-flash-preview for the best overall balance of cost, accuracy, and latency in Dictate Anywhere
Supports direct OpenRouter API usage for transcript cleanup after local transcription is complete
Lets you paste an API key into the app for secure Keychain storage
Can also read the API key from an environment variable such as OPENROUTER_API_KEY
Fetches the latest OpenRouter model catalog in-app
Includes model search and prioritizes models that advertise structured output support
Falls back to prompt-based JSON parsing automatically when a selected model does not support structured outputs cleanly
Supports provider-specific cleanup prompts and shared custom vocabulary
Benefits of using OpenRouter:
google/gemini-3-flash-preview currently gives the best overall results in this app when you care about cost, accuracy, and latency togetherGetting started with OpenRouter:
OPENROUTER_API_KEY set.| Germanic | Romance | Slavic | Other | Sino-Tibetan |
|---|---|---|---|---|
| English | Spanish | Polish | Hungarian | Mandarin Chinese (Simplified) |
| German | French | Czech | Finnish | |
| Dutch | Italian | Slovak | Greek | |
| Swedish | Portuguese | Slovenian | Latvian | |
| Danish | Romanian | Croatian | Lithuanian | |
| Norwegian | Bulgarian | Estonian | ||
| Ukrainian | ||||
| Russian |
# Clone the repository
git clone https://github.com/hoomanaskari/mac-dictate-anywhere.git
cd mac-dictate-anywhere
# Open in Xcode
open "Dictate Anywhere.xcodeproj"
# Or build from command line
xcodebuild -project "Dictate Anywhere.xcodeproj" -scheme "Dictate Anywhere" -configuration Release build
If you only want to run the app locally, you do not need the release packaging script.
For local development, use scripts/dev.sh with the shared Dictate Anywhere scheme. The workflow defaults to the Debug configuration, stable DerivedData, and the isolated Dictate Anywhere Dev.app so local permissions do not affect Release builds.
Create the ignored local signing override when needed:
scripts/dev.sh signing [TEAM_ID]
Automatic signing requires an Xcode account with the matching Apple Developer team and a matching development certificate. Keep Config/Signing.local.xcconfig ignored and do not commit it.
Common commands:
scripts/dev.sh check
scripts/dev.sh build
scripts/dev.sh build --configuration Release
scripts/dev.sh build --release
scripts/dev.sh launch
scripts/dev.sh test
scripts/dev.sh stop
Use --configuration Debug or --configuration Release with build. Tests run only with Debug because Release is not testable. The default is Debug, and --release is an alias for --configuration Release. Provisioning updates are disabled by default; pass --allow-provisioning-updates when you explicitly want Xcode to update signing assets. Release builds use the production signing identity and team. They do not package, notarize, update the appcast, or change production Release settings.
Set the optional DERIVED_DATA_PATH environment variable to use another stable path. The default is $HOME/Library/Developer/Xcode/DerivedData/DictateAnywhereDev.
If Accessibility permission is stale, remove Dictate Anywhere Dev.app from System Settings → Privacy & Security → Accessibility, launch it again, and add that exact app.
Release signing remains separate from this local workflow.
create-dmg \
--volname "Dictate Anywhere" \
--window-pos 200 120 \
--window-size 600 400 \
--icon-size 100 \
--icon "Dictate Anywhere.app" 150 185 \
--app-drop-link 450 185 \
"dist/Dictate Anywhere.dmg" \
"dist"
The maintainer release script is intentionally not tracked. Create your own local copy like this:
cp scripts/release-macos.template.sh scripts/release-macos.sh
chmod +x scripts/release-macos.sh
Then edit scripts/release-macos.sh and set your own values for:
NOTARY_PROFILETEAM_IDDEVELOPER_ID_APPDOWNLOAD_URL_PREFIXREPOSITORY_LINKAlso create Config/Signing.local.xcconfig with your own Apple Developer team ID, and update the Xcode signing settings and bundle identifiers if your local release setup needs different values.
When your local signing setup is ready, package the release with:
./scripts/release-macos.sh
The app uses FluidAudio speech models that run entirely on your Mac. Parakeet TDT remains the default path, and optional Parakeet EOU or Nemotron streaming models can be downloaded for lower-latency live previews.
Contributions are welcome! Please feel free to submit a Pull Request.
git checkout -b feature/amazing-feature)git commit -m 'Add amazing feature')git push origin feature/amazing-feature)This project is licensed under the MIT License - see the LICENSE file for details.
Swift
97.6%
Shell
2.4%
A native macOS app for voice dictation anywhere. An open-source alternative to Wispr Flow and Superwhisper. Press and hold Fn (or a custom shortcut) to dictate text directly into any app using on-device speech recognition.
32
stars
211
commits
Swift
primary language
Sep 10, 2026
updated
A native macOS app for voice dictation anywhere. Press and hold Fn (or a custom shortcut) to dictate text directly into any app using on-device speech recognition, with optional transcript cleanup through S1-mini by Superwhisper, Apple Intelligence, Ollama, or OpenRouter.
![]() | ![]() |
![]() | ![]() |
.dmg from ReleasesDictate Anywhere always transcribes audio locally with FluidAudio. Cleanup happens only after transcription, so your raw audio stays on your Mac even when you enable Ollama or OpenRouter. Context Awareness keeps surrounding text local by default; sharing it with a remote cleanup provider requires a separate opt-in.
| Provider | Runs Where | Best For | Benefits |
|---|---|---|---|
| None | Nowhere | Fastest raw dictation | Uses the local FluidAudio transcript as-is |
| FluidAudio Vocabulary | On-device | Lightweight terminology correction | Applies vocabulary rescoring to Parakeet TDT final transcripts without an LLM |
| Apple Intelligence | On-device | Native macOS cleanup | On-device cleanup on supported Macs |
| S1-mini by Superwhisper | On-device | Compact English transcript normalization | One-click 462 MB download, fixed style/structure/context controls, and no separate server |
| Ollama | Local or self-hosted server | Privacy-first LLM cleanup | Local model choice, optional reasoning controls, and in-app model management for local Ollama setups |
| OpenRouter | Cloud | Broad hosted model access | Large model catalog, model search, secure key storage, and structured-output-aware selection |
S1-mini by Superwhisper is a compact model trained specifically to normalize speech-to-text transcripts.
Use Ollama when you want transcript cleanup with a local model or your own hosted Ollama server.
Recommended models:
gpt-oss:120b-cloud for the best cleanup quality when you have access to a large hosted/self-hosted Ollama-backed model
mistral-nemo:12b as the recommended local model when you want a much lighter on-device setup
Runs cleanup against the configured Ollama server URL, with http://127.0.0.1:11434 as the default local address
Lets you enter any installed model manually or select from detected installed models
Shows recommended models in the app, including size guidance and quality/latency tradeoffs
Can download recommended models directly from the app when the Ollama CLI is installed and the server is local
Can delete installed models from the app through the Ollama CLI
Exposes reasoning controls for models that report Ollama thinking support
Supports provider-specific cleanup prompts and shared custom vocabulary
Sample cleanup prompt for Ollama or OpenRouter:
Avoid em dashes entirely.
If the speaker corrects themselves or revises what they said, preserve the final intended meaning. Replace only the portion that is clearly superseded, and leave the rest unchanged.
Add paragraph breaks and bullet points when the dictation clearly calls for structure. Otherwise, keep it as regular prose.
Convert spoken numbers to numerals when that improves clarity, while preserving intended units and symbols. Example: "thirteen point five percent" -> "13.5%".
Remove only accidental duplicate words or obvious speech-recognition repetitions. Keep intentional repetition when it appears to be deliberate.
Preserve the speaker's tone, meaning, and intent.
Treat custom vocabulary as a strong hint, not a hard rule. Use it when it clearly fits the surrounding context. If it does not, prefer the wording that best matches the sentence.
Benefits of using Ollama:
Getting started with Ollama:
Use OpenRouter when you want access to hosted models without managing local model downloads.
Recommended model:
google/gemini-3-flash-preview for the best overall balance of cost, accuracy, and latency in Dictate Anywhere
Supports direct OpenRouter API usage for transcript cleanup after local transcription is complete
Lets you paste an API key into the app for secure Keychain storage
Can also read the API key from an environment variable such as OPENROUTER_API_KEY
Fetches the latest OpenRouter model catalog in-app
Includes model search and prioritizes models that advertise structured output support
Falls back to prompt-based JSON parsing automatically when a selected model does not support structured outputs cleanly
Supports provider-specific cleanup prompts and shared custom vocabulary
Benefits of using OpenRouter:
google/gemini-3-flash-preview currently gives the best overall results in this app when you care about cost, accuracy, and latency togetherGetting started with OpenRouter:
OPENROUTER_API_KEY set.| Germanic | Romance | Slavic | Other | Sino-Tibetan |
|---|---|---|---|---|
| English | Spanish | Polish | Hungarian | Mandarin Chinese (Simplified) |
| German | French | Czech | Finnish | |
| Dutch | Italian | Slovak | Greek | |
| Swedish | Portuguese | Slovenian | Latvian | |
| Danish | Romanian | Croatian | Lithuanian | |
| Norwegian | Bulgarian | Estonian | ||
| Ukrainian | ||||
| Russian |
# Clone the repository
git clone https://github.com/hoomanaskari/mac-dictate-anywhere.git
cd mac-dictate-anywhere
# Open in Xcode
open "Dictate Anywhere.xcodeproj"
# Or build from command line
xcodebuild -project "Dictate Anywhere.xcodeproj" -scheme "Dictate Anywhere" -configuration Release build
If you only want to run the app locally, you do not need the release packaging script.
For local development, use scripts/dev.sh with the shared Dictate Anywhere scheme. The workflow defaults to the Debug configuration, stable DerivedData, and the isolated Dictate Anywhere Dev.app so local permissions do not affect Release builds.
Create the ignored local signing override when needed:
scripts/dev.sh signing [TEAM_ID]
Automatic signing requires an Xcode account with the matching Apple Developer team and a matching development certificate. Keep Config/Signing.local.xcconfig ignored and do not commit it.
Common commands:
scripts/dev.sh check
scripts/dev.sh build
scripts/dev.sh build --configuration Release
scripts/dev.sh build --release
scripts/dev.sh launch
scripts/dev.sh test
scripts/dev.sh stop
Use --configuration Debug or --configuration Release with build. Tests run only with Debug because Release is not testable. The default is Debug, and --release is an alias for --configuration Release. Provisioning updates are disabled by default; pass --allow-provisioning-updates when you explicitly want Xcode to update signing assets. Release builds use the production signing identity and team. They do not package, notarize, update the appcast, or change production Release settings.
Set the optional DERIVED_DATA_PATH environment variable to use another stable path. The default is $HOME/Library/Developer/Xcode/DerivedData/DictateAnywhereDev.
If Accessibility permission is stale, remove Dictate Anywhere Dev.app from System Settings → Privacy & Security → Accessibility, launch it again, and add that exact app.
Release signing remains separate from this local workflow.
create-dmg \
--volname "Dictate Anywhere" \
--window-pos 200 120 \
--window-size 600 400 \
--icon-size 100 \
--icon "Dictate Anywhere.app" 150 185 \
--app-drop-link 450 185 \
"dist/Dictate Anywhere.dmg" \
"dist"
The maintainer release script is intentionally not tracked. Create your own local copy like this:
cp scripts/release-macos.template.sh scripts/release-macos.sh
chmod +x scripts/release-macos.sh
Then edit scripts/release-macos.sh and set your own values for:
NOTARY_PROFILETEAM_IDDEVELOPER_ID_APPDOWNLOAD_URL_PREFIXREPOSITORY_LINKAlso create Config/Signing.local.xcconfig with your own Apple Developer team ID, and update the Xcode signing settings and bundle identifiers if your local release setup needs different values.
When your local signing setup is ready, package the release with:
./scripts/release-macos.sh
The app uses FluidAudio speech models that run entirely on your Mac. Parakeet TDT remains the default path, and optional Parakeet EOU or Nemotron streaming models can be downloaded for lower-latency live previews.
Contributions are welcome! Please feel free to submit a Pull Request.
git checkout -b feature/amazing-feature)git commit -m 'Add amazing feature')git push origin feature/amazing-feature)This project is licensed under the MIT License - see the LICENSE file for details.
Swift
97.6%
Shell
2.4%