Reads any web page aloud, entirely on your machine. Kokoro-82M via WebGPU locally. No server, no account, no API key.
0
stars
45
commits
JavaScript
primary language
Sep 14, 2026
updated
Any page, read aloud, locally.
Add to Chrome · usechickadee.com
Chickadee is a browser extension that reads web pages aloud in a natural, human-sounding voice. The speech model runs on your own computer, inside the browser, so there is no server, no account, no API key, and nothing to pay for. Nothing you read is ever uploaded.
The first time you read something, Chickadee downloads the voice model once. After that it starts in a couple of seconds.
Most read-aloud tools either use the operating system's robotic built-in voice, or send your text to a server where a large model produces good audio and sends it back. Chickadee gets the good audio without the server: it runs Kokoro-82M, a small open speech model, directly in the browser on your GPU.
A few things fall out of that:
activeTab permission).Three small pieces, and the model:
| Piece | Role |
|---|---|
extension/ext/content.js | Splits the live page into sentences, highlights the current one with the CSS Custom Highlight API (no DOM changes), draws the control bar |
extension/ext/engine.html | A hidden frame that holds the model and the <audio> element |
extension/ext/background.js | Routes the toolbar button, keyboard shortcuts, and right-click menu to the page you're on |
For each sentence: text → phonemes (espeak-ng compiled to WebAssembly) → tokens → Kokoro-82M (ONNX Runtime on WebGPU) → 24 kHz audio. A "voice" is a table of 510 style vectors indexed by sentence length, so delivery adapts to how long a sentence is. The next two sentences generate while the current one plays, so playback never waits.
Kokoro runs in full precision on the GPU only. The 8-bit build produces corrupt audio on WebGPU and every CPU-only configuration generates slower than it plays, so the extension requires WebGPU rather than falling back to something worse.
cd extension
npm install
node build.mjs # bundles the engine and stages the ONNX runtime into ext/vendor
./package.sh # produces chickadee-<version>.zip for the Chrome Web Store
Then load extension/ext unpacked at chrome://extensions with Developer mode on.
After changing
manifest.json, remove the extension and load it unpacked again; the reload button doesn't re-read the manifest.
More detail, including things that were tried and reverted, lives in
extension/README.md.
web/ is a Next.js site. The landing page narrates its own copy with audio generated by the
same model, under a soft bed of public-domain chickadee recordings that ducks while the voice
speaks. It deploys to Vercel as-is.
Chickadee collects nothing and sends nothing. The full policy is in PRIVACY.md and at usechickadee.com/privacy.
Kokoro-82M (Apache-2.0) ·
kokoro-js (Apache-2.0) ·
Transformers.js (Apache-2.0) ·
ONNX Runtime Web (MIT) ·
espeak-ng (GPL-3.0, via the phonemizer package)
Apache-2.0 — see LICENSE.
36 commits
9 commits
JavaScript
69.1%
CSS
24.9%
HTML
5.5%
Reads any web page aloud, entirely on your machine. Kokoro-82M via WebGPU locally. No server, no account, no API key.
0
stars
45
commits
JavaScript
primary language
Sep 14, 2026
updated
Any page, read aloud, locally.
Add to Chrome · usechickadee.com
Chickadee is a browser extension that reads web pages aloud in a natural, human-sounding voice. The speech model runs on your own computer, inside the browser, so there is no server, no account, no API key, and nothing to pay for. Nothing you read is ever uploaded.
The first time you read something, Chickadee downloads the voice model once. After that it starts in a couple of seconds.
Most read-aloud tools either use the operating system's robotic built-in voice, or send your text to a server where a large model produces good audio and sends it back. Chickadee gets the good audio without the server: it runs Kokoro-82M, a small open speech model, directly in the browser on your GPU.
A few things fall out of that:
activeTab permission).Three small pieces, and the model:
| Piece | Role |
|---|---|
extension/ext/content.js | Splits the live page into sentences, highlights the current one with the CSS Custom Highlight API (no DOM changes), draws the control bar |
extension/ext/engine.html | A hidden frame that holds the model and the <audio> element |
extension/ext/background.js | Routes the toolbar button, keyboard shortcuts, and right-click menu to the page you're on |
For each sentence: text → phonemes (espeak-ng compiled to WebAssembly) → tokens → Kokoro-82M (ONNX Runtime on WebGPU) → 24 kHz audio. A "voice" is a table of 510 style vectors indexed by sentence length, so delivery adapts to how long a sentence is. The next two sentences generate while the current one plays, so playback never waits.
Kokoro runs in full precision on the GPU only. The 8-bit build produces corrupt audio on WebGPU and every CPU-only configuration generates slower than it plays, so the extension requires WebGPU rather than falling back to something worse.
cd extension
npm install
node build.mjs # bundles the engine and stages the ONNX runtime into ext/vendor
./package.sh # produces chickadee-<version>.zip for the Chrome Web Store
Then load extension/ext unpacked at chrome://extensions with Developer mode on.
After changing
manifest.json, remove the extension and load it unpacked again; the reload button doesn't re-read the manifest.
More detail, including things that were tried and reverted, lives in
extension/README.md.
web/ is a Next.js site. The landing page narrates its own copy with audio generated by the
same model, under a soft bed of public-domain chickadee recordings that ducks while the voice
speaks. It deploys to Vercel as-is.
Chickadee collects nothing and sends nothing. The full policy is in PRIVACY.md and at usechickadee.com/privacy.
Kokoro-82M (Apache-2.0) ·
kokoro-js (Apache-2.0) ·
Transformers.js (Apache-2.0) ·
ONNX Runtime Web (MIT) ·
espeak-ng (GPL-3.0, via the phonemizer package)
Apache-2.0 — see LICENSE.
36 commits
9 commits
JavaScript
69.1%
CSS
24.9%
HTML
5.5%