yravinderkumar33/say-the-word

Local-first dictation for macOS: hold a key, speak, and the text lands where you were typing. On-device speech recognition, optional local Ollama cleanup, nothing leaves your Mac.

TypeScript

0

13 commits

updated Oct 9, 2026

See the code

See what people are saying

SourceMessageScoreDate

Say the Word - Free, open-source dictation that runs locally (r/SideProject)

Hi everyone! I built Say the Word so you can speak your thoughts instead of typing them out. Hold Fn, say what you want to write, and let go. Your words appear wherever you’re typing. There’s a hands-free mode for longer thoughts too. It’s free and open source, with no account or subscription. Your…

1

Oct 9, 2026

README

Hold Fn, say "Let's move the meeting to Friday at 3", let go: the sentence appears in the message. Click for the full 36-second video

Say the Word

Hold a key, speak, and your words land where you were typing. Nothing leaves your Mac.

Free, open-source dictation for macOS. Speech recognition runs on your Mac, an optional local model tidies the text, and no audio or transcript is ever sent anywhere.

Download Say the Word for Mac (Apple Silicon)

Latest release Licence: MIT macOS 14+ on Apple Silicon

Watch the 36-second video · Features · How it compares · Privacy · Install · Product Hunt


Why Say the Word

Voice typing is one of the biggest productivity tools on a computer, and for people with RSI, carpal tunnel, dyslexia, limited mobility or chronic pain it may be the only comfortable way to write. The best dictation tools usually send every word you say to someone else's server, on a subscription. The ones built into the OS are private, but give you little control.

Say the Word gives you fast hold-to-talk dictation in every app, with every step running on your own Mac:

  • Private by design. No account, no cloud, no telemetry. Your voice and your text stay on your Mac.
  • Fast. Verbatim mode took a median of about 0.4 seconds from key release to the paste request in synthetic-speech tests on an M4 Mac with 16 GB. See the measurements below.
  • Works everywhere you type. Mail, Slack, Notes, your browser, your code editor.
  • Works offline. After a one-time model download, it needs no internet.
  • Open source. MIT-licensed: anyone can read the code and check every privacy claim.

How it compares

Cloud dictation apps such as Wispr Flow and Say the Word make different trade-offs. As of October 2026, from Wispr Flow's own pricing, privacy and language pages:

Say the WordWispr Flow
Where speech becomes textOn your MacIn the cloud
Works offlineYes, after a one-time model downloadNeeds a connection to transcribe
PriceFree, no word limitFree up to 2,000 words a week on desktop; Pro $15 a month ($12 billed yearly)
Source codeOpen (MIT)Closed
AudioIn memory by default; saving is opt-inDeleted once transcribed, unless you turn on cloud storage
Languages25 European languages100+
PlatformsMac with Apple SiliconMac, Windows, iOS and Android
For teamsNo team admin or compliance certifications claimedSOC 2 Type II, ISO 27001, HIPAA with a signed agreement, team admin

If you want many languages, your phone, or team features, Wispr Flow is the stronger choice. If your words must never leave your Mac, or you want to read the code that handles them, choose Say the Word.

Features

  • Hold to talk. Hold Fn, speak, let go: the text is pasted at your cursor.
  • Hands-free. Press Fn twice (or Fn+Space, or click the pill) and speak with no key held. Press Fn again to stop.
  • Cleaned mode. Rules and an optional local Ollama model remove "um", false starts and repeated words. Checks look for unwanted edits, including changed numbers and negations. If a check flags the result or the model takes too long, the app falls back to rules-only cleanup. You can compare the original and cleaned text in History.
  • Verbatim mode. The speech recognizer's original transcript, with punctuation and capitals.
  • Recover missed pastes. Esc cancels and Undo brings the dictation back while it is offered. Cmd+Ctrl+V pastes your last available dictation again. If a paste can't happen, the pill offers Copy. Recovery stays in memory until you quit.
  • Safe with passwords. When macOS reports a password field, the app never pastes automatically.
  • Your choice of key. No Fn key, or another app already uses it? Use Control+Option instead.
  • History you control. See what was heard beside what was written, and how long each step took. Kept in memory only, unless you choose to save it.
  • Made for everyone. Light and dark appearance, a guided first run, and support for VoiceOver, Increase Contrast, Reduce Motion and Reduce Transparency. Everything also works from the menu bar.
Guided setup complete: dictation gestures, the menu bar, the pill and open at loginA dictation in the history: what was heard beside what was written, and the timings
Guided setup: learn the gestures and start dictating.History: what was heard beside what was written, and how long each step took.
Cleanup: Verbatim and Cleaned modes, with a comparisonPrivacy: what is stored and everything the app has contacted
Cleanup: choose Verbatim or Cleaned, and compare them.Privacy: what is stored, and every address the app has contacted, read live.

Privacy, in plain terms

AudioDictation audio is processed on your Mac and held in memory by default. Recordings and their text are saved only if you explicitly enable Advanced › Save Every Dictation for evaluation.
TranscriptsKept in memory until you quit. To keep them for 7 days, 30 days or until you delete them, you choose it, and macOS asks you to confirm before anything is written.
NetworkNone in Verbatim mode. Cleaned mode talks only to Ollama on your own Mac (127.0.0.1). The speech model is downloaded once, when you ask.
LogsRecord what happened (key presses, states, why a paste was refused), never what you said.
DeletingThe Privacy page lists everything stored, with its size, and deletes any of it.

These rules are enforced in code and covered by tests: see Architecture and behaviour.

Install

Download Say the Word for macOS 14 or later on Apple Silicon (M1 or later). It is signed and notarized by Apple.

  1. Open the DMG and drag Say the Word into Applications.
  2. Open it from Applications. It lives in the menu bar, and a setup guide opens on the first launch.
  3. Allow Microphone and Accessibility access when asked (Accessibility lets it paste for you). The speech model downloads once, about 670 MB.
  4. Click into any text field, hold Fn, speak, and let go.

Optional, for Cleaned mode: install Ollama, run ollama pull qwen3.5:4b, and pick the model on the Cleanup page.

Updates are not automatic yet. To update, download the latest release and replace the app; your settings and any history you chose to save stay. If you use another dictation app that listens to Fn, quit it first: two apps on the same key will fight over it.

FAQ

Is it really free? Yes. It is MIT-licensed, with no account, no subscription and no paid tier.

Does it work on Intel Macs? No. It needs Apple Silicon (M1 or later) and macOS 14 or later.

Which languages does it understand? The speech model, NVIDIA's Parakeet v3, recognizes 25 European languages, including English, French, German, Spanish and Italian. The cleanup rules are tuned for English.

A dictation didn't arrive. What happened? The pill says why in a few words, and the History page explains it, with what you can do about it. If the text was recognized, use Copy on the pill, or press Cmd+Ctrl+V to paste your last available dictation. Recovery stays in memory until you quit; it cannot recover every failure. The log (menu-bar icon › Show Log) has the details, and never contains what you said.

It says "Secure Input is on: nothing was pasted". macOS reports that the app in front is taking a password, so automatic paste is refused. If your cursor isn't in a password field, macOS or that app has left Secure Input on. Copy the text from the pill and paste it yourself.

How it works

flowchart LR
    K["Fn key<br/>(Swift helper)"] --> M["Main process<br/>(TypeScript)"]
    M --> O["Overlay pill<br/>(microphone)"]
    O -- 16 kHz audio --> S["Speech worker<br/>Parakeet v3<br/>via sherpa-onnx"]
    S -- text --> C{"Cleaned?"}
    C -- no --> P
    C -- yes --> R["Rules + local Ollama<br/>+ guard"] --> P["Swift helper:<br/>paste into the<br/>app you were in"]
  • Electron and TypeScript hold all the product logic. A small Swift helper does what JavaScript can't: seeing the Fn key, posting the paste, reading Accessibility.
  • Speech recognition: Parakeet TDT 0.6b v3 (int8) on the CPU through sherpa-onnx, in its own process, with Silero voice activity detection.
  • Cleanup: fast rules first, then an optional local model with a fixed time limit and a guard that checks for common unwanted changes. The guard is heuristic: it cannot guarantee that meaning is preserved, so the original transcript stays available for comparison.
  • Storage: history in SQLite in a separate process, so a slow disk never delays a paste.

Measured on a MacBook Air with an Apple M4, 16 GB and macOS 26.6 (benchmarks). The dictation timings use synthetic speech and intercepted paste requests; they do not measure accuracy on real voices or the time taken by every destination app. Results vary with your Mac, recording and cleanup model.

MeasureResult
Dictation start to microphone livemedian 108 ms, p95 119 ms
Key release to paste request, Verbatimmedian 402 ms, p95 448 ms
Key release to paste request, Cleaned (4B)median about 0.9 s

Build from source

You need macOS 14+ on Apple Silicon, Node 22.13+, and the Xcode command-line tools (Swift 6).

git clone https://github.com/yravinderkumar33/say-the-word.git
cd say-the-word
npm install
npm run models:download   # the speech model, about 670 MB, once
npm run dev               # builds the Swift helper and starts the app with hot reload

In development, macOS gives the Microphone and Accessibility permissions to the terminal that started the app. To test them as a user would, build a signed app: npm run setup:signing once, then npm run pack, then open dist/mac-arm64/Say the Word Dev.app.

CommandWhat it does
npm run checkType-check, lint, format check, nearly 1,200 unit tests and 120 Swift tests. Run before every PR
npm run test:appWhole dictations in the running app, with injected faults; never touches your keyboard
npm run test:e2eThe real key tap and paste into TextEdit (takes keyboard focus for about 45 s)
npm run packA signed, verified .app in dist/
npm run releaseThe notarized DMG (needs a Developer ID certificate)

The design and the decisions behind it are in docs/: research and decisions, architecture, implementation reference, and the progress log.

Roadmap

  • A "Check for updates" button that respects the network policy
  • More languages through a Whisper-based engine
  • Windows and Linux (the key, paste and speech parts are already behind interfaces)

Contributing

Contributions are welcome, especially:

  • Testing on other Macs, keyboards and apps. Paste behaviour differs between editors, browsers and terminals. A log excerpt and the app's name help a lot.
  • Accessibility feedback from people who use VoiceOver or rely on dictation every day.
  • Better cleanup rules, and better ways to measure Cleaned mode.

Open an issue for a bug or an idea. Before a pull request, run npm run check and read the working agreements in CLAUDE.md. The privacy rules are requirements: never log what was said, use no network beyond the local Ollama and downloads the user starts, and copy no code from GPL or AGPL projects.

Acknowledgements

Say the Word builds on excellent open work: sherpa-onnx, NVIDIA's Parakeet, Ollama, Electron, React and Tailwind CSS. The native layer learned from these MIT-licensed dictation projects: Amical, OpenWhispr, Handy, hive and dictation-cleanup-rules. Every component and its licence is listed on the app's About page.

Say the Word is an independent project, not affiliated with Wispr Flow or any other dictation product.

Licence

MIT

accessibility
dictation
electron
local-first
macos
offline
ollama
privacy
speech-to-text
swift
typescript
voice-typing

yravinderkumar33/say-the-word

Local-first dictation for macOS: hold a key, speak, and the text lands where you were typing. On-device speech recognition, optional local Ollama cleanup, nothing leaves your Mac.

TypeScript

0

13 commits

updated Oct 9, 2026

See the code

See what people are saying

SourceMessageScoreDate

Say the Word - Free, open-source dictation that runs locally (r/SideProject)

Hi everyone! I built Say the Word so you can speak your thoughts instead of typing them out. Hold Fn, say what you want to write, and let go. Your words appear wherever you’re typing. There’s a hands-free mode for longer thoughts too. It’s free and open source, with no account or subscription. Your…

1

Oct 9, 2026

README

Hold Fn, say "Let's move the meeting to Friday at 3", let go: the sentence appears in the message. Click for the full 36-second video

Say the Word

Hold a key, speak, and your words land where you were typing. Nothing leaves your Mac.

Free, open-source dictation for macOS. Speech recognition runs on your Mac, an optional local model tidies the text, and no audio or transcript is ever sent anywhere.

Download Say the Word for Mac (Apple Silicon)

Latest release Licence: MIT macOS 14+ on Apple Silicon

Watch the 36-second video · Features · How it compares · Privacy · Install · Product Hunt


Why Say the Word

Voice typing is one of the biggest productivity tools on a computer, and for people with RSI, carpal tunnel, dyslexia, limited mobility or chronic pain it may be the only comfortable way to write. The best dictation tools usually send every word you say to someone else's server, on a subscription. The ones built into the OS are private, but give you little control.

Say the Word gives you fast hold-to-talk dictation in every app, with every step running on your own Mac:

  • Private by design. No account, no cloud, no telemetry. Your voice and your text stay on your Mac.
  • Fast. Verbatim mode took a median of about 0.4 seconds from key release to the paste request in synthetic-speech tests on an M4 Mac with 16 GB. See the measurements below.
  • Works everywhere you type. Mail, Slack, Notes, your browser, your code editor.
  • Works offline. After a one-time model download, it needs no internet.
  • Open source. MIT-licensed: anyone can read the code and check every privacy claim.

How it compares

Cloud dictation apps such as Wispr Flow and Say the Word make different trade-offs. As of October 2026, from Wispr Flow's own pricing, privacy and language pages:

Say the WordWispr Flow
Where speech becomes textOn your MacIn the cloud
Works offlineYes, after a one-time model downloadNeeds a connection to transcribe
PriceFree, no word limitFree up to 2,000 words a week on desktop; Pro $15 a month ($12 billed yearly)
Source codeOpen (MIT)Closed
AudioIn memory by default; saving is opt-inDeleted once transcribed, unless you turn on cloud storage
Languages25 European languages100+
PlatformsMac with Apple SiliconMac, Windows, iOS and Android
For teamsNo team admin or compliance certifications claimedSOC 2 Type II, ISO 27001, HIPAA with a signed agreement, team admin

If you want many languages, your phone, or team features, Wispr Flow is the stronger choice. If your words must never leave your Mac, or you want to read the code that handles them, choose Say the Word.

Features

  • Hold to talk. Hold Fn, speak, let go: the text is pasted at your cursor.
  • Hands-free. Press Fn twice (or Fn+Space, or click the pill) and speak with no key held. Press Fn again to stop.
  • Cleaned mode. Rules and an optional local Ollama model remove "um", false starts and repeated words. Checks look for unwanted edits, including changed numbers and negations. If a check flags the result or the model takes too long, the app falls back to rules-only cleanup. You can compare the original and cleaned text in History.
  • Verbatim mode. The speech recognizer's original transcript, with punctuation and capitals.
  • Recover missed pastes. Esc cancels and Undo brings the dictation back while it is offered. Cmd+Ctrl+V pastes your last available dictation again. If a paste can't happen, the pill offers Copy. Recovery stays in memory until you quit.
  • Safe with passwords. When macOS reports a password field, the app never pastes automatically.
  • Your choice of key. No Fn key, or another app already uses it? Use Control+Option instead.
  • History you control. See what was heard beside what was written, and how long each step took. Kept in memory only, unless you choose to save it.
  • Made for everyone. Light and dark appearance, a guided first run, and support for VoiceOver, Increase Contrast, Reduce Motion and Reduce Transparency. Everything also works from the menu bar.
Guided setup complete: dictation gestures, the menu bar, the pill and open at loginA dictation in the history: what was heard beside what was written, and the timings
Guided setup: learn the gestures and start dictating.History: what was heard beside what was written, and how long each step took.
Cleanup: Verbatim and Cleaned modes, with a comparisonPrivacy: what is stored and everything the app has contacted
Cleanup: choose Verbatim or Cleaned, and compare them.Privacy: what is stored, and every address the app has contacted, read live.

Privacy, in plain terms

AudioDictation audio is processed on your Mac and held in memory by default. Recordings and their text are saved only if you explicitly enable Advanced › Save Every Dictation for evaluation.
TranscriptsKept in memory until you quit. To keep them for 7 days, 30 days or until you delete them, you choose it, and macOS asks you to confirm before anything is written.
NetworkNone in Verbatim mode. Cleaned mode talks only to Ollama on your own Mac (127.0.0.1). The speech model is downloaded once, when you ask.
LogsRecord what happened (key presses, states, why a paste was refused), never what you said.
DeletingThe Privacy page lists everything stored, with its size, and deletes any of it.

These rules are enforced in code and covered by tests: see Architecture and behaviour.

Install

Download Say the Word for macOS 14 or later on Apple Silicon (M1 or later). It is signed and notarized by Apple.

  1. Open the DMG and drag Say the Word into Applications.
  2. Open it from Applications. It lives in the menu bar, and a setup guide opens on the first launch.
  3. Allow Microphone and Accessibility access when asked (Accessibility lets it paste for you). The speech model downloads once, about 670 MB.
  4. Click into any text field, hold Fn, speak, and let go.

Optional, for Cleaned mode: install Ollama, run ollama pull qwen3.5:4b, and pick the model on the Cleanup page.

Updates are not automatic yet. To update, download the latest release and replace the app; your settings and any history you chose to save stay. If you use another dictation app that listens to Fn, quit it first: two apps on the same key will fight over it.

FAQ

Is it really free? Yes. It is MIT-licensed, with no account, no subscription and no paid tier.

Does it work on Intel Macs? No. It needs Apple Silicon (M1 or later) and macOS 14 or later.

Which languages does it understand? The speech model, NVIDIA's Parakeet v3, recognizes 25 European languages, including English, French, German, Spanish and Italian. The cleanup rules are tuned for English.

A dictation didn't arrive. What happened? The pill says why in a few words, and the History page explains it, with what you can do about it. If the text was recognized, use Copy on the pill, or press Cmd+Ctrl+V to paste your last available dictation. Recovery stays in memory until you quit; it cannot recover every failure. The log (menu-bar icon › Show Log) has the details, and never contains what you said.

It says "Secure Input is on: nothing was pasted". macOS reports that the app in front is taking a password, so automatic paste is refused. If your cursor isn't in a password field, macOS or that app has left Secure Input on. Copy the text from the pill and paste it yourself.

How it works

flowchart LR
    K["Fn key<br/>(Swift helper)"] --> M["Main process<br/>(TypeScript)"]
    M --> O["Overlay pill<br/>(microphone)"]
    O -- 16 kHz audio --> S["Speech worker<br/>Parakeet v3<br/>via sherpa-onnx"]
    S -- text --> C{"Cleaned?"}
    C -- no --> P
    C -- yes --> R["Rules + local Ollama<br/>+ guard"] --> P["Swift helper:<br/>paste into the<br/>app you were in"]
  • Electron and TypeScript hold all the product logic. A small Swift helper does what JavaScript can't: seeing the Fn key, posting the paste, reading Accessibility.
  • Speech recognition: Parakeet TDT 0.6b v3 (int8) on the CPU through sherpa-onnx, in its own process, with Silero voice activity detection.
  • Cleanup: fast rules first, then an optional local model with a fixed time limit and a guard that checks for common unwanted changes. The guard is heuristic: it cannot guarantee that meaning is preserved, so the original transcript stays available for comparison.
  • Storage: history in SQLite in a separate process, so a slow disk never delays a paste.

Measured on a MacBook Air with an Apple M4, 16 GB and macOS 26.6 (benchmarks). The dictation timings use synthetic speech and intercepted paste requests; they do not measure accuracy on real voices or the time taken by every destination app. Results vary with your Mac, recording and cleanup model.

MeasureResult
Dictation start to microphone livemedian 108 ms, p95 119 ms
Key release to paste request, Verbatimmedian 402 ms, p95 448 ms
Key release to paste request, Cleaned (4B)median about 0.9 s

Build from source

You need macOS 14+ on Apple Silicon, Node 22.13+, and the Xcode command-line tools (Swift 6).

git clone https://github.com/yravinderkumar33/say-the-word.git
cd say-the-word
npm install
npm run models:download   # the speech model, about 670 MB, once
npm run dev               # builds the Swift helper and starts the app with hot reload

In development, macOS gives the Microphone and Accessibility permissions to the terminal that started the app. To test them as a user would, build a signed app: npm run setup:signing once, then npm run pack, then open dist/mac-arm64/Say the Word Dev.app.

CommandWhat it does
npm run checkType-check, lint, format check, nearly 1,200 unit tests and 120 Swift tests. Run before every PR
npm run test:appWhole dictations in the running app, with injected faults; never touches your keyboard
npm run test:e2eThe real key tap and paste into TextEdit (takes keyboard focus for about 45 s)
npm run packA signed, verified .app in dist/
npm run releaseThe notarized DMG (needs a Developer ID certificate)

The design and the decisions behind it are in docs/: research and decisions, architecture, implementation reference, and the progress log.

Roadmap

  • A "Check for updates" button that respects the network policy
  • More languages through a Whisper-based engine
  • Windows and Linux (the key, paste and speech parts are already behind interfaces)

Contributing

Contributions are welcome, especially:

  • Testing on other Macs, keyboards and apps. Paste behaviour differs between editors, browsers and terminals. A log excerpt and the app's name help a lot.
  • Accessibility feedback from people who use VoiceOver or rely on dictation every day.
  • Better cleanup rules, and better ways to measure Cleaned mode.

Open an issue for a bug or an idea. Before a pull request, run npm run check and read the working agreements in CLAUDE.md. The privacy rules are requirements: never log what was said, use no network beyond the local Ollama and downloads the user starts, and copy no code from GPL or AGPL projects.

Acknowledgements

Say the Word builds on excellent open work: sherpa-onnx, NVIDIA's Parakeet, Ollama, Electron, React and Tailwind CSS. The native layer learned from these MIT-licensed dictation projects: Amical, OpenWhispr, Handy, hive and dictation-cleanup-rules. Every component and its licence is listed on the app's About page.

Say the Word is an independent project, not affiliated with Wispr Flow or any other dictation product.

Licence

MIT

accessibility
dictation
electron
local-first
macos
offline
ollama
privacy
speech-to-text
swift
typescript
voice-typing