Hold Ctrl+Space. Speak. Release. Your words appear where you were typing.
Kalam (Arabic: كلام, "speech") is an open-source push-to-talk dictation extension that runs state-of-the-art speech recognition entirely on your computer. No cloud, no account, no API key, no subscription — and no audio or transcript ever leaves your device. Turn on airplane mode and it still works (after the one-time model download).
Beta. Kalam works end-to-end and has been hardened against a long list of real-world failures — but so far on a small set of hardware. Reports from Macs, Linux, discrete GPUs, and Chromebooks are exactly what this beta is for. Open an issue with your hardware and what happened.
Speech recognition runs locally via Transformers.js and ONNX Runtime Web (WebGPU with WASM fallback).
All 100% on-device, selectable in the popup, downloadable/deletable from the Models tab:
| Engine | Size | Languages | Notes |
|---|---|---|---|
| Cohere Transcribe | ~1.2 GB | 14 (EU/APAC/MENA incl. Arabic) | Top leaderboard accuracy; GPU only; no auto language detect |
| Whisper Large v3 Turbo | ~600 MB | ~100 | Best language coverage |
| Whisper Base | ~80 MB | ~100 | Light; CPU-friendly |
| Parakeet CTC 0.6B | 0.6–1.2 GB | English | Fastest; CTC architecture cannot hallucinate |
| Gemma 4 E2B | ~3 GB | many | Experimental LLM engine + optional transcript polish (spoken punctuation, corrections, list formatting); GPU only |
"Auto" measures your hardware and picks accordingly, downgrading automatically if a model proves too slow on your machine.
GPU memory note: running a large engine and Gemma polish together can exceed integrated-GPU memory. Sustainable combos: a big engine with polish off, or Whisper Base + polish. Kalam recovers automatically from GPU session loss, but not needing recovery is better.
kalam-extension.zip from the latest release
and unzip it.chrome://extensions → enable Developer mode → Load unpacked →
select the unzipped folder.Requires Chrome 124+. Works best with a GPU Chrome can use (chrome://gpu → WebGPU); falls back to multi-threaded CPU inference.
npm install
npm run build # -> dist/, load unpacked
npm run package # -> kalam-extension.zip
npm run test:gemma # validate the Gemma recipe against the installed transformers.js
Manual model checks live in test/ — they run the extension's exact model
recipes in Node to separate our bugs from upstream ones. Read
test/README.md before trusting a "bug": its first lesson is that we once
blamed a healthy model for our own WAV decoding
(transformers.js#1726).
Icons are generated by tools/gen-icons.ps1.
content script (per page) offscreen document (extension origin)
┌─────────────────────────┐ ┌──────────────────────────────────┐
│ hotkey hold/release │ msgs │ getUserMedia → MediaRecorder │
│ status overlay │◄──────►│ decode → 16 kHz mono Float32 │
│ insert text at caret │ (SW │ ┌──────────────────────────────┐ │
└─────────────────────────┘ router)│ │ ASR worker: Transformers.js │ │
│ │ engines on WebGPU / WASM │ │
│ └──────────────────────────────┘ │
└──────────────────────────────────┘
Audio never crosses the extension messaging boundary — capture and inference both live in the offscreen document; only the finished text is routed back (tagged with a per-dictation id, ordered through a FIFO, and guarded by watchdogs and automatic engine recovery).
Bug reports with your hardware (OS, GPU, chrome://gpu WebGPU status) are
the most valuable contribution right now. PRs welcome — keep the privacy
invariant absolute: nothing leaves the machine.
MIT. Model weights retain their own licenses (Whisper: MIT; Parakeet: CC-BY-4.0; Cohere Transcribe: Apache 2.0; Gemma 4: Apache 2.0) and download directly from their Hugging Face repositories.
45 commits
JavaScript
81.5%
HTML
8.4%
CSS
7.1%
PowerShell
3.0%
Hold Ctrl+Space. Speak. Release. Your words appear where you were typing.
Kalam (Arabic: كلام, "speech") is an open-source push-to-talk dictation extension that runs state-of-the-art speech recognition entirely on your computer. No cloud, no account, no API key, no subscription — and no audio or transcript ever leaves your device. Turn on airplane mode and it still works (after the one-time model download).
Beta. Kalam works end-to-end and has been hardened against a long list of real-world failures — but so far on a small set of hardware. Reports from Macs, Linux, discrete GPUs, and Chromebooks are exactly what this beta is for. Open an issue with your hardware and what happened.
Speech recognition runs locally via Transformers.js and ONNX Runtime Web (WebGPU with WASM fallback).
All 100% on-device, selectable in the popup, downloadable/deletable from the Models tab:
| Engine | Size | Languages | Notes |
|---|---|---|---|
| Cohere Transcribe | ~1.2 GB | 14 (EU/APAC/MENA incl. Arabic) | Top leaderboard accuracy; GPU only; no auto language detect |
| Whisper Large v3 Turbo | ~600 MB | ~100 | Best language coverage |
| Whisper Base | ~80 MB | ~100 | Light; CPU-friendly |
| Parakeet CTC 0.6B | 0.6–1.2 GB | English | Fastest; CTC architecture cannot hallucinate |
| Gemma 4 E2B | ~3 GB | many | Experimental LLM engine + optional transcript polish (spoken punctuation, corrections, list formatting); GPU only |
"Auto" measures your hardware and picks accordingly, downgrading automatically if a model proves too slow on your machine.
GPU memory note: running a large engine and Gemma polish together can exceed integrated-GPU memory. Sustainable combos: a big engine with polish off, or Whisper Base + polish. Kalam recovers automatically from GPU session loss, but not needing recovery is better.
kalam-extension.zip from the latest release
and unzip it.chrome://extensions → enable Developer mode → Load unpacked →
select the unzipped folder.Requires Chrome 124+. Works best with a GPU Chrome can use (chrome://gpu → WebGPU); falls back to multi-threaded CPU inference.
npm install
npm run build # -> dist/, load unpacked
npm run package # -> kalam-extension.zip
npm run test:gemma # validate the Gemma recipe against the installed transformers.js
Manual model checks live in test/ — they run the extension's exact model
recipes in Node to separate our bugs from upstream ones. Read
test/README.md before trusting a "bug": its first lesson is that we once
blamed a healthy model for our own WAV decoding
(transformers.js#1726).
Icons are generated by tools/gen-icons.ps1.
content script (per page) offscreen document (extension origin)
┌─────────────────────────┐ ┌──────────────────────────────────┐
│ hotkey hold/release │ msgs │ getUserMedia → MediaRecorder │
│ status overlay │◄──────►│ decode → 16 kHz mono Float32 │
│ insert text at caret │ (SW │ ┌──────────────────────────────┐ │
└─────────────────────────┘ router)│ │ ASR worker: Transformers.js │ │
│ │ engines on WebGPU / WASM │ │
│ └──────────────────────────────┘ │
└──────────────────────────────────┘
Audio never crosses the extension messaging boundary — capture and inference both live in the offscreen document; only the finished text is routed back (tagged with a per-dictation id, ordered through a FIFO, and guarded by watchdogs and automatic engine recovery).
Bug reports with your hardware (OS, GPU, chrome://gpu WebGPU status) are
the most valuable contribution right now. PRs welcome — keep the privacy
invariant absolute: nothing leaves the machine.
MIT. Model weights retain their own licenses (Whisper: MIT; Parakeet: CC-BY-4.0; Cohere Transcribe: Apache 2.0; Gemma 4: Apache 2.0) and download directly from their Hugging Face repositories.
45 commits
JavaScript
81.5%
HTML
8.4%
CSS
7.1%
PowerShell
3.0%