diff --git a/web/PRODUCT.md b/web/PRODUCT.md
index 99a6d13..fe1d014 100644
--- a/web/PRODUCT.md
+++ b/web/PRODUCT.md
@@ -18,11 +18,11 @@ Offline-first Linux voice typing with real desktop integration (system tray, X11
## Operating context
-- Install via a one-line shell installer, AppImage from GitHub Releases, AUR, Snap (`--edge`), or Flatpak release bundle; then run from PATH, app menu, or the AppImage binary
+- Install from the signed Void Linux xbps repository (glibc, x86_64), then run `voculinux` from PATH or the application menu; source checkouts use the install script
- System tray indicator and settings GUI (GTK) with searchable sidebar navigation and an always-visible sidebar footer for dictation status / Test Dictation / Close
- Dictation into terminals, browsers, IDEs, office apps
- Engines and models chosen for hardware (CPU, optional Vulkan GPU with discrete-device preference)
-- Guides and comparison pages on voculinux.com; source on the fork's own Gitea host (`https://git.bongbetic.com/xavierk/voculinux`); upstream GitHub is linked only as labelled provenance
+- Guides and comparison pages on voculinux.com; source, issues and releases on the fork's own host (`https://git.bongbetic.com/xavierk/voculinux`); the upstream project is credited once, in the site footer
## Capabilities and constraints
@@ -43,21 +43,21 @@ Offline-first Linux voice typing with real desktop integration (system tray, X11
- Optional JSONL persistence of transcription history to disk (off by default)
- Settings Proxy page: outbound SOCKS5 or HTTP CONNECT proxy (optional auth) for model downloads and update checks
- Speech Model Advanced pickers stage engine/size/variant/language changes until Download is confirmed
-- In-app update checker (stable/nightly) with tray notification when a newer GitHub release is available
-- Settings About page groups this app, upstream project links retained as provenance, and talk-to-us links (GitHub, Discord, X, email)
+- In-app update checker (stable/nightly) with tray notification when a newer release is available on the fork's release host; packaged installs point to xbps for updates
+- Settings About page groups this app, with the website, the source and issues links, and one labelled upstream credit; no Discord, X or email
- Optional disable of the missing-tray warning dialog
- Settings → Audio tone picker (Lift, Flick, Ember, Step, Voca, Soft, Chirp, Scale, Drop, Glass, Off) with Preview; new installs default to Voca; catalog files are the preview WAVs
- Vulkan discrete GPU auto-select with manual device override in Advanced settings
- Native GTK installs follow the OS dark/light preference unless `GTK_THEME` is already set
- Wayland: IBus when `ibus-wayland` is running, including on compositors previously treated as unbridged
-- Packaging: install.sh (distro python3-gi required; no pip sdist of PyGObject), .deb/.rpm (x86_64/aarch64), AppImage (x86_64/aarch64), AUR, Flatpak (local/Flathub status as documented); uv.lock pins Python deps; Justfile replaces Makefile
+- Packaging: the signed Void Linux xbps repository (glibc, x86_64) is the only published channel; source checkouts use install.sh (distro python3-gi required; no pip sdist of PyGObject); uv.lock pins Python deps; Justfile replaces Makefile
- No usage telemetry in the installed app
- AGPL-3.0; marketing version string is tracked in site package/version surfaces
- Website is Next.js marketing + SEO guides (static export); languages page documents per-engine support honestly
## Brand commitments
-- Name: Voculinux, a hard fork of Vocalinux for Void Linux (glibc, Wayland-primary under niri). Upstream project links are retained as provenance; the fork site carries the new name everywhere a user looks
+- Name: Voculinux, a hard fork for Void Linux (glibc, Wayland-primary under niri). The only upstream link is the labelled provenance credit in the site footer; the fork site carries the new name everywhere a user looks
- Mark: fork mic for the app icon, tray states, and site favicons (`public/`); Bongbetic appears only as attribution chrome in the site header and footer, linking the hosted brand assets at `https://bongbetic.com/branding/` — no brand binaries are vendored into the repository
- Visual system: Carbon-mapped — Carbon spacing, type-role, motion, and contrast discipline remapped to the house palette (warm paper canvas, teal interactive colour, system type stacks only, red reserved for recording/destructive); no Carbon blue, no remote webfonts
- Engine promise: whisper.cpp is the guaranteed default engine (packaged, checksum-pinned, budgeted); Faster Whisper, Whisper, VOSK, and Parakeet are best-effort installable extras; the Remote API engine is user-configured and audio leaves the machine — stated plainly wherever remote is described
@@ -66,7 +66,7 @@ Offline-first Linux voice typing with real desktop integration (system tray, X11
## Evidence on hand
- Real app screenshots in `public/screenshots/`
-- Install/uninstall commands pointing at GitHub raw install scripts
+- Install commands for the signed Void xbps repository (the install guide and the home page), with the repository key fingerprint
- JSON-LD on the home page (software application, FAQ, how-to)
- Do not invent user counts, testimonials, or benchmarks
diff --git a/web/README.md b/web/README.md
index ab24458..557c2a2 100644
--- a/web/README.md
+++ b/web/README.md
@@ -73,7 +73,7 @@ web/
- Custom domain: `deploy` script writes `out/CNAME`
- Subdirectory deploy: set `basePath` in `next.config.js` if needed
-- Family workbench UI: warm paper, system type, same language as VocaHQ ([DESIGN.md](DESIGN.md))
+- Visual system: warm paper, system type, documented in [DESIGN.md](DESIGN.md)
## Troubleshooting
diff --git a/web/public/.well-known/org.flathub.VerifiedApps.txt b/web/public/.well-known/org.flathub.VerifiedApps.txt
deleted file mode 100644
index e69de29..0000000
diff --git a/web/public/brand/social/discord.svg b/web/public/brand/social/discord.svg
deleted file mode 100644
index 43868fa..0000000
--- a/web/public/brand/social/discord.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
diff --git a/web/public/brand/social/mail.svg b/web/public/brand/social/mail.svg
deleted file mode 100644
index 0ae8952..0000000
--- a/web/public/brand/social/mail.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
diff --git a/web/public/brand/social/x.svg b/web/public/brand/social/x.svg
deleted file mode 100644
index 843ef66..0000000
--- a/web/public/brand/social/x.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
diff --git a/web/public/sitemap.xml b/web/public/sitemap.xml
index 1191293..0971c36 100644
--- a/web/public/sitemap.xml
+++ b/web/public/sitemap.xml
@@ -12,36 +12,12 @@
weekly0.9
-
- https://voculinux.com/install/ubuntu/
- 2026-11-01
- monthly
- 0.8
-
-
- https://voculinux.com/install/fedora/
- 2026-11-01
- monthly
- 0.8
-
-
- https://voculinux.com/install/arch/
- 2026-11-01
- monthly
- 0.8
- https://voculinux.com/compare/2026-11-01monthly0.8
-
- https://voculinux.com/changelog/
- 2026-06-11
- weekly
- 0.7
- https://voculinux.com/screenshots/2026-07-14
@@ -241,46 +217,4 @@
monthly0.7
-
- https://voculinux.com/local-gateway/
- 2026-11-01
- monthly
- 0.7
-
-
- https://voculinux.com/flatpak/
- 2026-11-01
- monthly
- 0.7
-
-
- https://voculinux.com/install/nixos/
- 2026-11-01
- monthly
- 0.8
-
-
- https://voculinux.com/install/debian/
- 2026-11-01
- monthly
- 0.8
-
-
- https://voculinux.com/install/opensuse/
- 2026-11-01
- monthly
- 0.8
-
-
- https://voculinux.com/install/linux-mint/
- 2026-11-01
- monthly
- 0.8
-
-
- https://voculinux.com/install/pop-os/
- 2026-11-01
- monthly
- 0.8
-
diff --git a/web/src/app/__tests__/seo-assets.test.ts b/web/src/app/__tests__/seo-assets.test.ts
index e17a234..3221390 100644
--- a/web/src/app/__tests__/seo-assets.test.ts
+++ b/web/src/app/__tests__/seo-assets.test.ts
@@ -41,9 +41,6 @@ describe("SEO Assets", () => {
const expectedUrls = [
"https://voculinux.com/",
"https://voculinux.com/install/",
- "https://voculinux.com/install/ubuntu/",
- "https://voculinux.com/install/fedora/",
- "https://voculinux.com/install/arch/",
"https://voculinux.com/compare/",
"https://voculinux.com/remote-api/",
"https://voculinux.com/voice-activity-detection/",
@@ -59,13 +56,6 @@ describe("SEO Assets", () => {
"https://voculinux.com/pipewire/",
"https://voculinux.com/global-shortcuts/",
"https://voculinux.com/hyprland-sway/",
- "https://voculinux.com/local-gateway/",
- "https://voculinux.com/flatpak/",
- "https://voculinux.com/install/nixos/",
- "https://voculinux.com/install/debian/",
- "https://voculinux.com/install/opensuse/",
- "https://voculinux.com/install/linux-mint/",
- "https://voculinux.com/install/pop-os/",
];
expectedUrls.forEach((url) => {
@@ -101,8 +91,16 @@ describe("SEO Assets", () => {
(match) => match[1],
);
expect(new Set(locs).size).toBe(locs.length);
- routes.forEach((url) => {
- expect(locs).toContain(url);
- });
+
+ // Notice routes stay in the app but are dropped from navigation and the
+ // sitemap, so they are the only static routes allowed to be absent.
+ const NOTICE_ROUTES = [
+ "https://voculinux.com/flatpak/",
+ "https://voculinux.com/install/nixos/",
+ "https://voculinux.com/changelog/",
+ "https://voculinux.com/local-gateway/",
+ ];
+ const missing = routes.filter((url) => !locs.includes(url));
+ expect(missing.sort()).toEqual([...NOTICE_ROUTES].sort());
});
});
diff --git a/web/src/app/advanced-settings/page.tsx b/web/src/app/advanced-settings/page.tsx
index c49448f..59bdcf5 100644
--- a/web/src/app/advanced-settings/page.tsx
+++ b/web/src/app/advanced-settings/page.tsx
@@ -84,8 +84,8 @@ export default function AdvancedSettingsPage() {
dateModified: "2026-06-11",
author: {
"@type": "Person",
- name: "Jatin K Malik",
- url: "https://github.com/jatinkrmalik",
+ name: "Xavier Karma",
+ url: "https://bongbetic.com",
},
publisher: {
"@type": "Organization",
diff --git a/web/src/app/alternatives/page.tsx b/web/src/app/alternatives/page.tsx
index 0a70375..97c6f73 100644
--- a/web/src/app/alternatives/page.tsx
+++ b/web/src/app/alternatives/page.tsx
@@ -79,8 +79,8 @@ export default function AlternativesPage() {
dateModified: "2026-02-19",
author: {
"@type": "Person",
- name: "Jatin K Malik",
- url: "https://github.com/jatinkrmalik",
+ name: "Xavier Karma",
+ url: "https://bongbetic.com",
},
publisher: {
"@type": "Organization",
diff --git a/web/src/app/autostart/page.tsx b/web/src/app/autostart/page.tsx
index fbaf473..7cf4203 100644
--- a/web/src/app/autostart/page.tsx
+++ b/web/src/app/autostart/page.tsx
@@ -121,8 +121,8 @@ export default function AutostartPage() {
dateModified: "2026-11-01",
author: {
"@type": "Person",
- name: "Jatin K Malik",
- url: "https://github.com/jatinkrmalik",
+ name: "Xavier Karma",
+ url: "https://bongbetic.com",
},
publisher: {
"@type": "Organization",
diff --git a/web/src/app/changelog/page.tsx b/web/src/app/changelog/page.tsx
index 5d04d38..721b3c3 100644
--- a/web/src/app/changelog/page.tsx
+++ b/web/src/app/changelog/page.tsx
@@ -1,697 +1,29 @@
-import Link from "next/link";
import { type Metadata } from "next";
-import {
- BookOpen,
- CheckCircle2,
- ChevronRight,
- Clock,
- Download,
- Sparkles,
- Tag,
- Zap,
-} from "lucide-react";
-import { SeoSubpageShell } from "@/components/seo-subpage-shell";
-import {
- absoluteUrl,
- buildPageMetadata,
- UPSTREAM_REPO_URL,
-} from "@/lib/seo";
-
-const releases = [
- {
- version: "v0.18.5",
- date: "2026-10-27",
- type: "stable",
- highlights: [
- "A stop pressed while a recording is starting can no longer leave the microphone recording forever (PR #1023)",
- "A microphone that stalls mid-read can no longer hang dictation in PROCESSING; capture reads happen outside the buffer lock (PR #1023)",
- "Keyboards survive suspend and the GNOME lock screen again: the evdev grab is released when forwarding cannot run (PR #1025)",
- "Dictation Pad and Settings no longer bind to other windows or travel workspaces together on Wayland (PR #1024)",
- "Ctrl+mouse-wheel zoom works again in Firefox and other apps (PR #967)",
- "install.sh gains an upgrade mode that keeps your existing configuration and models (PR #1026)",
- "Paste-injection copies are marked sensitive on wl-clipboard 2.2+, so clipboard managers that honor the hint keep dictated text out of history (PR #956); AUR source publication is gated on attested sdists (PR #1020)",
- "Tray prefers libayatana-appindicator (PR #1019), the Snap lists PulseAudio microphones (PR #1018), and the Wayland fallback overlay survives dock closes (PR #1017)",
- ],
- },
- {
- version: "v0.18.4",
- date: "2026-10-21",
- type: "stable",
- highlights: [
- "Long push-to-talk dictations are queued in segments before the buffer cap, so nothing after the first two minutes is lost (PR #976)",
- "Model downloads only start after you confirm them, Cancel cancels the whole change without freezing Settings, and switching models keeps your language settings (PR #1006)",
- "Test Dictation always shows its own result; the Dictation Pad routing toggle moves to Settings > Dictation (PR #1005)",
- "The GPU picker follows ggml's device list and CPU runs use most of your cores instead of 2 threads (PR #1001)",
- "Press the recording hotkey again to cancel a slow transcription; nothing is typed or saved (PR #1004)",
- "Wayland fixes: unique RemoteDesktop portal request tokens (PR #996), xdotool for XWayland apps outside IBus (PR #1003), and the first recording keeps focus on GNOME (PR #998)",
- "Flatpak bundles onnxruntime for Silero VAD (PR #1002) and uses the X11 hotkey listener on X11 sessions (PR #997); keyboards with pointer axes like the Logitech K860 work again (PR #978)",
- "Parakeet installs work again (PR #1000), update checks follow the build channel and can be turned off (PR #999), and Slovenian is supported (PR #995)",
- ],
- },
- {
- version: "v0.18.3",
- date: "2026-10-17",
- type: "stable",
- highlights: [
- "\"new line\" and \"new paragraph\" voice commands insert real line breaks, standalone and mid-utterance, with no stray punctuation left behind (PR #958, #962)",
- "Hotkeys work again on GNOME Shell X11: the evdev backend is preferred there over pynput (PR #963)",
- "Quitting no longer collapses multi-layout keyboards; the IBus engine restore is skipped when a real engine is live (PR #963)",
- "Snap, Flatpak, AppImage and .deb/.rpm builds compile pywhispercpp at the portable x86-64 baseline, ending SIGILL crashes on pre-Haswell CPUs (PR #959)",
- "Snap recipe drops the denied `uinput` plug so new revisions clear Store review; Wayland typing uses the RemoteDesktop portal (PR #960)",
- "Transcribe File's modal download dialog releases its grab once TinyDiarize lands, so the transcript's Copy and Save As buttons work (PR #965)",
- "Flatpak remote publish warns loudly when unconfigured instead of skipping silently (PR #961); README gains install-format badges and a Nix section (PR #949)",
- ],
- },
- {
- version: "v0.18.2",
- date: "2026-10-12",
- type: "stable",
- highlights: [
- "Dictation overlay orb pulses and ripples with live microphone level (PR #940)",
- "Nix flake package with NixOS and Home Manager modules (PR #936), plus Vulkan GPU inference for pywhispercpp on Nix (PR #942)",
- "Held keyboards are left ungrabbed at startup, so typing during launch cannot strand a key (PR #941)",
- "Bundled pywhispercpp builds drop -march=native, fixing AppImage and Flatpak crashes on older CPUs (PR #939)",
- "Piped curl | bash install keeps the script on stdin and prompts via /dev/tty (PR #935)",
- "Installer covers cairo headers on openSUSE, Void, Solus and Alpine; evdev monitors remapper virtual keyboards ungrabbed (PR #937, #932)",
- "CI gates the remote curl | bash install path end to end (PR #898)",
- ],
- },
- {
- version: "v0.18.1",
- date: "2026-10-08",
- type: "stable",
- highlights: [
- "Settings > Proxy page for model downloads and update checks behind SOCKS5 or HTTP CONNECT proxies, with optional auth (PR #909, fixes #655)",
- "Opt-in JSONL transcript persistence: a transcript survives restarts and failed text injections instead of being lost (PR #907, fixes #758)",
- "Native .deb and .rpm packages for Debian/Ubuntu and Fedora, x86_64 and aarch64, attached to the GitHub Release (PR #913)",
- "Slimmer tray menu: Start on Login and About now live only in Settings (PR #905, fixes #654)",
- "Speech Model Advanced pickers stage changes until you confirm Download instead of starting a fetch per click (PR #908, fixes #894)",
- "Dictation Pad no longer ghosts away after sitting idle under a Wayland compositor (PR #912, fixes #896)",
- "evdev keyboard discovery stops grabbing Logitech mice, Goodix touchpads, and power buttons as keyboards (PR #902, #917, #918, fixes #900, #914, #915)",
- "KDE Plasma 6 Wayland: KWin VirtualKeyboard detection fixed, so dictated letter case stops scrambling (PR #919, fixes #911)",
- "Text injection ends option parsing before typed text, so a chunk starting with a hyphen no longer truncates dictation (PR #922, fixes #921)",
- "Startup reuses an on-disk same-size whisper.cpp weight instead of re-resolving it (PR #923, fixes #916)",
- "uninstall.sh no longer deletes files in the directory you ran it from (PR #901, fixes #897)",
- "Settings > Advanced Initial Prompt accepts typed input again, and transcript and log saves no longer double the .txt extension (PR #927)",
- "deb declares python3-socks, rpm declares python3-pysocks; snap attach keeps checksums on failure; remote curl | bash install gated end to end (PR #920, #899, #906)",
- ],
- },
- {
- version: "v0.18.0",
- date: "2026-10-02",
- type: "stable",
- highlights: [
- "Dictation Pad: in-app window receives dictation and you copy text out by hand, so Wayland injection quirks cannot touch it (PR #887, fixes #726)",
- "Hotkey suppression: evdev grabs the dictation shortcut and forwards everything else through a uinput clone; the key no longer types into the focused app, and still works when /dev/uinput is write-only (PR #873, #893, fixes #871)",
- "PipeWire capture path with microphone and system-audio sources (PR #889, #883, fixes #751, #760)",
- "RemoteDesktop portal text injection on Wayland, no ydotoold needed (PR #885, fixes #750)",
- "Per-language dictation shortcuts, follow the active keyboard layout while dictating, and recent dictations in the tray menu (PR #880, #837, #487, fixes #805, #821)",
- "File transcription with TinyDiarize per-speaker labels via --transcribe-file and the tray (PR #884, fixes #756)",
- "Opt-in D-Bus activation so compositor global shortcuts and scripts can start dictation (PR #568, fixes #761)",
- "Combined custom dictionary with transcript corrections, postprocessing script hook, bilingual dictation candidates (PR #890, #479, #424)",
- "Floating glowing dictation overlay, lower other audio while dictating, keep recording while an idle model reloads (PR #516, #861, #851)",
- "config.json can pin the text-injection backend (PR #649, fixes #476)",
- "GNOME Wayland: Alt+Shift and Win+Space layout switching keeps working; IBus guard no longer flips GNOME/X11 to a US layout (PR #876, #827, fixes #848)",
- "Shortcut recorder learns unmapped F19/F24 and XF86-aliased F13-F23 (PR #844, fixes #843)",
- "Vosk refuses a model that would exceed available memory instead of tripping the OOM killer (PR #850, fixes #676)",
- "Model downloads cancel stalled fetches; the download dialog shows verifying instead of a stalled 100% (PR #888, #864, fixes #679, #863)",
- "Update checker falls back when GitHub API rate-limits (PR #846, fixes #845)",
- "Settings: scrollable category list, Dictation Tone grayed while sounds are off, Test Dictation artifact and missing transcription fixed (PR #886, #877, #853, fixes #678, #849, #847, #720)",
- "AUR voculinux-bin ships the AppImage with per-arch digests; releases publish a signed self-hosted Flatpak remote; snap-promote workflow gates stable promotion; snap gains hardware-observe (PR #879, #875, #881, #858, fixes #817, #785, #783, #857)",
- "Installer: hash-pinned dependencies and build tools, sourced modules, generated distro package map (PR #856, #862, #872)",
- "Optional verified Orukeet model for Parakeet; VocaGateway runs locally from Settings > Advanced (PR #840, #774)",
- ],
- },
- {
- version: "v0.17.0",
- date: "2026-09-16",
- type: "stable",
- highlights: [
- "Faster Whisper engine: CTranslate2 / INT8 Whisper on CPU, optional extra, installer --engine=faster_whisper (PR #543)",
- "Parakeet TDT 0.6B via sherpa-onnx: default v3-european bundle or v2-english, installer --engine=parakeet (PR #802)",
- "Speech Model simple setup: language + speed/accuracy first; engine/size under Advanced (PR #801)",
- "First run seeds recognition language from keyboard layout / locale (PR #796, #777)",
- "Language picker filters while the list is open (PR #798)",
- "Recommended model button sets size and specialization together and will not ignore a file already on disk (PR #797, #778)",
- "Localized punctuation voice commands for it/fr/de/es/pt/nl/pl/ru (PR #642, #640)",
- "Bare F1–F24 push-to-talk shortcuts (PR #815)",
- "Snap packaging with ydotool and uinput for native Wayland; the Store denied the uinput grant, so later revisions drop the plug and type via the RemoteDesktop portal (PR #519, #823, #822)",
- "Release workflow attaches Voculinux--{x86_64,aarch64}.flatpak (PR #786, #784)",
- "XWayland clipboard paste instead of layout-garbled xdotool type (PR #680, #657)",
- "Layout-aware Ctrl+V paste; ydotool releases Ctrl after a timed-out paste (PR #788, #675, #658)",
- "Read WM_CLASS with xprop so xdotool stops dumping core on KDE Plasma Wayland (PR #807)",
- "Settings freeze on already-downloaded model, English whisper.cpp .en variant, PTT tray redraw, sink-wake audio cues, Parakeet decode survival (PR #790, #795, #780, #809, #804, #803)",
- "English-only models no longer hide other languages; picking Polish or auto-detect switches to the multilingual sibling (PR #826)",
- "Speech Model copy and Unused downloads as a sibling expander of Advanced; VocaWin on the About family grid (PR #826)",
- "install.sh: Faster Whisper is CPU CTranslate2/INT8; GPU backend does not install the CUDA toolkit (PR #826)",
- "HDA analog mics (3-8 channel) open at native layout instead of forced 2ch/48kHz; capture is downmixed to mono (PR #829, fixes #813)",
- "Native GTK installs (AUR / install.sh) follow OS dark/light; skipped when GTK_THEME is set so AppImage and user overrides stay in charge (PR #830, fixes #816)",
- "Lock-derived Flatpak/AUR deps, hash-pinned exports for every engine extra, published-release verification, install.sh distro matrix (PR #819, #828, #791, #810)",
- ],
- },
- {
- version: "v0.16.2",
- date: "2026-09-05",
- type: "stable",
- highlights: [
- "KDE: skip leftover IBus when it is not the session IM so dictation types into Kate, browsers, and terminals (PR #753, fixes #752)",
- "Wayland shortcuts: wtype and ydotool deliver real chords instead of refusing or silently doing nothing (PR #715)",
- "IBus shortcuts: route X11_IBUS through xdotool and WAYLAND_IBUS through wtype/ydotool (PR #716)",
- "Voice command delete that: send real BackSpace key events instead of U+0008 text (PR #714)",
- "Installer: Fedora and Arch need glslc/shaderc packages, not glslang (PR #763, #604)",
- "Nightly: stamp version.py before python -m build so wheel metadata matches the filename (PR #762)",
- "Release integrity: checksums, signatures, and pinned builders for release artifacts (PR #759, epic #701 phase 5)",
- "CI: gate AUR PKGBUILD builds on every PR; test the distros the docs promise and fix docs drift (PR #772, #773)",
- "Site: VocaGateway family card is Beta; README logo, badges, and privacy copy (PR #765, #764)",
- "Deps: bump the github-actions group (PR #766)",
- "Snap 0.16.2 edge (rev 7) has no uinput plug: snap connect voculinux:uinput fails, and dictation only reaches XWayland apps. Later revisions ship the RemoteDesktop portal instead; the Store denied the uinput grant (PR #823)",
- ],
- },
- {
- version: "v0.16.1",
- date: "2026-08-30",
- type: "stable",
- highlights: [
- "Startup uses the engine's own model size instead of a leftover generic key; the model is saved only after it loaded (PR #684, #685, fixes #681)",
- "Unused leftover-model list shows every row; one ConfigManager so Settings writes stick (PR #686, #691, fixes #683, #689)",
- "Tray stays idle after leftover transcription on toggle stop, and the missing-model notification can download the recommended model (PR #741, #687)",
- "Terminals get Ctrl+Shift+V paste; GNOME XWayland layout is restored after scoped IBus inject (PR #734, #742)",
- "Installer requires Python 3.11, verifies model downloads, and no longer invents GPUs (PR #713, #736)",
- "AppImage built against a glibc floor that boots on Debian 12 through current Fedora (PR #743, #744)",
- "AUR: build against Arch extra setuptools 84, and skip context_params on AUR pywhispercpp 1.4 so the app starts",
- "Settings dropdowns share a width; About is quieter with family platform marks (PR #754)",
- ],
- },
- {
- version: "v0.16.0",
- date: "2026-08-23",
- type: "stable",
- highlights: [
- "In-app update checker (stable/nightly) plus tray Update Available when GitHub has a newer release (PR #631, #645)",
- "New installs default to hold Right Alt push-to-talk; existing configs keep their shortcut (PR #648)",
- "Searchable language list and delete unused downloaded speech models (PR #672, #671)",
- "Family dictation tone picker in Settings → Audio: Lift, Flick, Ember, Step, Voca, Soft, Chirp, Scale, Drop, Glass, Off, plus Preview. New installs default to Voca. Catalog tones are the family preview WAVs, not synthesized files (PR #707, #708)",
- "License migrated to AGPL-3.0 (PR #660)",
- "App icon, tray states, and site favicons use the shared Voca family mic instead of the old Linux rounded-rect (PR #704)",
- "Installer hardened with Justfile and uv lockfiles; distro python3-gi required (no pip sdist of PyGObject). Epic #701 remains open (PR #700, #705, #706)",
- "Test Dictation no longer reports no speech when recognition never started (PR #702)",
- "IBus/X11 reliability: restorable scoped injection, engine restore after teardown, XKB layout restore (PR #623, #643, #665)",
- "Audio, clipboard, and AppImage/GPU packaging fixes (PR #629, #673, #588, #646, #674, #637)",
- "Settings About page groups this app, the VocaHQ family, and talk-to-us links (PR #718)",
- "voculinux.com restyled to the Voca family workbench; Discord and X links point at VocaHQ (PR #728, #729, #722, #717)",
- ],
- },
- {
- version: "v0.15.0",
- date: "2026-07-28",
- type: "stable",
- highlights: [
- "Searchable sidebar settings with live search replace the seven-tab notebook (PR #601)",
- "AppImage packages for x86_64 and aarch64 on GitHub Releases (PR #573, #602)",
- "Expanded speech-language catalog (~33 languages + Auto-detect), including Hungarian; VOSK only lists languages with official models (PR #616, fixes #565)",
- "Settings: dictation status / mic level / Test Dictation / Close live in the sidebar footer (PR #618)",
- "Settings: Custom Shortcut Record/Set controls show again (PR #619)",
- "Languages: English (India) maps to Whisper code en for whisper.cpp / Whisper / remote API (PR #617)",
- "Auto-capitalize after sentence punctuation; trailing space so the next utterance does not glue on (PR #554, #608)",
- "Auto-pause competing apps and idle model keep-alive unload for battery/GPU headroom (PR #592, closes #445, #591)",
- "Vulkan: auto-select discrete GPU and pick a device in Advanced settings (PR #590, closes #589)",
- "Wayland: use IBus on previously unbridged compositors when ibus-wayland is running (PR #614, closes #607)",
- "IBus: keep engine teardown correct when parent destroy fails (PR #613, fixes #606)",
- "CLI: voculinux --version (PR #563, closes #555)",
- "Settings info notices flattened; Bluetooth mic heap-corruption fix; KDE unbridged-IBus skip when ibus-wayland is absent; xdotool focus preserve; installer/AUR fixes (PR #615, #599, #577, #564, #583, #569, #597, #579, #586)",
- "Marketing site redesign; languages page per-engine badges; robots.txt indexing fix (PR #582, #616, #610)",
- ],
- },
- {
- version: "v0.14.2",
- date: "2026-07-17",
- type: "stable",
- highlights: [
- "IBus: restore engine process launch after Flatpak XDG path import so the engine no longer dies with ImportError and falls back to ydotool/clipboard paste (PR #534)",
- "IBus: wait for FocusIn before commit on scoped injection so the first dictation of a session is not dropped on GNOME Wayland (PR #533, fixes #523)",
- "Settings UI: notebook tabs scroll so the dialog fits the monitor; wheel events from unfocused combos/spins reach the tab scroller (PR #538, #541)",
- ],
- },
- {
- version: "v0.14.1",
- date: "2026-07-17",
- type: "stable",
- highlights: [
- "Flatpak packaging for universal distribution: whisper.cpp engine, XDG sandbox paths, global hotkeys via evdev, Wayland text injection via wl-copy + ydotool (PR #484, closes #167)",
- "AUR package and CI publish path for Arch Linux (PR #518)",
- "Layout-aware combo keys so custom shortcuts work on non-US keyboard layouts (PR #514)",
- "Installer fix for sg not found on Ubuntu 26.04 / Debian 13 (PR #524)",
- "Text injection treats XIM none as unset (PR #512)",
- "Website screenshot gallery refresh and Dependabot npm alert fixes (PR #521, #515)",
- ],
- },
- {
- version: "v0.14.0-beta",
- date: "2026-07-13",
- type: "beta",
- highlights: [
- "Configurable modifier+key hotkeys: set custom shortcuts with any combination of Ctrl, Alt, Shift, and Super plus a letter/number key, e.g. Alt+R or Ctrl+Shift+V (PR #493)",
- "Remote API engine now supports FunASR/SenseVoice models via OpenAI-compatible endpoints; SenseVoice metadata labels are stripped before text injection (PR #468)",
- "GNOME Wayland IBus text injection restored when only a bare xkb engine is configured; engine restore fallback now picks the correct IM engine (PR #506, #500)",
- "KDE Plasma Wayland IBus text-injection path restored after recent compositor-detection regressions (PR #502)",
- "Wayland text injection now waits for held modifiers to release before typing, preventing accidental shortcut triggers and garbled output (PR #494)",
- "Shortcuts UI keeps preset and custom shortcut selection exclusive: selecting a preset clears the custom field, and setting a custom combo selects the Custom Shortcut preset (PR #509)",
- "whisper.cpp no longer defaults to all CPU cores on hybrid processors, improving UI responsiveness and battery life (PR #492)",
- "Fixed a crash on recording start when the selected audio device index no longer matches the current system enumeration (PR #499)",
- "Installer includes xsel as a fallback for the Wayland clipboard path when xclip is unavailable (PR #496)",
- "Removed an outdated long comment about whisper.cpp default thread counts (PR #505)",
- ],
- },
- {
- version: "v0.13.0-beta",
- date: "2026-06-30",
- type: "beta",
- highlights: [
- "Guided whisper.cpp model selection: pick a size plus a specialization (English-only, quantized Q5/Q8, or Large v3 Turbo) through split Model Size and Specialization dropdowns with in-app guidance; the --model flag also accepts exact IDs like medium.en-q5_0 and large-v3-turbo (PR #465)",
- "Dictation now keeps a space between segments spoken with a pause in between, so words no longer run together after a silence (PR #464)",
- "Keyboard shortcuts now work on keyboards hotplugged after Voculinux starts, with the evdev backend rescanning for new devices and recovering from disconnects (PR #467)",
- "Voculinux now detects KDE Plasma Wayland sessions and points you to enable IBus Wayland for reliable text injection, surfaced during install and when wtype injection fails (PR #466)",
- "Wayland: fixed garbled text on non-US keyboard layouts (AZERTY/QWERTZ/Dvorak) and a clipboard-copy hang; ydotool now pastes through the clipboard, which is layout-independent (PR #480)",
- "Wayland: use wtype/ydotool instead of IBus on compositors that don't bridge it to native apps like COSMIC, Sway, and Hyprland, fixing silent text drops (PR #486)",
- "Wayland/IBus: require a real IM engine before using IBus, so a bare xkb layout no longer causes silent text drops on GNOME/Mutter and other compositors (#478)",
- "Wayland: keep the keyboard layout intact by not running setxkbmap, which was flipping XWayland apps to us after dictation (#474)",
- "Faster ydotool text injection via an explicit --key-delay (PR #488)",
- "Settings dialog height capped on high-resolution displays (PR #465)",
- "Refreshed website docs with new feature pages for Remote API, Silero VAD, advanced whisper.cpp settings, and desktop reliability, plus responsive layout polish (PR #470)",
- ],
- },
- {
- version: "v0.12.0-beta",
- date: "2026-06-07",
- type: "beta",
- highlights: [
- "Remote API speech recognition engine with installation and configuration support (PR #335)",
- "Silero VAD drops silence-only buffers for cleaner dictation when ONNX Runtime support is available (PR #447)",
- "Thread safety hardening for Remote API, IBus, and text injection paths (PR #452)",
- "IBus preserves user engines for dead keys and captures the current engine during scoped activation (PR #457, #458)",
- "Remote Server settings now respect the Advanced toggle and the settings dialog fits lower-resolution screens (PR #454, #456)",
- "CUDA diagnostics now include auto-remediation and behavioral tests (PR #451)",
- "Corrected whisper.cpp and VOSK model download size metadata (PR #453)",
- "Startup now works without the pynput backend (PR #448)",
- "Remote API developer test server documentation (PR #455)",
- "Website speech demo browser support clarification (PR #449) and GitHub Sponsors funding configuration",
- ],
- },
- {
- version: "v0.11.0-beta",
- date: "2026-05-30",
- type: "beta",
- highlights: [
- "New Advanced Settings tab with whisper.cpp anti-hallucination parameters - temperature, no_speech_threshold, max segment length, and more (PR #415)",
- "IBus engine readiness probe at startup with hardened retries (PR #391)",
- "IBus runtime failure recovery without app restart (PR #411)",
- "IBus engine instance destruction handled on keyboard layout switch (fixes #388, closes #389)",
- "Preserve final speech on stop - no more truncated transcriptions (fixes #401)",
- "Play stop sound immediately on release and after audio thread joins (PR #426, #436)",
- "Repair pywhispercpp library loading in installer (PR #433)",
- "Reduce whisper.cpp CPU threads and ensure GPU backend builds in dev mode (PR #439)",
- "Correct openSUSE Tumbleweed dependencies with fallback handling (PR #418, #420)",
- "Harden Debian compatibility layer in installer (PR #437)",
- "Add Python 3.14 support and bump lxml>=6.1.0 (fixes #404)",
- "Validate pyproject.toml/setup.py content before entering local repo mode (fixes #396)",
- "Reuse existing whispercpp builds during install (PR #421)",
- "Refresh ldconfig after openSUSE typelib install, clarify python3XY placeholder convention (PR #438)",
- "Clean up runtime log noise and cache hardware detection",
- "Test coverage: recognition internals, IBus edge cases, CI notification suppression (PR #410, #414)",
- "Clarify PyPI installation requirements (PR #423)",
- "Dependency bumps: Next.js security updates (PR #399, #429), PostCSS",
- ],
- },
- {
- version: "v0.10.2-beta",
- date: "2026-04-08",
- type: "beta",
- highlights: [
- "Handle non-ASCII characters (á, é, ñ, etc.) with ydotool via clipboard paste fallback (fixes #362, PR #376)",
- "Detect IBus on Wayland without legacy env vars and fix text injection (PR #381)",
- "Start IBus engine process before checking registration to fix startup on some systems (fixes #360, PR #361)",
- "Add missing dependencies for Pop!_OS and Ubuntu 24.04+ including cmake, libcairo2-dev, libgirepository (PR #379)",
- "Systematic code quality refactor across 20 dimensions (PR #377)",
- "Clarify missing GNOME AppIndicator support on Debian (PR #385)",
- "Redesigned OG image for voculinux.com - cleaner, professional, text-based layout (PR #392)",
- "Test coverage improvements: mock Notify module, tray degraded-startup, IBus socket-readiness branches (PR #384, #386, #390)",
- ],
- },
- {
- version: "v0.10.1-beta",
- date: "2026-03-30",
- type: "beta",
- highlights: [
- "Bundled package resources to prevent missing system tray icons (fixes #349, PR #354)",
- "Stopped recognition before engine switches to prevent segfaults (fixes #350, PR #355)",
- "Added a dedicated Close button in Settings for better WM compatibility (fixes #323, PR #356)",
- "Preserved XKB layout state during Voculinux IBus activation (fixes #292, PR #343)",
- "Auto-recover speech recognition after system suspend/resume via new D-Bus handler (fixes #367, PR #369)",
- "Restart keyboard shortcut backend after resume to keep shortcuts working (PR #371)",
- "Delayed keyboard restart to allow USB re-enumeration after resume (PR #372)",
- "Fixed premature transcription during push-to-talk silence (fixes #358, PR #359)",
- "Disabled copy-to-clipboard by default in Settings (PR #370)",
- "Maintenance updates: npm/yarn dependency refresh and brace-expansion dev dependency bump (PR #346, #357)",
- ],
- },
- {
- version: "v0.10.0-beta",
- date: "2026-03-25",
- type: "beta",
- highlights: [
- "Generalized keyboard modifier alias matching across layouts for more reliable shortcuts",
- "Audio channel probing now validates device-supported sample rates before selection",
- "evdev now handles SYN_DROPPED to prevent stale modifier state",
- "IBus engine activation now uses register_component for stronger text-injection startup",
- "Settings dialog forces window decorations to prevent missing-titlebar behavior",
- "Tray icon refresh now uses icon names for better AppIndicator compatibility",
- "Coverage increased to 80%+ with additional IBus launch/main-entry tests",
- "Installer and CI polish: latest-tag fallback via GitHub API, Node 24 deploy, and path-filtered workflows",
- ],
- },
- {
- version: "v0.9.0-beta",
- date: "2026-03-14",
- type: "beta",
- highlights: [
- "Left/right modifier key distinction - choose Left Ctrl vs Right Ctrl for your shortcut",
- "Sound effects toggle - enable or disable audio feedback from Settings",
- "Wayland clipboard fallback - auto-copies text when virtual keyboard injection isn't available",
- "Display availability check - graceful error when running in headless environments",
- "Fixed unwanted leading space at the start of each new transcription session",
- "Fixed shortcut mode (toggle/push-to-talk) not applying on startup",
- "Improved Debian/pipx installation guidance and cross-distro error messages",
- "Grouped shortcut selector UI - shortcuts organised by Either/Left/Right side",
- ],
- },
- {
- version: "v0.8.0-beta",
- date: "2026-03-01",
- type: "beta",
- highlights: [
- "Push-to-talk shortcut mode (hold to speak, release to stop)",
- "Optional voice commands with VOSK auto-enable behavior",
- "Improved shortcut mode switching and callback reliability",
- "IBus active-method detection before text injection",
- "Audio hardware compatibility fixes (sample rate and channel count)",
- "Fedora startup dialog stability fix",
- "Web SEO expansion and homepage visual refresh",
- ],
- },
- {
- version: "v0.7.0-beta",
- date: "2026-02-22",
- type: "beta",
- highlights: [
- "Autostart on login support (XDG autostart)",
- "Tabbed settings dialog (Speech Engine, Recognition, Text Injection, Audio Feedback, General)",
- "Intel GPU compatibility detection - auto fallback to CPU for incompatible GPUs",
- "Single instance prevention - prevents multiple Voculinux running",
- "Evdev device management - removes disconnected devices to prevent CPU spin",
- "Improved GPU detection - avoids false positives on systems without dev libraries",
- "IBus fallback - skip setup when daemon not running",
- "Fedora dnf check-update fix",
- "Web SEO - 7 new optimized pages",
- ],
- },
- {
- version: "v0.6.3-beta",
- date: "2026-02-19",
- type: "beta",
- highlights: [
- "Fixed installer default tag pointing to correct version",
- "Added missing psutil dependency for fresh installs",
- "Process check and interactive prompts in install/uninstall",
- "Removed leading space from first speech transcription",
- ],
- },
- {
- version: "v0.6.2-beta",
- date: "2026-02-18",
- type: "beta",
- highlights: [
- "Interactive backend selection (GPU/CPU)",
- "Enhanced welcome message",
- "Simplified install commands",
- "Better GPU support and Vulkan detection",
- ],
- },
- {
- version: "v0.6.0-beta",
- date: "2026-02-12",
- type: "beta",
- highlights: [
- "whisper.cpp as default engine",
- "Multi-language support with auto-detection",
- "System tray indicator",
- "Full Wayland support",
- "IBus text injection engine",
- ],
- },
- {
- version: "v0.5.0-beta",
- date: "2026-02-06",
- type: "beta",
- highlights: [
- "First beta release",
- "Stable core functionality",
- "Multiple speech engine support",
- "Improved text injection",
- ],
- },
- {
- version: "v0.4.1-alpha",
- date: "2026-01-29",
- type: "alpha",
- highlights: [
- "Language selector UI",
- "App drawer launch fix",
- "Better commit handling",
- "Improved update mechanism",
- ],
- },
- {
- version: "v0.4.0-alpha",
- date: "2026-01-29",
- type: "alpha",
- highlights: [
- "Multi-language support (French, German, Russian)",
- "Debian 13+ compatibility",
- "Python 3.12+ support",
- "Tag-based version selection in installer",
- ],
- },
- {
- version: "v0.3.0-alpha",
- date: "2026-01-21",
- type: "alpha",
- highlights: [
- "Initial public alpha",
- "Basic speech recognition",
- "X11 text injection",
- "VOSK engine support",
- ],
- },
-];
-
-const getTypeStyles = (type: string) => {
- switch (type) {
- case "stable":
- return {
- badge:
- "bg-primary/10 text-primary",
- label: "Stable",
- };
- case "beta":
- return {
- badge:
- "bg-primary/10 text-primary",
- label: "Beta",
- };
- case "alpha":
- return {
- badge:
- "bg-muted text-muted-foreground",
- label: "Alpha",
- };
- default:
- return {
- badge: "bg-muted text-muted-foreground",
- label: type,
- };
- }
-};
+import { ChannelNotice } from "@/components/channel-notice";
+import { buildPageMetadata, SOURCE_REPO_URL } from "@/lib/seo";
export const metadata: Metadata = buildPageMetadata({
- title: "Changelog and Release Notes",
+ title: "Changelog: Voculinux Release Notes",
description:
- "Track Voculinux release history and version updates. See what's new in each version of our Linux voice dictation software.",
+ "Voculinux release notes are on the fork's releases page. The upstream changelog is not published for Voculinux.",
path: "/changelog",
- keywords: [
- "voculinux changelog",
- "voculinux release notes",
- "voice dictation linux updates",
- "speech to text linux versions",
- ],
});
-export default function ChangelogPage() {
- const articleJsonLd = {
- "@context": "https://schema.org",
- "@type": "Article",
- headline: "Voculinux Changelog - Release History",
- description:
- "Complete release history for Voculinux, the offline voice dictation software for Linux.",
- dateModified: "2026-10-27",
- author: {
- "@type": "Person",
- name: "Jatin K Malik",
- url: "https://github.com/jatinkrmalik",
- },
- publisher: {
- "@type": "Organization",
- name: "Voculinux",
- logo: {
- "@type": "ImageObject",
- url: absoluteUrl("/voculinux.png"),
- },
- },
- mainEntityOfPage: absoluteUrl("/changelog"),
- };
-
+export default function ChangelogNoticePage() {
return (
-
-
-
-
-
-
- Release History
-
-
- Voculinux Changelog
-
-
- Track every release and see how Voculinux has evolved. From initial
- alpha to stable releases, follow the journey of Linux voice dictation.
-
-
- Fork status: the releases below are the upstream Vocalinux history
- this fork is ported from. Voculinux fork releases are not published
- yet, so each release link goes to upstream GitHub Releases.
-
+
);
}
diff --git a/web/src/app/compare/page.tsx b/web/src/app/compare/page.tsx
index b567436..d55e33c 100644
--- a/web/src/app/compare/page.tsx
+++ b/web/src/app/compare/page.tsx
@@ -42,7 +42,7 @@ const engineTable = [
speed: "Fast CPU inference (CTranslate2 / INT8)",
hardware: "CPU",
accuracy: "High (Whisper-class)",
- footprint: "Optional extra; not in AppImage/Flatpak/Snap",
+ footprint: "Optional extra; not in the Void package",
bestFor: "CPU-only machines that want Whisper quality without PyTorch",
icon: Sparkles,
iconColor: "text-primary",
@@ -111,8 +111,8 @@ export default function CompareEnginesPage() {
dateModified: "2026-06-11",
author: {
"@type": "Person",
- name: "Jatin K Malik",
- url: "https://github.com/jatinkrmalik",
+ name: "Xavier Karma",
+ url: "https://bongbetic.com",
},
publisher: {
"@type": "Organization",
@@ -279,7 +279,7 @@ export default function CompareEnginesPage() {
When to pick Faster Whisper
Choose Faster Whisper for Whisper-class accuracy on CPU without the
- PyTorch stack. Optional extra; not bundled in AppImage, Flatpak, or Snap.
+ PyTorch stack. Optional extra; not in the Void package.
@@ -296,8 +296,8 @@ export default function CompareEnginesPage() {
Choose Parakeet for English or European dictation on CPU via
sherpa-onnx. It uses a bundled language set (v3-european default)
- instead of the Whisper catalog picker. Optional extra; not in
- AppImage, Flatpak, or Snap.
+ instead of the Whisper catalog picker. Optional extra; not in the
+ Void package.
@@ -325,26 +325,12 @@ export default function CompareEnginesPage() {
- Install by distro:
+ Install on Void Linux, from the signed xbps repository:{" "}
- Ubuntu
-
- ,
-
- Fedora
-
- ,
-
- Arch Linux
+ install guide
.
diff --git a/web/src/app/custom-dictionary/page.tsx b/web/src/app/custom-dictionary/page.tsx
index ee460b6..fdfc512 100644
--- a/web/src/app/custom-dictionary/page.tsx
+++ b/web/src/app/custom-dictionary/page.tsx
@@ -96,8 +96,8 @@ export default function CustomDictionaryPage() {
dateModified: "2026-11-01",
author: {
"@type": "Person",
- name: "Jatin K Malik",
- url: "https://github.com/jatinkrmalik",
+ name: "Xavier Karma",
+ url: "https://bongbetic.com",
},
publisher: {
"@type": "Organization",
@@ -349,7 +349,7 @@ Okonkwo`}
],
[
"Environment",
- "Inherits Voculinux's environment. When Voculinux runs from the AppImage, the bundle's library paths are removed first.",
+ "Inherits Voculinux's environment, with any bundled library paths removed first.",
],
["Timeout", "10 seconds."],
[
diff --git a/web/src/app/desktop-reliability/page.tsx b/web/src/app/desktop-reliability/page.tsx
index fa750ae..59e2815 100644
--- a/web/src/app/desktop-reliability/page.tsx
+++ b/web/src/app/desktop-reliability/page.tsx
@@ -12,7 +12,11 @@ import {
Wrench,
} from "lucide-react";
import { SeoSubpageShell } from "@/components/seo-subpage-shell";
-import { absoluteUrl, buildPageMetadata } from "@/lib/seo";
+import {
+ absoluteUrl,
+ buildPageMetadata,
+ SOURCE_REPO_URL,
+} from "@/lib/seo";
const reliabilityFeatures = [
{
@@ -62,7 +66,7 @@ const releaseMap = [
{
version: "v0.17.0",
highlights:
- "Faster Whisper and Parakeet engines, Speech Model simple setup, first-run system language, Snap ydotool/uinput, workflow Flatpak bundles, XWayland clipboard paste, xprop WM_CLASS instead of crashing xdotool, HDA analog mics at native layout, native GTK OS dark/light, English-only models no longer trap other languages, and PTT tray/audio cue fixes.",
+ "Faster Whisper and Parakeet engines, Speech Model simple setup, first-run system language, ydotool/uinput packaging fixes, workflow bundles, XWayland clipboard paste, xprop WM_CLASS instead of crashing xdotool, HDA analog mics at native layout, native GTK OS dark/light, English-only models no longer trap other languages, and PTT tray/audio cue fixes.",
},
{
version: "v0.16.2",
@@ -72,12 +76,12 @@ const releaseMap = [
{
version: "v0.16.1",
highlights:
- "Per-engine model at startup, leftover tray idle after toggle stop, Ctrl+Shift+V paste in terminals, GNOME XWayland layout after scoped IBus inject, Python 3.11 installer floor with verified downloads, and AppImage glibc that boots on Debian 12.",
+ "Per-engine model at startup, leftover tray idle after toggle stop, Ctrl+Shift+V paste in terminals, GNOME XWayland layout after scoped IBus inject, Python 3.11 installer floor with verified downloads, and a glibc floor that boots on Debian 12.",
},
{
version: "v0.16.0",
highlights:
- "Update checker with tray notifications, Right Alt PTT default for new installs, searchable language list, unused model deletion, Test Dictation missing-model message, IBus/XKB restore fixes, safer audio capture, clipboard restore, installer python3-gi requirement, and AppImage/GPU packaging hardening.",
+ "Update checker with tray notifications, Right Alt PTT default for new installs, searchable language list, unused model deletion, Test Dictation missing-model message, IBus/XKB restore fixes, safer audio capture, clipboard restore, installer python3-gi requirement, and packaging and GPU hardening.",
},
{
version: "v0.15.0",
@@ -129,8 +133,8 @@ export default function DesktopReliabilityPage() {
dateModified: "2026-10-02",
author: {
"@type": "Person",
- name: "Jatin K Malik",
- url: "https://github.com/jatinkrmalik",
+ name: "Xavier Karma",
+ url: "https://bongbetic.com",
},
publisher: {
"@type": "Organization",
@@ -219,7 +223,6 @@ export default function DesktopReliabilityPage() {
{ href: "/hyprland-sway/", label: "Hyprland, sway, and i3" },
{ href: "/faster-whisper/", label: "Faster Whisper engine" },
{ href: "/parakeet/", label: "Parakeet engine" },
- { href: "/flatpak/", label: "VocaHQ Flatpak remote" },
].map((guide) => (
In v0.18.4 the switch moved to Settings → Dictation, next to the Open
Dictation Pad button. On older 0.18 releases, update first; the{" "}
- changelog lists what changed in each
- patch.
+
+ release notes
+ {" "}
+ list what changed in each patch.
diff --git a/web/src/app/faq/page.tsx b/web/src/app/faq/page.tsx
index 84a1614..ee87c95 100644
--- a/web/src/app/faq/page.tsx
+++ b/web/src/app/faq/page.tsx
@@ -22,11 +22,11 @@ const faqCategories = [
questions: [
{
q: "How do I install Voculinux?",
- a: "Run the one-liner installer: curl -fsSL https://raw.githubusercontent.com/VocaHQ/vocalinux/main/install.sh | bash. Fork status: this fetches the upstream install script, so it installs Vocalinux (upstream), not Voculinux; fork release artefacts are not published yet. The installer handles dependencies and configuration. You can also download an AppImage from upstream GitHub Releases if you prefer a no-root portable binary (host xdotool/wtype/ydotool still required for text injection), or grab a .deb, .rpm, Snap, or Flatpak package for your distro.",
+ a: "Voculinux is published for Void Linux (glibc, x86_64) as a signed xbps repository. Trust the repository key, register the repository, then run xbps-install -S voculinux as root; the install guide has the exact commands. This is a third-party repository published by this project, not by Void Linux upstream. Other channels are not published for Voculinux (Void only).",
},
{
q: "Which Linux distributions are supported?",
- a: "Voculinux works on Ubuntu 24.04+, Debian 12+, Fedora 39+, Arch Linux, Manjaro, and most other Linux distributions. See our install guides for distro-specific instructions.",
+ a: "The published package is for Void Linux (glibc, x86_64) only. Voculinux runs on X11 and Wayland desktops. See the Void install guide for the setup steps.",
},
{
q: "What are the system requirements?",
@@ -45,7 +45,7 @@ const faqCategories = [
},
{
q: "Does Voculinux send any data to external servers?",
- a: "Local engines do not send voice data externally. Remote API mode sends audio only to the transcription server URL you configure. The app also uses the network for model downloads and for its update check against GitHub Releases; neither carries your audio or transcripts.",
+ a: "Local engines do not send voice data externally. Remote API mode sends audio only to the transcription server URL you configure. The app also uses the network for model downloads and for its update check against the Voculinux release host; neither carries your audio or transcripts.",
},
{
q: "Is my voice data stored anywhere?",
diff --git a/web/src/app/faster-whisper/page.tsx b/web/src/app/faster-whisper/page.tsx
index 9f8c448..1dd8edb 100644
--- a/web/src/app/faster-whisper/page.tsx
+++ b/web/src/app/faster-whisper/page.tsx
@@ -12,15 +12,10 @@ import {
import { SeoSubpageShell } from "@/components/seo-subpage-shell";
import { absoluteUrl, buildPageMetadata } from "@/lib/seo";
-const installCommands = [
- "curl -fsSL https://raw.githubusercontent.com/VocaHQ/vocalinux/main/install.sh -o /tmp/vl.sh",
- "bash /tmp/vl.sh --auto --engine=faster_whisper",
-];
-
const setupSteps = [
{
title: "Install the Faster Whisper engine",
- text: "Faster Whisper is an optional extra. Run the installer and choose Faster-Whisper in the engine menu, or pass --engine=faster_whisper. If the faster-whisper package fails to install, the installer falls back to whisper.cpp and says so.",
+ text: "Faster Whisper is an optional extra and is not in the Void package. Make faster-whisper importable from your own Python environment, as the Void install guide describes. Voculinux lists Faster Whisper in Settings once its libraries can be imported.",
},
{
title: "Open Settings → Speech Model",
@@ -75,42 +70,25 @@ const sizes = [
const packages = [
{
- name: "install.sh / source install",
+ name: "Void package (voculinux)",
+ included: false,
+ note: "Ships whisper.cpp only; add faster-whisper from your own Python environment",
+ },
+ {
+ name: "Source checkout (install.sh)",
included: true,
note: "Menu option or --engine=faster_whisper",
},
- {
- name: "AUR (voculinux)",
- included: true,
- note: "Listed as an optional dependency: python-faster-whisper",
- },
- {
- name: "AppImage (and AUR voculinux-bin)",
- included: false,
- note: "Ships whisper.cpp only",
- },
- { name: "Flatpak", included: false, note: "Ships whisper.cpp only" },
- { name: "Snap", included: false, note: "Ships whisper.cpp only" },
- {
- name: ".deb / .rpm",
- included: false,
- note: "Thin packages; whisper.cpp on CPU",
- },
- {
- name: "Nix flake",
- included: false,
- note: "faster_whisper extra is not packaged",
- },
];
const choices = [
{
engine: "whisper.cpp",
- pick: "The default. Ships in every package, uses a Vulkan GPU on AMD, Intel and NVIDIA, and offers quantized and English-only variants. Start here.",
+ pick: "The default. Ships in the Void package, uses a Vulkan GPU on AMD, Intel and NVIDIA, and offers quantized and English-only variants. Start here.",
},
{
engine: "Faster Whisper",
- pick: "You installed with install.sh, from source or from the AUR and want a Whisper model on a CPU-only machine, running through CTranslate2 instead of whisper.cpp.",
+ pick: "You have faster-whisper available in your Python environment and want a Whisper model on a CPU-only machine, running through CTranslate2 instead of whisper.cpp.",
},
{
engine: "Whisper (OpenAI)",
@@ -141,12 +119,12 @@ const faqs = [
{
question: "Does audio leave my machine?",
answer:
- "No. Faster Whisper is a local engine. After the model download, recognition runs on your machine. Only the Remote API engine and VocaGateway send audio to an endpoint you configure.",
+ "No. Faster Whisper is a local engine. After the model download, recognition runs on your machine. Only the Remote API engine sends audio, and only to an endpoint you configure.",
},
{
question: "Why is Faster Whisper not in my Engine list?",
answer:
- "Settings lists only engines whose libraries are installed. The AppImage, Flatpak, Snap, .deb and .rpm packages do not include faster-whisper. Re-run the installer with --engine=faster_whisper, or on Arch install python-faster-whisper.",
+ "Settings lists only engines whose libraries are installed. The Void package does not include faster-whisper. Install faster-whisper into your own Python environment, and Settings lists it once the libraries import.",
},
];
@@ -177,8 +155,8 @@ export default function FasterWhisperPage() {
dateModified: "2026-11-01",
author: {
"@type": "Person",
- name: "Jatin K Malik",
- url: "https://github.com/jatinkrmalik",
+ name: "Xavier Karma",
+ url: "https://bongbetic.com",
},
publisher: {
"@type": "Organization",
@@ -298,20 +276,10 @@ export default function FasterWhisperPage() {
- Fork status: these commands fetch the upstream install script, so they
- install Vocalinux (upstream), not Voculinux. Fork release artefacts
- are not published yet.
+ Faster Whisper is not in the Void package. Add faster-whisper from your
+ own Python environment, then select it. The Void install guide lists
+ the optional engines and where they come from.
- Install Voculinux with the Faster Whisper engine, or keep whisper.cpp
- and switch later from Settings → Speech Model.
+ Install Voculinux from the Void repository and keep whisper.cpp, or
+ add faster-whisper to your Python environment and switch later from
+ Settings → Speech Model.
- Voculinux publishes a signed, self-hosted Flatpak remote called{" "}
- vocahq on every stable release. It is{" "}
- not on Flathub: the app comes from VocaHQ, and only
- the GNOME runtime comes from Flathub. Install once, and{" "}
- flatpak update picks up each new release.
-
-
-
-
-
- Who the Flatpak is for
-
-
- Pick the Flatpak if your distribution already uses Flatpak, if you run
- an immutable or non-standard layout, or if you want updates handled by
- the same tool as your other desktop apps. It runs on x86_64 and
- aarch64, and it ships the default whisper.cpp engine with Vulkan GPU
- support.
-
-
- Pick the install script instead if you
- want Faster Whisper, Parakeet, OpenAI Whisper or VOSK, or the local
- VocaGateway launcher. Those are not in the Flatpak.
-
-
-
-
-
-
- Install from the VocaHQ remote
-
-
- Fork status: the fork Flatpak remote below is not published yet —
- these commands resolve once the first fork release lands. The install
- script installs upstream Vocalinux today.
-
-
-
-
1. {installSteps[0].name}
-
- One command. The .flatpakref adds the{" "}
- vocahq remote and resolves the GNOME runtime (
- org.gnome.Platform//50) through Flathub, so no
- separate Flathub setup is needed.
-
- {FLATPAKREF_COMMAND}
-
-
-
2. {installSteps[1].name}
-
- If you prefer explicit remotes, add flathub, add vocahq, then
- install com.voculinux.Voculinux from vocahq:
-
- {MANUAL_COMMANDS}
-
-
-
3. {installSteps[2].name}
-
- Launch Voculinux from your app menu, or run:
-
- {RUN_COMMAND}
-
-
-
4. {installSteps[3].name}
-
- Pick a model in Settings → Speech Model. Since v0.18.4 Voculinux
- shows the download size and asks before downloading anything.
- After that one download, the whisper.cpp engine transcribes on
- your machine. Then hold Right Alt and speak.
-
-
-
-
-
-
-
-
- Updates
-
-
- Every stable v* tag is imported into the remote, signed
- with the VocaHQ GPG key and published with static deltas, so an update
- downloads only what changed:
-
- flatpak update
-
-
- Alpha, beta and rc tags never reach the remote. The only Flatpak for
- a prerelease is the .flatpak bundle on GitHub Releases.
-
-
- Release bundles (
- Voculinux-<version>-x86_64.flatpak or{" "}
- -aarch64.flatpak) do not auto-update. Switch to the
- remote if you installed one.
-
-
- The in-app update checker only tells you a release exists; it never
- installs anything.
-
-
-
- If an update fails signature verification
-
-
- After a signing-key rotation, existing installs must import the new
- public key. Re-running remote-add does not replace it.
- The documented fix:
-
- The sandbox cannot reach the host podman or docker socket
-
-
-
-
-
-
- Config and models live under{" "}
- ~/.var/app/com.voculinux.Voculinux/, not{" "}
- ~/.config/voculinux.
-
-
-
-
-
-
- Sandbox permissions and Wayland
-
-
- The manifest asks for the microphone (--socket=pulseaudio
- ), the GPU (--device=dri), network for model downloads,
- the Wayland and X11 sockets, IBus and the tray watcher on D-Bus, and{" "}
- --device=all for keyboard devices and{" "}
- /dev/uinput. Flatpak has no narrower flag for uinput.
-
-
Hotkeys
-
-
- Native X11: since v0.18.4 the Flatpak uses the X11 listener, so the
- hotkey needs no device access. GNOME on X11 is the exception and
- still needs /dev/input.
-
-
- Wayland: the built-in hotkey reads /dev/input. If you
- tighten permissions, grant --device=input on Flatpak
- 1.15.6 or newer, or --device=all on older versions.
-
-
- No device access at all: enable Settings → Shortcuts → External
- Activation (Desktop Shortcut) and bind a desktop shortcut to the
- D-Bus Toggle command below. Desktop shortcuts toggle dictation; they
- cannot do push-to-talk.
-
-
- {DBUS_TOGGLE_COMMAND}
-
- To drop device access but keep the GPU for whisper.cpp:
-
- {OVERRIDE_COMMAND}
-
Typing text
-
- Text injection prefers the RemoteDesktop portal, which asks for
- permission once and handles non-US layouts. When the portal is
- unavailable it falls back to wl-copy plus ydotool paste,
- then xdotool for X11 and XWayland clients. Without{" "}
- /dev/uinput the ydotool fallback is gone, but the portal
- and xdotool remain. On KDE Plasma Wayland, set System Settings →
- Keyboard → Virtual Keyboard to “IBus Wayland”. On GNOME,
- the tray icon needs the AppIndicator extension. For more, see{" "}
- Wayland voice typing and{" "}
- global shortcuts via D-Bus.
-
-
-
-
-
-
- Uninstall
-
-
- The uninstall.sh script is for script and source
- installs. For the Flatpak, use Flatpak itself. Remove the app:
-
- flatpak uninstall com.voculinux.Voculinux
-
- Add --delete-data to also remove settings and downloaded
- models under ~/.var/app/com.voculinux.Voculinux/. If no
- other app uses the remote, drop it too:
-
- flatpak remote-delete vocahq
-
-
-
-
-
- Flatpak FAQ
-
-
- {faqs.map((faq) => (
-
-
{faq.question}
-
{faq.answer}
-
- ))}
-
-
-
-
- More fixes for hotkeys, audio and text injection are on the{" "}
- troubleshooting page. To keep
- the whole stack local, see the{" "}
- GPU acceleration guide and{" "}
- Silero VAD.
-
-
-
-
-
-
-
- Need a different package?
-
-
- The install script covers every engine, the Nix flake fits NixOS, and
- the .deb and .rpm suit Debian, Ubuntu and Fedora. The AUR packages for
- Arch are not published yet.
-
-
-
- All install options
-
-
-
- Nix flake and NixOS module
-
-
- Local VocaGateway
-
-
-
-
- );
+export default function FlatpakNoticePage() {
+ return ;
}
diff --git a/web/src/app/for-developers/page.tsx b/web/src/app/for-developers/page.tsx
index a4e2fce..d84c71d 100644
--- a/web/src/app/for-developers/page.tsx
+++ b/web/src/app/for-developers/page.tsx
@@ -138,8 +138,8 @@ export default function ForDevelopersPage() {
dateModified: "2026-02-22",
author: {
"@type": "Person",
- name: "Jatin K Malik",
- url: "https://github.com/jatinkrmalik",
+ name: "Xavier Karma",
+ url: "https://bongbetic.com",
},
publisher: {
"@type": "Organization",
diff --git a/web/src/app/global-shortcuts/page.tsx b/web/src/app/global-shortcuts/page.tsx
index 360e906..64038ab 100644
--- a/web/src/app/global-shortcuts/page.tsx
+++ b/web/src/app/global-shortcuts/page.tsx
@@ -53,7 +53,7 @@ const steps = [
},
{
name: "Pick the command",
- text: "On a native install, use voculinux --toggle. On Flatpak, use the gdbus call shown below, because voculinux --toggle is not on the host PATH.",
+ text: "Use voculinux --toggle, or the gdbus call shown below if you prefer calling D-Bus directly.",
},
{
name: "Bind it in your desktop",
@@ -138,8 +138,8 @@ export default function GlobalShortcutsPage() {
dateModified: "2026-11-01",
author: {
"@type": "Person",
- name: "Jatin K Malik",
- url: "https://github.com/jatinkrmalik",
+ name: "Xavier Karma",
+ url: "https://bongbetic.com",
},
publisher: {
"@type": "Organization",
@@ -279,9 +279,8 @@ export default function GlobalShortcutsPage() {
Calling D-Bus directly
- The gdbus form is what the Flatpak
- documentation recommends: it is immediate and does not start another
- sandbox on every press. Swap Toggle for{" "}
+ The gdbus form talks to the running instance
+ directly. Swap Toggle for{" "}
Start or Stop as
needed.
@@ -378,14 +377,6 @@ export default function GlobalShortcutsPage() {
While a transcription is still processing, Toggle cancels it, the
same as pressing the recording hotkey again (since v0.18.4).
-
- On Flatpak,{" "}
-
- flatpak run com.voculinux.Voculinux --toggle
- {" "}
- also works but starts a sandbox on each press; prefer{" "}
- gdbus.
-
This changes how dictation starts, not how text is typed. If text
does not appear, see{" "}
@@ -418,10 +409,6 @@ export default function GlobalShortcutsPage() {
,{" "}
GNOME and KDE
-
- ,{" "}
-
- Flatpak
{" "}
and{" "}
diff --git a/web/src/app/gnome-kde/page.tsx b/web/src/app/gnome-kde/page.tsx
index 07bedbd..f2cd73b 100644
--- a/web/src/app/gnome-kde/page.tsx
+++ b/web/src/app/gnome-kde/page.tsx
@@ -68,8 +68,8 @@ export default function GnomeVsKdePage() {
dateModified: "2026-03-30",
author: {
"@type": "Person",
- name: "Jatin K Malik",
- url: "https://github.com/jatinkrmalik",
+ name: "Xavier Karma",
+ url: "https://bongbetic.com",
},
publisher: {
"@type": "Organization",
diff --git a/web/src/app/gpu-acceleration/page.tsx b/web/src/app/gpu-acceleration/page.tsx
index 91685b9..c3fce37 100644
--- a/web/src/app/gpu-acceleration/page.tsx
+++ b/web/src/app/gpu-acceleration/page.tsx
@@ -156,8 +156,8 @@ export default function GpuAccelerationPage() {
dateModified: "2026-02-22",
author: {
"@type": "Person",
- name: "Jatin K Malik",
- url: "https://github.com/jatinkrmalik",
+ name: "Xavier Karma",
+ url: "https://bongbetic.com",
},
publisher: {
"@type": "Organization",
diff --git a/web/src/app/hyprland-sway/page.tsx b/web/src/app/hyprland-sway/page.tsx
index 9662459..f667250 100644
--- a/web/src/app/hyprland-sway/page.tsx
+++ b/web/src/app/hyprland-sway/page.tsx
@@ -152,8 +152,8 @@ export default function HyprlandSwayPage() {
dateModified: "2026-11-01",
author: {
"@type": "Person",
- name: "Jatin K Malik",
- url: "https://github.com/jatinkrmalik",
+ name: "Xavier Karma",
+ url: "https://bongbetic.com",
},
publisher: {
"@type": "Organization",
@@ -362,7 +362,7 @@ export default function HyprlandSwayPage() {
On Wayland the built-in hotkey reads{" "}
/dev/input, so your user must be in the{" "}
input group (the source installer does this;
- .deb and .rpm packages cannot). The alternative, added in v0.18.0, is
+ the Void package leaves it to you). The alternative, added in v0.18.0, is
to turn on Settings → Shortcuts → External Activation (Desktop
Shortcut) and let the compositor own the key. These binds toggle
dictation; they cannot do push-to-talk.
@@ -384,7 +384,7 @@ export default function HyprlandSwayPage() {
displayCommand="sudo usermod -aG input $USER"
/>
- The full D-Bus interface and Flatpak command are in{" "}
+ The full D-Bus interface is in{" "}
global shortcuts
diff --git a/web/src/app/install/[distro]/page.tsx b/web/src/app/install/[distro]/page.tsx
index 12864ce..459aade 100644
--- a/web/src/app/install/[distro]/page.tsx
+++ b/web/src/app/install/[distro]/page.tsx
@@ -1,415 +1,30 @@
-import Link from "next/link";
import { type Metadata } from "next";
import { notFound } from "next/navigation";
-import {
- CheckCircle2,
- ChevronRight,
- Cpu,
- Download,
- Laptop,
- Monitor,
- RefreshCw,
- Server,
- Shield,
- Sparkles,
- Terminal,
-} from "lucide-react";
-import { SeoSubpageShell } from "@/components/seo-subpage-shell";
-import { absoluteUrl, buildPageMetadata } from "@/lib/seo";
+import { ChannelNotice } from "@/components/channel-notice";
+import { buildPageMetadata } from "@/lib/seo";
+
+// Distro guides are not published for Voculinux. Each slug keeps its route as a
+// short notice that points at the Void install hub.
+const DISTRO_NAMES: Record = {
+ ubuntu: "Ubuntu",
+ debian: "Debian",
+ fedora: "Fedora",
+ arch: "Arch",
+ opensuse: "openSUSE",
+ "linux-mint": "Linux Mint",
+ "pop-os": "Pop!_OS",
+};
-type DistroSlug =
- | "ubuntu"
- | "debian"
- | "fedora"
- | "arch"
- | "opensuse"
- | "linux-mint"
- | "pop-os";
type DistroParams = { distro: string } | Promise<{ distro: string }>;
-interface InstallOption {
- label: string;
- note: string;
- command: string;
-}
-
-interface DistroConfig {
- name: string;
- title: string;
- description: string;
- intro: string;
- prerequisites: string[];
- supportedOn: string[];
- installCommand: string;
- otherInstallOptions: InstallOption[];
- setupNotes: string[];
- postInstallChecks: string[];
-}
-
-const INSTALL_SCRIPT_COMMAND = `curl -fsSL https://raw.githubusercontent.com/VocaHQ/vocalinux/main/install.sh -o /tmp/vl.sh
-bash /tmp/vl.sh`;
-
-const DEB_OPTION: InstallOption = {
- label: "Native .deb package",
- note: "Fork status: the fork .deb is not published yet. Download the .deb for your CPU from upstream GitHub Releases in the meantime (arm64 files are attached too). It is a thin package: Python and GTK come from the distro, whisper.cpp runs on the CPU, and there is no auto-update. On Wayland, add yourself to the input group (sudo usermod -aG input $USER, then log out and back in) or the default hotkey stays off.",
- command: "sudo apt install ./voculinux_*_amd64.deb",
-};
-
-const RPM_OPTION: InstallOption = {
- label: "Native .rpm package",
- note: "Fork status: the fork .rpm is not published yet. Download the .rpm for your CPU from upstream GitHub Releases in the meantime (aarch64 files are attached too). It is a thin package: Python and GTK come from Fedora, whisper.cpp runs on the CPU, and there is no auto-update or COPR yet. On Wayland, add yourself to the input group (sudo usermod -aG input $USER, then log out and back in) or the default hotkey stays off.",
- command: "sudo dnf install ./voculinux-*.x86_64.rpm",
-};
-
-const FLATPAK_OPTION: InstallOption = {
- label: "Flatpak from the VocaHQ remote",
- note: "Fork status: the fork Flatpak remote is not published yet. Not on Flathub. The self-hosted vocahq remote updates with flatpak update and ships whisper.cpp only once published.",
- command:
- "flatpak install https://vocahq.github.io/voculinux-flatpak/com.voculinux.Voculinux.flatpakref",
-};
-
-const COMMON_CHECKS = [
- "Run voculinux --version to confirm the installed release.",
- "Launch voculinux and confirm the tray icon appears. On GNOME, the tray needs the AppIndicator extension.",
- "Hold Right Alt (Option) to dictate, or switch to toggle mode in Settings → Shortcuts, and confirm text lands in a terminal and a browser.",
- "If anything misbehaves, run voculinux --debug and check the troubleshooting guide.",
-];
-
-const distroConfig: Record = {
- ubuntu: {
- name: "Ubuntu",
- title: "Install Voice Dictation on Ubuntu",
- description:
- "Step-by-step Ubuntu voice dictation setup for offline speech-to-text with whisper.cpp. Covers Ubuntu 24.04+, the install script, the .deb, X11 and Wayland.",
- intro:
- "This Ubuntu guide is tuned for practical desktop use: terminals, browsers, IDEs, office suites, and chat apps. Local engines keep audio on your machine after the one-time model download. Remote API is optional.",
- prerequisites: [
- "Ubuntu 24.04 or newer (Ubuntu 22.04 ships Python 3.10, below the 3.11 floor)",
- "Python 3.11+ with the distro's python3-gi (the installer handles this)",
- "Working microphone",
- "curl installed (sudo apt update && sudo apt install -y curl)",
- ],
- supportedOn: [
- "Ubuntu 24.04 LTS and newer: full support",
- "Ubuntu-based derivatives on a 24.04 base, such as Linux Mint 22, Pop!_OS 24.04, elementary OS 8 and Zorin OS on 24.04",
- ],
- installCommand: INSTALL_SCRIPT_COMMAND,
- otherInstallOptions: [DEB_OPTION, FLATPAK_OPTION],
- setupNotes: [
- "Keep the default whisper.cpp engine: it installs in about 1-2 minutes and uses a Vulkan GPU when one is available.",
- "On lower-RAM systems, VOSK is the lightweight option (--engine=vosk with the install script).",
- "On KDE Plasma Wayland (Kubuntu), set System Settings → Keyboard → Virtual Keyboard to IBus Wayland.",
- "The install script adds you to the input group for Wayland hotkeys; log out and back in afterwards.",
- ],
- postInstallChecks: [
- ...COMMON_CHECKS,
- "Set language and model size in Settings → Speech Model for your workload.",
- ],
- },
- debian: {
- name: "Debian",
- title: "Install Voice Dictation on Debian",
- description:
- "Install Voculinux offline voice dictation on Debian 12, 13 and Testing with the install script or the native .deb. Covers AppIndicator, ydotool and Wayland.",
- intro:
- "Debian 12 and newer are a primary target for Voculinux. The install script detects Debian, installs the system packages it needs, and sets up whisper.cpp with a checksum-verified tiny model.",
- prerequisites: [
- "Debian 12 or newer, including Testing (Debian 11 and earlier are below the Python 3.11 floor)",
- "Python 3.11+ with the distro's python3-gi (the installer handles this)",
- "Working microphone",
- "curl installed (sudo apt update && sudo apt install -y curl)",
- ],
- supportedOn: [
- "Debian 12 and newer: full support",
- "Debian Testing: full support",
- ],
- installCommand: INSTALL_SCRIPT_COMMAND,
- otherInstallOptions: [DEB_OPTION, FLATPAK_OPTION],
- setupNotes: [
- "Debian uses the Ayatana AppIndicator for the tray (gir1.2-ayatanaappindicator3-0.1); the installer picks it.",
- "Clean Debian installs lack some build tools for compiling pywhispercpp (libssl-dev, autoconf, automake, libtool, patchelf). The installer adds them; add them yourself before a manual rebuild.",
- "ydotool is not in Debian's standard repositories. Voculinux falls back to IBus or wtype for most Wayland compositors.",
- "On KDE Plasma Wayland, set System Settings → Keyboard → Virtual Keyboard to IBus Wayland.",
- ],
- postInstallChecks: [
- ...COMMON_CHECKS,
- "On GNOME, install gnome-shell-extension-appindicator if the tray icon never appears.",
- ],
- },
- fedora: {
- name: "Fedora",
- title: "Install Voice Dictation on Fedora",
- description:
- "Fedora speech-to-text installation guide for Voculinux. Set up offline Linux voice typing on Fedora 42+ with the install script or .rpm, on Wayland or X11.",
- intro:
- "Fedora 42 and newer ship the Python and GTK stack Voculinux needs, and Fedora 42 is the release in the project's CI matrix. This guide focuses on reliable setup and minimal friction.",
- prerequisites: [
- "Fedora 42 or newer (Workstation or a spin)",
- "Python 3.11+ with python3-gobject (the installer handles this)",
- "Working microphone",
- "curl installed (sudo dnf install -y curl)",
- ],
- supportedOn: ["Fedora 42 and newer: good support (uses lib64 paths)"],
- installCommand: INSTALL_SCRIPT_COMMAND,
- otherInstallOptions: [RPM_OPTION, FLATPAK_OPTION],
- setupNotes: [
- "If prompted for optional dependencies, accept defaults unless your desktop setup requires custom input tooling.",
- "Keep the default whisper.cpp engine for the best speed-to-accuracy tradeoff.",
- "Use the smallest model first, then scale up once dictation feels stable on your hardware.",
- "On the KDE spin under Wayland, set System Settings → Keyboard → Virtual Keyboard to IBus Wayland.",
- ],
- postInstallChecks: [
- ...COMMON_CHECKS,
- "Confirm startup behavior and language settings persist after reboot.",
- ],
- },
- arch: {
- name: "Arch Linux",
- title: "Install Voice Dictation on Arch Linux",
- description:
- "Arch Linux voice dictation guide for offline speech recognition on Arch, Manjaro and EndeavourOS with the install script. The Voculinux AUR packages are not published yet.",
- intro:
- "Arch users can set up dictation with the install script, which keeps whisper.cpp as the default engine and works across rolling-release desktops. The Voculinux AUR packages are not published yet, so there is no AUR install path today.",
- prerequisites: [
- "Arch Linux, Manjaro or EndeavourOS",
- "Python 3.11+ with python-gobject",
- "Working microphone",
- "curl installed (sudo pacman -Sy --needed curl)",
- ],
- supportedOn: [
- "Arch Linux (rolling): good support",
- "Manjaro (rolling): good support, inherits Arch compatibility",
- "EndeavourOS (rolling): good support, inherits Arch compatibility",
- ],
- installCommand: INSTALL_SCRIPT_COMMAND,
- otherInstallOptions: [
- {
- label: "AUR packages (not published yet)",
- note: "Fork status: fork AUR packages are not published yet. Once published, voculinux builds the canonical release sdist against Arch dependencies. voculinux-bin installs the prebuilt release AppImage. voculinux-git is a community package that tracks main. The three conflict, so install only one.",
- command: `yay -S voculinux # canonical release sdist, built against Arch dependencies
-yay -S voculinux-git # community package; tracks main`,
- },
- ],
- setupNotes: [
- "Prefer whisper.cpp: it avoids the full PyTorch stack that OpenAI Whisper pulls in.",
- "On custom compositor setups, verify text injection behavior in both terminal and browser contexts.",
- "If you tweak keybinds heavily, set a non-conflicting activation shortcut in Voculinux settings.",
- "Once the AUR packages are published they will update with your AUR helper; the in-app update checker only notifies.",
- ],
- postInstallChecks: [
- ...COMMON_CHECKS,
- "Back up ~/.config/voculinux/config.json after tuning preferences.",
- ],
- },
- opensuse: {
- name: "openSUSE",
- title: "Install Voice Dictation on openSUSE",
- description:
- "Install Voculinux offline voice dictation on openSUSE Tumbleweed with the install script. Covers versioned Python packages, Vulkan builds, X11 and Wayland.",
- intro:
- "On openSUSE Tumbleweed the install script uses zypper, resolves the versioned Python packages for your snapshot, and sets up whisper.cpp with a checksum-verified tiny model.",
- prerequisites: [
- "openSUSE Tumbleweed",
- "Python 3.11+ with the matching pythonXY-gobject package (the installer handles this)",
- "Working microphone",
- "curl installed (sudo zypper install curl)",
- ],
- supportedOn: [
- "openSUSE Tumbleweed: good support",
- "openSUSE Leap is not listed in the compatibility matrix",
- ],
- installCommand: INSTALL_SCRIPT_COMMAND,
- otherInstallOptions: [
- FLATPAK_OPTION,
- {
- label: "AppImage",
- note: "Download the x86_64 or aarch64 AppImage from upstream GitHub Releases until fork releases land. It starts on Tumbleweed and uses Vulkan through the host driver, but still needs host text-injection tools (xdotool on X11; wtype, ydotool or clipboard tools on Wayland).",
- command: `chmod +x Voculinux-*-x86_64.AppImage # or aarch64
-./Voculinux-*-x86_64.AppImage`,
- },
- ],
- setupNotes: [
- "Tumbleweed uses versioned Python package names such as python313-devel. The -devel suffix means development headers, not beta packages.",
- "For a manual install, if ${PYVER}-virtualenv is unavailable on your snapshot, try ${PYVER}-venv.",
- "For whisper.cpp Vulkan GPU builds, install vulkan-tools, vulkan-devel and shaderc (sudo zypper install -y vulkan-tools vulkan-devel shaderc).",
- "On KDE Plasma Wayland, set System Settings → Keyboard → Virtual Keyboard to IBus Wayland.",
- ],
- postInstallChecks: [
- ...COMMON_CHECKS,
- "Run vulkaninfo --summary if you expect GPU acceleration.",
- ],
- },
- "linux-mint": {
- name: "Linux Mint",
- title: "Install Voice Dictation on Linux Mint",
- description:
- "Install Voculinux offline voice dictation on Linux Mint 22 with the install script or .deb. Covers Cinnamon, the Ubuntu 24.04 base and why Mint 21 is too old.",
- intro:
- "Linux Mint is judged by its Ubuntu base, not its own version number. Mint 22 is built on Ubuntu 24.04, so the install script treats it as Ubuntu and installs everything Voculinux needs.",
- prerequisites: [
- "Linux Mint 22 or newer, on an Ubuntu 24.04+ base (Mint 21 is on Ubuntu 22.04, below the floor)",
- "Python 3.11+ with the distro's python3-gi (the installer handles this)",
- "Working microphone",
- "curl installed (sudo apt update && sudo apt install -y curl)",
- ],
- supportedOn: [
- "Linux Mint on Ubuntu 24.04+ (Mint 22): good support",
- "Cinnamon, MATE and Xfce desktops: full support",
- ],
- installCommand: INSTALL_SCRIPT_COMMAND,
- otherInstallOptions: [
- {
- ...DEB_OPTION,
- note: `The .deb targets Debian 12+ and Ubuntu 24.04+, the base Mint 22 is built on. ${DEB_OPTION.note}`,
- },
- FLATPAK_OPTION,
- ],
- setupNotes: [
- "Keep the default whisper.cpp engine unless you have a specific reason to switch.",
- "Cinnamon is fully supported and works with AppIndicator for the tray icon.",
- "Text is typed with xdotool on X11 sessions; on Wayland, Voculinux picks from IBus, the RemoteDesktop portal, wtype or ydotool.",
- "The install script adds you to the input group for Wayland hotkeys; log out and back in afterwards.",
- ],
- postInstallChecks: [...COMMON_CHECKS],
- },
- "pop-os": {
- name: "Pop!_OS",
- title: "Install Voice Dictation on Pop!_OS",
- description:
- "Install Voculinux offline voice dictation on Pop!_OS 24.04 with the install script or .deb. Covers the Ubuntu base, Wayland hotkeys and fallback options.",
- intro:
- "Pop!_OS uses Ubuntu's own version numbering, and 24.04 and newer meet the Python 3.11 floor. The install script detects Pop!_OS as part of the Ubuntu family.",
- prerequisites: [
- "Pop!_OS 24.04 or newer",
- "Python 3.11+ with the distro's python3-gi (the installer handles this)",
- "Working microphone",
- "curl installed (sudo apt update && sudo apt install -y curl)",
- ],
- supportedOn: ["Pop!_OS 24.04 and newer: good support"],
- installCommand: INSTALL_SCRIPT_COMMAND,
- otherInstallOptions: [DEB_OPTION, FLATPAK_OPTION],
- setupNotes: [
- "For a manual install, use libgirepository-2.0-dev if libgirepository1.0-dev is not available.",
- "The install script adds you to the input group for Wayland hotkeys; log out and back in afterwards.",
- "If the hotkey or typing does not work in your session, enable Settings → Shortcuts → External Activation (Desktop Shortcut) and bind a desktop shortcut to voculinux --toggle (toggle only, no push-to-talk), or dictate into the Dictation Pad and copy the text out.",
- "whisper.cpp uses a Vulkan GPU when available; check with vulkaninfo --summary.",
- ],
- postInstallChecks: [...COMMON_CHECKS],
- },
-};
-
-const distroKeywords: Record = {
- ubuntu: [
- "ubuntu voice dictation",
- "speech to text ubuntu",
- "ubuntu voice typing",
- "offline dictation ubuntu",
- ],
- debian: [
- "debian voice dictation",
- "speech to text debian",
- "debian voice typing",
- "offline dictation debian",
- ],
- fedora: [
- "fedora voice dictation",
- "speech to text fedora",
- "fedora voice typing",
- "offline dictation fedora",
- ],
- arch: [
- "arch linux voice dictation",
- "speech to text arch linux",
- "manjaro dictation",
- "voculinux aur",
- ],
- opensuse: [
- "opensuse voice dictation",
- "speech to text opensuse tumbleweed",
- "opensuse voice typing",
- "offline dictation opensuse",
- ],
- "linux-mint": [
- "linux mint voice dictation",
- "speech to text linux mint",
- "linux mint voice typing",
- "cinnamon dictation",
- ],
- "pop-os": [
- "pop os voice dictation",
- "speech to text pop!_os",
- "pop os voice typing",
- "offline dictation pop os",
- ],
-};
-
-const isDistroSlug = (value: string): value is DistroSlug => {
- return value in distroConfig;
-};
-
const resolveParams = async (
params: DistroParams,
): Promise<{ distro: string }> => {
return Promise.resolve(params);
};
-const getDistroStyles = (distro: DistroSlug) => {
- switch (distro) {
- case "ubuntu":
- return {
- icon: Laptop,
- iconClass: "text-primary",
- chipClass: "border-border bg-muted text-muted-foreground",
- panelClass: "bg-primary/10",
- };
- case "debian":
- return {
- icon: Server,
- iconClass: "text-primary",
- chipClass: "border-border bg-muted text-muted-foreground",
- panelClass: "bg-primary/10",
- };
- case "fedora":
- return {
- icon: Sparkles,
- iconClass: "text-primary",
- chipClass: "border-border bg-primary/10 text-primary",
- panelClass: "bg-primary/10",
- };
- case "opensuse":
- return {
- icon: RefreshCw,
- iconClass: "text-primary",
- chipClass: "border-border bg-primary/10 text-primary",
- panelClass: "bg-primary/10",
- };
- case "linux-mint":
- return {
- icon: Monitor,
- iconClass: "text-primary",
- chipClass: "border-border bg-muted text-muted-foreground",
- panelClass: "bg-primary/10",
- };
- case "pop-os":
- return {
- icon: Laptop,
- iconClass: "text-primary",
- chipClass: "border-border bg-primary/10 text-primary",
- panelClass: "bg-primary/10",
- };
- case "arch":
- default:
- return {
- icon: Cpu,
- iconClass: "text-primary",
- chipClass: "border-border bg-primary/10 text-muted-foreground",
- panelClass: "bg-primary/10",
- };
- }
-};
-
export function generateStaticParams() {
- return Object.keys(distroConfig).map((distro) => ({ distro }));
+ return Object.keys(DISTRO_NAMES).map((distro) => ({ distro }));
}
export async function generateMetadata({
@@ -418,258 +33,31 @@ export async function generateMetadata({
params: DistroParams;
}): Promise {
const { distro } = await resolveParams(params);
-
- if (!isDistroSlug(distro)) {
- return buildPageMetadata({
- title: "Linux Voice Dictation Install Guide",
- description:
- "Install Voculinux on Linux with distro-specific setup instructions for Ubuntu, Debian, Fedora, Arch, openSUSE, Linux Mint, and Pop!_OS.",
- path: "/install",
- });
- }
-
- const config = distroConfig[distro];
+ const name = DISTRO_NAMES[distro] ?? "Linux";
return buildPageMetadata({
- // Search title leads with the query people type ("ubuntu speech to text");
- // the on-page h1 stays config.title.
- title: `${config.name} Speech to Text: Offline Voice Typing Setup`,
- description: config.description,
+ title: `${name}: Not Published for Voculinux`,
+ description: `Voculinux is not published for ${name}. It is available for Void Linux (glibc, x86_64) as a signed xbps repository.`,
path: `/install/${distro}`,
- keywords: distroKeywords[distro],
});
}
-export default async function DistroInstallPage({
+export default async function DistroNoticePage({
params,
}: {
params: DistroParams;
}) {
const { distro } = await resolveParams(params);
+ const name = DISTRO_NAMES[distro];
- if (!isDistroSlug(distro)) {
+ if (!name) {
notFound();
}
- const config = distroConfig[distro];
- const styles = getDistroStyles(distro);
- const DistroIcon = styles.icon;
-
- const howToJsonLd = {
- "@context": "https://schema.org",
- "@type": "HowTo",
- name: `${config.title} in 3 Steps`,
- description: config.description,
- inLanguage: "en-US",
- totalTime: "PT10M",
- supply: [
- {
- "@type": "HowToSupply",
- name: "Linux computer",
- },
- {
- "@type": "HowToSupply",
- name: "Microphone",
- },
- ],
- tool: [
- {
- "@type": "HowToTool",
- name: "Terminal",
- },
- ],
- step: [
- {
- "@type": "HowToStep",
- name: "Open terminal",
- text: "Launch your terminal application and ensure curl is available.",
- url: absoluteUrl(`/install/${distro}`),
- },
- {
- "@type": "HowToStep",
- name: "Run installer",
- text: `Run: ${config.installCommand}`,
- url: absoluteUrl(`/install/${distro}`),
- },
- {
- "@type": "HowToStep",
- name: "Start dictating",
- text: "Launch voculinux and hold Right Alt (Option) to begin dictation, or choose toggle mode in Settings.",
- url: absoluteUrl(`/install/${distro}`),
- },
- ],
- };
-
return (
-
-
-
-
-
-
- {config.name} Setup Guide
-
-
-
- {config.title}
-
-
- {config.intro}
-
-
-
-
-
- Install command
-
-
-
- {config.installCommand}
-
-
-
- Fork status: this command fetches the upstream install script, so it
- installs Vocalinux (upstream), not Voculinux. Fork release artefacts
- are not published yet.
-
-
-
-
-
-
-
-
- Prerequisites
-
-
- {config.prerequisites.map((item) => (
-
-
- {item}
-
- ))}
-
-
-
-
-
-
- Supported on
-
-
- {config.supportedOn.map((item) => (
-
-
- {item}
-
- ))}
-
-
- Support levels come from the project’s distribution
- compatibility matrix. They describe expected compatibility, not a
- list of test machines.
-
- Compare every package format on the
-
- install overview
-
- , or read the
-
- Flatpak guide
-
- .
-
-
- )}
-
-
-
-
- Setup notes for {config.name}
-
-
- {config.setupNotes.map((item) => (
-
-
- {item}
-
- ))}
-
-
-
-
-
-
- Post-install checklist
-
-
- {config.postInstallChecks.map((item) => (
-
-
- {item}
-
- ))}
-
-
-
- Need help selecting an engine? Read the
-
- engine comparison
-
- . Stuck? See
-
- troubleshooting
-
- .
-
-
-
+
);
}
diff --git a/web/src/app/install/nixos/page.tsx b/web/src/app/install/nixos/page.tsx
index a4b45e3..8574560 100644
--- a/web/src/app/install/nixos/page.tsx
+++ b/web/src/app/install/nixos/page.tsx
@@ -1,422 +1,14 @@
-import Link from "next/link";
import { type Metadata } from "next";
-import {
- AlertTriangle,
- Braces,
- CheckCircle2,
- ChevronRight,
- CircleHelp,
- Settings2,
- Terminal,
-} from "lucide-react";
-import { SeoSubpageShell } from "@/components/seo-subpage-shell";
-import { absoluteUrl, buildPageMetadata } from "@/lib/seo";
-
-const PAGE_PATH = "/install/nixos";
-const PAGE_TITLE = "Voculinux on NixOS: Nix Flake and NixOS Module | Voculinux";
-const PAGE_DESCRIPTION =
- "Install Voculinux on NixOS or any Nix system with the official flake: nix run, nix profile, the NixOS and Home Manager modules, Wayland groups and scope.";
-
-const TRY_COMMANDS = `nix run github:VocaHQ/vocalinux # try it
-nix profile install github:VocaHQ/vocalinux`;
-
-const NIXOS_SNIPPET = `{
- inputs.vocalinux.url = "github:VocaHQ/vocalinux";
-
- outputs = { nixpkgs, vocalinux, ... }: {
- nixosConfigurations.host = nixpkgs.lib.nixosSystem {
- modules = [
- vocalinux.nixosModules.vocalinux
- {
- programs.vocalinux.enable = true;
- users.users.you.extraGroups = [ "input" "uinput" ];
- }
- ];
- };
- };
-}`;
-
-const HOME_MANAGER_SNIPPET = `{
- inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
- inputs.home-manager.url = "github:nix-community/home-manager";
- inputs.home-manager.inputs.nixpkgs.follows = "nixpkgs";
- inputs.vocalinux.url = "github:VocaHQ/vocalinux";
-
- outputs = { nixpkgs, home-manager, vocalinux, ... }: {
- homeConfigurations.you = home-manager.lib.homeManagerConfiguration {
- pkgs = nixpkgs.legacyPackages.x86_64-linux;
- modules = [
- vocalinux.homeManagerModules.vocalinux
- { programs.vocalinux.enable = true; }
- ];
- };
- };
-}`;
-
-const flakeOutputs = [
- {
- output: "packages..vocalinux (also default)",
- purpose: "The Voculinux package for x86_64-linux and aarch64-linux",
- },
- {
- output: "apps..vocalinux (also default)",
- purpose: "What nix run github:VocaHQ/vocalinux starts",
- },
- {
- output: "overlays.default",
- purpose: "Adds pkgs.vocalinux to your own nixpkgs",
- },
- {
- output: "nixosModules.vocalinux (also default)",
- purpose: "programs.vocalinux.enable and programs.vocalinux.package",
- },
- {
- output: "homeManagerModules.vocalinux (also default)",
- purpose: "The same programs.vocalinux options, per user",
- },
-];
-
-const moduleSteps = [
- {
- name: "Add the flake input",
- text: 'Add inputs.vocalinux.url = "github:VocaHQ/vocalinux" to your system flake.',
- },
- {
- name: "Import the module and enable it",
- text: "Add vocalinux.nixosModules.vocalinux to your modules and set programs.vocalinux.enable = true. The module installs the package and enables hardware.uinput.",
- },
- {
- name: "Add each dictating user to input and uinput",
- text: 'Set users.users..extraGroups = [ "input" "uinput" ] for Wayland shortcuts and ydotool typing. X11 sessions can skip this.',
- },
- {
- name: "Rebuild and log in again",
- text: "Rebuild your system as usual, then log out and back in so the new group membership applies.",
- },
-];
-
-const faqs = [
- {
- question: "Is NixOS supported?",
- answer:
- "Yes, through the Nix flake added in v0.18.2. The standard install.sh script does not work on NixOS because of the /nix/store layout, which is why the distro compatibility doc still lists NixOS as unsupported for that installer. Use the flake instead.",
- },
- {
- question: "Does the Nix package use my GPU?",
- answer:
- "The bundled pywhispercpp is built with the Vulkan backend, so whisper.cpp can use an AMD, Intel or NVIDIA GPU through Vulkan. It is also built with GGML_NATIVE=OFF, a portable baseline rather than -march=native.",
- },
- {
- question:
- "Can I use Parakeet, Faster Whisper, VOSK or OpenAI Whisper from the flake?",
- answer:
- "No. The flake packages whisper.cpp plus the Silero VAD extra. The other engines are not packaged because of the PyTorch footprint or because they are not in nixpkgs.",
- },
- {
- question: "Why do I need the input group?",
- answer:
- "On Wayland the built-in push-to-talk hotkey reads keyboard devices under /dev/input. Membership in input grants read access to every keyboard and pointer device, so the module leaves that choice to each user. The alternative is a compositor shortcut bound to the D-Bus Toggle command, which only toggles.",
- },
- {
- question: "How do I update?",
- answer:
- "Update the vocalinux input in your flake lock and rebuild, or upgrade your Nix profile. The in-app update checker only tells you a release exists; it never installs anything.",
- },
-];
+import { ChannelNotice } from "@/components/channel-notice";
+import { buildPageMetadata } from "@/lib/seo";
export const metadata: Metadata = buildPageMetadata({
- title: PAGE_TITLE,
- description: PAGE_DESCRIPTION,
- path: PAGE_PATH,
- keywords: [
- "nixos voice dictation",
- "voculinux nix flake",
- "nixos speech to text",
- "nixos module voculinux",
- "home manager voculinux",
- "nix whisper.cpp dictation",
- ],
+ title: "NixOS: Not Published for Voculinux",
+ description:
+ "Voculinux has no Nix flake or NixOS module. It is published for Void Linux (glibc, x86_64) as a signed xbps repository.",
+ path: "/install/nixos",
});
-function Commands({ children }: { children: string }) {
- return (
-
- Voculinux does not yet publish its own Nix flake. The flake below is
- the upstream Vocalinux flake: it builds the app against nixpkgs, ships
- a NixOS module and a Home Manager module, and wires every
- text-injection and clipboard tool onto the wrapped binary’s
- PATH. Its snippets install Vocalinux (upstream), not Voculinux. For
- Voculinux on Void Linux, use the install script today; a signed xbps
- repository will ship with fork releases once published.
-
-
-
-
-
-
- Try it or install into a profile
-
-
- No configuration needed. nix run starts Vocalinux
- (upstream) once; nix profile install keeps it in your
- user profile:
-
- {TRY_COMMANDS}
-
- On a non-NixOS host, pair nix profile install with your
- distro’s udev rule and group membership for{" "}
- /dev/uinput and /dev/input if you use
- Wayland.
-
-
-
-
-
-
- Enable the NixOS module
-
-
- {moduleSteps.map((step, index) => (
-
-
- {index + 1}. {step.name}
-
-
{step.text}
-
- ))}
-
-
- The documented flake, with host and you{" "}
- replaced by your hostname and user:
-
- {NIXOS_SNIPPET}
-
- hardware.uinput.enable, which the module sets, loads the
- uinput kernel module, creates the uinput group and
- installs the matching udev rule. ydotool and the evdev backend’s
- keyboard clone both open /dev/uinput. Group membership
- stays per user because input grants read access to every
- keyboard and pointer device.
-
-
-
Home Manager
-
- homeManagerModules.vocalinux takes the same{" "}
- programs.vocalinux options and installs into your home
- profile. Device permissions are a system concern, so on NixOS keep the
- NixOS module (or the group lines) on the system side.
-
- {HOME_MANAGER_SNIPPET}
-
-
-
-
-
- What the flake provides
-
-
-
-
-
-
Flake output
-
Use
-
-
-
- {flakeOutputs.map((row) => (
-
-
{row.output}
-
{row.purpose}
-
- ))}
-
-
-
-
Included in the package
-
- {[
- "whisper.cpp (the default engine), with pywhispercpp built from its PyPI sdist with the Vulkan backend",
- "Silero neural VAD through onnxruntime (the [vad] extra)",
- "GTK 3, PyGObject and the AppIndicator typelib from nixpkgs",
- "xdotool, wtype, ydotool, wl-clipboard, xclip, xsel, xprop, setxkbmap, ibus, gdbus, notify-send, paplay, aplay and vulkaninfo on PATH",
- "A desktop entry and the app icon",
- ].map((item) => (
-
-
- {item}
-
- ))}
-
-
Not included
-
- The vosk, whisper, parakeet and{" "}
- faster_whisper extras are not packaged, so{" "}
- Parakeet and{" "}
- Faster Whisper need the install
- script on another distro. The flake follows{" "}
- nixos-unstable and builds for x86_64-linux and
- aarch64-linux.
-
-
-
-
-
-
- Gotchas
-
-
-
- Do not run install.sh on NixOS. It expects a
- conventional filesystem layout; the flake is the supported path.
-
-
- Speech models are not part of the Nix store. Voculinux downloads one
- only after you confirm it, and shows the size first.
-
-
- On Wayland without input membership, the hotkey is
- disabled. Bind a compositor shortcut through{" "}
- D-Bus activation instead; it
- toggles, it cannot push-to-talk.
-
-
- On KDE Plasma Wayland, set System Settings → Keyboard → Virtual
- Keyboard to “IBus Wayland”. More in the{" "}
- Wayland guide.
-
-
-
-
-
-
-
- NixOS FAQ
-
-
- {faqs.map((faq) => (
-
-
{faq.question}
-
{faq.answer}
-
- ))}
-
-
-
-
-
- Other ways to install
-
-
- Not on Nix? The install script and the upstream .deb, .rpm and
- AppImage downloads cover most other systems. The AUR packages and the
- fork Flatpak remote are not published yet.
-
-
-
- );
+export default function NixosNoticePage() {
+ return ;
}
diff --git a/web/src/app/install/page.tsx b/web/src/app/install/page.tsx
index 67527f8..406c34c 100644
--- a/web/src/app/install/page.tsx
+++ b/web/src/app/install/page.tsx
@@ -1,236 +1,104 @@
import Link from "next/link";
import { type Metadata } from "next";
-import { ChevronRight, Cpu, Laptop, Terminal } from "lucide-react";
import { SeoSubpageShell } from "@/components/seo-subpage-shell";
import { TerminalBlock } from "@/components/terminal-block";
+import { buildPageMetadata, SOURCE_REPO_URL } from "@/lib/seo";
import {
- buildPageMetadata,
- SOURCE_REPO_URL,
- UPSTREAM_REPO_URL,
-} from "@/lib/seo";
-
-const installCommand =
- "curl -fsSL https://raw.githubusercontent.com/VocaHQ/vocalinux/main/install.sh -o /tmp/vl.sh && bash /tmp/vl.sh --interactive";
-const installDisplayCommand = `curl -fsSL \\
- https://raw.githubusercontent.com/VocaHQ/vocalinux/main/install.sh \\
- -o /tmp/vl.sh && \\
-bash /tmp/vl.sh --interactive`;
-
-const codeClass =
- "rounded bg-muted px-1.5 py-0.5 font-mono text-sm text-foreground";
-
-const distroGuides = [
- {
- name: "Ubuntu",
- href: "/install/ubuntu/",
- description:
- "Install offline voice dictation on Ubuntu 24.04+ with GNOME, KDE, X11, or Wayland.",
- icon: Laptop,
- },
- {
- name: "Fedora",
- href: "/install/fedora/",
- description:
- "Set up speech-to-text on Fedora Workstation and Silverblue with distro-specific notes.",
- icon: Terminal,
- },
- {
- name: "Arch Linux",
- href: "/install/arch/",
- description:
- "Install Voculinux on Arch, Manjaro, and EndeavourOS with package prerequisites and tips.",
- icon: Cpu,
- },
- {
- name: "Debian",
- href: "/install/debian/",
- description:
- "Debian 12+ with the install script or the native .deb package.",
- icon: Terminal,
- },
- {
- name: "openSUSE",
- href: "/install/opensuse/",
- description: "Set up offline voice typing on openSUSE Tumbleweed.",
- icon: Cpu,
- },
- {
- name: "Linux Mint",
- href: "/install/linux-mint/",
- description:
- "Voice dictation on Linux Mint releases built on Ubuntu 24.04.",
- icon: Laptop,
- },
- {
- name: "Pop!_OS",
- href: "/install/pop-os/",
- description: "Install Voculinux on Pop!_OS 24.04 and later.",
- icon: Laptop,
- },
- {
- name: "NixOS",
- href: "/install/nixos/",
- description: "Use the Nix flake or the NixOS module shipped since v0.18.2.",
- icon: Terminal,
- },
-];
+ VOID_INSTALL_COMMANDS,
+ VOID_KEY_FINGERPRINT,
+ VOID_UPDATE_COMMAND,
+} from "@/lib/void-channel";
export const metadata: Metadata = buildPageMetadata({
- title: "Install Speech to Text on Linux (Ubuntu, Fedora, Arch)",
+ title: "Install Voculinux on Void Linux",
description:
- "Linux voice dictation install guides for Ubuntu, Debian, Fedora, Arch, openSUSE, Mint, Pop!_OS, NixOS, and Flatpak. Start offline speech-to-text.",
+ "Install Voculinux on Void Linux (glibc, x86_64) from its signed xbps repository: trust the key, register the repository, then run xbps-install.",
path: "/install",
keywords: [
- "install voice dictation linux",
- "linux speech to text setup",
- "ubuntu voice typing install",
- "fedora speech recognition",
- "arch linux dictation",
+ "void linux voice dictation",
+ "install voice dictation void linux",
+ "xbps voice dictation",
+ "void linux speech to text",
+ "offline voice typing linux",
],
});
-export default function InstallGuidesPage() {
+export default function InstallPage() {
return (
-
Linux installation
-
Install Voice Dictation on Linux
+
Void Linux install
+
Install Voculinux on Void Linux
- Pick your distro guide and follow a proven setup flow for offline
- speech-to-text on Linux. Every guide is written for real desktop
- usage.
+ Voculinux is packaged for Void Linux (glibc, x86_64) as a signed xbps
+ repository. Trust the key, register the repository, then install the
+ package with xbps.
+
+
+ This is a third-party repository published by this project, not by
+ Void Linux upstream. It covers Void Linux glibc x86_64 only. Other
+ channels are not published for Voculinux.
- Then launch vocalinux — the upstream binary the script
- installs today. Fork releases will ship voculinux.
-
-
- Fork status: this command fetches the upstream install script, so it
- installs Vocalinux (upstream), not Voculinux. Fork release artefacts
- are not published yet.
-
- Fork status: packaged artefacts (AppImage, .deb/.rpm, Flatpak, Snap,
- AUR) are not published yet. The AppImage card links upstream
- artefacts; the Snap and AUR cards name the planned fork packages and
- do not link anywhere until the first fork release lands.
+ Repository key fingerprint: {VOID_KEY_FINGERPRINT}. The
+ key file is named by its fingerprint, so xbps finds it on the first
+ sync and asks nothing. If xbps still shows a fingerprint prompt,
+ answer N unless it reads exactly this fingerprint; the
+ release's FINGERPRINT file carries the same value.
+ Do not add -y to the first sync: it would accept an
+ unknown key without asking.
+ Packaged installs point their update prompts at xbps, so update with
+ this command.
+
After installation
- Launch with voculinux once fork
- releases are published. The install command above fetches the
- upstream script, so today it puts{" "}
- vocalinux (upstream) on your PATH
- instead.
+ Launch with voculinux from a terminal or the
+ application menu.
+
+
+ Hotkeys need the input group: sudo usermod -aG input{" "}
+ with your user name, then log out and back in.
Hold Right Alt (Option) to dictate, or switch to toggle mode in
Settings.
- Choose whisper.cpp for speed, Whisper for maximum model
- compatibility, or VOSK for low-RAM systems.
+ Speech models are not in the package. They download on first run
+ into ~/.local/share/voculinux and are checked against
+ pinned checksums.
+
+
+ Optional engines (VOSK, OpenAI Whisper, Parakeet, Faster Whisper and
+ onnxruntime for VAD) come from your own Python environment, not
+ xbps.
+
+
+ ydotool is not packaged for Void, so that text-injection fallback is
+ absent.
@@ -244,6 +112,21 @@ export default function InstallGuidesPage() {
.
+
);
}
diff --git a/web/src/app/languages/page.tsx b/web/src/app/languages/page.tsx
index 35987a7..976d4af 100644
--- a/web/src/app/languages/page.tsx
+++ b/web/src/app/languages/page.tsx
@@ -339,8 +339,8 @@ export default function LanguagesPage() {
dateModified: "2026-07-29",
author: {
"@type": "Person",
- name: "Jatin K Malik",
- url: "https://github.com/jatinkrmalik",
+ name: "Xavier Karma",
+ url: "https://bongbetic.com",
},
publisher: {
"@type": "Organization",
diff --git a/web/src/app/layout.tsx b/web/src/app/layout.tsx
index 0d69637..382f67d 100644
--- a/web/src/app/layout.tsx
+++ b/web/src/app/layout.tsx
@@ -8,7 +8,6 @@ import {
SOURCE_REPO_URL,
SITE_NAME,
SITE_URL,
- TWITTER_HANDLE,
} from "@/lib/seo";
export const viewport = {
@@ -41,12 +40,12 @@ export const metadata: Metadata = {
"wayland voice dictation",
"x11 speech recognition",
"open source dictation software",
- "voice typing ubuntu",
- "voice typing fedora",
- "voice typing arch linux",
+ "voice dictation void linux",
+ "void linux speech to text",
+ "xbps voice typing",
],
- authors: [{ name: "Jatin K Malik", url: "https://github.com/jatinkrmalik" }],
- creator: "Jatin K Malik",
+ authors: [{ name: "Xavier Karma", url: "https://bongbetic.com" }],
+ creator: "Xavier Karma",
publisher: SITE_NAME,
icons: {
icon: [
@@ -80,7 +79,7 @@ export const metadata: Metadata = {
siteName: SITE_NAME,
title: "Voculinux: Offline Speech to Text & Voice Dictation for Linux",
description:
- "Voice dictation for Linux with local engines or an optional Remote API. Install in minutes and dictate in any app on Ubuntu, Fedora, Arch, X11, or Wayland.",
+ "Voice dictation for Linux with local engines or an optional Remote API. Install from the signed Void Linux repository and dictate in any app on X11 or Wayland.",
images: [
{
url: DEFAULT_OG_IMAGE_PATH,
@@ -96,8 +95,6 @@ export const metadata: Metadata = {
description:
"Speech-to-text for Linux with whisper.cpp and VOSK. Local engines by default, optional Remote API, open source.",
images: [DEFAULT_OG_IMAGE_PATH],
- creator: TWITTER_HANDLE,
- site: TWITTER_HANDLE,
},
robots: {
index: true,
@@ -127,7 +124,12 @@ const organizationJsonLd = {
url: absoluteUrl("/"),
logo: absoluteUrl("/voculinux.png"),
description: "Open-source, offline voice dictation software for Linux.",
- sameAs: [SOURCE_REPO_URL, "https://bongbetic.com"],
+ parentOrganization: {
+ "@type": "Organization",
+ name: "Bongbetic",
+ url: "https://bongbetic.com",
+ },
+ sameAs: [SOURCE_REPO_URL],
};
const webSiteJsonLd = {
diff --git a/web/src/app/local-gateway/page.tsx b/web/src/app/local-gateway/page.tsx
index d743aea..cbc4079 100644
--- a/web/src/app/local-gateway/page.tsx
+++ b/web/src/app/local-gateway/page.tsx
@@ -1,470 +1,14 @@
-import Link from "next/link";
import { type Metadata } from "next";
-import type { ReactNode } from "react";
-import {
- AlertTriangle,
- ChevronRight,
- ExternalLink,
- Lock,
- Server,
-} from "lucide-react";
-import { SeoSubpageShell } from "@/components/seo-subpage-shell";
-import { absoluteUrl, buildPageMetadata } from "@/lib/seo";
-
-const PAGE_PATH = "/local-gateway";
-const PAGE_TITLE = "Run a Local VocaGateway for Linux Dictation";
-const PAGE_DESCRIPTION =
- "Start a local VocaGateway from Voculinux Settings with podman or docker, connect it via Remote API, and learn why gateway mode is not on-device transcription.";
-
-const comparisonRows = [
- {
- mode: "Local engine (default whisper.cpp)",
- audio: "Stays on this machine; transcribed in the app",
- setup: "Download a model once",
- network: "None for transcription",
- },
- {
- mode: "Local VocaGateway on 127.0.0.1",
- audio: "Sent over HTTP to the gateway container on this machine",
- setup: "podman or docker with Compose",
- network: "Loopback only by default",
- },
- {
- mode: "Gateway or Remote API on another machine",
- audio: "Leaves this machine for the endpoint you configured",
- setup: "Server URL and token in Remote Server",
- network: "Your LAN, VPN or the internet",
- },
-];
-
-const statusRows = [
- { status: "Stopped", meaning: "Not running." },
- {
- status: "Starting",
- meaning: "Compose up in progress, or the live probe is not green yet.",
- },
- { status: "Live", meaning: "The gateway answers /health/live." },
- {
- status: "Pairable",
- meaning:
- "Live, plus a non-loopback phone URL and bearer token for pairing.",
- },
- {
- status: "Ready",
- meaning: "/health/ready returns 200 (a model is selected in the gateway).",
- },
- {
- status: "Error",
- meaning: "Start, stop or probe failure; the subtitle says which.",
- },
-];
-
-const steps = [
- {
- name: "Open the Advanced section",
- text: "Open Settings → Speech Model and expand Advanced. The Local VocaGateway group sits next to Remote Server.",
- },
- {
- name: "Run the gateway",
- text: "Click Run VocaGateway locally. The first start builds the local image vocagateway:v0.1.0 from the pinned tag, so it takes longer than later starts.",
- },
- {
- name: "Wait for Ready",
- text: "Watch the Status row. Select a model in the gateway's own web UI; the status shows Ready once the gateway reports it can transcribe.",
- },
- {
- name: "Use this Gateway",
- text: "Click Use this Gateway. Voculinux fills Remote Server with the gateway URL and bearer token, sets the endpoint to /v1/audio/transcriptions and switches the engine to Remote API.",
- },
- {
- name: "Dictate and verify",
- text: "Use Test Connection in Remote Server, then dictate as usual with your normal shortcut.",
- },
-];
-
-const faqs = [
- {
- question: "Is a local gateway the same as on-device dictation?",
- answer:
- "No. Even on 127.0.0.1, audio leaves the Voculinux client and is transcribed by a separate gateway process over HTTP. The on-device path is a local engine such as whisper.cpp, which stays the default.",
- },
- {
- question: "Does quitting Voculinux stop the gateway?",
- answer:
- "No. The pinned compose file uses restart: unless-stopped, so the container keeps running after Quit. Use Stop local Gateway in Settings or the tray menu.",
- },
- {
- question: "Can I run it from the Flatpak?",
- answer:
- "No. The Flatpak sandbox cannot reach the host podman or docker socket. Use the native package or AppImage, or start VocaGateway on the host yourself and point Remote Server at it.",
- },
- {
- question: "Do I need a Voca account?",
- answer:
- "No. VocaGateway is optional self-hosted software. There is no Voca account and no hosted Voca cloud.",
- },
- {
- question: "How do I go back to on-device transcription?",
- answer:
- "Choose a local engine again under Speech Engine in Settings → Speech Model → Advanced. Stop the gateway too if you no longer need it.",
- },
-];
+import { ChannelNotice } from "@/components/channel-notice";
+import { buildPageMetadata } from "@/lib/seo";
export const metadata: Metadata = buildPageMetadata({
- title: `${PAGE_TITLE} | Voculinux`,
- description: PAGE_DESCRIPTION,
- path: PAGE_PATH,
- keywords: [
- "vocagateway linux",
- "local speech gateway podman",
- "self hosted dictation gateway",
- "voculinux remote api gateway",
- "docker speech to text linux dictation",
- "phone dictation gateway linux",
- ],
+ title: "Local Gateway: Not Published for Voculinux",
+ description:
+ "The local gateway is not published for Voculinux. The Void Linux package ships the on-device engines; remote engines are configured in Settings.",
+ path: "/local-gateway",
});
-function InlineCode({ children }: { children: ReactNode }) {
- return (
-
- {children}
-
- );
-}
-
-export default function LocalGatewayPage() {
- const jsonLd = {
- "@context": "https://schema.org",
- "@graph": [
- {
- "@type": "TechArticle",
- headline: PAGE_TITLE,
- description: PAGE_DESCRIPTION,
- dateModified: "2026-11-01",
- author: {
- "@type": "Person",
- name: "Jatin K Malik",
- url: "https://github.com/jatinkrmalik",
- },
- publisher: {
- "@type": "Organization",
- name: "Voculinux",
- logo: {
- "@type": "ImageObject",
- url: absoluteUrl("/voculinux.png"),
- },
- },
- mainEntityOfPage: absoluteUrl(PAGE_PATH),
- },
- {
- "@type": "HowTo",
- name: "Run a local VocaGateway from Voculinux Settings",
- step: steps.map((step, index) => ({
- "@type": "HowToStep",
- position: index + 1,
- name: step.name,
- text: step.text,
- })),
- },
- {
- "@type": "FAQPage",
- mainEntity: faqs.map((faq) => ({
- "@type": "Question",
- name: faq.question,
- acceptedAnswer: { "@type": "Answer", text: faq.answer },
- })),
- },
- ],
- };
-
- return (
-
-
-
-
-
Added in v0.18.0 · optional
-
- Run a local VocaGateway from Voculinux
-
-
- Voculinux can start{" "}
-
- VocaGateway
-
- , the self-hosted speech gateway in the Voca family, as a podman or
- docker container from its own Settings. It is a power-user path for
- people who want one transcription service shared by the desktop and a
- paired phone.
-
-
-
-
-
-
- Gateway mode is not the on-device engine
-
-
- With a local engine, audio is transcribed on this machine by Voculinux
- itself. In gateway mode it is sent over HTTP to the gateway, even when
- that gateway runs on 127.0.0.1. If you point
- Voculinux at a gateway on another machine, your audio leaves this
- machine for that endpoint. Keep it on a trusted LAN, an encrypted
- private network such as Tailscale, or HTTPS, and never expose port
- 8765 to the public internet. Enabling the gateway does not change the
- default engine; whisper.cpp stays on-device until you click Use this
- Gateway.
-
-
-
-
-
- Where your audio goes
-
-
-
-
-
-
- Mode
-
-
- Audio
-
-
- Setup
-
-
- Network
-
-
-
-
- {comparisonRows.map((row) => (
-
-
- {row.mode}
-
-
- {row.audio}
-
-
- {row.setup}
-
-
{row.network}
-
- ))}
-
-
-
-
-
-
-
-
- Requirements
-
-
-
- podman (preferred) or docker, with a working Compose plugin, or{" "}
- podman-compose /{" "}
- docker-compose. If the engine is present
- but Compose is missing, Settings tells you which to install.
-
-
- A native install or the AppImage. The AppImage does not bundle a
- container engine; it uses the host's podman or docker socket
- when available.
-
-
- Not the Flatpak: its sandbox cannot reach the host container socket,
- so the controls are blocked there.
-
-
-
-
-
-
Set it up
-
- {steps.map((step, index) => (
-
-
-
- {index + 1}
-
-
{step.name}
-
-
{step.text}
-
- ))}
-
-
Status labels
-
-
-
- {statusRows.map((row) => (
-
-
- {row.status}
-
-
{row.meaning}
-
- ))}
-
-
-
-
- Pairable can appear before Ready, so a phone can pair while a model is
- still downloading.
-
-
-
-
-
- What Voculinux sets up
-
-
-
- A checkout of VocaGateway pinned to the{" "}
- v0.1.0 tag under your XDG cache, run as the
- Compose project vocagateway with the{" "}
- cpu profile. It never floats on{" "}
- latest;{" "}
- VOCAGATEWAY_IMAGE overrides the image.
-
-
- A private bootstrap token in{" "}
- ~/.config/voculinux/gateway_embed/ with
- mode 600, plus a matching Compose .env.
-
-
- A port published on 127.0.0.1:8765 by
- default, reachable from this desktop only.
-
-
- The usual Remote API settings. Use this Gateway writes the URL,
- token, endpoint and the model name{" "}
- whisper-1 into the same{" "}
- remote_api_* keys described on the{" "}
-
- Remote API page
-
- . The token is stored in plain JSON in{" "}
- config.json, like any Remote API key.
-
-
-
-
-
-
-
- LAN access, stopping and gotchas
-
-
Allow LAN access for Phone
-
- This switch publishes the gateway on{" "}
- 0.0.0.0:8765 and advertises a LAN URL for
- phone pairing. Open port 8765 in your firewall only on networks you
- trust. If the switch fails, Compose keeps the previous bind and the
- switch snaps back with an error; stop and run again, or retry.
-
-
Quit does not stop it
-
- The container keeps running after you quit Voculinux, including a
- LAN-published one. Use Stop local Gateway in Settings or the tray
- menu, which appears whenever Compose is running. Stopping keeps the
- named data volume, so downloaded models survive. Voculinux does not
- start the gateway on login.
-
-
Other machines
-
- You can also run VocaGateway on a stronger box and enter its address
- in Remote Server by hand. Audio then crosses your network, so prefer a
- trusted LAN, Tailscale or HTTPS. Read the{" "}
-
- VocaGateway documentation
-
- {" "}
- for server-side setup.
-
- Voculinux is 100% open source under the AGPL-3.0 license, a hard fork of
- Vocalinux (upstream, by VocaHQ). No subscriptions, no vendor lock-in, no
- hidden costs. Local engines keep audio on the machine. Remote API is
- optional.
+ Voculinux is 100% open source under the AGPL-3.0 license and is a fork
+ of an upstream project, credited in the site footer. No subscriptions,
+ no vendor lock-in, no hidden costs. Local engines keep audio on the
+ machine. Remote API is optional.
diff --git a/web/src/app/page.tsx b/web/src/app/page.tsx
index 6c52bb1..6862f9d 100644
--- a/web/src/app/page.tsx
+++ b/web/src/app/page.tsx
@@ -5,25 +5,12 @@ import Link from "next/link";
import Image from "next/image";
import { SiteChrome } from "@/components/site-chrome";
import { TerminalBlock, TerminalPrompt } from "@/components/terminal-block";
-import { SOURCE_REPO_URL, UPSTREAM_REPO_URL } from "@/lib/seo";
-
-// The install and uninstall scripts below are fetched from upstream: the fork
-// has no published raw script host yet. The install section labels this.
-const UPSTREAM_REPO_PATH = UPSTREAM_REPO_URL.replace("https://github.com/", "");
-const UPSTREAM_RAW_BASE = `https://raw.githubusercontent.com/${UPSTREAM_REPO_PATH}`;
-
-const installCommands = {
- interactiveInstallCommand: `curl -fsSL ${UPSTREAM_RAW_BASE}/main/install.sh -o /tmp/vl.sh && bash /tmp/vl.sh --interactive`,
- interactiveInstallDisplayCommand: `curl -fsSL \\
- ${UPSTREAM_RAW_BASE}/main/install.sh \\
- -o /tmp/vl.sh && \\
-bash /tmp/vl.sh --interactive`,
- uninstallCommand: `curl -fsSL ${UPSTREAM_RAW_BASE}/main/uninstall.sh -o /tmp/vul.sh && bash /tmp/vul.sh`,
- uninstallDisplayCommand: `curl -fsSL \\
- ${UPSTREAM_RAW_BASE}/main/uninstall.sh \\
- -o /tmp/vul.sh && \\
-bash /tmp/vul.sh`,
-};
+import { absoluteUrl, SOURCE_REPO_URL } from "@/lib/seo";
+import {
+ VOID_INSTALL_COMMANDS,
+ VOID_KEY_FINGERPRINT,
+ VOID_UPDATE_COMMAND,
+} from "@/lib/void-channel";
const homeJsonLd = [
{
@@ -45,11 +32,11 @@ const homeJsonLd = [
softwareVersion: "0.18.5",
author: {
"@type": "Person",
- name: "Jatin K Malik",
- url: "https://github.com/jatinkrmalik",
+ name: "Xavier Karma",
+ url: "https://bongbetic.com",
},
url: "https://voculinux.com/",
- downloadUrl: SOURCE_REPO_URL,
+ downloadUrl: absoluteUrl("/install/"),
screenshot: "https://voculinux.com/og-image.png",
featureList: [
"Local speech recognition with whisper.cpp, Faster Whisper, Whisper, VOSK, and Parakeet",
@@ -60,8 +47,7 @@ const homeJsonLd = [
"Left/right modifier key distinction for shortcuts",
"Optional voice commands with VOSK-aware defaults",
"Searchable sidebar settings",
- "AppImage, .deb, .rpm, and Flatpak packages for x86_64 and aarch64",
- "Snap package on the Ubuntu Snap Store",
+ "Signed xbps package for Void Linux (glibc, x86_64)",
"Expanded speech-language catalog including Hungarian (per-engine availability)",
"Auto-capitalize sentences after punctuation",
"Trailing space after completed transcriptions for continuous dictation",
@@ -98,7 +84,7 @@ const homeJsonLd = [
name: "Does Voculinux collect usage telemetry?",
acceptedAnswer: {
"@type": "Answer",
- text: "No. The installed app does not send usage telemetry or analytics events. Its update checker only asks GitHub Releases whether a newer version exists.",
+ text: "No. The installed app does not send usage telemetry or analytics events. Its update checker only asks the Voculinux release host whether a newer version exists.",
},
},
{
@@ -106,7 +92,7 @@ const homeJsonLd = [
name: "Which Linux distributions are supported?",
acceptedAnswer: {
"@type": "Answer",
- text: "Voculinux supports Ubuntu, Fedora, Debian, Arch, Linux Mint, Pop!_OS, and other modern Linux distributions across X11 and Wayland.",
+ text: "The published package is for Void Linux (glibc, x86_64), installed from a signed xbps repository. Voculinux runs on X11 and Wayland.",
},
},
{
@@ -138,27 +124,28 @@ const homeJsonLd = [
{
"@context": "https://schema.org",
"@type": "HowTo",
- name: "Install Voculinux on Linux",
- description: "Install offline voice dictation on Linux in a few minutes.",
+ name: "Install Voculinux on Void Linux",
+ description:
+ "Install offline voice dictation on Void Linux from the signed xbps repository.",
totalTime: "PT10M",
step: [
{
"@type": "HowToStep",
- name: "Run the install command",
- text: "Copy the install command from voculinux.com and run it in terminal.",
- url: "https://voculinux.com/#install",
+ name: "Trust the key and add the repository",
+ text: "As root, fetch the repository key into /var/db/xbps/keys and write the xbps.d repository line.",
+ url: absoluteUrl("/install/"),
},
{
"@type": "HowToStep",
- name: "Complete the guided setup",
- text: "Pick your speech engine and model size in the interactive installer.",
- url: "https://voculinux.com/#install",
+ name: "Install the package",
+ text: "Run xbps-install -S voculinux.",
+ url: absoluteUrl("/install/"),
},
{
"@type": "HowToStep",
name: "Start dictating",
text: "Launch voculinux and hold Right Alt (Option) to begin dictation, or choose toggle mode in Settings.",
- url: "https://voculinux.com/#install",
+ url: absoluteUrl("/install/"),
},
],
},
@@ -229,10 +216,7 @@ function formatPanelClock(date: Date): string {
}
const ribbonItems = [
- "Ubuntu",
- "Fedora",
- "Debian",
- "Arch",
+ "Void Linux",
"X11",
"Wayland",
"on-device",
@@ -245,12 +229,6 @@ const ribbonItems = [
export default function HomePage() {
const [panelClock, setPanelClock] = useState("");
- const {
- interactiveInstallCommand,
- interactiveInstallDisplayCommand,
- uninstallCommand,
- uninstallDisplayCommand,
- } = installCommands;
useEffect(() => {
const tick = () => setPanelClock(formatPanelClock(new Date()));
@@ -668,8 +646,8 @@ export default function HomePage() {
Your voice has a path. We show you which one.
- Voculinux does not need a Voca cloud to transcribe. The important
- boundary is the engine you selected.
+ Voculinux does not need a cloud service to transcribe. The
+ important boundary is the engine you selected.
@@ -716,9 +694,9 @@ export default function HomePage() {
What uses a network
- Model downloads, the update check against GitHub Releases, and
- any Remote API host you add. Nothing is sent to a Voca speech
- cloud.
+ Model downloads, the update check against the Voculinux release
+ host, and any Remote API host you add. The default engines send
+ no audio off the machine.
@@ -736,138 +714,39 @@ export default function HomePage() {
- Install in one command.
+ Install from the Void repository.
- The interactive installer detects hardware, lets you pick an
- engine, and wires the desktop app. Ubuntu, Fedora, Debian, Arch,
- and openSUSE. Native .deb, .rpm, Snap, and Flatpak packages are
- planned for every fork release.
+ Voculinux is packaged for Void Linux (glibc, x86_64) as a signed
+ xbps repository. Trust the key, register the repository, then
+ install the package. This is a third-party repository published by
+ this project, not by Void Linux upstream.
-
- Then launch vocalinux — the upstream binary the script
- installs today. Fork releases will ship voculinux.
+
+ Repository key fingerprint: {VOID_KEY_FINGERPRINT}. If
+ xbps asks about a fingerprint, answer N unless it
+ matches exactly. Do not add -y to the first sync.
- Fork status: this command fetches the upstream install script, so it
- installs Vocalinux (upstream), not Voculinux. Fork release artefacts
- are not published yet.
+ Update later with {VOID_UPDATE_COMMAND}. Other channels
+ are not published for Voculinux (Void only). The full install notes
+ are in the Void install guide. The
+ source, issues and releases are on the{" "}
+
+ fork host
+
+ .
- Fork status: packaged artefacts (AppImage, .deb/.rpm, Flatpak, Snap,
- AUR, xbps) are not published yet. The AppImage card links upstream
- artefacts; the Snap and AUR cards name the planned fork packages and
- do not link anywhere until the first fork release lands.
-
@@ -896,15 +775,16 @@ export default function HomePage() {
{
question: "Does Voculinux collect usage telemetry?",
answer:
- "No. The installed app does not send usage telemetry or analytics events. Its update checker only asks GitHub Releases whether a newer version exists.",
+ "No. The installed app does not send usage telemetry or analytics events. Its update checker only asks the Voculinux release host whether a newer version exists.",
},
{
question: "Which Linux distributions are supported?",
answer: (
<>
- Ubuntu 24.04+, Debian 12+, Fedora 39+, Arch, openSUSE
- Tumbleweed, and most modern desktops on X11 or Wayland.{" "}
- Install guides.
+ The published package is for Void Linux (glibc, x86_64),
+ installed from a signed xbps repository. Voculinux runs on
+ X11 and Wayland. Install guide
+ .
>
),
},
@@ -1010,25 +890,6 @@ export default function HomePage() {
Linux.
-
-
-
-
- Upstream
-
- Provenance
-
-
Vocalinux (upstream)
-
- The upstream Linux dictation app this fork is ported from. Fixes
- are taken by hand, one at a time.
-