{"id":50311145,"url":"https://github.com/0xlau/openbroca","last_synced_at":"2026-05-28T21:01:27.542Z","repository":{"id":359165707,"uuid":"1227030962","full_name":"0xlau/openbroca","owner":"0xlau","description":"An open-source, system-wide voice interface for the AI era — dictate into any app, then transcribe, rewrite, and transform with pluggable local or cloud ASR \u0026 LLM providers.","archived":false,"fork":false,"pushed_at":"2026-05-20T18:45:22.000Z","size":4029,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-20T22:09:34.297Z","etag":null,"topics":["ai","asr","cross-platform","desktop-app","dictation","electron","llm","local-first","monorepo","open-source","pnpm","react","speech-to-text","tailwindcss","transcription","trpc","turborepo","typescript","voice-input","voice-interface"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/0xlau.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":"docs/ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-05-02T05:43:28.000Z","updated_at":"2026-05-20T18:44:44.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/0xlau/openbroca","commit_stats":null,"previous_names":["0xlau/openbroca"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/0xlau/openbroca","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/0xlau%2Fopenbroca","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/0xlau%2Fopenbroca/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/0xlau%2Fopenbroca/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/0xlau%2Fopenbroca/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/0xlau","download_url":"https://codeload.github.com/0xlau/openbroca/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/0xlau%2Fopenbroca/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33626142,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-28T02:00:06.440Z","response_time":99,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","asr","cross-platform","desktop-app","dictation","electron","llm","local-first","monorepo","open-source","pnpm","react","speech-to-text","tailwindcss","transcription","trpc","turborepo","typescript","voice-input","voice-interface"],"created_at":"2026-05-28T21:01:24.416Z","updated_at":"2026-05-28T21:01:27.526Z","avatar_url":"https://github.com/0xlau.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ca id=\"readme-top\"\u003e\u003c/a\u003e\n\n\u003cbr /\u003e\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"docs/assets/logo.svg\" alt=\"OpenBroca logo\" width=\"260\" /\u003e\n\n  \u003cp align=\"center\"\u003e\n    An open-source voice interface for the AI era.\n    \u003cbr /\u003e\n    It turns speech into text, intent into action, and your voice into a system-wide input layer.\n    \u003cbr /\u003e\n    \u003ca href=\"docs/ARCHITECTURE.md\"\u003e\u003cstrong\u003eExplore the docs »\u003c/strong\u003e\u003c/a\u003e\n    \u003cbr /\u003e\n    \u003cbr /\u003e\n    \u003ca href=\"https://github.com/0xlau/openbroca/releases/latest\"\u003eDownload\u003c/a\u003e\n    ·\n    \u003ca href=\"https://github.com/0xlau/openbroca/issues/new?template=bug_report.yml\"\u003eReport Bug\u003c/a\u003e\n    ·\n    \u003ca href=\"https://github.com/0xlau/openbroca/issues/new?template=feature_request.yml\"\u003eRequest Feature\u003c/a\u003e\n  \u003c/p\u003e\n\u003c/div\u003e\n\n[![Contributors](https://img.shields.io/github/contributors/0xlau/openbroca.svg)](https://github.com/0xlau/openbroca/graphs/contributors)\n[![Forks](https://img.shields.io/github/forks/0xlau/openbroca.svg)](https://github.com/0xlau/openbroca/network/members)\n[![Stargazers](https://img.shields.io/github/stars/0xlau/openbroca.svg)](https://github.com/0xlau/openbroca/stargazers)\n[![Issues](https://img.shields.io/github/issues/0xlau/openbroca.svg)](https://github.com/0xlau/openbroca/issues)\n[![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)\n[![CI](https://github.com/0xlau/openbroca/actions/workflows/ci.yml/badge.svg)](https://github.com/0xlau/openbroca/actions/workflows/ci.yml)\n[![Release](https://github.com/0xlau/openbroca/actions/workflows/release.yml/badge.svg)](https://github.com/0xlau/openbroca/actions/workflows/release.yml)\n[![Latest Release](https://img.shields.io/github/v/release/0xlau/openbroca)](https://github.com/0xlau/openbroca/releases/latest)\n[![TypeScript](https://img.shields.io/badge/TypeScript-5.x-blue.svg)](https://www.typescriptlang.org/)\n[![Electron](https://img.shields.io/badge/Electron-39-47848f.svg)](https://www.electronjs.org/)\n[![pnpm](https://img.shields.io/badge/pnpm-10-orange.svg)](https://pnpm.io/)\n\n## Table Of Contents\n\n1. [About The Project](#about-the-project)\n   - [Why OpenBroca](#why-openbroca)\n   - [What OpenBroca Does](#what-openbroca-does)\n   - [The Idea](#the-idea)\n   - [Built With](#built-with)\n   - [Status](#status)\n2. [Getting Started](#getting-started)\n   - [Prerequisites](#prerequisites)\n   - [Installation](#installation)\n3. [Usage](#usage)\n4. [Project Structure](#project-structure)\n5. [Architecture](#architecture)\n6. [Roadmap](#roadmap)\n7. [Releasing](#releasing)\n8. [Security](#security)\n9. [Contributing](#contributing)\n10. [License](#license)\n11. [Contact](#contact)\n12. [Acknowledgments](#acknowledgments)\n\n## About The Project\n\nOpenBroca is an open-source voice interface for the AI era.\n\nComputers should hear you before they read your mind. OpenBroca is built around that simple belief: voice should be a first-class input layer for computers, not a narrow dictation box locked to one vendor, one model, or one workflow.\n\nIt started from a personal itch. Tools like Typeless show how delightful desktop dictation can be, but I kept running into places where the behavior I wanted was not customizable. OpenBroca is my attempt to solve that problem for myself first, in the open, with the hope that the same flexibility can help other people shape voice input around their own workflows too.\n\nOpenBroca captures audio locally, routes transcription and LLM work through provider registries, and delivers the final text back into the desktop context where you were working. The app is built with Electron, React, TypeScript, tRPC over IPC, and a provider-first monorepo architecture.\n\nProduct screenshots and demo media will be added as the first public release stabilizes.\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n### Why OpenBroca\n\nKeyboards were built for typewriters. They were never designed for how humans actually think.\n\nWe think in language.\n\nWe speak in flow.\n\nWe edit by intention.\n\nOpenBroca exists to make voice a first-class interface for computers:\n\n- Speak naturally, then let OpenBroca transcribe, clean up, and deliver text where you need it.\n- Use local or cloud ASR providers through one shared provider contract.\n- Connect LLM providers through a registry that supports model selection, provider settings, and middleware.\n- Keep provider credentials in OS-backed secure storage.\n- Build desktop-first automation without coupling the app to one vendor or hosted backend.\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n### What OpenBroca Does\n\n- Dictate into any focused app.\n- Use cloud or local ASR providers.\n- Rewrite, polish, and transform text with LLM providers.\n- Switch between providers and models.\n- Build custom voice workflows.\n- Extend the system with open provider interfaces.\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n### The Idea\n\nThe future interface will not be the keyboard.\n\nMaybe it is voice.\n\nMaybe it is brain-computer interfaces.\n\nMaybe voice is only the bridge.\n\nOpenBroca is building that bridge.\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n### Built With\n\n- [Electron](https://www.electronjs.org/)\n- [React](https://react.dev/)\n- [TypeScript](https://www.typescriptlang.org/)\n- [electron-vite](https://electron-vite.org/)\n- [tRPC](https://trpc.io/)\n- [TanStack Query](https://tanstack.com/query)\n- [Zustand](https://zustand-demo.pmnd.rs/)\n- [Tailwind CSS](https://tailwindcss.com/)\n- [Turborepo](https://turbo.build/repo)\n- [pnpm](https://pnpm.io/)\n- [Vitest](https://vitest.dev/)\n- [electron-builder](https://www.electron.build/)\n- [release-please](https://github.com/googleapis/release-please)\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n### Status\n\nOpenBroca is pre-1.0 software. The repository is active, usable for development, and currently focused on desktop dictation, provider architecture, ASR provider support, LLM provider support, system-wide text insertion, and local-first voice workflows.\n\nExpect provider contracts, desktop UX details, and release packaging to keep moving while the project matures.\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n## Getting Started\n\nYou can use OpenBroca as a packaged desktop app or run it from source for development.\n\n### Prerequisites\n\n- [Node.js](https://nodejs.org/) 22 or newer\n- [pnpm](https://pnpm.io/) 10.32.1 or newer\n- macOS, Windows, or Linux for local development\n- Platform build tools required by native Electron dependencies such as `keytar`, `uiohook-napi`, and `audify`\n\nInstall pnpm if you do not already have it:\n\n```bash\ncorepack enable\ncorepack prepare pnpm@10.32.1 --activate\n```\n\n### Installation\n\n#### Download A Release\n\nDownload the latest installer from the [Releases page](https://github.com/0xlau/openbroca/releases/latest).\n\nCurrent release targets:\n\n- macOS Apple Silicon and Intel: `.dmg`\n- Windows x64: `.exe`\n\nmacOS and Windows builds may be unsigned while the project is early. Your operating system may show the usual unknown publisher warning.\n\n#### Run From Source\n\n1. Clone the repository:\n\n   ```bash\n   git clone https://github.com/0xlau/openbroca.git\n   cd openbroca\n   ```\n\n2. Install dependencies:\n\n   ```bash\n   pnpm install\n   ```\n\n3. Start the desktop app:\n\n   ```bash\n   pnpm dev\n   ```\n\n4. Run the main quality checks:\n\n   ```bash\n   pnpm check\n   pnpm test\n   ```\n\n5. Build the app:\n\n   ```bash\n   pnpm build\n   ```\n\n6. Create desktop bundles:\n\n   ```bash\n   pnpm bundle:mac\n   pnpm bundle:win\n   pnpm bundle:linux\n   ```\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n## Usage\n\n1. Launch OpenBroca.\n2. Complete the desktop permission onboarding for microphone access and platform-specific text delivery.\n3. Select a microphone from the sidebar or tray menu.\n4. Configure ASR and LLM providers in the app.\n5. Use the configured shortcut to start dictation, then speak naturally.\n6. Let OpenBroca transcribe, rewrite, polish, transform, and deliver the result to your active app or clipboard fallback.\n\nDefault shortcuts and provider setup may change before the 1.0 release. See [docs/PRIVACY.md](docs/PRIVACY.md) for data-handling notes and [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) for how the desktop processes fit together.\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n## Project Structure\n\n```text\napps/\n  desktop/              Electron + React desktop app\npackages/\n  app-identity/         Cross-platform active app/window identification\n  audio-capture/        Audio capture primitives\n  providers/            ASR/LLM provider contracts, registries, implementations\n  ui/                   Shared React component library\n  eslint-config/        Shared ESLint config\n  tailwind-config/      Shared Tailwind CSS base\n  typescript-config/    Shared TypeScript configs\ndocs/\n  ARCHITECTURE.md       System overview\n  PRIVACY.md            Data and credential handling notes\n  RELEASING.md          Release process\n  ROADMAP.md            Current direction\n```\n\nCommon workspace commands:\n\n```bash\npnpm dev\npnpm build\npnpm lint\npnpm typecheck\npnpm test\npnpm format\n```\n\nTarget a specific package:\n\n```bash\npnpm --filter openbroca-desktop dev\npnpm --filter @openbroca/providers test\npnpm --filter @openbroca/ui typecheck\n```\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n## Architecture\n\nThe desktop app uses Electron's main, preload, and renderer processes under `apps/desktop/src`.\n\nRenderer-to-main communication goes through tRPC over a custom Electron IPC transport rather than HTTP:\n\n```text\nRenderer\n  -\u003e tRPC client\n  -\u003e preload contextBridge\n  -\u003e ipcMain handler\n  -\u003e main-process tRPC router\n```\n\nThe provider platform lives in `packages/providers` and is consumed directly as TypeScript source by the desktop app.\n\n- LLM providers implement `LLMProvider` and register descriptors with `LLMProviderRegistry`.\n- ASR providers implement `ASRProvider`, `StreamingASRProvider`, or `LocalASRProvider`.\n- Provider configuration uses a minimal `ConfigSchema\u003cT\u003e` interface, so Zod or any compatible parser can be used.\n- LLM middleware can wrap provider completion for cross-cutting behavior.\n\nRead the full system overview in [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md).\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n## Roadmap\n\n- [ ] Stabilize desktop dictation.\n- [ ] Harden system-wide text insertion.\n- [ ] Expand ASR provider support.\n- [ ] Expand LLM provider support.\n- [ ] Improve local-first voice workflows.\n- [ ] Improve local ASR model management.\n- [ ] Add richer update and release verification.\n- [ ] Publish polished screenshots and demo media.\n- [ ] Document provider authoring in more depth.\n\nSee [docs/ROADMAP.md](docs/ROADMAP.md) and the [open issues](https://github.com/0xlau/openbroca/issues) for proposed features and known issues.\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n## Releasing\n\nOpenBroca uses [release-please](https://github.com/googleapis/release-please) to manage version bumps, changelog entries, tags, and GitHub Releases from Conventional Commits.\n\nThe release workflow builds macOS and Windows installers, uploads them to GitHub Releases, and publishes update metadata for `electron-updater`.\n\nRead the release checklist in [docs/RELEASING.md](docs/RELEASING.md).\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n## Security\n\nDo not commit API keys, model provider credentials, local `.env` files, desktop build artifacts, or agent-local state. The repository is configured to ignore common local and secret-bearing files.\n\nBefore opening a PR, run a local secret scan:\n\n```bash\ntrufflehog git file://$(pwd) --no-update\ntrufflehog filesystem . --no-update --force-skip-binaries --force-skip-archives\n```\n\nIf you discover a vulnerability, please follow [SECURITY.md](SECURITY.md) and report it privately.\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n## Contributing\n\nContributions are welcome, especially provider integrations, cross-platform desktop reliability improvements, accessibility fixes, and focused tests.\n\n1. Fork the project.\n2. Create your feature branch:\n\n   ```bash\n   git checkout -b feat/amazing-feature\n   ```\n\n3. Commit your changes using Conventional Commits:\n\n   ```bash\n   git commit -m \"feat: add amazing feature\"\n   ```\n\n4. Push to the branch:\n\n   ```bash\n   git push origin feat/amazing-feature\n   ```\n\n5. Open a pull request.\n\nPlease read [CONTRIBUTING.md](CONTRIBUTING.md) and [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) before opening issues or pull requests.\n\n### Top Contributors\n\n\u003ca href=\"https://github.com/0xlau/openbroca/graphs/contributors\"\u003e\n  \u003cimg src=\"https://contrib.rocks/image?repo=0xlau/openbroca\" alt=\"Top contributors\" /\u003e\n\u003c/a\u003e\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n## License\n\nDistributed under the MIT License. See [LICENSE](LICENSE) for more information.\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n## Contact\n\nProject maintainer: [Timothy Lau](https://github.com/0xlau)\n\nProject link: [https://github.com/0xlau/openbroca](https://github.com/0xlau/openbroca)\n\nFor bugs and feature requests, use [GitHub Issues](https://github.com/0xlau/openbroca/issues/new/choose).\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n## Acknowledgments\n\n- [Best-README-Template](https://github.com/othneildrew/Best-README-Template) for the README structure.\n- [Electron](https://www.electronjs.org/) and [electron-builder](https://www.electron.build/) for desktop packaging.\n- [Turborepo](https://turbo.build/repo) and [pnpm](https://pnpm.io/) for monorepo tooling.\n- [release-please](https://github.com/googleapis/release-please) for release automation.\n- Everyone who files issues, tests builds, improves providers, and helps make OpenBroca calmer and more useful.\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F0xlau%2Fopenbroca","html_url":"https://awesome.ecosyste.ms/projects/github.com%2F0xlau%2Fopenbroca","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F0xlau%2Fopenbroca/lists"}