Voice dictation for the browser — free, open source, and private. Press one shortcut, speak, and clean, punctuated text lands at your cursor — streaming onto the page while you talk. Works in Chrome, and — via the pop-out and clipboard mode — with every other app on your machine.
No account, no subscription, no telemetry, no server of ours. Ever.
MIT licensed · Manifest V3 · WXT + Svelte 5 + TypeScript
- One shortcut everywhere —
⌘⇧1/Ctrl+Shift+1starts and stops dictation. On a web page it types at your cursor; with the pop-out focused it fills the pop-out; from any other app it records in the background (audible start/stop chimes) and puts the finished text on your clipboard, ready to paste. - Streaming — text appears in the overlay while you're still speaking, not after.
- Smart formatting — an optional AI pass punctuates and capitalizes by grammar, so you can just talk without saying "comma". Two providers: Chrome's built-in Gemini Nano (free, on-device) or a Workers AI model on your own Cloudflare account (best quality, works on any machine).
- Three speech engines — Chrome built-in (free, zero setup),
@cf/openai/whisper-large-v3-turbo(best accuracy, batch), or@cf/deepgram/flux(streaming with smart end-of-phrase detection), the Cloudflare pair on your own account. - Cleanup that reads like writing — fillers and stutters removed, spoken punctuation ("period", "new line") honored, fuzzy custom-word correction for names and jargon.
- Pop-out window — a small always-available surface that keeps your clipboard preloaded as you speak: dictate there, paste anywhere. One-tap AI action chips — Clean, Summarize, Sharpen, and Ask — sit under the transcript, each with an Undo.
- First-run onboarding — mic permission, shortcut check, and a try-it box, all up front. After that page, it just works.
- Local history — recent transcriptions on this device only, capped,
clearable, and
0genuinely keeps nothing.
The AI action chips are yours to arrange: hide the ones you don't use, reorder the rest, or add your own — a short name plus a plain-English instruction ("turn this into a Slack message") — up to 12 custom chips. Built-ins can be hidden and reordered but not edited or deleted. A tone picker (None, Professional, Direct, Confident) in the pop-out and options page applies to Clean, Sharpen, and every custom chip — never Summarize or Ask. Manage it all from the extension's Options page or the mobile app's settings sheet.
Reusable text — a whole prompt, not just an instruction — gets its own library: save up to 20 snippets, then tap one from the Saved strip above the transcript to load and copy it instantly. Manage names and text from the same Options page or settings sheet.
The same pipeline runs as an installable web app — no store, no approval:
npm run build:web # → .output/web (host it anywhere static)
npm run dev:web # local developmentOpen it on a phone, Add to Home Screen, and it behaves like an app: tap
the orb, talk, and the cleaned text is already on your clipboard — paste into
any app. Underneath the transcript, one-tap AI actions — Clean,
Summarize, Sharpen, and Ask (a question about what you just said)
— each with an Undo. Android can use the free built-in engine; iOS needs Cloudflare keys
(Safari has no Web Speech API). It shares src/ with the extension, so
there's one pipeline, one set of design tokens, two shells.
The AI actions call Cloudflare through a same-origin /api/ai Pages
Function to stay CORS-safe, so the web build needs to be hosted somewhere
that runs it — Cloudflare Pages — rather than any static file host.
Mobile PRs touching mobile/android/** also get a debug APK built
automatically as a downloadable CI artifact, for sideload testing.
Not on the Web Store yet — load it unpacked:
- Clone this repo, then
npm install && npm run build - Open
chrome://extensions, enable Developer mode - Load unpacked → select
.output/chrome-mv3 - The welcome page opens itself — three steps and you're set
Using an AI assistant? Paste this into Claude Code (or any coding agent) and it will build everything and hand you the final click:
Install this Chrome extension: https://raw.githubusercontent.com/jkishaba-creator/bobby-speak/main/INSTALL.md
Full details (including troubleshooting) in INSTALL.md.
- Audio goes only to the speech engine you selected — Chrome's built-in service by default, or your own Cloudflare account. There is no Bobby Speak server.
- Smart formatting runs on-device (Gemini Nano) or on your Cloudflare account. Your API token is stored only in your local Chrome profile.
- History and settings live in
chrome.storage.local— never synced, never transmitted.
A real-time streaming pipeline — see ARCHITECTURE.md, which grew out of community issue #4 by @jR4dh3y:
Mic ─ frames ─▶ ASR provider ─ events ─▶ staged processing ─▶ overlay/inject
src/audio/ src/ai/ src/processing/ src/output/
Every layer is pluggable: an ASR engine is one file implementing
AsrProvider, a text processor is one pure function. 78 tests cover the
pipeline, the grammar stages, the audio math, and the workflow files.
npm install
npm test # vitest
npm run check # svelte-check
npm run dev # live-reload development
npm run build # → .output/chrome-mv3Community project, contributions welcome. Three steps:
- Comment
.takeon an issue so we don't double up. - Make your change;
npm testmust pass — and actually dictate with it. - Open a PR — one thing at a time.
Details in CONTRIBUTING.md. Ideas go in Discussions; everything is announced in the project Discord — come say hi. Every change is reviewed and merged by the maintainer.
- Chrome must be running (background is fine) — an extension can't outlive its browser.
- Native apps are reached via the clipboard (chime → talk → chime → paste); no Chrome extension can type keystrokes into another app.
- Google Docs draws its editor on a canvas: falls back to copy-to-clipboard with a paste hint.
- Global shortcuts are restricted by Chrome to
Ctrl/⌘+Shift+0–9.
- v2 (current) — streaming pipeline architecture, one global shortcut, smart formatting, onboarding. This line.
- v1 — the original no-build vanilla-JS extension, preserved on the
v1branch.
The text-cleanup approach and recording state machine trace back to ideas from Handy by CJ Pais (MIT), reimagined twice over — see LICENSE. The v2 architecture spec came from the community. The literal-punctuation guard came from @jpachec0's v1 PR.
MIT — see LICENSE.