A private desktop speech editor. Speak messy thoughts, watch them get refined by a local LLM, review the result, and place clean text into a focused target when the configured platform/backend supports it. Core speech processing runs on your machine: no cloud inference, account, subscription, or telemetry.
A Donaven Crenshaw project · MIT licensed · Windows + Linux Status: public alpha. v1.1.0-alpha.3 includes a signed Windows x64 installer. It is still alpha software; see Project status for the honest boundaries.
Hold a hotkey (or a game-controller button), talk, and BetterFingers:
The whole product is built around one loop: activate → speak → transcribe → refine → review → inject → recover when anything fails.
| Area | What's there |
|---|---|
| Capture | Global push-to-talk (uiohook), controller trigger, long-recording chunking with progress |
| Refinement | Local LLM personas (schema v2), personal dictionary, spoken formatting commands, text macros |
| Review | Editable review overlay, TTS read-back, per-utterance confidence surfaced honestly |
| Recovery | Raw-audio retention + re-transcribe, recoverable error drafts |
| Placement | Text injection through supported typing/paste backends; clipboard restore; qualification varies by desktop/platform path |
| Recall | Full-text searchable history (SQLite FTS5) |
| Trust | Privacy dashboard, one-button data wipe, hardware-aware model recommender |
BetterFingers is a real local-first application with automated tests and a deep feature set. v1.1.0-alpha.3 is a public prerelease with a signed Windows x64 installer. It is not a stable release: hardware/model compatibility, desktop injection paths, and platform-specific selection behavior still need broader outside testing. The release page and its CI-built assets are the public source of truth.
Platforms: Windows is the primary packaged target. Linux can run from source; the
source Ctrl+Alt+R selection-rewrite workflow is qualified on X11, while Wayland paths
remain compositor-dependent and best-effort. macOS is not supported yet.
| Tier | CPU | RAM | GPU | Suggested models |
|---|---|---|---|---|
| Minimum | 6c/12t | 16 GB | none (CPU-only OK) | Gemma 4B Q4, Whisper base.en |
| Recommended | 8c/16t | 32 GB | RTX 3060 12 GB class | Gemma 4B Q6/Q8, Whisper small/medium.en |
| High-perf | 12c+ | 64 GB | RTX 4080/4090 class | Gemma 12B, Whisper large-v3 |
The in-app recommender detects your tier and never suggests a model that won't fit your RAM. Bigger models are always opt-in.
Speech processing runs on-device. Network access is limited to model/runtime downloads
and update checks. No accounts, analytics, or cloud inference. The Privacy dashboard
(GET /privacy) lists every data location on disk with sizes and retention, and
POST /privacy/wipe verifiably clears drafts, the searchable-history database, and raw
recordings. See DESIGN.md §9 for the full data-lifecycle model (a unified
DataRegistry and optional at-rest encryption are on the roadmap).
Download the installer from the v1.1.0-alpha.3 release. The published Windows installer is Authenticode-signed. Windows SmartScreen can still warn on a new, low-reputation alpha; verify the signature and release URL instead of downloading copies from third-party mirrors.
# Hardware-aware bootstrap: creates ./.venv and installs the torch build that
# matches your machine. On a GPU-less box it installs CPU-only torch, skipping
# the ~3.9 GB of CUDA/nvidia wheels the default install would pull in.
python3 tools/setup_venv.py
cd app && npm install && npm run fix:electron
BETTERFINGERS_PYTHON=../.venv/bin/python npm run dev
The bootstrap auto-detects an NVIDIA GPU via nvidia-smi. Override with
--torch cpu or --torch cuda if you want to force a build. The old manual
path still works (python3 -m venv .venv && source .venv/bin/activate && pip install -r requirements.txt) but on Linux it always pulls the CUDA stack.
The Electron shell starts the FastAPI backend automatically on port 8000
(BETTERFINGERS_HOST / BETTERFINGERS_PORT are honored end-to-end).
You also need a local llama-server binary for LLM cleanup. BetterFingers looks for it at
.betterfingers/llama-server/bin/llama-server; provision one with:
python tools/setup_linux_llama_server.py --from /path/to/llama-server
# or build from a llama.cpp checkout:
python tools/setup_linux_llama_server.py --source .betterfingers/llama.cpp
# CUDA build:
python tools/setup_linux_llama_server.py --source .betterfingers/llama.cpp --cmake-arg=-DGGML_CUDA=ON
Overrides: BETTERFINGERS_LLAMA_SERVER=/path/to/llama-server,
BETTERFINGERS_MODEL_PATH=/path/to/model.gguf.
python3 -m pytest -q (full suite loads real Whisper/TTS models and peaks
around 11 GB RAM — see the OOM note in tests/conftest.py; for
fast iteration use python3 -m pytest -q -k "not transcriber and not tts_engine").cd app && npx playwright test (needs a local LLM + llama-server on
disk for the review-overlay spec; close any running instance first).node --check app/src/renderer/main.js.Electron (app/) Python sidecar (repo root)
├─ main: windows, tray, ├─ server.py FastAPI (~60 routes) + WebSocket
│ overlays, global ├─ transcriber faster-whisper (+ confidence)
│ hotkeys, injection ├─ llm_engine llama-server client, personas, chunking
├─ preload: auth + origin bridge ├─ tts_engine Kokoro (+ blend / modulation)
└─ renderer: dashboard, overlays ├─ recorder / hotkey_manager / dictionary / macros
├─ history_store (FTS5) / recordings / model_manager
REST + WebSocket boundary <────> └─ hardware_report / model_recommender / privacy
(Bearer token, versioned)
Electron owns the desktop surface (windows, tray, overlays, hotkeys, clipboard, injection); Python owns everything model- and data-related (STT, LLM, TTS, personas, recordings, history, privacy). The boundary is an inspectable, version-gated REST + WS API.
DISPLAY, xclip (or xsel), and
xdotool where those paths are used. Wayland best-effort paths use WAYLAND_DISPLAY,
wl-copy/wl-paste from wl-clipboard, and wtype or ydotool where the
compositor permits them; tool presence alone is not qualification.Found a bug or a security issue? See SECURITY.md for how to report vulnerabilities privately. Roadmap and design rationale: DESIGN.md.
BetterFingers is a project by Donaven Crenshaw — private, local-first software that respects you.
MIT © 2026 Donaven Crenshaw.
481 commits
9 commits
Python
47.5%
JavaScript
40.4%
HTML
8.2%
CSS
3.0%
A private desktop speech editor. Speak messy thoughts, watch them get refined by a local LLM, review the result, and place clean text into a focused target when the configured platform/backend supports it. Core speech processing runs on your machine: no cloud inference, account, subscription, or telemetry.
A Donaven Crenshaw project · MIT licensed · Windows + Linux Status: public alpha. v1.1.0-alpha.3 includes a signed Windows x64 installer. It is still alpha software; see Project status for the honest boundaries.
Hold a hotkey (or a game-controller button), talk, and BetterFingers:
The whole product is built around one loop: activate → speak → transcribe → refine → review → inject → recover when anything fails.
| Area | What's there |
|---|---|
| Capture | Global push-to-talk (uiohook), controller trigger, long-recording chunking with progress |
| Refinement | Local LLM personas (schema v2), personal dictionary, spoken formatting commands, text macros |
| Review | Editable review overlay, TTS read-back, per-utterance confidence surfaced honestly |
| Recovery | Raw-audio retention + re-transcribe, recoverable error drafts |
| Placement | Text injection through supported typing/paste backends; clipboard restore; qualification varies by desktop/platform path |
| Recall | Full-text searchable history (SQLite FTS5) |
| Trust | Privacy dashboard, one-button data wipe, hardware-aware model recommender |
BetterFingers is a real local-first application with automated tests and a deep feature set. v1.1.0-alpha.3 is a public prerelease with a signed Windows x64 installer. It is not a stable release: hardware/model compatibility, desktop injection paths, and platform-specific selection behavior still need broader outside testing. The release page and its CI-built assets are the public source of truth.
Platforms: Windows is the primary packaged target. Linux can run from source; the
source Ctrl+Alt+R selection-rewrite workflow is qualified on X11, while Wayland paths
remain compositor-dependent and best-effort. macOS is not supported yet.
| Tier | CPU | RAM | GPU | Suggested models |
|---|---|---|---|---|
| Minimum | 6c/12t | 16 GB | none (CPU-only OK) | Gemma 4B Q4, Whisper base.en |
| Recommended | 8c/16t | 32 GB | RTX 3060 12 GB class | Gemma 4B Q6/Q8, Whisper small/medium.en |
| High-perf | 12c+ | 64 GB | RTX 4080/4090 class | Gemma 12B, Whisper large-v3 |
The in-app recommender detects your tier and never suggests a model that won't fit your RAM. Bigger models are always opt-in.
Speech processing runs on-device. Network access is limited to model/runtime downloads
and update checks. No accounts, analytics, or cloud inference. The Privacy dashboard
(GET /privacy) lists every data location on disk with sizes and retention, and
POST /privacy/wipe verifiably clears drafts, the searchable-history database, and raw
recordings. See DESIGN.md §9 for the full data-lifecycle model (a unified
DataRegistry and optional at-rest encryption are on the roadmap).
Download the installer from the v1.1.0-alpha.3 release. The published Windows installer is Authenticode-signed. Windows SmartScreen can still warn on a new, low-reputation alpha; verify the signature and release URL instead of downloading copies from third-party mirrors.
# Hardware-aware bootstrap: creates ./.venv and installs the torch build that
# matches your machine. On a GPU-less box it installs CPU-only torch, skipping
# the ~3.9 GB of CUDA/nvidia wheels the default install would pull in.
python3 tools/setup_venv.py
cd app && npm install && npm run fix:electron
BETTERFINGERS_PYTHON=../.venv/bin/python npm run dev
The bootstrap auto-detects an NVIDIA GPU via nvidia-smi. Override with
--torch cpu or --torch cuda if you want to force a build. The old manual
path still works (python3 -m venv .venv && source .venv/bin/activate && pip install -r requirements.txt) but on Linux it always pulls the CUDA stack.
The Electron shell starts the FastAPI backend automatically on port 8000
(BETTERFINGERS_HOST / BETTERFINGERS_PORT are honored end-to-end).
You also need a local llama-server binary for LLM cleanup. BetterFingers looks for it at
.betterfingers/llama-server/bin/llama-server; provision one with:
python tools/setup_linux_llama_server.py --from /path/to/llama-server
# or build from a llama.cpp checkout:
python tools/setup_linux_llama_server.py --source .betterfingers/llama.cpp
# CUDA build:
python tools/setup_linux_llama_server.py --source .betterfingers/llama.cpp --cmake-arg=-DGGML_CUDA=ON
Overrides: BETTERFINGERS_LLAMA_SERVER=/path/to/llama-server,
BETTERFINGERS_MODEL_PATH=/path/to/model.gguf.
python3 -m pytest -q (full suite loads real Whisper/TTS models and peaks
around 11 GB RAM — see the OOM note in tests/conftest.py; for
fast iteration use python3 -m pytest -q -k "not transcriber and not tts_engine").cd app && npx playwright test (needs a local LLM + llama-server on
disk for the review-overlay spec; close any running instance first).node --check app/src/renderer/main.js.Electron (app/) Python sidecar (repo root)
├─ main: windows, tray, ├─ server.py FastAPI (~60 routes) + WebSocket
│ overlays, global ├─ transcriber faster-whisper (+ confidence)
│ hotkeys, injection ├─ llm_engine llama-server client, personas, chunking
├─ preload: auth + origin bridge ├─ tts_engine Kokoro (+ blend / modulation)
└─ renderer: dashboard, overlays ├─ recorder / hotkey_manager / dictionary / macros
├─ history_store (FTS5) / recordings / model_manager
REST + WebSocket boundary <────> └─ hardware_report / model_recommender / privacy
(Bearer token, versioned)
Electron owns the desktop surface (windows, tray, overlays, hotkeys, clipboard, injection); Python owns everything model- and data-related (STT, LLM, TTS, personas, recordings, history, privacy). The boundary is an inspectable, version-gated REST + WS API.
DISPLAY, xclip (or xsel), and
xdotool where those paths are used. Wayland best-effort paths use WAYLAND_DISPLAY,
wl-copy/wl-paste from wl-clipboard, and wtype or ydotool where the
compositor permits them; tool presence alone is not qualification.Found a bug or a security issue? See SECURITY.md for how to report vulnerabilities privately. Roadmap and design rationale: DESIGN.md.
BetterFingers is a project by Donaven Crenshaw — private, local-first software that respects you.
MIT © 2026 Donaven Crenshaw.
481 commits
9 commits
Python
47.5%
JavaScript
40.4%
HTML
8.2%
CSS
3.0%