A handoff-ready spec for Voculinux: a hard fork of Vocalinux for Void Linux (glibc x86_64), Wayland-primary under niri with Dank Material Shell. The spec decides terminal dictation, CUDA inference on an RTX 2050 4 GB, xbps packaging, the voculinux rename (app, binary, package, and web site), Carbon plus Bongbetic branding, performance budgets, and whether a Rust rebuild is sound. The web rebrand is part of this effort, not a later one.
Notes
Source app: Vocalinux 0.18.5, a Python GTK3 tray dictation app. Default engine is whisper.cpp via pywhispercpp; text injection covers X11 and Wayland (IBus, RemoteDesktop portal, ydotool); hotkeys use pynput or evdev.
Settled while charting: Wayland is primary. CUDA is the default GPU backend on Nvidia hardware. PipeWire is the default capture path. whisper_cpp is the only guaranteed engine. Hotkeys prefer niri keybinds calling the D-Bus toggle. Fresh voculinux XDG directories with one-time import of an old vocalinux config. Models download on first run with pinned checksums, never inside the xbps package.
Every session consults the grilling and domain-modeling skills. This map produces decisions, not deliverables.
Upstream: VocaHQ/vocalinux on GitHub. Fixes are cherry-picked by hand.
Decisions so far
Rust rebuild viability: Stay on Python. A wholesale Rust rebuild is feasible but unsound now; the sound Rust path is incremental spikes or a sidecar, injection first.
RTX 2050 CUDA model fit: Default to large-v3-turbo-q8_0 on 4 GB VRAM with q5_0 and small as fallbacks. Backend order is conditional: CUDA first only with a complete arch-matching toolkit, else Vulkan then CPU. Today's code never reaches its CUDA model path on this card.
niri and Dank integration APIs: Fork neither. Use niri keybinds spawning the existing D-Bus toggle triggers, standard StatusNotifier for the tray, and treat a DMS QML plugin as a later optional extra.
Void xbps packaging route: Dual track with the signed personal repository first (in-repo templates, tag-driven CI, signed repodata) and an optional upstream void-packages PR later. The packaged build is Vulkan plus CPU only, because Void has no CUDA toolkit package; a CUDA build stays a local-toolkit path outside the package.
Wayland terminal injection choice: RemoteDesktop portal first (no clipboard touch), then wtype, ydotool, xdotool XWayland, manual paste last; IBus excluded on niri; Ctrl+Shift+V in Ghostty via terminal auto-detect.
Carbon and Bongbetic UI direction: Carbon structure remapped to the house palette (teal stays interactive, paper canvas, Bongbetic mono for attribution chrome only); GTK keeps Adwaita theme vars with a small accent hook.
Rename mechanics: user-visible names go voculinux (binaries, desktop id, XDG dirs, D-Bus, IBus, xbps package, site); the Python import package stays vocalinux; one-time copy of the legacy config plus dictionary on first run.
Python performance baseline: three-metric protocol (unloaded/loaded idle RSS, toggle-to-capture wake latency, RTF on a fixed 30 s sample with large-v3-turbo-q8_0); host facts recorded, full loaded-model numbers deferred to an installed-build re-run.
Optional engines support promise: whisper_cpp is the only guaranteed engine; vosk, whisper, faster_whisper and parakeet stay best-effort installable extras and remote_api stays best-effort user-configured; nothing is dropped.
PipeWire capture details: Keep the scheme unchanged — System audio: sinks on negative indices via pw-dump, capture with pw-record --raw --target node.name, no silent mic fallback on stale selections, ducking off for system-audio capture.
Model catalog for 4 GB VRAM: Three-rung 4 GB ladder — large-v3-turbo-q8_0 default, q5_0 when free VRAM is low, small/small.en as the floor; larger and medium variants excluded from the recommended set; load-time free-VRAM rule plus one step-down retry, thresholds validated later.
Signed xbps repository release pipeline: In-repo void-packages-layout template, v*-tag CI in a void-glibc container signing with xbps-rindex, full signed x86_64 repodata on every GitHub release, one RSA 4096 key via XBPS_PRIVKEY, template bumps via PR.: Sync-point hand cherry-picks (one fix, one PR, dual reference), frozen once the release branch opens; port fixes only, never wholesale merges.
Portal first-run prompt UX under niri: No portal prompt exists on niri — no backend implements RemoteDesktop there, so first dictation goes straight to wtype; the permission dialog, deny-then-fallback, and restore-token persistence apply only on GNOME/KDE.
Upstream void-packages submission (revisit only under a new destination).
Forking niri or Dank Material Shell.
A web-UI rewrite of the desktop app.
## Destination
A handoff-ready spec for Voculinux: a hard fork of Vocalinux for Void Linux (glibc x86_64), Wayland-primary under niri with Dank Material Shell. The spec decides terminal dictation, CUDA inference on an RTX 2050 4 GB, xbps packaging, the voculinux rename (app, binary, package, and web site), Carbon plus Bongbetic branding, performance budgets, and whether a Rust rebuild is sound. The web rebrand is part of this effort, not a later one.
## Notes
- Source app: Vocalinux 0.18.5, a Python GTK3 tray dictation app. Default engine is whisper.cpp via pywhispercpp; text injection covers X11 and Wayland (IBus, RemoteDesktop portal, ydotool); hotkeys use pynput or evdev.
- Settled while charting: Wayland is primary. CUDA is the default GPU backend on Nvidia hardware. PipeWire is the default capture path. whisper_cpp is the only guaranteed engine. Hotkeys prefer niri keybinds calling the D-Bus toggle. Fresh voculinux XDG directories with one-time import of an old vocalinux config. Models download on first run with pinned checksums, never inside the xbps package.
- Every session consults the grilling and domain-modeling skills. This map produces decisions, not deliverables.
- Upstream: VocaHQ/vocalinux on GitHub. Fixes are cherry-picked by hand.
## Decisions so far
- [Rust rebuild viability](https://git.bongbetic.com/xavierk/voculinux/issues/2): Stay on Python. A wholesale Rust rebuild is feasible but unsound now; the sound Rust path is incremental spikes or a sidecar, injection first.
- [RTX 2050 CUDA model fit](https://git.bongbetic.com/xavierk/voculinux/issues/3): Default to large-v3-turbo-q8_0 on 4 GB VRAM with q5_0 and small as fallbacks. Backend order is conditional: CUDA first only with a complete arch-matching toolkit, else Vulkan then CPU. Today's code never reaches its CUDA model path on this card.
- [niri and Dank integration APIs](https://git.bongbetic.com/xavierk/voculinux/issues/5): Fork neither. Use niri keybinds spawning the existing D-Bus toggle triggers, standard StatusNotifier for the tray, and treat a DMS QML plugin as a later optional extra.
- [Void xbps packaging route](https://git.bongbetic.com/xavierk/voculinux/issues/4): Dual track with the signed personal repository first (in-repo templates, tag-driven CI, signed repodata) and an optional upstream void-packages PR later. The packaged build is Vulkan plus CPU only, because Void has no CUDA toolkit package; a CUDA build stays a local-toolkit path outside the package.
- [Wayland terminal injection choice](https://git.bongbetic.com/xavierk/voculinux/issues/6): RemoteDesktop portal first (no clipboard touch), then wtype, ydotool, xdotool XWayland, manual paste last; IBus excluded on niri; Ctrl+Shift+V in Ghostty via terminal auto-detect.
- [Carbon and Bongbetic UI direction](https://git.bongbetic.com/xavierk/voculinux/issues/7): Carbon structure remapped to the house palette (teal stays interactive, paper canvas, Bongbetic mono for attribution chrome only); GTK keeps Adwaita theme vars with a small accent hook.
- [Rename mechanics](https://git.bongbetic.com/xavierk/voculinux/issues/8): user-visible names go voculinux (binaries, desktop id, XDG dirs, D-Bus, IBus, xbps package, site); the Python import package stays vocalinux; one-time copy of the legacy config plus dictionary on first run.
- [Python performance baseline](https://git.bongbetic.com/xavierk/voculinux/issues/9): three-metric protocol (unloaded/loaded idle RSS, toggle-to-capture wake latency, RTF on a fixed 30 s sample with large-v3-turbo-q8_0); host facts recorded, full loaded-model numbers deferred to an installed-build re-run.
- [Optional engines support promise](https://git.bongbetic.com/xavierk/voculinux/issues/10): whisper_cpp is the only guaranteed engine; vosk, whisper, faster_whisper and parakeet stay best-effort installable extras and remote_api stays best-effort user-configured; nothing is dropped.
- [PipeWire capture details](https://git.bongbetic.com/xavierk/voculinux/issues/11): Keep the scheme unchanged — `System audio:` sinks on negative indices via pw-dump, capture with pw-record --raw --target node.name, no silent mic fallback on stale selections, ducking off for system-audio capture.
- [Model catalog for 4 GB VRAM](https://git.bongbetic.com/xavierk/voculinux/issues/12): Three-rung 4 GB ladder — large-v3-turbo-q8_0 default, q5_0 when free VRAM is low, small/small.en as the floor; larger and medium variants excluded from the recommended set; load-time free-VRAM rule plus one step-down retry, thresholds validated later.
- [Cherry-pick policy for upstream fixes](https://git.bongbetic.com/xavierk/voculinux/issues/13)
- [Signed xbps repository release pipeline](https://git.bongbetic.com/xavierk/voculinux/issues/14): In-repo void-packages-layout template, v*-tag CI in a void-glibc container signing with xbps-rindex, full signed x86_64 repodata on every GitHub release, one RSA 4096 key via XBPS_PRIVKEY, template bumps via PR.: Sync-point hand cherry-picks (one fix, one PR, dual reference), frozen once the release branch opens; port fixes only, never wholesale merges.
- [Portal first-run prompt UX under niri](https://git.bongbetic.com/xavierk/voculinux/issues/15): No portal prompt exists on niri — no backend implements RemoteDesktop there, so first dictation goes straight to wtype; the permission dialog, deny-then-fallback, and restore-token persistence apply only on GNOME/KDE.
## Not yet specified
All previously sketched fog has graduated into live tickets: [Optional engines support promise](https://git.bongbetic.com/xavierk/voculinux/issues/10), [PipeWire capture details](https://git.bongbetic.com/xavierk/voculinux/issues/11), [Model catalog for 4 GB VRAM](https://git.bongbetic.com/xavierk/voculinux/issues/12), [Cherry-pick policy for upstream fixes](https://git.bongbetic.com/xavierk/voculinux/issues/13), [Signed xbps repository release pipeline](https://git.bongbetic.com/xavierk/voculinux/issues/14), [Portal first-run prompt UX under niri](https://git.bongbetic.com/xavierk/voculinux/issues/15).
## Out of scope
- musl builds of Void Linux.
- Upstream void-packages submission (revisit only under a new destination).
- Forking niri or Dank Material Shell.
- A web-UI rewrite of the desktop app.
Handoff: the decisions on this map have been collapsed into a spec, Spec: Voculinux — Void Linux (glibc) Wayland/niri port of Vocalinux, labelled ready-for-agent. The spec is the human review gate for the agent-made decisions recorded here. Next step after review: split the spec into tickets.
Handoff: the decisions on this map have been collapsed into a spec, [Spec: Voculinux — Void Linux (glibc) Wayland/niri port of Vocalinux](https://git.bongbetic.com/xavierk/voculinux/issues/16), labelled ready-for-agent. The spec is the human review gate for the agent-made decisions recorded here. Next step after review: split the spec into tickets.
The port has shipped. v0.19.0 is released (https://git.bongbetic.com/xavierk/voculinux/releases/tag/v0.19.0) as a signed Void xbps repository at https://git.bongbetic.com/xavierk/voculinux/releases/download/latest. The repository is public, and hardware acceptance on Void, niri, Dank Material Shell and the RTX 2050 is recorded in #19, #22 and #32. Defects found after the release are tracked as new issues.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Destination
A handoff-ready spec for Voculinux: a hard fork of Vocalinux for Void Linux (glibc x86_64), Wayland-primary under niri with Dank Material Shell. The spec decides terminal dictation, CUDA inference on an RTX 2050 4 GB, xbps packaging, the voculinux rename (app, binary, package, and web site), Carbon plus Bongbetic branding, performance budgets, and whether a Rust rebuild is sound. The web rebrand is part of this effort, not a later one.
Notes
Decisions so far
System audio:sinks on negative indices via pw-dump, capture with pw-record --raw --target node.name, no silent mic fallback on stale selections, ducking off for system-audio capture.Not yet specified
All previously sketched fog has graduated into live tickets: Optional engines support promise, PipeWire capture details, Model catalog for 4 GB VRAM, Cherry-pick policy for upstream fixes, Signed xbps repository release pipeline, Portal first-run prompt UX under niri.
Out of scope
Handoff: the decisions on this map have been collapsed into a spec, Spec: Voculinux — Void Linux (glibc) Wayland/niri port of Vocalinux, labelled ready-for-agent. The spec is the human review gate for the agent-made decisions recorded here. Next step after review: split the spec into tickets.
The port has shipped. v0.19.0 is released (https://git.bongbetic.com/xavierk/voculinux/releases/tag/v0.19.0) as a signed Void xbps repository at https://git.bongbetic.com/xavierk/voculinux/releases/download/latest. The repository is public, and hardware acceptance on Void, niri, Dank Material Shell and the RTX 2050 is recorded in #19, #22 and #32. Defects found after the release are tracked as new issues.