{"id":47630215,"url":"https://github.com/iptoux/localvoice","last_synced_at":"2026-04-01T23:18:52.411Z","repository":{"id":345326460,"uuid":"1184371781","full_name":"iptoux/localvoice","owner":"iptoux","description":"Offline-first desktop voice dictation app with local Whisper transcription, custom dictionary, and zero telemetry.","archived":false,"fork":false,"pushed_at":"2026-03-27T00:54:52.000Z","size":6557,"stargazers_count":6,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-27T09:38:30.740Z","etag":null,"topics":["app","dekstop","dictation","local","privacy","react","rust","speech-to-text","tauri","transcription","voice","whisper-cpp"],"latest_commit_sha":null,"homepage":"https://bitslix.dev","language":"Rust","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/iptoux.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-17T14:22:00.000Z","updated_at":"2026-03-27T00:55:12.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/iptoux/localvoice","commit_stats":null,"previous_names":["iptoux/localvoice"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/iptoux/localvoice","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iptoux%2Flocalvoice","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iptoux%2Flocalvoice/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iptoux%2Flocalvoice/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iptoux%2Flocalvoice/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/iptoux","download_url":"https://codeload.github.com/iptoux/localvoice/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iptoux%2Flocalvoice/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31292871,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-01T21:15:39.731Z","status":"ssl_error","status_checked_at":"2026-04-01T21:15:34.046Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["app","dekstop","dictation","local","privacy","react","rust","speech-to-text","tauri","transcription","voice","whisper-cpp"],"created_at":"2026-04-01T23:18:51.800Z","updated_at":"2026-04-01T23:18:52.403Z","avatar_url":"https://github.com/iptoux.png","language":"Rust","readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"docs/localvoice_appicon_transparent.png\" alt=\"LocalVoice\" width=\"120\"/\u003e\n\n# LocalVoice\n\n**Offline-first desktop voice dictation — no cloud, no telemetry, just your voice.**\n\nRecord with a global shortcut, transcribe locally with [whisper.cpp](https://github.com/ggerganov/whisper.cpp), and send text straight to your clipboard or active app.\n\n[![MIT License](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n[![Tauri v2](https://img.shields.io/badge/Tauri-v2-2B90B8)](https://tauri.app)\n[![TypeScript](https://img.shields.io/badge/TypeScript-5.8-3178C6)](https://www.typescriptlang.org)\n[![Rust](https://img.shields.io/badge/Rust-1.77+-CE422B)](https://www.rust-lang.org)\n\n\u003c/div\u003e\n\n---\n\n## What is LocalVoice?\n\nLocalVoice is a lightweight desktop app that turns your voice into text — entirely on your machine. There's no account to create, no audio sent to a server, and no subscription. Just press a shortcut, speak, and your words appear wherever your cursor is.\n\nIt's built for developers, writers, and anyone who wants fast, private voice input as part of their daily workflow.\n\n---\n\n## Key Features\n\n- **Global hotkey recording** — start and stop dictation from anywhere on your desktop\n- **Push-to-talk mode** — hold the shortcut to record, release to stop; configurable per session\n- **100% local transcription** — powered by whisper.cpp; your audio never leaves your machine\n- **Multiple Whisper models** — download and switch between models per language\n- **Smart output** — insert directly into the active app, copy to clipboard, or preview first\n- **Custom dictionary** — teach LocalVoice your vocabulary, acronyms, and corrections\n- **Filler word removal** — automatically strips \"um\", \"uh\", and other fillers\n- **Ambiguity detection** — flags low-confidence phrases for your review\n- **Session history** — browse, search, and filter past transcriptions with bulk select, delete, and export\n- **Audio playback** — replay the original recording directly from the session detail view\n- **Pagination \u0026 filters** — configurable page size (25/50/100), \"has audio\" toggle, and date quick-presets\n- **CSV / JSON / TXT export** — export single or multiple sessions in your preferred format\n- **Dashboard \u0026 analytics** — WPM trends, language breakdown, correction metrics\n- **Session reprocessing** — re-run post-processing on past sessions with updated rules\n- **Compact pill UI** — a small floating window that stays out of your way\n- **Themes \u0026 shortcuts** — light, dark, or system theme; fully configurable hotkeys\n- **No telemetry** — zero data collection, ever\n\n---\n\n## Tech Stack\n\n| Layer | Technology |\n|---|---|\n| Desktop framework | [Tauri v2](https://tauri.app) |\n| Frontend | React 19, TypeScript 5.8, Vite |\n| Styling | Tailwind CSS v4, shadcn/ui, Radix UI |\n| State management | Zustand |\n| Backend | Rust (stable ≥ 1.77) |\n| Database | SQLite (bundled via rusqlite) |\n| Transcription | whisper.cpp (local sidecar binary) |\n| Audio capture | cpal, hound |\n\n---\n\n## Screenshots\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003cimg src=\"docs/screenshots/dashboard.png\" alt=\"Dashboard — usage stats, WPM chart, language breakdown\" width=\"480\"/\u003e\n      \u003cbr/\u003e\u003csub\u003eDashboard — usage stats, WPM trend \u0026amp; language breakdown\u003c/sub\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003cimg src=\"docs/screenshots/models-light.png\" alt=\"Model Manager — download and manage whisper.cpp models (light theme)\" width=\"480\"/\u003e\n      \u003cbr/\u003e\u003csub\u003eModel Manager — download whisper.cpp models (dark theme)\u003c/sub\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003cimg src=\"docs/screenshots/models-dark.png\" alt=\"Model Manager — installed models with per-language defaults (dark theme)\" width=\"480\"/\u003e\n      \u003cbr/\u003e\u003csub\u003eModel Manager — per-language defaults \u0026amp; installed models (light theme)\u003c/sub\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003cimg src=\"docs/screenshots/logs.png\" alt=\"Log Viewer — filterable in-app debug logs with export\" width=\"480\"/\u003e\n      \u003cbr/\u003e\u003csub\u003eLog Viewer — filterable in-app debug logs with JSON export\u003c/sub\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n---\n\n## Platform Support\n\n| Platform | Status | Notes |\n|---|---|---|\n| **Windows 10/11 x64** | First-class | Fully supported, signed installers |\n| **macOS Apple Silicon (arm64)** | Supported | Unsigned builds; Accessibility permission required for auto-insert |\n| **macOS Intel (x86_64)** | Supported | Same as Apple Silicon |\n| **Linux x86_64** | Supported | Requires `xdotool` (X11) or `wtype` (Wayland) for auto-insert; `libappindicator` for tray |\n\n---\n\n## Installation\n\n\u003e **Security notices by platform**\n\u003e\n\u003e - **Windows:** You may see a SmartScreen warning (\"unknown publisher\"). Click **\"More info\" → \"Run anyway\"**. Release binaries are Authenticode-signed via SignPath.\n\u003e - **macOS:** The app is not notarized. Right-click the `.app` → Open → Open to bypass Gatekeeper. Auto-insert (paste) requires granting Accessibility permission in System Settings → Privacy \u0026 Security → Accessibility.\n\u003e - **Linux:** No code signing. Mark the binary executable and run directly. Tray icon requires `libayatana-appindicator3` or `libappindicator3`.\n\n### Prerequisites\n\n| Tool | Version |\n|---|---|\n| Node.js | ≥ 20 |\n| pnpm | ≥ 9 |\n| Rust | stable ≥ 1.77 |\n\n**macOS additional requirements:**\n- Xcode Command Line Tools: `xcode-select --install`\n- cmake (for building whisper.cpp): `brew install cmake`\n\n**Linux additional requirements:**\n```bash\nsudo apt-get install -y \\\n  libwebkit2gtk-4.1-dev libssl-dev libgtk-3-dev \\\n  libayatana-appindicator3-dev librsvg2-dev libasound2-dev \\\n  cmake build-essential\n# For auto-insert (X11):\nsudo apt-get install -y xdotool\n# For auto-insert (Wayland):\nsudo apt-get install -y wtype\n```\n\n### Quick Setup (recommended)\n\nClone the repo and run the bootstrap script — it handles dependencies, whisper binaries, and build verification automatically.\n\n**Windows (PowerShell):**\n```powershell\ngit clone https://github.com/your-username/localvoice.git\ncd localvoice\n.\\scripts\\bootstrap.ps1\n```\n\n**macOS / Linux:**\n```bash\ngit clone https://github.com/your-username/localvoice.git\ncd localvoice\n./scripts/bootstrap.sh\n```\n\nThe script will:\n1. Check for Node.js, Rust, and pnpm (and install pnpm if missing)\n2. Check Linux system packages (Linux only)\n3. Install frontend dependencies\n4. Download or build whisper.cpp binaries for your platform (skip with `--skip-whisper`)\n5. Verify the Tauri CLI is available\n6. Run a Rust compilation check (skip with `--skip-verification`)\n\n### Manual Setup\n\n```bash\n# Install frontend dependencies\npnpm install\n\n# Start the dev server (hot-reload frontend + Rust watch)\npnpm tauri dev\n\n# Production build\npnpm tauri build\n```\n\n### whisper.cpp Binaries (required)\n\nThe bootstrap script handles this automatically. For manual setup, you need to place a platform-appropriate binary in `src-tauri/binaries/`:\n\n**Windows:**\n\n1. Download `whisper-bin-win-x64.zip` from the [whisper.cpp v1.7.1 release](https://github.com/ggerganov/whisper.cpp/releases/tag/v1.7.1)\n2. Extract and copy files:\n\n| File | Destination |\n|---|---|\n| `Release/whisper-cli.exe` | `src-tauri/binaries/whisper-cli-x86_64-pc-windows-msvc.exe` |\n| `Release/ggml.dll` | `src-tauri/ggml.dll` |\n| `Release/ggml-base.dll` | `src-tauri/ggml-base.dll` |\n| `Release/ggml-cpu.dll` | `src-tauri/ggml-cpu.dll` |\n| `Release/whisper.dll` | `src-tauri/whisper.dll` |\n| `Release/SDL2.dll` | `src-tauri/SDL2.dll` |\n\n**macOS (Apple Silicon):**\n\n```bash\ngit clone --depth 1 --branch v1.7.1 https://github.com/ggerganov/whisper.cpp\ncd whisper.cpp \u0026\u0026 cmake -B build -DCMAKE_BUILD_TYPE=Release -DWHISPER_BUILD_EXAMPLES=ON\ncmake --build build --target whisper-cli -j$(sysctl -n hw.logicalcpu)\ncp build/bin/whisper-cli ../src-tauri/binaries/whisper-cli-aarch64-apple-darwin\n```\n\n**macOS (Intel):** same steps, use target name `whisper-cli-x86_64-apple-darwin`.\n\n**Linux:**\n\n```bash\ngit clone --depth 1 --branch v1.7.1 https://github.com/ggerganov/whisper.cpp\ncd whisper.cpp \u0026\u0026 cmake -B build -DCMAKE_BUILD_TYPE=Release -DWHISPER_BUILD_EXAMPLES=ON\ncmake --build build --target whisper-cli -j$(nproc)\ncp build/bin/whisper-cli ../src-tauri/binaries/whisper-cli-x86_64-unknown-linux-gnu\n```\n\n\u003e All binary files are excluded from version control (`.gitignore`). Every contributor must provide them manually or run the bootstrap script.\n\n### Platform-specific notes\n\n**macOS — Auto-insert (paste):**\n`LocalVoice.app` must be granted Accessibility permission:\nSystem Settings → Privacy \u0026 Security → Accessibility → enable LocalVoice.\n\n**macOS — Autostart:**\nThe autostart toggle writes a launchd plist to `~/Library/LaunchAgents/com.localvoice.app.plist`.\n\n**Linux — Auto-insert (paste):**\nInstall the tool matching your display server:\n- X11: `sudo apt-get install xdotool`\n- Wayland: `sudo apt-get install wtype`\n\n**Linux — Tray icon:**\nRequires `libayatana-appindicator3` or `libappindicator3`. Install via:\n```bash\nsudo apt-get install libayatana-appindicator3-dev\n```\n\n**Linux — Autostart:**\nThe autostart toggle writes an XDG `.desktop` file to `~/.config/autostart/localvoice.desktop`.\n\n---\n\n## Configuration\n\nLocalVoice stores all settings in a local SQLite database — no config files to edit by hand. Everything is configurable through the app's Settings page:\n\n| Setting | Description |\n|---|---|\n| Recording shortcut | Global hotkey to start/stop recording |\n| Output mode | Insert to active app, clipboard, or preview |\n| Default language | Language used for transcription |\n| Active Whisper model | Per-language model selection |\n| Theme | System, light, or dark |\n| Filler words | Language-specific list of words to strip |\n| Audio retention | Whether to keep raw audio after transcription |\n| Logging | Enable/disable in-app debug logging |\n\n---\n\n## Usage\n\n1. Launch LocalVoice — a small pill window appears on screen.\n2. Press your configured shortcut (default: customizable in Settings) to start recording.\n3. Speak. The pill animates to show it's listening.\n4. Press the shortcut again (or let silence detection stop it automatically).\n5. LocalVoice transcribes locally and sends the text to your active app or clipboard.\n\nYou can open the full dashboard at any time to browse history, manage models, edit your dictionary, review ambiguous phrases, and view usage stats.\n\n---\n\n## Project Structure\n\n```\nsrc/                  React/TypeScript frontend\nsrc-tauri/\n  src/\n    commands/         Tauri IPC command handlers\n    db/               SQLite layer (migrations, repositories)\n    audio/            Recording and device management\n    transcription/    whisper.cpp sidecar protocol\n    postprocess/      Text cleaning, filler removal, corrections\n    dictionary/       Custom vocabulary and correction rules\n    os/               Tray, hotkeys, clipboard, text insertion\n    state/            AppState shared across commands\n    errors/           AppError / CmdResult types\ndocs/\n  user/               User-facing guides\n  dev/                Developer and architecture docs\nscripts/              Bootstrap and utility scripts\n```\n\nFull developer reference: [docs/dev/index.md](docs/dev/index.md)\n\n---\n\n## Contributing\n\nContributions are welcome. Here's how to get involved:\n\n**Reporting bugs**\nOpen an issue with a clear description, steps to reproduce, your OS, and the LocalVoice version. Attach logs from the in-app log viewer if relevant.\n\n**Suggesting features**\nOpen a discussion or issue describing the use case and why it would be valuable. Check existing issues first to avoid duplicates.\n\n**Submitting a pull request**\n1. Fork the repo and create a branch from `main`: `git checkout -b feat/your-feature`\n2. Follow the existing code style — Rust uses standard `rustfmt`, TypeScript uses the project's ESLint config\n3. Keep PRs focused — one feature or fix per PR\n4. Update or add documentation if your change affects user-facing behavior\n5. Open the PR with a clear description of what changed and why\n\n**Good first issues**\nLook for issues tagged `good first issue` — these are scoped and well-documented entry points.\n\n---\n\n## Code signing policy\n\nFree code signing provided by SignPath.io, certificate by SignPath Foundation.\n\nOfficial Windows release artifacts for LocalVoice are built from this public repository and submitted for signing only from the project's release workflow.\n\nCommitters and reviewers:\n- @iptoux\n\nApprovers:\n- @iptoux\n\nOnly release artifacts produced from the LocalVoice repository are submitted for signing.\nThird-party upstream binaries included in release packages remain attributed to their original upstream projects and are not individually signed under the LocalVoice project certificate.\n\n---\n\n## License\n\nMIT — see [LICENSE](LICENSE) for the full text.\n\n---\n\n\u003cdiv align=\"center\"\u003e\nBuilt with \u003ca href=\"https://tauri.app\"\u003eTauri\u003c/a\u003e · Transcription by \u003ca href=\"https://github.com/ggerganov/whisper.cpp\"\u003ewhisper.cpp\u003c/a\u003e\n\u003c/div\u003e\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fiptoux%2Flocalvoice","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fiptoux%2Flocalvoice","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fiptoux%2Flocalvoice/lists"}