diff --git a/tests/test_rename_sweep.py b/tests/test_rename_sweep.py index f3b88ec..07e9207 100644 --- a/tests/test_rename_sweep.py +++ b/tests/test_rename_sweep.py @@ -1,4 +1,4 @@ -"""Ticket #18: offline naming-sweep — no old-name strings on user-visible surfaces. +"""Ticket #18 + #24: offline naming-sweep — no old-name strings on surfaces. The fork takes its own name everywhere a user can see it. Anything still spelling the old name must be on the allowlist below: @@ -10,8 +10,9 @@ spelling the old name must be on the allowlist below: - one-time-legacy import sources (old config/dictionary/bus literals), - generated or historical files (``uv.lock``, ``requirements/*.txt``, ``CHANGELOG.md``), -- the rest of ``web/`` (owned by ticket #24; only ``page.tsx`` and - ``package.json`` belong to this ticket). +- web upstream surfaces (ticket #24): upstream GitHub/raw/nix flake URLs, + nix flake API identifiers, and the nixos-page fork-status note that names + the upstream flake as installing Vocalinux rather than Voculinux. """ import os @@ -21,7 +22,7 @@ REPO_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) OLD_NAME = re.compile(r"vocalinux", re.IGNORECASE) -SKIP_DIRS = {".git", "__pycache__", ".venv", "venv", "node_modules", ".next", "build", "dist"} +SKIP_DIRS = {".git", "__pycache__", ".venv", "venv", "node_modules", ".next", "build", "dist", "out"} SKIP_SUFFIXES = (".egg-info",) SKIP_FILES = {"uv.lock", "CHANGELOG.md"} SKIP_PREFIXES = ("requirements/",) @@ -45,7 +46,8 @@ BINARY_EXTS = ( ".pyc", ) -#: web/ belongs to ticket #24 except the two rename-inventory files. +#: web/ was fully rebranded in ticket #24; only upstream-provenance lines +#: (matched in _allowed) may still spell the old name there. WEB_OWNED = {"web/src/app/page.tsx", "web/package.json"} @@ -57,6 +59,10 @@ def _allowed(path: str, line: str) -> bool: if "vocalinux" in low and "voculinux" in low: # Migration-compat shims that name both installs at once. return True + if "upstream" in low: + # Upstream-provenance mentions that explicitly label the old name + # as upstream (fork-status notes, provenance cards). + return True if "/{name}/vocalinux" in line: # Upstream repo-name template (retained provenance). return True @@ -101,6 +107,12 @@ def _allowed(path: str, line: str) -> bool: if '"src"' in line and '"vocalinux"' in line: # Retained module-dir path segments in tests and tooling. return True + if path == "web/src/app/install/nixos/page.tsx": + # The Nix flake is upstream's: flake URL, input/output names, module + # paths, and programs.* options spell the retained upstream API. + # The page carries a fork-status note stating those snippets install + # Vocalinux (upstream), not Voculinux. + return True if path == "tests/test_rename_sweep.py": return True if path == "pyproject.toml" and re.search(r'"vocalinux[."\'\]]', line): @@ -126,8 +138,6 @@ def _iter_files(): rel = os.path.relpath(full, REPO_ROOT) if rel.startswith(SKIP_PREFIXES): continue - if rel.startswith("web/") and rel not in WEB_OWNED: - continue yield rel, full diff --git a/web/AGENTS.md b/web/AGENTS.md index 2a0e7b4..d572133 100644 --- a/web/AGENTS.md +++ b/web/AGENTS.md @@ -1,10 +1,10 @@ -# AGENTS.md — vocalinux.com (`web/`) +# AGENTS.md — voculinux.com (`web/`) Guidelines for agents working on the marketing site only. For the Python desktop app, git worktrees, and PR rules, see the repo root [`AGENTS.md`](../AGENTS.md). Do not create branches, commits, or pull requests in the primary checkout. ## What this package is -Next.js (App Router) static marketing + SEO guides for Vocalinux. Source lives here; production deploys from `web/` (static export to `out/`). +Next.js (App Router) static marketing + SEO guides for Voculinux. Source lives here; production deploys from `web/` (static export to `out/`). ## Product and design authority diff --git a/web/DESIGN.md b/web/DESIGN.md index 2a92231..d23a69f 100644 --- a/web/DESIGN.md +++ b/web/DESIGN.md @@ -1,6 +1,6 @@ --- -name: Vocalinux website -description: Linux voice dictation marketing site in the Voca family workbench language +name: Voculinux website +description: Linux voice dictation marketing site in the Carbon-mapped house-palette language colors: paper: "#f4f1e8" paper-deep: "#ebe5d8" @@ -31,13 +31,13 @@ spacing: section-y: "5.5rem" --- -# Design system: vocalinux.com +# Design system: voculinux.com ## Overview -**Creative north star: the Linux desk in the Voca family** +**Creative north star: the Linux desk, Carbon-mapped to the house palette** -Vocalinux.com is a Voca product site. It should feel related to VocaHQ, VocaMac, VocaPhone, and VocaGateway before anyone reads the logo: warm paper, deep green ink, one teal accent, editorial type, flat surfaces, and real product proof. +Voculinux.com is the fork site. It adopts Carbon's spacing, type-role, motion, and contrast discipline remapped to the house palette — warm paper, deep green ink, one teal accent, editorial type, flat surfaces, and real product proof. Carbon blue and Carbon typefaces are not adopted; system stacks only. Bongbetic appears only as attribution chrome in the header and footer, linking hosted assets. The Linux-specific job is to show local desktop dictation with distribution and display-server truth. Pair a GTK-style window (not macOS traffic lights) with a terminal. Explain the user outcome before the install command. @@ -82,7 +82,7 @@ Warm paper with one product teal. No second chromatic brand color. ## Typography -System-first, same stacks as VocaHQ / VocaMac. +System-first, system stacks only; no remote webfonts. - **Display:** Avenir Next / Helvetica Neue / Segoe UI / Arial - **Body:** system UI sans @@ -119,7 +119,7 @@ Flat fills, 1px borders, paper-window shadows. Small rotations only on decorativ ### Buttons - Primary: brand teal, paper-bright text, 44px min height -- Homepage / closing CTA: "Install Vocalinux", jumps to `#install` +- Homepage / closing CTA: "Install Voculinux", jumps to `#install` - Secondary: transparent with a 3:1 control outline - Hover: 2px lift, no bounce scale as the only affordance - Focus: 3px sun outline, 3px offset @@ -137,7 +137,7 @@ Flat fills, 1px borders, paper-window shadows. Small rotations only on decorativ ### Navigation - Sticky paper bar, mark + name, 3–5 text links, GitHub stars on desktop -- Mobile menu keeps Install Vocalinux as the conversion action +- Mobile menu keeps Install Voculinux as the conversion action - Real mobile disclosure with `aria-expanded` - Resource-rich footer, not a second mega-menu in the header @@ -159,4 +159,4 @@ Flat fills, 1px borders, paper-window shadows. Small rotations only on decorativ - macOS traffic-light chrome on Linux surfaces - Tracked uppercase eyebrows on every section - Invent metrics, testimonials, or "AI-powered" claims -- Recolor the Vocalinux mark +- Recolor the Voculinux mark diff --git a/web/PRODUCT.md b/web/PRODUCT.md index 31aab21..241e0b8 100644 --- a/web/PRODUCT.md +++ b/web/PRODUCT.md @@ -1,4 +1,4 @@ -# Product (vocalinux.com) +# Product (voculinux.com) ## Platform @@ -10,7 +10,7 @@ Linux desktop users who want voice dictation that stays on their machine: develo ## Product purpose -Vocalinux is free, open-source offline voice dictation for Linux. It turns speech into typed text in whatever app has focus, using local engines (whisper.cpp default, Faster Whisper, Whisper, VOSK, Parakeet) or an optional user-configured remote API. Success is: install once, dictate in any app, without cloud transcription or telemetry. +Voculinux is free, open-source offline voice dictation for Linux. It turns speech into typed text in whatever app has focus, using local engines (whisper.cpp default, Faster Whisper, Whisper, VOSK, Parakeet) or an optional user-configured remote API. Success is: install once, dictate in any app, without cloud transcription or telemetry. ## Positioning @@ -22,7 +22,7 @@ Offline-first Linux voice typing with real desktop integration (system tray, X11 - 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 vocalinux.com; source on GitHub +- Guides and comparison pages on voculinux.com; source on GitHub ## Capabilities and constraints @@ -44,9 +44,9 @@ Offline-first Linux voice typing with real desktop integration (system tray, X11 - 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, VocaHQ family sites, and talk-to-us links (GitHub, Discord, X, email) +- Settings About page groups this app, upstream project links retained as provenance, and talk-to-us links (GitHub, Discord, X, email) - Optional disable of the missing-tray warning dialog -- Settings → Audio family tone picker (Lift, Flick, Ember, Step, Voca, Soft, Chirp, Scale, Drop, Glass, Off) with Preview; new installs default to Voca; catalog files are the family preview WAVs +- 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 @@ -57,9 +57,10 @@ Offline-first Linux voice typing with real desktop integration (system tray, X11 ## Brand commitments -- Name: Vocalinux (part of [VocaHQ](https://vocahq.com) with VocaMac / VocaWin) -- Mark: shared Voca family mic for the app icon, tray states, and site favicons (`public/`) -- Warm paper surfaces and Voca teal, matching the family web standard +- 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 +- 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 - Voice: practical, specific, Linux-native; not hype-first SaaS copy ## Evidence on hand diff --git a/web/README.md b/web/README.md index 2b05135..ab24458 100644 --- a/web/README.md +++ b/web/README.md @@ -1,6 +1,6 @@ -# Vocalinux website +# Voculinux website -Marketing site for [vocalinux.com](https://vocalinux.com), built with Next.js and deployed as a static export (GitHub Pages). +Marketing site for [voculinux.com](https://voculinux.com), built with Next.js and deployed as a static export (GitHub Pages). Product claims and design constraints: [PRODUCT.md](PRODUCT.md), [DESIGN.md](DESIGN.md). Agent notes: [AGENTS.md](AGENTS.md). @@ -41,7 +41,7 @@ Open `http://localhost:3000`. ## Deployment -Push to `main` triggers the site workflow. Production host: **vocalinux.com**. +Push to `main` triggers the site workflow. Production host: **voculinux.com**. Manual path: @@ -51,7 +51,7 @@ npm install npm run deploy ``` -That produces `out/` with `.nojekyll` and a `CNAME` for vocalinux.com. +That produces `out/` with `.nojekyll` and a `CNAME` for voculinux.com. ## Layout @@ -87,4 +87,4 @@ web/ ## License -Same as the main Vocalinux project ([AGPL-3.0](../LICENSE)). +Same as the main Voculinux project ([AGPL-3.0](../LICENSE)). diff --git a/web/package-lock.json b/web/package-lock.json index c2c003b..55f4417 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -1,11 +1,11 @@ { - "name": "vocalinux-website", + "name": "voculinux-website", "version": "0.18.5", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "vocalinux-website", + "name": "voculinux-website", "version": "0.18.5", "dependencies": { "@types/node": "^20.14.10", diff --git a/web/public/brand/tux.md b/web/public/brand/tux.md index e615439..5d8349a 100644 --- a/web/public/brand/tux.md +++ b/web/public/brand/tux.md @@ -3,7 +3,7 @@ Linux mascot used on the Open Graph card. `tux.svg` is a flat derivative of Larry Ewing's Tux: the original -silhouette, filled with Vocalinux tokens (ink, paper-bright, sun). +silhouette, filled with Voculinux tokens (ink, paper-bright, sun). No gradients, blurs, or glares. `tux-classic.svg` is the unaltered Wikimedia vector. diff --git a/web/public/brand/vocalinux-mark-circle.svg b/web/public/brand/voculinux-mark-circle.svg similarity index 93% rename from web/public/brand/vocalinux-mark-circle.svg rename to web/public/brand/voculinux-mark-circle.svg index 5b522ea..7f8ffb0 100644 --- a/web/public/brand/vocalinux-mark-circle.svg +++ b/web/public/brand/voculinux-mark-circle.svg @@ -1,4 +1,4 @@ - + diff --git a/web/public/robots.txt b/web/public/robots.txt index 069df73..6756629 100644 --- a/web/public/robots.txt +++ b/web/public/robots.txt @@ -1,5 +1,5 @@ -# Robots.txt for Vocalinux -# https://vocalinux.com +# Robots.txt for Voculinux +# https://voculinux.com # # Intentionally permissive for marketing pages. Do not blanket-block # query-string URLs or /_next/static — those caused Google Search Console @@ -12,4 +12,4 @@ Disallow: /api/ Disallow: /out/ # Sitemap location -Sitemap: https://vocalinux.com/sitemap.xml +Sitemap: https://voculinux.com/sitemap.xml diff --git a/web/public/site.webmanifest b/web/public/site.webmanifest index 4f62132..6bdf16b 100644 --- a/web/public/site.webmanifest +++ b/web/public/site.webmanifest @@ -1,6 +1,6 @@ { - "name": "Vocalinux", - "short_name": "Vocalinux", + "name": "Voculinux", + "short_name": "Voculinux", "description": "Voice dictation for Linux with local engines and an optional Remote API.", "start_url": "/", "display": "standalone", @@ -8,7 +8,7 @@ "theme_color": "#0f6b57", "icons": [ { - "src": "/brand/vocalinux-mark-circle.svg", + "src": "/brand/voculinux-mark-circle.svg", "sizes": "any", "type": "image/svg+xml", "purpose": "any" diff --git a/web/public/sitemap.xml b/web/public/sitemap.xml index a2fd7c2..1191293 100644 --- a/web/public/sitemap.xml +++ b/web/public/sitemap.xml @@ -1,284 +1,284 @@ - https://vocalinux.com/ + https://voculinux.com/ 2026-11-01 weekly 1.0 - https://vocalinux.com/install/ + https://voculinux.com/install/ 2026-11-01 weekly 0.9 - https://vocalinux.com/install/ubuntu/ + https://voculinux.com/install/ubuntu/ 2026-11-01 monthly 0.8 - https://vocalinux.com/install/fedora/ + https://voculinux.com/install/fedora/ 2026-11-01 monthly 0.8 - https://vocalinux.com/install/arch/ + https://voculinux.com/install/arch/ 2026-11-01 monthly 0.8 - https://vocalinux.com/compare/ + https://voculinux.com/compare/ 2026-11-01 monthly 0.8 - https://vocalinux.com/changelog/ + https://voculinux.com/changelog/ 2026-06-11 weekly 0.7 - https://vocalinux.com/screenshots/ + https://voculinux.com/screenshots/ 2026-07-14 monthly 0.8 - https://vocalinux.com/faq/ + https://voculinux.com/faq/ 2026-11-01 monthly 0.8 - https://vocalinux.com/privacy/ + https://voculinux.com/privacy/ 2026-02-22 monthly 0.7 - https://vocalinux.com/shortcuts/ + https://voculinux.com/shortcuts/ 2026-02-22 monthly 0.6 - https://vocalinux.com/troubleshooting/ + https://voculinux.com/troubleshooting/ 2026-06-11 monthly 0.7 - https://vocalinux.com/use-cases/ + https://voculinux.com/use-cases/ 2026-02-22 monthly 0.8 - https://vocalinux.com/alternatives/ + https://voculinux.com/alternatives/ 2026-11-01 monthly 0.8 - https://vocalinux.com/languages/ + https://voculinux.com/languages/ 2026-11-01 monthly 0.8 - https://vocalinux.com/wayland/ + https://voculinux.com/wayland/ 2026-06-11 monthly 0.8 - https://vocalinux.com/remote-api/ + https://voculinux.com/remote-api/ 2026-06-11 monthly 0.8 - https://vocalinux.com/voice-activity-detection/ + https://voculinux.com/voice-activity-detection/ 2026-06-11 monthly 0.8 - https://vocalinux.com/advanced-settings/ + https://voculinux.com/advanced-settings/ 2026-06-11 monthly 0.8 - https://vocalinux.com/desktop-reliability/ + https://voculinux.com/desktop-reliability/ 2026-06-11 monthly 0.8 - https://vocalinux.com/rsi-prevention/ + https://voculinux.com/rsi-prevention/ 2026-02-22 monthly 0.8 - https://vocalinux.com/gpu-acceleration/ + https://voculinux.com/gpu-acceleration/ 2026-11-01 monthly 0.8 - https://vocalinux.com/open-source/ + https://voculinux.com/open-source/ 2026-11-01 monthly 0.8 - https://vocalinux.com/autostart/ + https://voculinux.com/autostart/ 2026-11-01 monthly 0.7 - https://vocalinux.com/for-developers/ + https://voculinux.com/for-developers/ 2026-02-22 monthly 0.8 - https://vocalinux.com/offline/ + https://voculinux.com/offline/ 2026-11-01 monthly 0.8 - https://vocalinux.com/vs-nerd-dictation/ + https://voculinux.com/vs-nerd-dictation/ 2026-03-30 monthly 0.8 - https://vocalinux.com/whisper-model-guide/ + https://voculinux.com/whisper-model-guide/ 2026-03-30 monthly 0.8 - https://vocalinux.com/voice-typing-vscode/ + https://voculinux.com/voice-typing-vscode/ 2026-03-30 monthly 0.8 - https://vocalinux.com/writers/ + https://voculinux.com/writers/ 2026-03-30 monthly 0.8 - https://vocalinux.com/gnome-kde/ + https://voculinux.com/gnome-kde/ 2026-03-30 monthly 0.8 - https://vocalinux.com/parakeet/ + https://voculinux.com/parakeet/ 2026-11-01 monthly 0.7 - https://vocalinux.com/faster-whisper/ + https://voculinux.com/faster-whisper/ 2026-11-01 monthly 0.7 - https://vocalinux.com/dictation-pad/ + https://voculinux.com/dictation-pad/ 2026-11-01 monthly 0.7 - https://vocalinux.com/transcribe-audio-files/ + https://voculinux.com/transcribe-audio-files/ 2026-11-01 monthly 0.7 - https://vocalinux.com/custom-dictionary/ + https://voculinux.com/custom-dictionary/ 2026-11-01 monthly 0.7 - https://vocalinux.com/multilingual-dictation/ + https://voculinux.com/multilingual-dictation/ 2026-11-01 monthly 0.7 - https://vocalinux.com/pipewire/ + https://voculinux.com/pipewire/ 2026-11-01 monthly 0.7 - https://vocalinux.com/global-shortcuts/ + https://voculinux.com/global-shortcuts/ 2026-11-01 monthly 0.7 - https://vocalinux.com/hyprland-sway/ + https://voculinux.com/hyprland-sway/ 2026-11-01 monthly 0.7 - https://vocalinux.com/local-gateway/ + https://voculinux.com/local-gateway/ 2026-11-01 monthly 0.7 - https://vocalinux.com/flatpak/ + https://voculinux.com/flatpak/ 2026-11-01 monthly 0.7 - https://vocalinux.com/install/nixos/ + https://voculinux.com/install/nixos/ 2026-11-01 monthly 0.8 - https://vocalinux.com/install/debian/ + https://voculinux.com/install/debian/ 2026-11-01 monthly 0.8 - https://vocalinux.com/install/opensuse/ + https://voculinux.com/install/opensuse/ 2026-11-01 monthly 0.8 - https://vocalinux.com/install/linux-mint/ + https://voculinux.com/install/linux-mint/ 2026-11-01 monthly 0.8 - https://vocalinux.com/install/pop-os/ + https://voculinux.com/install/pop-os/ 2026-11-01 monthly 0.8 diff --git a/web/public/vocalinux-192x192.png b/web/public/voculinux-192x192.png similarity index 100% rename from web/public/vocalinux-192x192.png rename to web/public/voculinux-192x192.png diff --git a/web/public/vocalinux-192x192.webp b/web/public/voculinux-192x192.webp similarity index 100% rename from web/public/vocalinux-192x192.webp rename to web/public/voculinux-192x192.webp diff --git a/web/public/vocalinux-32x32.png b/web/public/voculinux-32x32.png similarity index 100% rename from web/public/vocalinux-32x32.png rename to web/public/voculinux-32x32.png diff --git a/web/public/vocalinux-32x32.webp b/web/public/voculinux-32x32.webp similarity index 100% rename from web/public/vocalinux-32x32.webp rename to web/public/voculinux-32x32.webp diff --git a/web/public/vocalinux-512x512.png b/web/public/voculinux-512x512.png similarity index 100% rename from web/public/vocalinux-512x512.png rename to web/public/voculinux-512x512.png diff --git a/web/public/vocalinux-512x512.webp b/web/public/voculinux-512x512.webp similarity index 100% rename from web/public/vocalinux-512x512.webp rename to web/public/voculinux-512x512.webp diff --git a/web/public/vocalinux-64x64.png b/web/public/voculinux-64x64.png similarity index 100% rename from web/public/vocalinux-64x64.png rename to web/public/voculinux-64x64.png diff --git a/web/public/vocalinux-64x64.webp b/web/public/voculinux-64x64.webp similarity index 100% rename from web/public/vocalinux-64x64.webp rename to web/public/voculinux-64x64.webp diff --git a/web/public/vocalinux-96x96.png b/web/public/voculinux-96x96.png similarity index 100% rename from web/public/vocalinux-96x96.png rename to web/public/voculinux-96x96.png diff --git a/web/public/vocalinux-96x96.webp b/web/public/voculinux-96x96.webp similarity index 100% rename from web/public/vocalinux-96x96.webp rename to web/public/voculinux-96x96.webp diff --git a/web/public/vocalinux-microphone-off.svg b/web/public/voculinux-microphone-off.svg similarity index 93% rename from web/public/vocalinux-microphone-off.svg rename to web/public/voculinux-microphone-off.svg index 826e120..7792b28 100644 --- a/web/public/vocalinux-microphone-off.svg +++ b/web/public/voculinux-microphone-off.svg @@ -1,4 +1,4 @@ - + diff --git a/web/public/vocalinux-microphone-process.svg b/web/public/voculinux-microphone-process.svg similarity index 93% rename from web/public/vocalinux-microphone-process.svg rename to web/public/voculinux-microphone-process.svg index 7b9d9c3..9f11044 100644 --- a/web/public/vocalinux-microphone-process.svg +++ b/web/public/voculinux-microphone-process.svg @@ -1,4 +1,4 @@ - + diff --git a/web/public/vocalinux-microphone.svg b/web/public/voculinux-microphone.svg similarity index 93% rename from web/public/vocalinux-microphone.svg rename to web/public/voculinux-microphone.svg index 4a9a4dd..48e136d 100644 --- a/web/public/vocalinux-microphone.svg +++ b/web/public/voculinux-microphone.svg @@ -1,4 +1,4 @@ - + diff --git a/web/public/vocalinux.png b/web/public/voculinux.png similarity index 100% rename from web/public/vocalinux.png rename to web/public/voculinux.png diff --git a/web/public/vocalinux.svg b/web/public/voculinux.svg similarity index 100% rename from web/public/vocalinux.svg rename to web/public/voculinux.svg diff --git a/web/public/vocalinux.webp b/web/public/voculinux.webp similarity index 100% rename from web/public/vocalinux.webp rename to web/public/voculinux.webp diff --git a/web/scripts/render-social-assets.mjs b/web/scripts/render-social-assets.mjs index ad8cb46..45c733c 100644 --- a/web/scripts/render-social-assets.mjs +++ b/web/scripts/render-social-assets.mjs @@ -10,7 +10,7 @@ import { chromium } from "playwright-core"; const root = join(dirname(fileURLToPath(import.meta.url)), ".."); const pub = join(root, "public"); -const mark = join(pub, "brand/vocalinux-mark-circle.svg"); +const mark = join(pub, "brand/voculinux-mark-circle.svg"); const chrome = process.env.CHROME_PATH || ["/usr/bin/chromium-browser", "/usr/bin/chromium"].find(Boolean); @@ -33,15 +33,15 @@ const skipIcons = process.env.OG_ONLY === "1"; const sizes = [ [16, join(pub, "favicon-16x16.png")], [32, join(pub, "favicon-32x32.png")], - [32, join(pub, "vocalinux-32x32.png")], - [64, join(pub, "vocalinux-64x64.png")], + [32, join(pub, "voculinux-32x32.png")], + [64, join(pub, "voculinux-64x64.png")], [96, join(pub, "favicon-96x96.png")], - [96, join(pub, "vocalinux-96x96.png")], - [192, join(pub, "vocalinux-192x192.png")], + [96, join(pub, "voculinux-96x96.png")], + [192, join(pub, "voculinux-192x192.png")], [192, join(pub, "icon-192x192.png")], - [512, join(pub, "vocalinux-512x512.png")], + [512, join(pub, "voculinux-512x512.png")], [512, join(pub, "icon-512x512.png")], - [512, join(pub, "vocalinux.png")], + [512, join(pub, "voculinux.png")], ]; if (!skipIcons) { @@ -50,8 +50,8 @@ if (!skipIcons) { if (dest.endsWith(".png") && !dest.includes("favicon-")) { const webp = dest.replace(/\.png$/i, ".webp"); if ( - dest.includes("vocalinux-") || - dest.endsWith("/vocalinux.png") + dest.includes("voculinux-") || + dest.endsWith("/voculinux.png") ) { toWebp(dest, webp); } @@ -119,7 +119,7 @@ const ogHtml = `
- Vocalinux + Voculinux

Dictate locally.
In any app.

Hold Right Alt. Text lands in the focused window. Local engines by default.

@@ -128,11 +128,11 @@ const ogHtml = ` No telemetry AGPL-3.0
-

vocalinux.com

+

voculinux.com

-
Vocalinuxlistening
+
Voculinuxlistening
notes.txt
diff --git a/web/scripts/viewport-qa.mjs b/web/scripts/viewport-qa.mjs index c053ed8..f346d43 100644 --- a/web/scripts/viewport-qa.mjs +++ b/web/scripts/viewport-qa.mjs @@ -1,6 +1,6 @@ #!/usr/bin/env node /** - * Viewport QA for the Vocalinux marketing home page. + * Viewport QA for the Voculinux marketing home page. * Uses system Google Chrome via playwright-core (no browser download). * * Usage: @@ -74,7 +74,7 @@ try { scrollWidth: de.scrollWidth, clientWidth: de.clientWidth, overflowX, - hasVocalinux: bodyText.includes("Vocalinux"), + hasVoculinux: bodyText.includes("Voculinux"), hasInstallCta: !!document.querySelector('a[href="#install"]'), hasGradientText: !!document.querySelector('[class*="bg-clip-text"]'), h1: hero ? hero.innerText.trim() : null, @@ -128,7 +128,7 @@ try { const ok = !metrics.overflowX && - metrics.hasVocalinux && + metrics.hasVoculinux && metrics.hasInstallCta && !metrics.hasGradientText && metrics.heroInBounds && diff --git a/web/src/app/__tests__/lazy-loading.test.tsx b/web/src/app/__tests__/lazy-loading.test.tsx index 35f7c41..90683d1 100644 --- a/web/src/app/__tests__/lazy-loading.test.tsx +++ b/web/src/app/__tests__/lazy-loading.test.tsx @@ -1,6 +1,6 @@ import React from 'react'; import { render, screen } from '@testing-library/react'; -import { OptimizedImage, VocalinuxLogo } from '../../components/optimized-image'; +import { OptimizedImage, VoculinuxLogo } from '../../components/optimized-image'; // Mock Next.js Image component to capture loading behavior const mockImage = jest.fn(); @@ -61,17 +61,17 @@ describe('Lazy Loading Behavior', () => { }); }); - describe('VocalinuxLogo Component', () => { + describe('VoculinuxLogo Component', () => { it('lazy loads the circular mark by default', () => { - render(); - const img = screen.getByAltText('Vocalinux'); - expect(img).toHaveAttribute('src', '/brand/vocalinux-mark-circle.svg'); + render(); + const img = screen.getByAltText('Voculinux'); + expect(img).toHaveAttribute('src', '/brand/voculinux-mark-circle.svg'); expect(img).toHaveAttribute('loading', 'lazy'); }); it('eager loads the mark when priority is set', () => { - render(); - const img = screen.getByAltText('Vocalinux'); + render(); + const img = screen.getByAltText('Voculinux'); expect(img).toHaveAttribute('loading', 'eager'); }); }); @@ -86,8 +86,8 @@ describe('Lazy Loading Behavior', () => { }); it('prevents layout shift with explicit dimensions', () => { - render(); - const img = screen.getByAltText('Vocalinux'); + render(); + const img = screen.getByAltText('Voculinux'); expect(img).toHaveAttribute('width', '64'); expect(img).toHaveAttribute('height', '64'); }); @@ -106,9 +106,9 @@ describe('Lazy Loading Behavior', () => { }); it('ships the circular mark as an SVG', () => { - render(); - const img = screen.getByAltText('Vocalinux'); - expect(img).toHaveAttribute('src', '/brand/vocalinux-mark-circle.svg'); + render(); + const img = screen.getByAltText('Voculinux'); + expect(img).toHaveAttribute('src', '/brand/voculinux-mark-circle.svg'); }); }); }); diff --git a/web/src/app/__tests__/screenshots-page.test.ts b/web/src/app/__tests__/screenshots-page.test.ts index 0d82862..7885ffe 100644 --- a/web/src/app/__tests__/screenshots-page.test.ts +++ b/web/src/app/__tests__/screenshots-page.test.ts @@ -41,7 +41,7 @@ describe("Screenshots page and assets", () => { expect(fs.existsSync(pagePath)).toBe(true); expect(pageSource).toMatch(/export default function ScreenshotsPage/); expect(pageSource).toContain('path: "/screenshots"'); - expect(pageSource).toContain("Vocalinux Screenshots"); + expect(pageSource).toContain("Voculinux Screenshots"); expect(pageSource).toContain("ScreenshotGallery"); const galleryPath = path.join( webRoot, diff --git a/web/src/app/__tests__/seo-assets.test.ts b/web/src/app/__tests__/seo-assets.test.ts index 82cf125..e0d147d 100644 --- a/web/src/app/__tests__/seo-assets.test.ts +++ b/web/src/app/__tests__/seo-assets.test.ts @@ -15,7 +15,7 @@ describe("SEO Assets", () => { it("contains sitemap reference in robots.txt", () => { expect(robotsContent).toContain( - "Sitemap: https://vocalinux.com/sitemap.xml", + "Sitemap: https://voculinux.com/sitemap.xml", ); }); @@ -39,33 +39,33 @@ describe("SEO Assets", () => { it("includes core landing pages in sitemap", () => { const expectedUrls = [ - "https://vocalinux.com/", - "https://vocalinux.com/install/", - "https://vocalinux.com/install/ubuntu/", - "https://vocalinux.com/install/fedora/", - "https://vocalinux.com/install/arch/", - "https://vocalinux.com/compare/", - "https://vocalinux.com/remote-api/", - "https://vocalinux.com/voice-activity-detection/", - "https://vocalinux.com/advanced-settings/", - "https://vocalinux.com/desktop-reliability/", - "https://vocalinux.com/screenshots/", - "https://vocalinux.com/parakeet/", - "https://vocalinux.com/faster-whisper/", - "https://vocalinux.com/dictation-pad/", - "https://vocalinux.com/transcribe-audio-files/", - "https://vocalinux.com/custom-dictionary/", - "https://vocalinux.com/multilingual-dictation/", - "https://vocalinux.com/pipewire/", - "https://vocalinux.com/global-shortcuts/", - "https://vocalinux.com/hyprland-sway/", - "https://vocalinux.com/local-gateway/", - "https://vocalinux.com/flatpak/", - "https://vocalinux.com/install/nixos/", - "https://vocalinux.com/install/debian/", - "https://vocalinux.com/install/opensuse/", - "https://vocalinux.com/install/linux-mint/", - "https://vocalinux.com/install/pop-os/", + "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/", + "https://voculinux.com/advanced-settings/", + "https://voculinux.com/desktop-reliability/", + "https://voculinux.com/screenshots/", + "https://voculinux.com/parakeet/", + "https://voculinux.com/faster-whisper/", + "https://voculinux.com/dictation-pad/", + "https://voculinux.com/transcribe-audio-files/", + "https://voculinux.com/custom-dictionary/", + "https://voculinux.com/multilingual-dictation/", + "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) => { @@ -87,7 +87,7 @@ describe("SEO Assets", () => { } const routePath = `${prefix}/${entry.name}`; if (fs.existsSync(path.join(dir, entry.name, "page.tsx"))) { - routes.push(`https://vocalinux.com${routePath}/`); + routes.push(`https://voculinux.com${routePath}/`); } walk(path.join(dir, entry.name), routePath); } diff --git a/web/src/app/__tests__/viewport-layout.test.ts b/web/src/app/__tests__/viewport-layout.test.ts index a1a1ba0..dbadd4c 100644 --- a/web/src/app/__tests__/viewport-layout.test.ts +++ b/web/src/app/__tests__/viewport-layout.test.ts @@ -124,7 +124,7 @@ describe("marketing home three-viewport overflow (live browser)", () => { heroInBounds: inBounds(heroRect), terminalInBounds: inBounds(termRect), hasGradientText: !!document.querySelector('[class*="bg-clip-text"]'), - hasVocalinux: document.body.innerText.includes("Vocalinux"), + hasVoculinux: document.body.innerText.includes("Voculinux"), }; }); @@ -137,7 +137,7 @@ describe("marketing home three-viewport overflow (live browser)", () => { heroInBounds: true, terminalInBounds: true, hasGradientText: false, - hasVocalinux: true, + hasVoculinux: true, }), ); diff --git a/web/src/app/advanced-settings/page.tsx b/web/src/app/advanced-settings/page.tsx index a18f40b..c49448f 100644 --- a/web/src/app/advanced-settings/page.tsx +++ b/web/src/app/advanced-settings/page.tsx @@ -64,12 +64,12 @@ const useCases = [ export const metadata: Metadata = buildPageMetadata({ title: "Advanced Whisper.cpp Settings for Linux Dictation", description: - "Tune Vocalinux advanced whisper.cpp settings for anti-hallucination, decoding thresholds, initial prompts, and Remote API configuration.", + "Tune Voculinux advanced whisper.cpp settings for anti-hallucination, decoding thresholds, initial prompts, and Remote API configuration.", path: "/advanced-settings", keywords: [ "whisper.cpp advanced settings", "whisper anti hallucination linux dictation", - "vocalinux advanced settings", + "voculinux advanced settings", "whisper.cpp no speech threshold", ], }); @@ -80,7 +80,7 @@ export default function AdvancedSettingsPage() { "@type": "TechArticle", headline: "Advanced Whisper.cpp Settings for Linux Dictation", description: - "Guide to Vocalinux advanced settings for whisper.cpp decoding, anti-hallucination controls, and Remote API configuration.", + "Guide to Voculinux advanced settings for whisper.cpp decoding, anti-hallucination controls, and Remote API configuration.", dateModified: "2026-06-11", author: { "@type": "Person", @@ -89,10 +89,10 @@ export default function AdvancedSettingsPage() { }, publisher: { "@type": "Organization", - name: "Vocalinux", + name: "Voculinux", logo: { "@type": "ImageObject", - url: absoluteUrl("/vocalinux.png"), + url: absoluteUrl("/voculinux.png"), }, }, mainEntityOfPage: absoluteUrl("/advanced-settings"), @@ -114,7 +114,7 @@ export default function AdvancedSettingsPage() { Advanced Whisper.cpp Settings for Linux Dictation

- Vocalinux keeps the default setup simple, but power users can unlock + Voculinux keeps the default setup simple, but power users can unlock advanced whisper.cpp decoding controls for anti-hallucination tuning, initial prompts, Remote API server configuration, Vulkan GPU device selection, and optional model keep-alive unload. diff --git a/web/src/app/alternatives/page.tsx b/web/src/app/alternatives/page.tsx index 6dfb510..0a70375 100644 --- a/web/src/app/alternatives/page.tsx +++ b/web/src/app/alternatives/page.tsx @@ -43,25 +43,25 @@ const alternatives = [ ]; const comparisonTable = [ - { feature: "Linux Support", vocalinux: true, dragon: false, otter: false, google: true }, - { feature: "Local engines", vocalinux: true, dragon: false, otter: false, google: false }, - { feature: "Open Source", vocalinux: true, dragon: false, otter: false, google: false }, - { feature: "Free Forever", vocalinux: true, dragon: false, otter: false, google: true }, - { feature: "Desktop Integration", vocalinux: true, dragon: true, otter: false, google: false }, - { feature: "Wayland Support", vocalinux: true, dragon: false, otter: false, google: false }, - { feature: "Custom Shortcuts", vocalinux: true, dragon: true, otter: false, google: false }, - { feature: "Voice Commands", vocalinux: true, dragon: true, otter: true, google: true }, - { feature: "Multi-language", vocalinux: true, dragon: true, otter: true, google: true }, - { feature: "GPU Acceleration", vocalinux: true, dragon: false, otter: false, google: false }, + { feature: "Linux Support", voculinux: true, dragon: false, otter: false, google: true }, + { feature: "Local engines", voculinux: true, dragon: false, otter: false, google: false }, + { feature: "Open Source", voculinux: true, dragon: false, otter: false, google: false }, + { feature: "Free Forever", voculinux: true, dragon: false, otter: false, google: true }, + { feature: "Desktop Integration", voculinux: true, dragon: true, otter: false, google: false }, + { feature: "Wayland Support", voculinux: true, dragon: false, otter: false, google: false }, + { feature: "Custom Shortcuts", voculinux: true, dragon: true, otter: false, google: false }, + { feature: "Voice Commands", voculinux: true, dragon: true, otter: true, google: true }, + { feature: "Multi-language", voculinux: true, dragon: true, otter: true, google: true }, + { feature: "GPU Acceleration", voculinux: true, dragon: false, otter: false, google: false }, ]; export const metadata: Metadata = buildPageMetadata({ title: "Linux Alternatives to Dragon, Otter.ai and Speechnotes", description: - "Looking for Dragon NaturallySpeaking, Otter.ai or Google Voice Typing on Linux? Compare offline Linux dictation options, including Vocalinux and Nerd Dictation.", + "Looking for Dragon NaturallySpeaking, Otter.ai or Google Voice Typing on Linux? Compare offline Linux dictation options, including Voculinux and Nerd Dictation.", path: "/alternatives", keywords: [ - "vocalinux alternatives", + "voculinux alternatives", "dragon naturally speaking linux alternative", "otter.ai alternative", "linux speech to text comparison", @@ -73,9 +73,9 @@ export default function AlternativesPage() { const articleJsonLd = { "@context": "https://schema.org", "@type": "Article", - headline: "Vocalinux vs Dragon, Otter, Google - Voice Dictation Comparison", + headline: "Voculinux vs Dragon, Otter, Google - Voice Dictation Comparison", description: - "Comprehensive comparison of Vocalinux with other voice dictation solutions for Linux users.", + "Comprehensive comparison of Voculinux with other voice dictation solutions for Linux users.", dateModified: "2026-02-19", author: { "@type": "Person", @@ -84,10 +84,10 @@ export default function AlternativesPage() { }, publisher: { "@type": "Organization", - name: "Vocalinux", + name: "Voculinux", logo: { "@type": "ImageObject", - url: absoluteUrl("/vocalinux.png"), + url: absoluteUrl("/voculinux.png"), }, }, mainEntityOfPage: absoluteUrl("/alternatives"), @@ -106,16 +106,16 @@ export default function AlternativesPage() { Comparison

- Vocalinux vs The Alternatives + Voculinux vs The Alternatives

- Looking for voice dictation on Linux? Compare Vocalinux with Dragon, Otter.ai, Google Voice - Typing, and other alternatives. See why Vocalinux is the best choice for Linux users. + Looking for voice dictation on Linux? Compare Voculinux with Dragon, Otter.ai, Google Voice + Typing, and other alternatives. See why Voculinux is the best choice for Linux users.

-

Why Vocalinux for Linux?

+

Why Voculinux for Linux?

@@ -142,7 +142,7 @@ export default function AlternativesPage() { Feature - Vocalinux + Voculinux Dragon Otter.ai Google @@ -153,7 +153,7 @@ export default function AlternativesPage() { {row.feature} - {row.vocalinux ? ( + {row.voculinux ? ( ) : (

The Bottom Line

- If you are on Linux and need voice dictation, Vocalinux is a strong option: local + If you are on Linux and need voice dictation, Voculinux is a strong option: local engines, no usage telemetry, and desktop integration, at no cost. See the{" "} nerd-dictation comparison @@ -290,7 +290,7 @@ export default function AlternativesPage() { href="/install/" className="inline-flex items-center gap-2 rounded-full bg-primary px-4 py-2 text-sm font-semibold text-primary-foreground" > - Install Vocalinux + Install Voculinux

- Have Vocalinux ready to go the moment you log in. Uses the Linux-standard XDG autostart + Have Voculinux ready to go the moment you log in. Uses the Linux-standard XDG autostart mechanism - works with GNOME, KDE, Xfce, and all major desktop environments.

@@ -200,7 +200,7 @@ export default function AutostartPage() {

Desktop Environment Compatibility

- Vocalinux uses the XDG Autostart specification, which is supported by virtually all Linux + Voculinux uses the XDG Autostart specification, which is supported by virtually all Linux desktop environments:

@@ -250,7 +250,7 @@ export default function AutostartPage() { Not a systemd Service

- Vocalinux autostart uses XDG desktop entries, not systemd services. This + Voculinux autostart uses XDG desktop entries, not systemd services. This means it starts as a regular desktop application in your graphical session - which is the correct way to launch GUI apps. No background services, no root required.

@@ -266,7 +266,7 @@ export default function AutostartPage() {

Enable autostart:

- mkdir -p ~/.config/autostart && cp /usr/share/applications/vocalinux.desktop + mkdir -p ~/.config/autostart && cp /usr/share/applications/voculinux.desktop ~/.config/autostart/
@@ -274,14 +274,14 @@ export default function AutostartPage() {

Disable autostart:

- rm ~/.config/autostart/vocalinux.desktop + rm ~/.config/autostart/voculinux.desktop

Start minimized (skip welcome dialog):

- vocalinux --start-minimized + voculinux --start-minimized
@@ -291,7 +291,7 @@ export default function AutostartPage() {

Ready to Automate?

- Install Vocalinux and enable autostart. Your voice dictation will be ready the moment you + Install Voculinux and enable autostart. Your voice dictation will be ready the moment you log in.

diff --git a/web/src/app/changelog/page.tsx b/web/src/app/changelog/page.tsx index 7a5cc62..12cbe62 100644 --- a/web/src/app/changelog/page.tsx +++ b/web/src/app/changelog/page.tsx @@ -113,7 +113,7 @@ const releases = [ "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 vocalinux-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)", + "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)", ], @@ -132,7 +132,7 @@ const releases = [ "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 Vocalinux--{x86_64,aarch64}.flatpak (PR #786, #784)", + "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)", @@ -160,7 +160,7 @@ const releases = [ "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 vocalinux:uinput fails, and dictation only reaches XWayland apps. Later revisions ship the RemoteDesktop portal instead; the Store denied the uinput grant (PR #823)", + "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)", ], }, { @@ -194,7 +194,7 @@ const releases = [ "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)", - "vocalinux.com restyled to the Voca family workbench; Discord and X links point at VocaHQ (PR #728, #729, #722, #717)", + "voculinux.com restyled to the Voca family workbench; Discord and X links point at VocaHQ (PR #728, #729, #722, #717)", ], }, { @@ -213,7 +213,7 @@ const releases = [ "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: vocalinux --version (PR #563, closes #555)", + "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)", ], @@ -265,8 +265,8 @@ const releases = [ 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 Vocalinux starts, with the evdev backend rescanning for new devices and recovering from disconnects (PR #467)", - "Vocalinux 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)", + "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)", @@ -329,7 +329,7 @@ const releases = [ "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 vocalinux.com - cleaner, professional, text-based layout (PR #392)", + "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)", ], }, @@ -341,7 +341,7 @@ const releases = [ "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 Vocalinux IBus activation (fixes #292, PR #343)", + "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)", @@ -402,7 +402,7 @@ const releases = [ "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 Vocalinux running", + "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", @@ -521,11 +521,11 @@ const getTypeStyles = (type: string) => { export const metadata: Metadata = buildPageMetadata({ title: "Changelog and Release Notes", description: - "Track Vocalinux release history and version updates. See what's new in each version of our Linux voice dictation software.", + "Track Voculinux release history and version updates. See what's new in each version of our Linux voice dictation software.", path: "/changelog", keywords: [ - "vocalinux changelog", - "vocalinux release notes", + "voculinux changelog", + "voculinux release notes", "voice dictation linux updates", "speech to text linux versions", ], @@ -535,9 +535,9 @@ export default function ChangelogPage() { const articleJsonLd = { "@context": "https://schema.org", "@type": "Article", - headline: "Vocalinux Changelog - Release History", + headline: "Voculinux Changelog - Release History", description: - "Complete release history for Vocalinux, the offline voice dictation software for Linux.", + "Complete release history for Voculinux, the offline voice dictation software for Linux.", dateModified: "2026-10-27", author: { "@type": "Person", @@ -546,10 +546,10 @@ export default function ChangelogPage() { }, publisher: { "@type": "Organization", - name: "Vocalinux", + name: "Voculinux", logo: { "@type": "ImageObject", - url: absoluteUrl("/vocalinux.png"), + url: absoluteUrl("/voculinux.png"), }, }, mainEntityOfPage: absoluteUrl("/changelog"), @@ -568,10 +568,10 @@ export default function ChangelogPage() { Release History

- Vocalinux Changelog + Voculinux Changelog

- Track every release and see how Vocalinux has evolved. From initial + Track every release and see how Voculinux has evolved. From initial alpha to stable releases, follow the journey of Linux voice dictation.

diff --git a/web/src/app/compare/page.tsx b/web/src/app/compare/page.tsx index a790e3f..b567436 100644 --- a/web/src/app/compare/page.tsx +++ b/web/src/app/compare/page.tsx @@ -14,6 +14,7 @@ import { absoluteUrl, buildPageMetadata } from "@/lib/seo"; const engineTable = [ { engine: "whisper.cpp", + support: "Guaranteed default", speed: "Fastest startup + low latency", hardware: "CPU + AMD/Intel/NVIDIA GPU", accuracy: "High (best overall balance)", @@ -25,6 +26,7 @@ const engineTable = [ }, { engine: "Whisper (OpenAI)", + support: "Best-effort extra", speed: "Slower install and startup", hardware: "CPU or NVIDIA CUDA", accuracy: "High", @@ -36,6 +38,7 @@ const engineTable = [ }, { engine: "Faster Whisper", + support: "Best-effort extra", speed: "Fast CPU inference (CTranslate2 / INT8)", hardware: "CPU", accuracy: "High (Whisper-class)", @@ -47,6 +50,7 @@ const engineTable = [ }, { engine: "VOSK", + support: "Best-effort extra", speed: "Very fast realtime on low-end systems", hardware: "CPU", accuracy: "Good for lightweight use", @@ -58,6 +62,7 @@ const engineTable = [ }, { engine: "Parakeet", + support: "Best-effort extra", speed: "Fast CPU (sherpa-onnx TDT 0.6B)", hardware: "CPU", accuracy: "High on bundled English / European languages", @@ -69,6 +74,7 @@ const engineTable = [ }, { engine: "Remote API", + support: "User-configured (audio leaves the machine)", speed: "Depends on server + network latency", hardware: "Client CPU + remote Whisper server", accuracy: "Depends on remote model", @@ -110,10 +116,10 @@ export default function CompareEnginesPage() { }, publisher: { "@type": "Organization", - name: "Vocalinux", + name: "Voculinux", logo: { "@type": "ImageObject", - url: absoluteUrl("/vocalinux.png"), + url: absoluteUrl("/voculinux.png"), }, }, mainEntityOfPage: absoluteUrl("/compare"), @@ -138,6 +144,9 @@ export default function CompareEnginesPage() { If you are choosing a Linux speech-to-text engine, this page gives a practical side-by-side comparison focused on latency, hardware support, install footprint, privacy boundary, and real desktop usage. + whisper.cpp is the guaranteed default engine; every other local + engine is a best-effort extra. Remote API is user-configured: audio + leaves the machine for a server you choose.

@@ -157,6 +166,7 @@ export default function CompareEnginesPage() {
{[ + ["Support", row.support], ["Speed", row.speed], ["Hardware", row.hardware], ["Accuracy", row.accuracy], @@ -181,6 +191,7 @@ export default function CompareEnginesPage() { Engine + Support Speed Hardware Accuracy @@ -206,6 +217,9 @@ export default function CompareEnginesPage() { {row.engine} + + {row.support} + {row.speed} @@ -247,7 +261,7 @@ export default function CompareEnginesPage() {

Choose whisper.cpp when you want the best speed-to-accuracy ratio - and broad hardware support. It is the default in Vocalinux for a + and broad hardware support. It is the default in Voculinux for a reason. Safe engine switching - v0.10.1+ stops recognition before switching to prevent crashes.

diff --git a/web/src/app/custom-dictionary/page.tsx b/web/src/app/custom-dictionary/page.tsx index b3146b5..ee460b6 100644 --- a/web/src/app/custom-dictionary/page.tsx +++ b/web/src/app/custom-dictionary/page.tsx @@ -14,7 +14,7 @@ import { absoluteUrl, buildPageMetadata } from "@/lib/seo"; const PAGE_PATH = "/custom-dictionary"; const dictionaryFileCommand = - "vocalinux --dictionary-file /path/to/dictionary.txt"; + "voculinux --dictionary-file /path/to/dictionary.txt"; const howToSteps = [ { @@ -62,18 +62,18 @@ const faqs = [ }, { q: "My post-processing script runs but nothing changes. What should I check?", - a: "Vocalinux falls back to the original text when the script exits non-zero, cannot be started, or runs longer than 10 seconds. Make sure the file is executable, the path is absolute, and the script writes to standard output. The Vocalinux log records the exit code and standard error.", + a: "Voculinux falls back to the original text when the script exits non-zero, cannot be started, or runs longer than 10 seconds. Make sure the file is executable, the path is absolute, and the script writes to standard output. The Voculinux log records the exit code and standard error.", }, { q: "Why did a segment disappear after I added a script?", - a: "If the script exits successfully but prints nothing, Vocalinux types nothing for that segment. Make sure every code path writes the text back out.", + a: "If the script exits successfully but prints nothing, Voculinux types nothing for that segment. Make sure every code path writes the text back out.", }, ]; export const metadata: Metadata = buildPageMetadata({ - title: "Custom Dictionary, Corrections and Post-Processing | Vocalinux", + title: "Custom Dictionary, Corrections and Post-Processing | Voculinux", description: - "Teach Vocalinux your jargon: custom terms that bias Whisper, transcript corrections for every engine, and a stdin/stdout post-processing script hook.", + "Teach Voculinux your jargon: custom terms that bias Whisper, transcript corrections for every engine, and a stdin/stdout post-processing script hook.", path: PAGE_PATH, keywords: [ "custom dictionary voice dictation Linux", @@ -81,7 +81,7 @@ export const metadata: Metadata = buildPageMetadata({ "whisper.cpp initial prompt terms", "speech to text corrections", "dictation post-processing script", - "Vocalinux custom dictionary", + "Voculinux custom dictionary", ], }); @@ -90,9 +90,9 @@ export default function CustomDictionaryPage() { "@context": "https://schema.org", "@type": "TechArticle", headline: - "Custom Dictionary, Transcript Corrections and Post-Processing in Vocalinux", + "Custom Dictionary, Transcript Corrections and Post-Processing in Voculinux", description: - "How Vocalinux custom terms, transcript corrections and the post-processing script hook work, with exact file formats and safe example scripts.", + "How Voculinux custom terms, transcript corrections and the post-processing script hook work, with exact file formats and safe example scripts.", dateModified: "2026-11-01", author: { "@type": "Person", @@ -101,10 +101,10 @@ export default function CustomDictionaryPage() { }, publisher: { "@type": "Organization", - name: "Vocalinux", + name: "Voculinux", logo: { "@type": "ImageObject", - url: absoluteUrl("/vocalinux.png"), + url: absoluteUrl("/voculinux.png"), }, }, mainEntityOfPage: absoluteUrl(PAGE_PATH), @@ -113,7 +113,7 @@ export default function CustomDictionaryPage() { const howToJsonLd = { "@context": "https://schema.org", "@type": "HowTo", - name: "Set up a custom dictionary in Vocalinux", + name: "Set up a custom dictionary in Voculinux", step: howToSteps.map((step, index) => ({ "@type": "HowToStep", position: index + 1, @@ -154,7 +154,7 @@ export default function CustomDictionaryPage() {

Speech models stumble on product names, colleagues' names and - project jargon. Vocalinux gives you three tools for that: custom terms + project jargon. Voculinux gives you three tools for that: custom terms that steer Whisper-family engines toward your vocabulary, transcript corrections that fix known mishearings on every engine, and a script hook that can rewrite each result before it is typed. @@ -233,14 +233,14 @@ export default function CustomDictionaryPage() { Custom terms file

- Terms live in ~/.config/vocalinux/dictionary.txt by + Terms live in ~/.config/voculinux/dictionary.txt by default: UTF-8, one term per line. Blank lines and lines starting with{" "} # are skipped, and duplicates are ignored regardless of case. The plain line format is deliberate, so accessibility tools and scripts can maintain the same file.

-          {`# ~/.config/vocalinux/dictionary.txt
+          {`# ~/.config/voculinux/dictionary.txt
 Supabase
 Kubernetes
 PipeWire
@@ -267,7 +267,7 @@ Okonkwo`}
         

Session-only terms file

To try a different list without touching saved settings, start - Vocalinux with: + Voculinux with:

Corrections are stored separately in{" "} - ~/.config/vocalinux/custom-dictionary-corrections.json, + ~/.config/voculinux/custom-dictionary-corrections.json, always in the config directory, whatever terms file you use. The format is versioned:

@@ -328,7 +328,7 @@ Okonkwo`}

The path is saved as post_processing.script_path (empty - means off). For each completed segment, Vocalinux runs the file like + means off). For each completed segment, Voculinux runs the file like this:

@@ -349,7 +349,7 @@ Okonkwo`} ], [ "Environment", - "Inherits Vocalinux's environment. When Vocalinux runs from the AppImage, the bundle's library paths are removed first.", + "Inherits Voculinux's environment. When Voculinux runs from the AppImage, the bundle's library paths are removed first.", ], ["Timeout", "10 seconds."], [ @@ -374,7 +374,7 @@ Okonkwo`}

Example: uppercase everything

- The example from the Vocalinux user guide. Make it executable with{" "} + The example from the Voculinux user guide. Make it executable with{" "} chmod +x before setting the path.

@@ -386,7 +386,7 @@ tr '[:lower:]' '[:upper:]'`}
         
         

Reads everything from stdin and writes it back without adding a - newline. Any exception exits non-zero, so Vocalinux falls back to the + newline. Any exception exits non-zero, so Voculinux falls back to the original text.

@@ -397,7 +397,7 @@ text = sys.stdin.read()
 sys.stdout.write(text.replace("'", "\\u2019"))`}
         

- Before pointing Vocalinux at a script, pipe a sample sentence into it + Before pointing Voculinux at a script, pipe a sample sentence into it from a terminal and check that it prints the text back. Output is not written to the log, but anything your script does with the text (files, network calls) is up to the script. @@ -435,7 +435,7 @@ sys.stdout.write(text.replace("'", "\\u2019"))`} href="/install/" className="inline-flex items-center gap-2 rounded-full bg-primary px-4 py-2 text-sm font-semibold text-primary-foreground" > - Install Vocalinux + Install Voculinux

- Recent Vocalinux beta releases focused heavily on the hard parts of + Recent Voculinux beta releases focused heavily on the hard parts of Linux desktop dictation: Wayland text injection, IBus lifecycle behavior, suspend/resume recovery, keyboard layouts, non-ASCII text, and settings compatibility. diff --git a/web/src/app/dictation-pad/page.tsx b/web/src/app/dictation-pad/page.tsx index c188fe8..1fad8c6 100644 --- a/web/src/app/dictation-pad/page.tsx +++ b/web/src/app/dictation-pad/page.tsx @@ -19,7 +19,7 @@ const howToSteps = [ }, { name: "Open the pad", - text: "Click Open on the Open Dictation Pad row, or choose Dictation Pad from the tray menu. A window titled Vocalinux Dictation Pad appears.", + text: "Click Open on the Open Dictation Pad row, or choose Dictation Pad from the tray menu. A window titled Voculinux Dictation Pad appears.", }, { name: "Dictate as usual", @@ -65,15 +65,15 @@ const settingsRows = [ const faqs = [ { q: "Does the Dictation Pad save my text to disk?", - a: "No. The pad keeps its text for the current session only. Closing the window hides it and keeps the text, but quitting Vocalinux discards it. Copy anything you want to keep before you quit.", + a: "No. The pad keeps its text for the current session only. Closing the window hides it and keeps the text, but quitting Voculinux discards it. Copy anything you want to keep before you quit.", }, { q: "Why does the pad not stay on top of my other windows on Wayland?", - a: "Vocalinux asks for the pad to float above other windows and appear on every workspace, which works on X11. Wayland has no always-on-top protocol for normal apps, so the compositor decides. If a covered pad stops drawing, choose Dictation Pad from the tray menu again and Vocalinux recreates the window.", + a: "Voculinux asks for the pad to float above other windows and appear on every workspace, which works on X11. Wayland has no always-on-top protocol for normal apps, so the compositor decides. If a covered pad stops drawing, choose Dictation Pad from the tray menu again and Voculinux recreates the window.", }, { q: "Do I still need IBus, ydotool or wtype?", - a: "Not for getting text out. Pad capture skips cross-application text injection entirely. You still need a working dictation shortcut, which on Wayland means the built-in listener with access to input devices, or External Activation (Desktop Shortcut) with a desktop shortcut that runs vocalinux --toggle.", + a: "Not for getting text out. Pad capture skips cross-application text injection entirely. You still need a working dictation shortcut, which on Wayland means the built-in listener with access to input devices, or External Activation (Desktop Shortcut) with a desktop shortcut that runs voculinux --toggle.", }, { q: "Can I edit text inside the pad?", @@ -86,16 +86,16 @@ const faqs = [ ]; export const metadata: Metadata = buildPageMetadata({ - title: "Dictation Pad: Wayland-Safe Voice Typing on Linux | Vocalinux", + title: "Dictation Pad: Wayland-Safe Voice Typing on Linux | Voculinux", description: - "Dictate into the Vocalinux Dictation Pad, then copy text out by hand. The Wayland-safe path that skips text injection. Setup, settings, limits and FAQ.", + "Dictate into the Voculinux Dictation Pad, then copy text out by hand. The Wayland-safe path that skips text injection. Setup, settings, limits and FAQ.", path: PAGE_PATH, keywords: [ "Wayland voice typing", "Wayland dictation workaround", "Linux dictation pad", "voice typing without text injection", - "Vocalinux Dictation Pad", + "Voculinux Dictation Pad", "speech to text window Linux", ], }); @@ -106,7 +106,7 @@ export default function DictationPadPage() { "@type": "TechArticle", headline: "Dictation Pad: Wayland-Safe Voice Typing on Linux", description: - "How the Vocalinux Dictation Pad receives dictation in its own window so text never depends on cross-application injection, and how to copy it out.", + "How the Voculinux Dictation Pad receives dictation in its own window so text never depends on cross-application injection, and how to copy it out.", dateModified: "2026-11-01", author: { "@type": "Person", @@ -115,10 +115,10 @@ export default function DictationPadPage() { }, publisher: { "@type": "Organization", - name: "Vocalinux", + name: "Voculinux", logo: { "@type": "ImageObject", - url: absoluteUrl("/vocalinux.png"), + url: absoluteUrl("/voculinux.png"), }, }, mainEntityOfPage: absoluteUrl(PAGE_PATH), @@ -127,7 +127,7 @@ export default function DictationPadPage() { const howToJsonLd = { "@context": "https://schema.org", "@type": "HowTo", - name: "Dictate into the Vocalinux Dictation Pad", + name: "Dictate into the Voculinux Dictation Pad", step: howToSteps.map((step, index) => ({ "@type": "HowToStep", position: index + 1, @@ -167,7 +167,7 @@ export default function DictationPadPage() { Dictation Pad: voice typing that skips text injection

- The Dictation Pad is a small Vocalinux window with an editable text + The Dictation Pad is a small Voculinux window with an editable text box. When pad capture is on, everything you dictate lands there instead of being typed into another app. You copy the text out yourself. Because nothing is injected into other windows, the @@ -209,16 +209,16 @@ export default function DictationPadPage() { Why the Dictation Pad exists

- On X11, Vocalinux types into the focused window with xdotool. Wayland + On X11, Voculinux types into the focused window with xdotool. Wayland deliberately stops apps from sending keystrokes to each other, so - Vocalinux has to go through IBus, the RemoteDesktop portal, ydotool or + Voculinux has to go through IBus, the RemoteDesktop portal, ydotool or wtype, and which of those works depends on your desktop. Most setups are covered (see the Wayland guide), but some compositor and app combinations still drop or mangle text.

The pad is the explicit fallback for those cases. Dictation is written - straight into a Vocalinux window, so there is no injection step left + straight into a Voculinux window, so there is no injection step left to fail. Text bound for the pad also lands there even if you switched to another app while it was being transcribed.

@@ -283,7 +283,7 @@ export default function DictationPadPage() {

- The switch is stored in ~/.config/vocalinux/config.json. + The switch is stored in ~/.config/voculinux/config.json. Flipping it in Settings applies to the next dictated segment without a restart. The saved value looks like this:

@@ -377,7 +377,7 @@ export default function DictationPadPage() { The pad solves text output, not hotkeys. On Wayland the built-in listener needs access to /dev/input, or you can turn on External Activation (Desktop Shortcut) and bind{" "} - vocalinux --toggle to a desktop shortcut (toggle + voculinux --toggle to a desktop shortcut (toggle only, no push-to-talk). See{" "} global shortcuts and{" "} Hyprland and sway. @@ -406,7 +406,7 @@ export default function DictationPadPage() { Try the Dictation Pad

- Install Vocalinux, open Settings → Dictation and switch on Dictate + Install Voculinux, open Settings → Dictation and switch on Dictate into Dictation Pad. If injection already works on your desktop, the{" "} troubleshooting guide covers the other paths. @@ -416,7 +416,7 @@ export default function DictationPadPage() { href="/install/" className="inline-flex items-center gap-2 rounded-full bg-primary px-4 py-2 text-sm font-semibold text-primary-foreground" > - Install Vocalinux + Install Voculinux

- Find answers to common questions about Vocalinux. From installation to + Find answers to common questions about Voculinux. From installation to advanced features, we've got you covered.

diff --git a/web/src/app/faster-whisper/page.tsx b/web/src/app/faster-whisper/page.tsx index e6cbe0a..febfabf 100644 --- a/web/src/app/faster-whisper/page.tsx +++ b/web/src/app/faster-whisper/page.tsx @@ -80,12 +80,12 @@ const packages = [ note: "Menu option or --engine=faster_whisper", }, { - name: "AUR (vocalinux)", + name: "AUR (voculinux)", included: true, note: "Listed as an optional dependency: python-faster-whisper", }, { - name: "AppImage (and AUR vocalinux-bin)", + name: "AppImage (and AUR voculinux-bin)", included: false, note: "Ships whisper.cpp only", }, @@ -126,17 +126,17 @@ const faqs = [ { question: "Is Faster Whisper the same model as Whisper?", answer: - "It runs the same Whisper model family converted to the CTranslate2 format. Vocalinux downloads those conversions from pinned Hugging Face revisions. The sizes and English-only variants match the Whisper names you already know.", + "It runs the same Whisper model family converted to the CTranslate2 format. Voculinux downloads those conversions from pinned Hugging Face revisions. The sizes and English-only variants match the Whisper names you already know.", }, { question: "Does Faster Whisper use my GPU?", answer: - "On a typical install it runs on the CPU with int8. Vocalinux switches to CUDA with float16 only when PyTorch is installed and reports a CUDA GPU. The installer's Faster Whisper option does not install CUDA. For Vulkan GPU acceleration on AMD, Intel or NVIDIA, use whisper.cpp.", + "On a typical install it runs on the CPU with int8. Voculinux switches to CUDA with float16 only when PyTorch is installed and reports a CUDA GPU. The installer's Faster Whisper option does not install CUDA. For Vulkan GPU acceleration on AMD, Intel or NVIDIA, use whisper.cpp.", }, { question: "Can I change the compute type?", answer: - "There is no setting for it. Vocalinux picks int8 on the CPU and float16 on CUDA automatically.", + "There is no setting for it. Voculinux picks int8 on the CPU and float16 on CUDA automatically.", }, { question: "Does audio leave my machine?", @@ -151,9 +151,9 @@ const faqs = [ ]; export const metadata: Metadata = buildPageMetadata({ - title: "Faster Whisper on Linux: Offline Voice Typing | Vocalinux", + title: "Faster Whisper on Linux: Offline Voice Typing | Voculinux", description: - "Use Faster Whisper (CTranslate2, int8 on CPU) for offline voice typing on Linux with Vocalinux: install, model sizes, GPU and compute options, and fixes.", + "Use Faster Whisper (CTranslate2, int8 on CPU) for offline voice typing on Linux with Voculinux: install, model sizes, GPU and compute options, and fixes.", path: "/faster-whisper", keywords: [ "Faster Whisper Linux", @@ -173,7 +173,7 @@ export default function FasterWhisperPage() { "@type": "TechArticle", headline: "Faster Whisper on Linux", description: - "How to install and use the Faster Whisper speech engine in Vocalinux on Linux, including model sizes, compute options, package availability and troubleshooting.", + "How to install and use the Faster Whisper speech engine in Voculinux on Linux, including model sizes, compute options, package availability and troubleshooting.", dateModified: "2026-11-01", author: { "@type": "Person", @@ -182,10 +182,10 @@ export default function FasterWhisperPage() { }, publisher: { "@type": "Organization", - name: "Vocalinux", + name: "Voculinux", logo: { "@type": "ImageObject", - url: absoluteUrl("/vocalinux.png"), + url: absoluteUrl("/voculinux.png"), }, }, mainEntityOfPage: absoluteUrl("/faster-whisper"), @@ -193,7 +193,7 @@ export default function FasterWhisperPage() { { "@context": "https://schema.org", "@type": "HowTo", - name: "Set up the Faster Whisper engine in Vocalinux", + name: "Set up the Faster Whisper engine in Voculinux", step: setupSteps.map((step, index) => ({ "@type": "HowToStep", position: index + 1, @@ -228,11 +228,13 @@ export default function FasterWhisperPage() { Faster Whisper on Linux

- Faster Whisper is an optional local speech engine in Vocalinux. It + Faster Whisper is an optional local speech engine in Voculinux. It runs Whisper models through CTranslate2 with int8 quantization on your CPU and types what you say into the focused app. It is for people who want Whisper models and the full language catalog on a machine without a GPU, using a different runtime from the default whisper.cpp. + Faster Whisper is a best-effort extra: installable and selectable, + outside the performance budgets.

@@ -281,11 +283,11 @@ export default function FasterWhisperPage() { int8, which lowers memory use on the CPU.

- Vocalinux added Faster Whisper as an optional engine in v0.17.0, - together with Parakeet. whisper.cpp remains the default. Vocalinux + Voculinux added Faster Whisper as an optional engine in v0.17.0, + together with Parakeet. whisper.cpp remains the default. Voculinux stores Faster Whisper models under{" "} - ~/.local/share/vocalinux/models/ + ~/.local/share/voculinux/models/ {" "} and checks each file against a pinned checksum before loading it.

@@ -325,7 +327,7 @@ export default function FasterWhisperPage() {

To start once with Faster Whisper from a terminal, run{" "} - vocalinux --engine faster_whisper + voculinux --engine faster_whisper .

@@ -391,7 +393,7 @@ export default function FasterWhisperPage() {

- Vocalinux chooses the device and precision for you; there is no + Voculinux chooses the device and precision for you; there is no compute-type setting. On the CPU it loads the model with{" "} int8. If PyTorch is installed and reports a CUDA GPU, it loads the model on CUDA with{" "} @@ -480,7 +482,7 @@ export default function FasterWhisperPage() {

All four are local engines. Choose by hardware and by how you - installed Vocalinux. For the full table, see the{" "} + installed Voculinux. For the full table, see the{" "} engine comparison {" "} @@ -556,10 +558,10 @@ export default function FasterWhisperPage() {

Run{" "} - vocalinux --debug{" "} + voculinux --debug{" "} and check{" "} - ~/.local/share/vocalinux/vocalinux.log + ~/.local/share/voculinux/voculinux.log , then see the{" "} @@ -593,7 +595,7 @@ export default function FasterWhisperPage() { Try Faster Whisper

- Install Vocalinux with the Faster Whisper engine, or keep whisper.cpp + Install Voculinux with the Faster Whisper engine, or keep whisper.cpp and switch later from Settings → Speech Model.

@@ -601,7 +603,7 @@ export default function FasterWhisperPage() { href="/install/" className="inline-flex items-center gap-2 rounded-full bg-primary px-4 py-2 text-sm font-semibold text-primary-foreground" > - Install Vocalinux + Install Voculinux

Config and models live under{" "} - ~/.var/app/com.vocalinux.Vocalinux/, not{" "} - ~/.config/vocalinux. + ~/.var/app/com.voculinux.Voculinux/, not{" "} + ~/.config/voculinux.

@@ -406,10 +406,10 @@ flatpak update`} The uninstall.sh script is for script and source installs. For the Flatpak, use Flatpak itself. Remove the app:

- flatpak uninstall com.vocalinux.Vocalinux + flatpak uninstall com.voculinux.Voculinux

Add --delete-data to also remove settings and downloaded - models under ~/.var/app/com.vocalinux.Vocalinux/. If no + models under ~/.var/app/com.voculinux.Voculinux/. If no other app uses the remote, drop it too:

flatpak remote-delete vocahq diff --git a/web/src/app/for-developers/page.tsx b/web/src/app/for-developers/page.tsx index ea2dbdd..a4e2fce 100644 --- a/web/src/app/for-developers/page.tsx +++ b/web/src/app/for-developers/page.tsx @@ -112,7 +112,7 @@ const benefits = [ ]; export const metadata: Metadata = buildPageMetadata({ - title: "Voice Dictation for Developers & Coders | Vocalinux", + title: "Voice Dictation for Developers & Coders | Voculinux", description: "Dictate code comments, documentation, and commit messages hands-free. Voice dictation for Linux developers - works in VS Code, JetBrains, terminal, and all apps.", path: "/for-developers", @@ -134,7 +134,7 @@ export default function ForDevelopersPage() { "@type": "Article", headline: "Voice Dictation for Developers & Coders", description: - "How Linux developers use Vocalinux for code comments, documentation, and commit messages.", + "How Linux developers use Voculinux for code comments, documentation, and commit messages.", dateModified: "2026-02-22", author: { "@type": "Person", @@ -143,10 +143,10 @@ export default function ForDevelopersPage() { }, publisher: { "@type": "Organization", - name: "Vocalinux", + name: "Voculinux", logo: { "@type": "ImageObject", - url: absoluteUrl("/vocalinux.png"), + url: absoluteUrl("/voculinux.png"), }, }, mainEntityOfPage: absoluteUrl("/for-developers"), @@ -239,7 +239,7 @@ export default function ForDevelopersPage() { Not Voice Coding - Voice Documentation

- Vocalinux is designed for dictating text, not writing code syntax. For + Voculinux is designed for dictating text, not writing code syntax. For actual code, your keyboard is still faster. But for comments, docs, messages, and notes - voice is a game-changer. Use both together for maximum productivity.

@@ -269,14 +269,14 @@ export default function ForDevelopersPage() { ))}

- Vocalinux works system-wide. If the app accepts text input, Vocalinux can dictate into it. + Voculinux works system-wide. If the app accepts text input, Voculinux can dictate into it.

Start Dictating Your Docs

- Install Vocalinux and start writing better documentation with less effort. Your future + Install Voculinux and start writing better documentation with less effort. Your future self (and your team) will thank you.

diff --git a/web/src/app/global-shortcuts/page.tsx b/web/src/app/global-shortcuts/page.tsx index 2f04c50..360e906 100644 --- a/web/src/app/global-shortcuts/page.tsx +++ b/web/src/app/global-shortcuts/page.tsx @@ -15,32 +15,32 @@ import { absoluteUrl, buildPageMetadata } from "@/lib/seo"; const PAGE_PATH = "/global-shortcuts"; const PAGE_TITLE = "Global Shortcuts for Voice Dictation via D-Bus"; const PAGE_DESCRIPTION = - "Start and stop Vocalinux dictation from GNOME, KDE, sway or Hyprland shortcuts and scripts using its D-Bus service and the --toggle, --start and --stop flags."; + "Start and stop Voculinux dictation from GNOME, KDE, sway or Hyprland shortcuts and scripts using its D-Bus service and the --toggle, --start and --stop flags."; const GDBUS_TOGGLE = - "gdbus call --session --dest com.vocalinux.Vocalinux --object-path /com/vocalinux/Vocalinux --method com.vocalinux.Vocalinux.Toggle"; + "gdbus call --session --dest com.voculinux.Voculinux --object-path /com/voculinux/Voculinux --method com.voculinux.Voculinux.Toggle"; const dbusRows = [ { item: "Bus", value: "Session bus" }, - { item: "Bus name", value: "com.vocalinux.Vocalinux" }, - { item: "Object path", value: "/com/vocalinux/Vocalinux" }, - { item: "Interface", value: "com.vocalinux.Vocalinux" }, + { item: "Bus name", value: "com.voculinux.Voculinux" }, + { item: "Object path", value: "/com/voculinux/Voculinux" }, + { item: "Interface", value: "com.voculinux.Voculinux" }, { item: "Methods", value: "Toggle, Start, Stop (no arguments)" }, ]; const commandRows = [ { - cli: "vocalinux --toggle", + cli: "voculinux --toggle", method: "Toggle", effect: "Start if idle, stop if active", }, { - cli: "vocalinux --start", + cli: "voculinux --start", method: "Start", effect: "Start voice typing; does nothing if already running", }, { - cli: "vocalinux --stop", + cli: "voculinux --stop", method: "Stop", effect: "Stop voice typing; does nothing if already idle", }, @@ -53,7 +53,7 @@ const steps = [ }, { name: "Pick the command", - text: "On a native install, use vocalinux --toggle. On Flatpak, use the gdbus call shown below, because vocalinux --toggle is not on the host PATH.", + 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.", }, { name: "Bind it in your desktop", @@ -72,19 +72,19 @@ const faqs = [ "No. A desktop shortcut only sends the key press and never the release, so it can toggle dictation but cannot hold-to-talk. Use the built-in listener if you need push-to-talk.", }, { - question: "Will vocalinux --toggle launch Vocalinux if it is not running?", + question: "Will voculinux --toggle launch Voculinux if it is not running?", answer: - "No. It forwards the command to a running instance over D-Bus and exits. If no instance answers, it logs that it could not reach a running Vocalinux and exits with status 1.", + "No. It forwards the command to a running instance over D-Bus and exits. If no instance answers, it logs that it could not reach a running Voculinux and exits with status 1.", }, { question: "Do I still need the input group?", answer: - "Not for starting and stopping dictation. With External Activation on, Vocalinux does not read /dev/input for the hotkey. Text injection is unaffected and keeps its own requirements.", + "Not for starting and stopping dictation. With External Activation on, Voculinux does not read /dev/input for the hotkey. Text injection is unaffected and keeps its own requirements.", }, { question: "What happens if the D-Bus service cannot start?", answer: - "Vocalinux shows an External activation unavailable notification and falls back to the internal keyboard shortcut, so you are never left without a way to start or stop dictation.", + "Voculinux shows an External activation unavailable notification and falls back to the internal keyboard shortcut, so you are never left without a way to start or stop dictation.", }, { question: "Do per-language shortcuts work with External Activation?", @@ -94,13 +94,13 @@ const faqs = [ ]; export const metadata: Metadata = buildPageMetadata({ - title: `${PAGE_TITLE} | Vocalinux`, + title: `${PAGE_TITLE} | Voculinux`, description: PAGE_DESCRIPTION, path: PAGE_PATH, keywords: [ "linux dictation global shortcut", - "vocalinux d-bus", - "vocalinux --toggle", + "voculinux d-bus", + "voculinux --toggle", "sway voice typing keybind", "hyprland dictation keybind", "kde global shortcut dictation", @@ -143,17 +143,17 @@ export default function GlobalShortcutsPage() { }, publisher: { "@type": "Organization", - name: "Vocalinux", + name: "Voculinux", logo: { "@type": "ImageObject", - url: absoluteUrl("/vocalinux.png"), + url: absoluteUrl("/voculinux.png"), }, }, mainEntityOfPage: absoluteUrl(PAGE_PATH), }, { "@type": "HowTo", - name: "Start Vocalinux dictation from a desktop shortcut", + name: "Start Voculinux dictation from a desktop shortcut", step: steps.map((step, index) => ({ "@type": "HowToStep", position: index + 1, @@ -185,10 +185,10 @@ export default function GlobalShortcutsPage() { Start dictation from desktop shortcuts and scripts

- Vocalinux can hand hotkey duty to your desktop. A running instance + Voculinux can hand hotkey duty to your desktop. A running instance answers on the session D-Bus, so a GNOME or KDE custom shortcut, a sway or Hyprland bind, or any script can start and stop voice typing - without Vocalinux reading your keyboard. + without Voculinux reading your keyboard.

@@ -230,7 +230,7 @@ export default function GlobalShortcutsPage() {

These names come from dbus_service.py in the - Vocalinux source. + Voculinux source.

@@ -309,8 +309,8 @@ export default function GlobalShortcutsPage() {

The same switch is stored as{" "} shortcuts.disable_internal_hotkey in{" "} - ~/.config/vocalinux/config.json. Quit - Vocalinux before editing that file by hand, or the running app can + ~/.config/voculinux/config.json. Quit + Voculinux before editing that file by hand, or the running app can overwrite your change.

@@ -321,13 +321,13 @@ export default function GlobalShortcutsPage() {

The key combination is your choice; the examples use Super+Shift+D. - Only the command matters to Vocalinux. Menu names and config syntax + Only the command matters to Voculinux. Menu names and config syntax belong to each desktop and can differ between versions.

GNOME

In Settings → Keyboard, open the custom shortcuts list, add a - shortcut, enter vocalinux --toggle as the + shortcut, enter voculinux --toggle as the command and record your key combination.

KDE Plasma

@@ -335,21 +335,21 @@ export default function GlobalShortcutsPage() { Open System Settings → Keyboard → Shortcuts → Add New → Command or Script (older Plasma: System Settings → Shortcuts → Custom Shortcuts → Edit → New → Global Shortcut → Command/URL) and bind your keys to{" "} - vocalinux --toggle. + voculinux --toggle.

- {"bindsym $mod+Shift+d exec vocalinux --toggle"} + {"bindsym $mod+Shift+d exec voculinux --toggle"} - {"bind = SUPER SHIFT, D, exec, vocalinux --toggle"} + {"bind = SUPER SHIFT, D, exec, voculinux --toggle"}

- If your compositor cannot find vocalinux, its + If your compositor cannot find voculinux, its PATH may not include ~/.local/bin. Use the full path{" "} - ~/.local/share/vocalinux/venv/bin/vocalinux{" "} + ~/.local/share/voculinux/venv/bin/voculinux{" "} for an installer setup, or the gdbus command above. More on tiling compositors in{" "} @@ -381,7 +381,7 @@ export default function GlobalShortcutsPage() {

  • On Flatpak,{" "} - flatpak run com.vocalinux.Vocalinux --toggle + flatpak run com.voculinux.Voculinux --toggle {" "} also works but starts a sandbox on each press; prefer{" "} gdbus. @@ -436,7 +436,7 @@ export default function GlobalShortcutsPage() { Bind your dictation key

    - Install Vocalinux, turn on External Activation, and let your desktop + Install Voculinux, turn on External Activation, and let your desktop own the shortcut.

    @@ -444,7 +444,7 @@ export default function GlobalShortcutsPage() { href="/install/" className="inline-flex items-center gap-2 rounded-full bg-primary px-4 py-2 text-sm font-semibold text-primary-foreground" > - Install Vocalinux + Install Voculinux

    If you see your GPU name, you're ready for accelerated dictation! - On multi-GPU machines Vocalinux prefers a discrete Vulkan device when + On multi-GPU machines Voculinux prefers a discrete Vulkan device when one is present; pick a specific device under Advanced settings if you need to override auto-select.

    @@ -324,7 +324,7 @@ export default function GpuAccelerationPage() {

    Some Intel integrated GPUs don't fully support the compute features needed for - whisper.cpp GPU acceleration. Vocalinux v0.7.0+ automatically detects incompatible + whisper.cpp GPU acceleration. Voculinux v0.7.0+ automatically detects incompatible Intel GPUs and falls back to CPU processing for reliability.

    diff --git a/web/src/app/hyprland-sway/page.tsx b/web/src/app/hyprland-sway/page.tsx index 7f74a2b..9662459 100644 --- a/web/src/app/hyprland-sway/page.tsx +++ b/web/src/app/hyprland-sway/page.tsx @@ -15,7 +15,7 @@ import { absoluteUrl, buildPageMetadata } from "@/lib/seo"; const PAGE_PATH = "/hyprland-sway"; const PAGE_TITLE = "Voice Typing on Hyprland, Sway and i3 for Linux"; const PAGE_DESCRIPTION = - "Set up Vocalinux voice typing on sway, i3 and Hyprland: pick wtype, ydotool, IBus or the RemoteDesktop portal, bind keys over D-Bus, and use the Dictation Pad."; + "Set up Voculinux voice typing on sway, i3 and Hyprland: pick wtype, ydotool, IBus or the RemoteDesktop portal, bind keys over D-Bus, and use the Dictation Pad."; const supportRows = [ { @@ -39,7 +39,7 @@ const backendRows = [ where: "Desktops that bridge IBus; on sway and Hyprland only with ibus-wayland running", needs: - "IBus. On sway and Hyprland, Vocalinux skips IBus unless the ibus-wayland bridge is running", + "IBus. On sway and Hyprland, Voculinux skips IBus unless the ibus-wayland bridge is running", }, { backend: "RemoteDesktop portal (portal)", @@ -66,20 +66,20 @@ const backendRows = [ const steps = [ { - name: "Install Vocalinux and the typing tools", - text: "Install Vocalinux, then make sure wtype and wl-clipboard are installed on sway or Hyprland, or xdotool on i3.", + name: "Install Voculinux and the typing tools", + text: "Install Voculinux, then make sure wtype and wl-clipboard are installed on sway or Hyprland, or xdotool on i3.", }, { name: "Check that the tool can type", - text: 'Focus a text field and run wtype "hello" on Wayland or xdotool type "hello" on X11. If nothing appears, Vocalinux cannot type there either.', + text: 'Focus a text field and run wtype "hello" on Wayland or xdotool type "hello" on X11. If nothing appears, Voculinux cannot type there either.', }, { name: "Choose how dictation starts", - text: "Either add yourself to the input group for the built-in hotkey, or turn on External Activation and bind vocalinux --toggle in your compositor config.", + text: "Either add yourself to the input group for the built-in hotkey, or turn on External Activation and bind voculinux --toggle in your compositor config.", }, { name: "Pin a backend if autodetection guesses wrong", - text: "Set text_injection.backend in ~/.config/vocalinux/config.json, for example to wtype, then restart Vocalinux.", + text: "Set text_injection.backend in ~/.config/voculinux/config.json, for example to wtype, then restart Voculinux.", }, ]; @@ -88,12 +88,12 @@ const faqs = [ question: "Why does dictation work in my browser but not in native Wayland apps?", answer: - "That is the classic IBus symptom: the compositor does not relay IBus commits to native Wayland clients, so IBus reports success while nothing appears. Pin the wtype backend and restart Vocalinux.", + "That is the classic IBus symptom: the compositor does not relay IBus commits to native Wayland clients, so IBus reports success while nothing appears. Pin the wtype backend and restart Voculinux.", }, { question: "Does the RemoteDesktop portal work on sway or Hyprland?", answer: - "Only if your portal backend implements org.freedesktop.portal.RemoteDesktop. GNOME and KDE Plasma do and most wlroots compositors do not. When it is missing, Vocalinux moves on to ydotool and then wtype.", + "Only if your portal backend implements org.freedesktop.portal.RemoteDesktop. GNOME and KDE Plasma do and most wlroots compositors do not. When it is missing, Voculinux moves on to ydotool and then wtype.", }, { question: "Can I use push-to-talk on a tiling compositor?", @@ -108,7 +108,7 @@ const faqs = [ ]; export const metadata: Metadata = buildPageMetadata({ - title: `${PAGE_TITLE} | Vocalinux`, + title: `${PAGE_TITLE} | Voculinux`, description: PAGE_DESCRIPTION, path: PAGE_PATH, keywords: [ @@ -157,17 +157,17 @@ export default function HyprlandSwayPage() { }, publisher: { "@type": "Organization", - name: "Vocalinux", + name: "Voculinux", logo: { "@type": "ImageObject", - url: absoluteUrl("/vocalinux.png"), + url: absoluteUrl("/voculinux.png"), }, }, mainEntityOfPage: absoluteUrl(PAGE_PATH), }, { "@type": "HowTo", - name: "Set up Vocalinux voice typing on sway, i3 or Hyprland", + name: "Set up Voculinux voice typing on sway, i3 or Hyprland", step: steps.map((step, index) => ({ "@type": "HowToStep", position: index + 1, @@ -199,7 +199,7 @@ export default function HyprlandSwayPage() { Voice typing on Hyprland, sway and i3

    - Tiling setups are hand-built, so Vocalinux cannot assume the pieces a + Tiling setups are hand-built, so Voculinux cannot assume the pieces a full desktop provides. This guide covers which text injection backend applies on each compositor, how to bind dictation to a key in your config, and the fallback that works when typing into other windows @@ -261,7 +261,7 @@ export default function HyprlandSwayPage() { Text injection options

    - Vocalinux picks a backend automatically. On Wayland, when IBus is not + Voculinux picks a backend automatically. On Wayland, when IBus is not selected, it tries the RemoteDesktop portal first, then ydotool, then wtype, and finally xdotool for XWayland windows. sway and Hyprland are on its list of compositors that do not bridge IBus to native Wayland @@ -304,9 +304,9 @@ export default function HyprlandSwayPage() {

    Pin a backend

    - Edit ~/.config/vocalinux/config.json and - restart Vocalinux. An explicit non-IBus value skips IBus selection. If - the pinned tool is missing, Vocalinux warns and falls back to its + Edit ~/.config/voculinux/config.json and + restart Voculinux. An explicit non-IBus value skips IBus selection. If + the pinned tool is missing, Voculinux warns and falls back to its normal order.

    @@ -320,12 +320,12 @@ export default function HyprlandSwayPage() { To try a backend for one run without saving it:

    Terminals

    - When text goes in through the clipboard, Vocalinux sends Ctrl+V in + When text goes in through the clipboard, Voculinux sends Ctrl+V in normal fields and Ctrl+Shift+V in terminal windows. Terminal detection works on Hyprland, sway and niri.

    @@ -369,10 +369,10 @@ export default function HyprlandSwayPage() {

    - {"bindsym $mod+Shift+d exec vocalinux --toggle"} + {"bindsym $mod+Shift+d exec voculinux --toggle"} - {"bind = SUPER SHIFT, D, exec, vocalinux --toggle"} + {"bind = SUPER SHIFT, D, exec, voculinux --toggle"}

    @@ -425,7 +425,7 @@ export default function HyprlandSwayPage() {

    Nothing is typed anywhere

    - Install the Wayland tools and test them by hand, then run Vocalinux + Install the Wayland tools and test them by hand, then run Voculinux with debug logging and check which backend it reports. The startup log records a pin request; a live test in the target app is the real confirmation. @@ -489,7 +489,7 @@ export default function HyprlandSwayPage() { Dictate on your tiling setup

    - Install Vocalinux, check that wtype or xdotool can type, and bind + Install Voculinux, check that wtype or xdotool can type, and bind dictation to a key in your compositor config.

    @@ -497,7 +497,7 @@ export default function HyprlandSwayPage() { href="/install/" className="inline-flex items-center gap-2 rounded-full bg-primary px-4 py-2 text-sm font-semibold text-primary-foreground" > - Install Vocalinux + Install Voculinux
  • - Speech models are not part of the Nix store. Vocalinux downloads one + Speech models are not part of the Nix store. Voculinux downloads one only after you confirm it, and shows the size first.
  • diff --git a/web/src/app/install/page.tsx b/web/src/app/install/page.tsx index 21b93e3..6c175b9 100644 --- a/web/src/app/install/page.tsx +++ b/web/src/app/install/page.tsx @@ -31,7 +31,7 @@ const distroGuides = [ name: "Arch Linux", href: "/install/arch/", description: - "Install Vocalinux on Arch, Manjaro, and EndeavourOS with package prerequisites and tips.", + "Install Voculinux on Arch, Manjaro, and EndeavourOS with package prerequisites and tips.", icon: Cpu, }, { @@ -55,7 +55,7 @@ const distroGuides = [ { name: "Pop!_OS", href: "/install/pop-os/", - description: "Install Vocalinux on Pop!_OS 24.04 and later.", + description: "Install Voculinux on Pop!_OS 24.04 and later.", icon: Laptop, }, { @@ -99,7 +99,7 @@ export default function InstallGuidesPage() { />

    - Then launch vocalinux. + Then launch voculinux.

    Snap Store

    Snap

    - snap install vocalinux --edge. amd64 only for + snap install voculinux --edge. amd64 only for now; a .snap is attached to every release too.

    Arch

    AUR

    - yay -S vocalinux, or vocalinux-bin for the + yay -S voculinux, or voculinux-bin for the prebuilt package.

    @@ -208,7 +208,7 @@ export default function InstallGuidesPage() {
  • Launch with{" "} - vocalinux + voculinux .
  • diff --git a/web/src/app/languages/page.tsx b/web/src/app/languages/page.tsx index bb5e32d..35987a7 100644 --- a/web/src/app/languages/page.tsx +++ b/web/src/app/languages/page.tsx @@ -288,7 +288,7 @@ const features = [ { title: "Automatic Language Detection", description: - "Vocalinux can automatically detect the language you're speaking, no manual switching required.", + "Voculinux can automatically detect the language you're speaking, no manual switching required.", icon: Globe, }, { @@ -335,7 +335,7 @@ export default function LanguagesPage() { "@type": "Article", headline: `Multilingual Voice Dictation for Linux - ${languageCount}+ Languages Supported`, description: - "Complete guide to Vocalinux multilingual voice dictation. Dictate in Spanish, French, German, Hungarian, Japanese, Korean, Arabic, Hindi, and more.", + "Complete guide to Voculinux multilingual voice dictation. Dictate in Spanish, French, German, Hungarian, Japanese, Korean, Arabic, Hindi, and more.", dateModified: "2026-07-29", author: { "@type": "Person", @@ -344,10 +344,10 @@ export default function LanguagesPage() { }, publisher: { "@type": "Organization", - name: "Vocalinux", + name: "Voculinux", logo: { "@type": "ImageObject", - url: absoluteUrl("/vocalinux.png"), + url: absoluteUrl("/voculinux.png"), }, }, mainEntityOfPage: absoluteUrl("/languages"), @@ -369,7 +369,7 @@ export default function LanguagesPage() { Multilingual Voice Dictation for Linux

    - Dictate in your native language. Vocalinux lists {languageCount} languages in Settings, + Dictate in your native language. Voculinux lists {languageCount} languages in Settings, and whisper.cpp / Whisper can auto-detect many more. Local engines stay on the machine.

    @@ -464,7 +464,7 @@ export default function LanguagesPage() {

    Ready to Dictate in Your Language?

    - Install Vocalinux and start dictating in your preferred language. All processing happens + Install Voculinux and start dictating in your preferred language. All processing happens locally on your Linux machine.

    diff --git a/web/src/app/layout.tsx b/web/src/app/layout.tsx index aff7201..4648b84 100644 --- a/web/src/app/layout.tsx +++ b/web/src/app/layout.tsx @@ -10,7 +10,6 @@ import { SITE_NAME, SITE_URL, TWITTER_HANDLE, - VOCAHQ_URL, } from "@/lib/seo"; export const viewport = { @@ -23,8 +22,8 @@ export const viewport = { export const metadata: Metadata = { metadataBase: new URL(SITE_URL), title: { - default: "Vocalinux: Offline Speech to Text & Voice Dictation for Linux", - template: "%s | Vocalinux", + default: "Voculinux: Offline Speech to Text & Voice Dictation for Linux", + template: "%s | Voculinux", }, description: "Free, open-source speech to text for Linux. Offline voice dictation and voice typing in any app with whisper.cpp, VOSK or Parakeet, on X11 and Wayland.", @@ -52,11 +51,11 @@ export const metadata: Metadata = { publisher: SITE_NAME, icons: { icon: [ - { url: "/brand/vocalinux-mark-circle.svg", type: "image/svg+xml" }, + { url: "/brand/voculinux-mark-circle.svg", type: "image/svg+xml" }, { url: "/favicon-16x16.png", sizes: "16x16", type: "image/png" }, { url: "/favicon-32x32.png", sizes: "32x32", type: "image/png" }, { url: "/favicon-96x96.png", sizes: "96x96", type: "image/png" }, - { url: "/vocalinux.png", type: "image/png", sizes: "512x512" }, + { url: "/voculinux.png", type: "image/png", sizes: "512x512" }, ], apple: [ { url: "/apple-touch-icon.png", sizes: "180x180", type: "image/png" }, @@ -80,7 +79,7 @@ export const metadata: Metadata = { locale: "en_US", url: absoluteUrl("/"), siteName: SITE_NAME, - title: "Vocalinux: Offline Speech to Text & Voice Dictation for Linux", + 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.", images: [ @@ -94,7 +93,7 @@ export const metadata: Metadata = { }, twitter: { card: "summary_large_image", - title: "Vocalinux: Offline Speech to Text & Voice Dictation for Linux", + title: "Voculinux: Offline Speech to Text & Voice Dictation for Linux", 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], @@ -127,19 +126,14 @@ const organizationJsonLd = { "@id": `${absoluteUrl("/")}#organization`, name: SITE_NAME, url: absoluteUrl("/"), - logo: absoluteUrl("/vocalinux.png"), + logo: absoluteUrl("/voculinux.png"), description: "Open-source, offline voice dictation software for Linux.", - sameAs: [GITHUB_REPO_URL, VOCAHQ_URL], + sameAs: [GITHUB_REPO_URL, "https://bongbetic.com"], founder: { "@type": "Person", name: "Jatin K Malik", url: "https://github.com/jatinkrmalik", }, - parentOrganization: { - "@type": "Organization", - name: "VocaHQ", - url: VOCAHQ_URL, - }, }; const webSiteJsonLd = { @@ -150,7 +144,7 @@ const webSiteJsonLd = { url: absoluteUrl("/"), inLanguage: "en-US", description: - "Vocalinux provides offline speech-to-text and voice dictation for Linux desktops.", + "Voculinux provides offline speech-to-text and voice dictation for Linux desktops.", publisher: { "@id": `${absoluteUrl("/")}#organization`, }, diff --git a/web/src/app/local-gateway/page.tsx b/web/src/app/local-gateway/page.tsx index 6f1bb77..d743aea 100644 --- a/web/src/app/local-gateway/page.tsx +++ b/web/src/app/local-gateway/page.tsx @@ -14,7 +14,7 @@ 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 Vocalinux Settings with podman or docker, connect it via Remote API, and learn why gateway mode is not on-device transcription."; + "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 = [ { @@ -74,7 +74,7 @@ const steps = [ }, { name: "Use this Gateway", - text: "Click Use this Gateway. Vocalinux fills Remote Server with the gateway URL and bearer token, sets the endpoint to /v1/audio/transcriptions and switches the engine to Remote API.", + 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", @@ -86,10 +86,10 @@ const faqs = [ { question: "Is a local gateway the same as on-device dictation?", answer: - "No. Even on 127.0.0.1, audio leaves the Vocalinux 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.", + "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 Vocalinux stop the gateway?", + 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.", }, @@ -111,14 +111,14 @@ const faqs = [ ]; export const metadata: Metadata = buildPageMetadata({ - title: `${PAGE_TITLE} | Vocalinux`, + title: `${PAGE_TITLE} | Voculinux`, description: PAGE_DESCRIPTION, path: PAGE_PATH, keywords: [ "vocagateway linux", "local speech gateway podman", "self hosted dictation gateway", - "vocalinux remote api gateway", + "voculinux remote api gateway", "docker speech to text linux dictation", "phone dictation gateway linux", ], @@ -148,17 +148,17 @@ export default function LocalGatewayPage() { }, publisher: { "@type": "Organization", - name: "Vocalinux", + name: "Voculinux", logo: { "@type": "ImageObject", - url: absoluteUrl("/vocalinux.png"), + url: absoluteUrl("/voculinux.png"), }, }, mainEntityOfPage: absoluteUrl(PAGE_PATH), }, { "@type": "HowTo", - name: "Run a local VocaGateway from Vocalinux Settings", + name: "Run a local VocaGateway from Voculinux Settings", step: steps.map((step, index) => ({ "@type": "HowToStep", position: index + 1, @@ -187,10 +187,10 @@ export default function LocalGatewayPage() {

    Added in v0.18.0 · optional

    - Run a local VocaGateway from Vocalinux + Run a local VocaGateway from Voculinux

    - Vocalinux can start{" "} + Voculinux can start{" "}

    - With a local engine, audio is transcribed on this machine by Vocalinux + 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 - Vocalinux at a gateway on another machine, your audio leaves this + 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 @@ -334,7 +334,7 @@ export default function LocalGatewayPage() {

    - What Vocalinux sets up + What Voculinux sets up

    • @@ -347,7 +347,7 @@ export default function LocalGatewayPage() {
    • A private bootstrap token in{" "} - ~/.config/vocalinux/gateway_embed/ with + ~/.config/voculinux/gateway_embed/ with mode 600, plus a matching Compose .env.
    • @@ -383,10 +383,10 @@ export default function LocalGatewayPage() {

      Quit does not stop it

      - The container keeps running after you quit Vocalinux, including a + 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. Vocalinux does not + named data volume, so downloaded models survive. Voculinux does not start the gateway on login.

      Other machines

      @@ -446,7 +446,7 @@ export default function LocalGatewayPage() { Start on-device, add a gateway later

      - Install Vocalinux with the default on-device engine. Add a local + Install Voculinux with the default on-device engine. Add a local VocaGateway only if you need a shared transcription service.

      @@ -454,7 +454,7 @@ export default function LocalGatewayPage() { href="/install/" className="inline-flex items-center gap-2 rounded-full bg-primary px-4 py-2 text-sm font-semibold text-primary-foreground" > - Install Vocalinux + Install Voculinux
    • - On other desktops Vocalinux uses the configured primary layout, + On other desktops Voculinux uses the configured primary layout, which does not follow your switches. A layout with no catalog language falls back to auto-detect.
    • @@ -334,7 +334,7 @@ export default function MultilingualDictationPage() { The settings in config.json

      - Settings writes these to ~/.config/vocalinux/config.json. + Settings writes these to ~/.config/voculinux/config.json. The value "layout" is how Follow keyboard layout is stored:

      @@ -469,7 +469,7 @@ export default function MultilingualDictationPage() { Dictate in your languages

      - Install Vocalinux, keep the default whisper.cpp engine with a + Install Voculinux, keep the default whisper.cpp engine with a multilingual model, and add a shortcut for each language you write in. Names and jargon in any language can go in the{" "} custom dictionary. @@ -479,7 +479,7 @@ export default function MultilingualDictationPage() { href="/install/" className="inline-flex items-center gap-2 rounded-full bg-primary px-4 py-2 text-sm font-semibold text-primary-foreground" > - Install Vocalinux + Install Voculinux

      The link is broken, the page moved, or the URL picked up a typo - on the way here. Vocalinux can type what you say, but it can't + on the way here. Voculinux can type what you say, but it can't type a page that doesn't exist.

    @@ -70,7 +70,7 @@ export default function NotFound() { Back to home - Install Vocalinux + Install Voculinux
    - + @@ -218,7 +218,7 @@ export default function OfflinePage() { How Offline Processing Works

    - Vocalinux uses speech recognition models that run entirely on your CPU or GPU: + Voculinux uses speech recognition models that run entirely on your CPU or GPU:

    - + @@ -219,7 +219,7 @@ export default function OpenSourcePage() { {vsProprietary.map((row) => ( - + ))} @@ -231,7 +231,7 @@ export default function OpenSourcePage() {

    Built on Open Source

    - Vocalinux stands on the shoulders of these excellent open source projects: + Voculinux stands on the shoulders of these excellent open source projects:

    {techStack.map((tech) => ( @@ -257,7 +257,7 @@ export default function OpenSourcePage() {

    Privacy by Design

    - Because Vocalinux is open source, you can verify what local engines do on your + Because Voculinux is open source, you can verify what local engines do on your machine. The installed app has no usage telemetry. Remote API is optional and only talks to a server you configure.

    @@ -282,7 +282,7 @@ export default function OpenSourcePage() {

    - Contribute to Vocalinux + Contribute to Voculinux

    We welcome contributions! Whether it's bug fixes, features, documentation, or @@ -304,7 +304,7 @@ export default function OpenSourcePage() {

    Join the Open Source Revolution

    - Install Vocalinux and experience voice dictation that respects your freedom and privacy. + Install Voculinux and experience voice dictation that respects your freedom and privacy.

    Then launch voculinux.

    + +

    Void Linux

    +

    xbps repository

    +

    + Signed xbps repository data is attached to every release. + Install and update with the normal Void package tools. +

    +
    Auto-updates

    Flatpak

    - Install once from the VocaHQ remote and{" "} + Install once from the Flatpak remote and{" "} flatpak update carries each stable release. Or sideload the .flatpak bundle.

    @@ -952,14 +971,13 @@ export default function HomePage() {

    - Same promise, other machines. + A hard fork for Void Linux.

    - Voculinux is part of{" "} - - VocaHQ - - . This site is about the Linux app. + Voculinux is a hard fork of Vocalinux for Void Linux (glibc, + Wayland-primary under niri). The internal Python module keeps + the upstream name so fixes stay cheap to port by hand; upstream + links below are retained as provenance.

    @@ -982,91 +1000,52 @@ export default function HomePage() { Linux.

    - -
    - - - macOS - - Available now -
    -

    VocaMac

    -

    - Native macOS menu bar app. Offline voice-to-text with WhisperKit - and CoreML. -

    -
    - -
    - - - Windows - - Beta -
    -

    VocaWin

    -

    - Unsigned Windows speech-to-text, v0.1.1-beta. SmartScreen may - warn about an unknown publisher. -

    -
    - -
    - - - - - - iPhone + Android - - Android on Google Play / iOS TestFlight -
    -

    VocaPhone

    -

    - Android on Google Play and iOS TestFlight. On-device first, - gateway optional. -

    -
    - Infrastructure + Upstream - Beta + Provenance
    -

    VocaGateway

    +

    Vocalinux (upstream)

    - Optional self-hosted speech-to-text on hardware you run. Not - on-device. + The upstream Linux dictation app this fork is ported from. + Fixes are taken by hand, one at a time. +

    +
    + +
    + + {/* Hosted brand asset: never vendored into the repository. */} + {/* eslint-disable-next-line @next/next/no-img-element */} + + Publisher + + Attribution +
    +

    Bongbetic

    +

    + Attribution chrome only. Brand binaries stay hosted; the + repository gains no brand files.

    diff --git a/web/src/app/parakeet/page.tsx b/web/src/app/parakeet/page.tsx index 47ec0bb..a2a2307 100644 --- a/web/src/app/parakeet/page.tsx +++ b/web/src/app/parakeet/page.tsx @@ -71,12 +71,12 @@ const packages = [ note: "Use --engine=parakeet", }, { - name: "AUR (vocalinux)", + name: "AUR (voculinux)", parakeet: true, note: "Listed as an optional dependency: python-sherpa-onnx", }, { - name: "AppImage (and AUR vocalinux-bin)", + name: "AppImage (and AUR voculinux-bin)", parakeet: false, note: "Ships whisper.cpp only", }, @@ -146,7 +146,7 @@ const faqs = [ { question: "Why is the Language picker greyed out or ignored with Parakeet?", answer: - "Parakeet's language coverage comes from the model, not from the Vocalinux language catalog. Vocalinux treats the language as auto for Parakeet, so pick v2-english for English only or v3-european for the European set. Follow keyboard layout is not available for Parakeet.", + "Parakeet's language coverage comes from the model, not from the Voculinux language catalog. Voculinux treats the language as auto for Parakeet, so pick v2-english for English only or v3-european for the European set. Follow keyboard layout is not available for Parakeet.", }, { question: "Can I use Parakeet from the AppImage, Flatpak or Snap?", @@ -156,14 +156,14 @@ const faqs = [ { question: "What is Orukeet?", answer: - "Orukeet v0.1.0 is an optional model for the Parakeet engine, added in v0.18.0. It runs on the same local sherpa-onnx recognizer, covers 25 European languages, takes about 641 MiB, and its weights are licensed CC BY-SA 4.0. Vocalinux downloads it from a pinned Hugging Face revision and checks every file against bundled SHA-256 pins.", + "Orukeet v0.1.0 is an optional model for the Parakeet engine, added in v0.18.0. It runs on the same local sherpa-onnx recognizer, covers 25 European languages, takes about 641 MiB, and its weights are licensed CC BY-SA 4.0. Voculinux downloads it from a pinned Hugging Face revision and checks every file against bundled SHA-256 pins.", }, ]; export const metadata: Metadata = buildPageMetadata({ - title: "Parakeet Speech Recognition on Linux | Vocalinux", + title: "Parakeet Speech Recognition on Linux | Voculinux", description: - "Run NVIDIA Parakeet TDT speech recognition offline on Linux with Vocalinux: install, pick v3-european, v2-english or Orukeet, languages, packages and fixes.", + "Run NVIDIA Parakeet TDT speech recognition offline on Linux with Voculinux: install, pick v3-european, v2-english or Orukeet, languages, packages and fixes.", path: "/parakeet", keywords: [ "Parakeet speech recognition Linux", @@ -183,7 +183,7 @@ export default function ParakeetPage() { "@type": "TechArticle", headline: "Parakeet speech recognition on Linux", description: - "How to install and use the Parakeet speech engine in Vocalinux on Linux, including model variants, languages, package availability and troubleshooting.", + "How to install and use the Parakeet speech engine in Voculinux on Linux, including model variants, languages, package availability and troubleshooting.", dateModified: "2026-11-01", author: { "@type": "Person", @@ -192,10 +192,10 @@ export default function ParakeetPage() { }, publisher: { "@type": "Organization", - name: "Vocalinux", + name: "Voculinux", logo: { "@type": "ImageObject", - url: absoluteUrl("/vocalinux.png"), + url: absoluteUrl("/voculinux.png"), }, }, mainEntityOfPage: absoluteUrl("/parakeet"), @@ -203,7 +203,7 @@ export default function ParakeetPage() { { "@context": "https://schema.org", "@type": "HowTo", - name: "Set up the Parakeet engine in Vocalinux", + name: "Set up the Parakeet engine in Voculinux", step: setupSteps.map((step, index) => ({ "@type": "HowToStep", position: index + 1, @@ -238,12 +238,12 @@ export default function ParakeetPage() { Parakeet speech recognition on Linux

    - Parakeet is an optional local speech engine in Vocalinux. It runs + Parakeet is an optional local speech engine in Voculinux. It runs NVIDIA's Parakeet TDT 0.6B models on your CPU through sherpa-onnx and types what you say into the focused app, with no cloud transcription. It suits people who dictate in English or a European language and want a CPU engine with a short list of models to choose - from. + from. Parakeet is a best-effort extra: installable and selectable, outside the performance budgets.

    @@ -285,9 +285,9 @@ export default function ParakeetPage() {

    Parakeet is a family of automatic speech recognition models from - NVIDIA's NeMo toolkit. Vocalinux uses the TDT 0.6B models, + NVIDIA's NeMo toolkit. Voculinux uses the TDT 0.6B models, which are transducer models: they turn audio straight into text - tokens rather than generating text the way Whisper does. Vocalinux + tokens rather than generating text the way Whisper does. Voculinux loads int8 ONNX exports of these models with{" "}

    - Parakeet arrived in Vocalinux v0.17.0 alongside Faster Whisper. + Parakeet arrived in Voculinux v0.17.0 alongside Faster Whisper. whisper.cpp is still the default engine; Parakeet is something you opt into.

    @@ -339,11 +339,11 @@ export default function ParakeetPage() {

    To start once with Parakeet from a terminal, run{" "} - vocalinux --engine parakeet + voculinux --engine parakeet . In{" "} - ~/.config/vocalinux/config.json + ~/.config/voculinux/config.json {" "} the engine name is{" "} parakeet. @@ -356,7 +356,7 @@ export default function ParakeetPage() {

    The Model size picker lists three models for the Parakeet engine. - Sizes are the catalog values Vocalinux shows before a download. + Sizes are the catalog values Voculinux shows before a download.

    FeatureVocalinux (Offline)Voculinux (Offline) Cloud Dictation
    FeatureVocalinuxVoculinux Proprietary Alternatives
    {row.feature}{row.vocalinux}{row.voculinux} {row.proprietary}
    @@ -393,7 +393,7 @@ export default function ParakeetPage() { Orukeet v0.1.0 was added in v0.18.0. It uses the same local sherpa-onnx recognizer and covers 25 European languages; the recommended Parakeet model and the default whisper.cpp engine are - unchanged. Vocalinux downloads it from a pinned revision of{" "} + unchanged. Voculinux downloads it from a pinned revision of{" "}

    With Parakeet, the model decides the language, not the Language - picker. Vocalinux treats the language as auto for this engine, so a + picker. Voculinux treats the language as auto for this engine, so a language you chose for whisper.cpp is not passed to Parakeet. Choose v2-english if you only speak English, or v3-european (or Orukeet) for the 25-language European set. @@ -449,7 +449,7 @@ export default function ParakeetPage() { Hardware and packages

    - Parakeet runs on the CPU. Vocalinux's Vulkan and CUDA + Parakeet runs on the CPU. Voculinux's Vulkan and CUDA acceleration applies to whisper.cpp, so a GPU does not speed up Parakeet (see{" "} @@ -457,7 +457,7 @@ export default function ParakeetPage() { ). Plan for roughly 640 MB of disk per Parakeet model, stored under{" "} - ~/.local/share/vocalinux/models/ + ~/.local/share/voculinux/models/ .

    @@ -574,7 +574,7 @@ export default function ParakeetPage() { The model will not load after an interrupted download

    - Vocalinux refuses to load Parakeet files that fail checksum + Voculinux refuses to load Parakeet files that fail checksum verification. In Settings → Speech Model, delete the leftover model from Unused downloads and download it again. @@ -596,10 +596,10 @@ export default function ParakeetPage() {

    Run{" "} - vocalinux --debug{" "} + voculinux --debug{" "} and check{" "} - ~/.local/share/vocalinux/vocalinux.log + ~/.local/share/voculinux/voculinux.log , then see the{" "} @@ -633,7 +633,7 @@ export default function ParakeetPage() { Try Parakeet on your machine

    - Install Vocalinux with the Parakeet engine, or start with whisper.cpp + Install Voculinux with the Parakeet engine, or start with whisper.cpp and compare. Also see{" "} Faster Whisper on Linux @@ -645,7 +645,7 @@ export default function ParakeetPage() { href="/install/" className="inline-flex items-center gap-2 rounded-full bg-primary px-4 py-2 text-sm font-semibold text-primary-foreground" > - Install Vocalinux + Install Voculinux

    Added in v0.18.0

    - PipeWire audio capture in Vocalinux + PipeWire audio capture in Voculinux

    - Vocalinux records from two kinds of source: microphones, opened + Voculinux records from two kinds of source: microphones, opened through PortAudio, and system-audio sources that come straight from PipeWire. This page explains what each one is for, how to pick the right source, and what to check when dictation hears the wrong device @@ -178,10 +178,10 @@ export default function PipeWirePage() { PortAudio enumerates ALSA and PulseAudio devices, not PipeWire nodes. That works well for microphones, but it cannot see a sink's monitor, the stream of everything playing through an output. Since - v0.18.0 Vocalinux asks PipeWire directly: it lists sinks with{" "} + v0.18.0 Voculinux asks PipeWire directly: it lists sinks with{" "} pw-dump and records the chosen one with{" "} pw-record --raw. PipeWire converts the audio - to the format Vocalinux asks for inside its own graph, so no format + to the format Voculinux asks for inside its own graph, so no format negotiation is needed.

    @@ -263,7 +263,7 @@ export default function PipeWirePage() {

    Leaves valid default and virtual inputs under the sound server's control, so the mic you pick in desktop sound - settings is the one Vocalinux hears. + settings is the one Voculinux hears.

    @@ -273,7 +273,7 @@ export default function PipeWirePage() { />

    A named microphone

    - A valid explicit choice always wins over System Default. Vocalinux + A valid explicit choice always wins over System Default. Voculinux saves the device name and matches it again by name when indexes shift after a replug.

    @@ -297,7 +297,7 @@ export default function PipeWirePage() {

    Where the choice is stored

    The selection lives in{" "} - ~/.config/vocalinux/config.json under{" "} + ~/.config/voculinux/config.json under{" "} audio.device_index and{" "} audio.device_name. A{" "} null index means System Default. @@ -310,7 +310,7 @@ export default function PipeWirePage() { simply not listed.

  • - If a saved System audio sink disappears, Vocalinux refuses to record + If a saved System audio sink disappears, Voculinux refuses to record instead of quietly switching to a microphone, because that would capture the wrong audio. Pick a source again.
  • @@ -338,15 +338,15 @@ export default function PipeWirePage() {

    Select the mic by name in Settings → Audio → Input Device rather than relying on System Default. On ALSA-only setups where PortAudio - substitutes some other hardware for the default input, Vocalinux + substitutes some other hardware for the default input, Voculinux prefers an input-capable pulse device so it follows your desktop's choice, and logs a warning when none exists. Run with debug logging to see which device was opened:

    @@ -361,9 +361,9 @@ export default function PipeWirePage() {

    A Microphone Stalled notification means the selected input stopped - delivering audio and Vocalinux stopped that attempt. Use Microphone + delivering audio and Voculinux stopped that attempt. Use Microphone Test, or choose another Input Device. If a stale device index is the - problem, quit Vocalinux and set{" "} + problem, quit Voculinux and set{" "} audio.device_index to{" "} null in config.json. With a System audio source, remember that a silent output produces @@ -372,7 +372,7 @@ export default function PipeWirePage() {

    Bluetooth headsets

    Bluetooth headset microphones use a separate capture profile that is - sensitive to repeated opening. Vocalinux opens the stream once per + sensitive to repeated opening. Voculinux opens the stream once per session and pauses briefly between failed attempts on Bluetooth devices. If capture still fails, try a wired microphone to check whether the Bluetooth capture path is the cause. @@ -421,7 +421,7 @@ export default function PipeWirePage() { Pick a source and dictate

    - Install Vocalinux, choose your microphone or a system-audio source in + Install Voculinux, choose your microphone or a system-audio source in Settings → Audio, and run the Microphone Test before your first dictation.

    @@ -430,7 +430,7 @@ export default function PipeWirePage() { href="/install/" className="inline-flex items-center gap-2 rounded-full bg-primary px-4 py-2 text-sm font-semibold text-primary-foreground" > - Install Vocalinux + Install Voculinux
    @@ -108,7 +108,7 @@ export default function PrivacyPage() {

    - The installed Vocalinux app does not send usage telemetry. + The installed Voculinux app does not send usage telemetry. {" "} It does not phone home. The installed app does not do the following for us: @@ -149,17 +149,17 @@ export default function PrivacyPage() {

    - This website (vocalinux.com) + This website (voculinux.com)

    - vocalinux.com loads Google Analytics via the googletagmanager gtag + voculinux.com loads Google Analytics via the googletagmanager gtag script for measurement ID{" "} G-7NBBNJNNQ7{" "} and runs gtag config with no IP anonymization and no cookie flags. That sends page views and a Google Analytics client identifier (a cookie) to Google. Google processes IP addresses and device and - browser data. The installed Vocalinux app does not send usage + browser data. The installed Voculinux app does not send usage telemetry.

    @@ -204,7 +204,7 @@ export default function PrivacyPage() {

    - Vocalinux stores configuration locally at ~/.config/vocalinux/config.json: + Voculinux stores configuration locally at ~/.config/voculinux/config.json:

    • @@ -230,13 +230,13 @@ export default function PrivacyPage() { {/* Comparison with Cloud Services */}
      -

      Vocalinux vs Cloud Dictation Services

      +

      Voculinux vs Cloud Dictation Services

    - + diff --git a/web/src/app/remote-api/page.tsx b/web/src/app/remote-api/page.tsx index c474c9f..53d505c 100644 --- a/web/src/app/remote-api/page.tsx +++ b/web/src/app/remote-api/page.tsx @@ -25,16 +25,16 @@ const protocolOptions = [ name: "whisper.cpp server", endpoint: "/inference", description: - "Point Vocalinux at the HTTP server bundled with whisper.cpp when you want a small LAN transcription appliance.", + "Point Voculinux at the HTTP server bundled with whisper.cpp when you want a small LAN transcription appliance.", }, ]; const workflowSteps = [ - "Vocalinux records microphone audio locally as 16 kHz mono PCM.", + "Voculinux records microphone audio locally as 16 kHz mono PCM.", "Voice activity detection decides when an utterance is ready.", "The utterance is packaged as an in-memory WAV upload.", "The configured server returns JSON with a text field.", - "Vocalinux injects the transcription into the focused Linux app.", + "Voculinux injects the transcription into the focused Linux app.", ]; const setupSteps = [ @@ -51,7 +51,7 @@ const setupSteps = [ { title: "Choose the endpoint format", description: - "Select OpenAI-compatible or whisper.cpp so Vocalinux sends the multipart fields your server expects.", + "Select OpenAI-compatible or whisper.cpp so Voculinux sends the multipart fields your server expects.", }, { title: "Test, then dictate", @@ -63,12 +63,12 @@ const setupSteps = [ export const metadata: Metadata = buildPageMetadata({ title: "Remote API Speech Recognition for Linux Dictation", description: - "Configure Vocalinux Remote API speech recognition with OpenAI-compatible Whisper servers or whisper.cpp server endpoints for Linux voice dictation.", + "Configure Voculinux Remote API speech recognition with OpenAI-compatible Whisper servers or whisper.cpp server endpoints for Linux voice dictation.", path: "/remote-api", keywords: [ "remote api speech recognition linux", "openai compatible whisper linux dictation", - "whisper.cpp server vocalinux", + "whisper.cpp server voculinux", "self hosted transcription linux", ], }); @@ -79,7 +79,7 @@ export default function RemoteApiPage() { "@type": "TechArticle", headline: "Remote API Speech Recognition for Linux Dictation", description: - "How Vocalinux connects Linux voice dictation to OpenAI-compatible and whisper.cpp remote transcription servers.", + "How Voculinux connects Linux voice dictation to OpenAI-compatible and whisper.cpp remote transcription servers.", dateModified: "2026-06-11", author: { "@type": "Person", @@ -88,10 +88,10 @@ export default function RemoteApiPage() { }, publisher: { "@type": "Organization", - name: "Vocalinux", + name: "Voculinux", logo: { "@type": "ImageObject", - url: absoluteUrl("/vocalinux.png"), + url: absoluteUrl("/voculinux.png"), }, }, mainEntityOfPage: absoluteUrl("/remote-api"), @@ -113,9 +113,11 @@ export default function RemoteApiPage() { Remote API Speech Recognition for Linux

    - Vocalinux can offload the heavy transcription step to a trusted HTTP + Voculinux can offload the heavy transcription step to a trusted HTTP server while keeping desktop capture, voice activity detection, - shortcut handling, and text injection on your Linux machine. + shortcut handling, and text injection on your Linux machine. Remote + API is a user-configured, best-effort engine: audio leaves the + machine for the server you configure.

    @@ -137,7 +139,7 @@ export default function RemoteApiPage() { icon: Settings, title: "Same desktop workflow", description: - "Remote API behaves like a Vocalinux engine, so toggle mode, push-to-talk, VAD, and text injection still work normally.", + "Remote API behaves like a Voculinux engine, so toggle mode, push-to-talk, VAD, and text injection still work normally.", }, ].map((item) => { const Icon = item.icon; diff --git a/web/src/app/rsi-prevention/page.tsx b/web/src/app/rsi-prevention/page.tsx index 56ab7bf..46a397d 100644 --- a/web/src/app/rsi-prevention/page.tsx +++ b/web/src/app/rsi-prevention/page.tsx @@ -89,7 +89,7 @@ const statistics = [ ]; export const metadata: Metadata = buildPageMetadata({ - title: "Voice Dictation for RSI & Carpal Tunnel Prevention | Vocalinux", + title: "Voice Dictation for RSI & Carpal Tunnel Prevention | Voculinux", description: "Prevent and manage RSI, carpal tunnel, and repetitive strain injuries with voice dictation. Hands-free typing for Linux users with local engines or an optional Remote API.", path: "/rsi-prevention", @@ -120,10 +120,10 @@ export default function RsiPreventionPage() { }, publisher: { "@type": "Organization", - name: "Vocalinux", + name: "Voculinux", logo: { "@type": "ImageObject", - url: absoluteUrl("/vocalinux.png"), + url: absoluteUrl("/voculinux.png"), }, }, mainEntityOfPage: absoluteUrl("/rsi-prevention"), @@ -231,7 +231,7 @@ export default function RsiPreventionPage() {
    -

    Vocalinux Advantages

    +

    Voculinux Advantages

    • @@ -268,7 +268,7 @@ export default function RsiPreventionPage() { href="/install/" className="inline-flex items-center gap-2 rounded-full bg-primary px-4 py-2 text-sm font-semibold text-primary-foreground" > - Install Vocalinux + Install Voculinux

      - Vocalinux Screenshots + Voculinux Screenshots

      A look at offline voice dictation on Linux: tray controls, debugging @@ -170,7 +170,7 @@ export default function ScreenshotsPage() {

      Try it yourself

      - Install Vocalinux and open Settings from the system tray to explore + Install Voculinux and open Settings from the system tray to explore the same screens on your desktop.

      diff --git a/web/src/app/shortcuts/page.tsx b/web/src/app/shortcuts/page.tsx index 29cde00..17c9e60 100644 --- a/web/src/app/shortcuts/page.tsx +++ b/web/src/app/shortcuts/page.tsx @@ -84,7 +84,7 @@ const shortcutCategories = [ icon: Settings, iconColor: "text-primary", shortcuts: [ - { keys: ["Config File"], action: "~/.config/vocalinux/config.json", note: "Manual editing" }, + { keys: ["Config File"], action: "~/.config/voculinux/config.json", note: "Manual editing" }, ], }, ]; @@ -102,10 +102,10 @@ function Mic(props: { className?: string }) { export const metadata: Metadata = buildPageMetadata({ title: "Keyboard Shortcuts and Voice Commands", description: - "Learn Vocalinux keyboard shortcut modes and voice commands. Use toggle mode or push-to-talk, then customize activation and command behavior.", + "Learn Voculinux keyboard shortcut modes and voice commands. Use toggle mode or push-to-talk, then customize activation and command behavior.", path: "/shortcuts", keywords: [ - "vocalinux shortcuts", + "voculinux shortcuts", "linux voice dictation commands", "speech to text keyboard shortcuts", "voice commands linux", @@ -116,9 +116,9 @@ export default function ShortcutsPage() { const articleJsonLd = { "@context": "https://schema.org", "@type": "Article", - headline: "Vocalinux Keyboard Shortcuts & Voice Commands", + headline: "Voculinux Keyboard Shortcuts & Voice Commands", description: - "Complete guide to Vocalinux keyboard shortcuts and voice commands for efficient Linux voice dictation.", + "Complete guide to Voculinux keyboard shortcuts and voice commands for efficient Linux voice dictation.", dateModified: "2026-03-30", author: { "@type": "Person", @@ -127,10 +127,10 @@ export default function ShortcutsPage() { }, publisher: { "@type": "Organization", - name: "Vocalinux", + name: "Voculinux", logo: { "@type": "ImageObject", - url: absoluteUrl("/vocalinux.png"), + url: absoluteUrl("/voculinux.png"), }, }, mainEntityOfPage: absoluteUrl("/shortcuts"), @@ -152,7 +152,7 @@ export default function ShortcutsPage() { Keyboard Shortcuts & Voice Commands

      - Master Vocalinux with keyboard shortcuts and voice commands. New installs default to + Master Voculinux with keyboard shortcuts and voice commands. New installs default to push-to-talk (hold Right Alt), or switch to toggle mode (double-tap), then apply voice commands for editing and formatting.

      @@ -233,10 +233,10 @@ export default function ShortcutsPage() { configuration file directly:

      - ~/.config/vocalinux/config.json + ~/.config/voculinux/config.json

      - Open Vocalinux and access Settings from the tray icon to change keyboard shortcuts + Open Voculinux and access Settings from the tray icon to change keyboard shortcuts through the GUI.

      @@ -249,7 +249,7 @@ export default function ShortcutsPage() { >

      Frequently Asked Questions

      - Get answers to common questions about Vocalinux features and usage. + Get answers to common questions about Voculinux features and usage.

      View FAQ diff --git a/web/src/app/transcribe-audio-files/page.tsx b/web/src/app/transcribe-audio-files/page.tsx index 4b71e4c..c15b312 100644 --- a/web/src/app/transcribe-audio-files/page.tsx +++ b/web/src/app/transcribe-audio-files/page.tsx @@ -14,12 +14,12 @@ import { absoluteUrl, buildPageMetadata } from "@/lib/seo"; const PAGE_PATH = "/transcribe-audio-files"; -const cliCommand = "vocalinux --transcribe-file meeting.wav"; +const cliCommand = "voculinux --transcribe-file meeting.wav"; const howToSteps = [ { name: "Open the tray entry", - text: "Click the Vocalinux tray icon and choose Transcribe Audio File…", + text: "Click the Voculinux tray icon and choose Transcribe Audio File…", }, { name: "Pick a recording", @@ -27,7 +27,7 @@ const howToSteps = [ }, { name: "Download TinyDiarize once", - text: "The first time, Vocalinux asks to download the TinyDiarize model (about 465 MB, one time). Click Download. It is only used for file transcription and never becomes your dictation model.", + text: "The first time, Voculinux asks to download the TinyDiarize model (about 465 MB, one time). Click Download. It is only used for file transcription and never becomes your dictation model.", }, { name: "Wait for the transcript", @@ -61,15 +61,15 @@ const formatRows = [ const faqs = [ { q: "Can it label speakers in languages other than English?", - a: "No. The TinyDiarize model Vocalinux uses, small.en-tdrz, is English-only. Speaker labels and the transcript itself are for English audio.", + a: "No. The TinyDiarize model Voculinux uses, small.en-tdrz, is English-only. Speaker labels and the transcript itself are for English audio.", }, { q: "Does Speaker 1 always mean the same person?", - a: "No. TinyDiarize marks the points where the speaker changes, and Vocalinux numbers each new turn in order. A person who speaks again later gets a new number, so treat the labels as turn markers and rename them yourself.", + a: "No. TinyDiarize marks the points where the speaker changes, and Voculinux numbers each new turn in order. A person who speaks again later gets a new number, so treat the labels as turn markers and rename them yourself.", }, { q: "Why does the CLI say the model is not downloaded?", - a: "vocalinux --transcribe-file never downloads anything. Run Transcribe Audio File… from the tray once and accept the TinyDiarize download, then the CLI can use the model.", + a: "voculinux --transcribe-file never downloads anything. Run Transcribe Audio File… from the tray once and accept the TinyDiarize download, then the CLI can use the model.", }, { q: "Is my audio uploaded anywhere?", @@ -82,9 +82,9 @@ const faqs = [ ]; export const metadata: Metadata = buildPageMetadata({ - title: "Transcribe Audio Files on Linux Offline with Speakers | Vocalinux", + title: "Transcribe Audio Files on Linux Offline with Speakers | Voculinux", description: - "Transcribe an audio file on Linux offline with Vocalinux: tray or --transcribe-file, local TinyDiarize speaker labels (English), formats, output and limits.", + "Transcribe an audio file on Linux offline with Voculinux: tray or --transcribe-file, local TinyDiarize speaker labels (English), formats, output and limits.", path: PAGE_PATH, keywords: [ "transcribe audio file Linux offline", @@ -102,7 +102,7 @@ export default function TranscribeAudioFilesPage() { "@type": "TechArticle", headline: "Transcribe Audio Files on Linux Offline with Speaker Labels", description: - "How to transcribe recordings locally with Vocalinux from the tray or the --transcribe-file CLI, and how TinyDiarize speaker labels work.", + "How to transcribe recordings locally with Voculinux from the tray or the --transcribe-file CLI, and how TinyDiarize speaker labels work.", dateModified: "2026-11-01", author: { "@type": "Person", @@ -111,10 +111,10 @@ export default function TranscribeAudioFilesPage() { }, publisher: { "@type": "Organization", - name: "Vocalinux", + name: "Voculinux", logo: { "@type": "ImageObject", - url: absoluteUrl("/vocalinux.png"), + url: absoluteUrl("/voculinux.png"), }, }, mainEntityOfPage: absoluteUrl(PAGE_PATH), @@ -123,7 +123,7 @@ export default function TranscribeAudioFilesPage() { const howToJsonLd = { "@context": "https://schema.org", "@type": "HowTo", - name: "Transcribe an audio file with speaker labels in Vocalinux", + name: "Transcribe an audio file with speaker labels in Voculinux", step: howToSteps.map((step, index) => ({ "@type": "HowToStep", position: index + 1, @@ -163,7 +163,7 @@ export default function TranscribeAudioFilesPage() { Transcribe audio files offline, with speaker labels

      - Vocalinux can turn a recorded meeting, interview or voice memo into a + Voculinux can turn a recorded meeting, interview or voice memo into a text transcript on your own machine. It uses TinyDiarize, a whisper.cpp model that also marks where the speaker changes, so the transcript comes out as timestamped blocks labelled Speaker 1, Speaker @@ -222,7 +222,7 @@ export default function TranscribeAudioFilesPage() {

      The model download is checked against a pinned SHA-256 digest before - use, like every other Vocalinux model. The status line under the + use, like every other Voculinux model. The status line under the transcript reports how many blocks were found and the highest speaker number.

      @@ -244,7 +244,7 @@ export default function TranscribeAudioFilesPage() { />
      • - It needs no display and no tray, and it runs alongside a Vocalinux + It needs no display and no tray, and it runs alongside a Voculinux instance that is already running, so it works over SSH or from a script.
      • @@ -256,9 +256,9 @@ export default function TranscribeAudioFilesPage() {
      • Because the transcript goes to standard output, you can redirect it to a file with your shell. Errors go to standard error, prefixed - with vocalinux: could not transcribe, and the exit + with voculinux: could not transcribe, and the exit status is 1. A file with no detectable speech prints{" "} - vocalinux: no speech detected. + voculinux: no speech detected.
      @@ -272,7 +272,7 @@ export default function TranscribeAudioFilesPage() {
    - + @@ -286,7 +286,7 @@ export default function TranscribeAudioFilesPage() {
    FeatureVocalinuxVoculinux Cloud Services
    InputHow Vocalinux reads itHow Voculinux reads it

    - Vocalinux does not install ffmpeg for you. Without it, only 16-bit 16 + Voculinux does not install ffmpeg for you. Without it, only 16-bit 16 kHz WAV files can be transcribed, and the tray picker's filter says so.

    @@ -319,7 +319,7 @@ export default function TranscribeAudioFilesPage() {

    TinyDiarize is a small, English-only whisper.cpp model whose output includes a speaker-turn marker wherever it detects a change of voice. - Vocalinux runs it in whisper.cpp's tinydiarize mode and splits + Voculinux runs it in whisper.cpp's tinydiarize mode and splits the text at each marker. Each new block gets the next number.

    @@ -381,7 +381,7 @@ export default function TranscribeAudioFilesPage() {

    File transcription is available from v0.18.0; check yours with{" "} - vocalinux --version. For live dictation model choices, + voculinux --version. For live dictation model choices, see the Whisper model guide; to fix names the model mishears in dictation, use the{" "} custom dictionary. @@ -391,7 +391,7 @@ export default function TranscribeAudioFilesPage() { href="/install/" className="inline-flex items-center gap-2 rounded-full bg-primary px-4 py-2 text-sm font-semibold text-primary-foreground" > - Install Vocalinux + Install Voculinux

    - Having issues with Vocalinux? Find solutions to common problems below. + Having issues with Voculinux? Find solutions to common problems below. Can't find your issue? Open a GitHub issue for help.

    @@ -231,10 +231,10 @@ export default function TroubleshootingPage() { Quick Debug Command

    - Run Vocalinux with debug output to see detailed logs: + Run Voculinux with debug output to see detailed logs:

    - vocalinux --debug + voculinux --debug
    diff --git a/web/src/app/use-cases/page.tsx b/web/src/app/use-cases/page.tsx index ccf1710..b9f9d94 100644 --- a/web/src/app/use-cases/page.tsx +++ b/web/src/app/use-cases/page.tsx @@ -94,7 +94,7 @@ const useCases = [ export const metadata: Metadata = buildPageMetadata({ title: "Use Cases for Linux Voice Dictation", description: - "Discover how developers, writers, students, and professionals use Vocalinux for Linux voice dictation. Find your use case and boost productivity.", + "Discover how developers, writers, students, and professionals use Voculinux for Linux voice dictation. Find your use case and boost productivity.", path: "/use-cases", keywords: [ "voice dictation for developers", @@ -108,9 +108,9 @@ export default function UseCasesPage() { const articleJsonLd = { "@context": "https://schema.org", "@type": "Article", - headline: "Vocalinux Use Cases - Voice Dictation for Every Workflow", + headline: "Voculinux Use Cases - Voice Dictation for Every Workflow", description: - "Discover how different professionals use Vocalinux for Linux voice dictation.", + "Discover how different professionals use Voculinux for Linux voice dictation.", dateModified: "2026-02-19", author: { "@type": "Person", @@ -119,10 +119,10 @@ export default function UseCasesPage() { }, publisher: { "@type": "Organization", - name: "Vocalinux", + name: "Voculinux", logo: { "@type": "ImageObject", - url: absoluteUrl("/vocalinux.png"), + url: absoluteUrl("/voculinux.png"), }, }, mainEntityOfPage: absoluteUrl("/use-cases"), @@ -144,7 +144,7 @@ export default function UseCasesPage() { Voice Dictation for Every Workflow

    - Whether you're coding, writing, studying, or need accessibility support, Vocalinux adapts + Whether you're coding, writing, studying, or need accessibility support, Voculinux adapts to your needs. See how different professionals use voice dictation to boost productivity.

    @@ -202,7 +202,7 @@ export default function UseCasesPage() {

    Ready to Get Started?

    - Install Vocalinux in minutes and start dictating in any application on Linux. + Install Voculinux in minutes and start dictating in any application on Linux.

    - Vocalinux now uses Silero neural voice activity detection when ONNX + Voculinux now uses Silero neural voice activity detection when ONNX Runtime support is available. It identifies speech before transcription, drops silence-only buffers, and falls back safely when the neural backend is not installed. @@ -142,12 +142,12 @@ export default function VoiceActivityDetectionPage() {

    The official installer attempts to install neural VAD support. If - ONNX Runtime is not available, Vocalinux logs the fallback and + ONNX Runtime is not available, Voculinux logs the fallback and continues with amplitude-based VAD.

    - pip install "vocalinux[vad]" + pip install "voculinux[vad]"

    diff --git a/web/src/app/voice-typing-vscode/page.tsx b/web/src/app/voice-typing-vscode/page.tsx index 1677ea9..e4914ef 100644 --- a/web/src/app/voice-typing-vscode/page.tsx +++ b/web/src/app/voice-typing-vscode/page.tsx @@ -16,9 +16,9 @@ import { absoluteUrl, buildPageMetadata } from "@/lib/seo"; const setupSteps = [ { - title: "Install Vocalinux", + title: "Install Voculinux", description: - "Follow the install guide, launch Vocalinux, and confirm your microphone and language are configured.", + "Follow the install guide, launch Voculinux, and confirm your microphone and language are configured.", href: "/install/", linkLabel: "Open installation guide", icon: CheckCircle2, @@ -83,8 +83,8 @@ const vscodeTips = [ ]; const troubleshootingTips = [ - "No text appears in VS Code: verify Vocalinux is active and the editor window is focused.", - "Shortcut conflicts: remap Vocalinux activation to avoid overlapping VS Code keybinds.", + "No text appears in VS Code: verify Voculinux is active and the editor window is focused.", + "Shortcut conflicts: remap Voculinux activation to avoid overlapping VS Code keybinds.", "Unexpected punctuation: review your voice command phrases and disable commands if needed.", "Low accuracy: use a quieter mic setup and test another model size/engine in settings.", ]; @@ -92,14 +92,14 @@ const troubleshootingTips = [ export const metadata: Metadata = buildPageMetadata({ title: "How to Dictate in VS Code on Linux (Voice Coding Workflow)", description: - "Learn how to use voice dictation in VS Code on Linux. Setup Vocalinux for programming, recommended workflows for coding, PTT vs toggle mode, and troubleshooting tips.", + "Learn how to use voice dictation in VS Code on Linux. Setup Voculinux for programming, recommended workflows for coding, PTT vs toggle mode, and troubleshooting tips.", path: "/voice-typing-vscode", keywords: [ "voice typing VS Code Linux", "voice coding linux", "dictate code linux", "speech to text programming linux", - "vocalinux VS Code", + "voculinux VS Code", ], }); @@ -109,7 +109,7 @@ export default function VoiceTypingVsCodePage() { "@type": "Article", headline: "How to Dictate in VS Code on Linux (Voice Coding Workflow)", description: - "Learn how to use voice dictation in VS Code on Linux. Setup Vocalinux for programming, recommended workflows for coding, PTT vs toggle mode, and troubleshooting tips.", + "Learn how to use voice dictation in VS Code on Linux. Setup Voculinux for programming, recommended workflows for coding, PTT vs toggle mode, and troubleshooting tips.", dateModified: "2026-03-30", author: { "@type": "Person", @@ -118,10 +118,10 @@ export default function VoiceTypingVsCodePage() { }, publisher: { "@type": "Organization", - name: "Vocalinux", + name: "Voculinux", logo: { "@type": "ImageObject", - url: absoluteUrl("/vocalinux.png"), + url: absoluteUrl("/voculinux.png"), }, }, mainEntityOfPage: absoluteUrl("/voice-typing-vscode"), @@ -143,7 +143,7 @@ export default function VoiceTypingVsCodePage() { How to Dictate in VS Code on Linux (Voice Coding Workflow)

    - Learn how to use Vocalinux for practical, low-friction voice coding in VS Code on Linux. + Learn how to use Voculinux for practical, low-friction voice coding in VS Code on Linux. This guide covers setup, toggle vs push-to-talk, editing workflows, and common fixes.

    @@ -257,14 +257,14 @@ export default function VoiceTypingVsCodePage() {

    Ready to voice-type in VS Code?

    - Install Vocalinux and use a hybrid keyboard + voice workflow that fits real-world Linux + Install Voculinux and use a hybrid keyboard + voice workflow that fits real-world Linux development.

    - Install Vocalinux + Install Voculinux
    diff --git a/web/src/app/vs-nerd-dictation/page.tsx b/web/src/app/vs-nerd-dictation/page.tsx index 5cdd5ab..2cfd18b 100644 --- a/web/src/app/vs-nerd-dictation/page.tsx +++ b/web/src/app/vs-nerd-dictation/page.tsx @@ -17,62 +17,62 @@ import { absoluteUrl, buildPageMetadata } from "@/lib/seo"; const comparisonRows = [ { feature: "Interface and daily workflow", - vocalinux: "Full GTK GUI + tray controls + keyboard shortcuts", + voculinux: "Full GTK GUI + tray controls + keyboard shortcuts", nerdDictation: "CLI-first terminal workflow", - winner: "Vocalinux", + winner: "Voculinux", icon: PanelTop, }, { feature: "Offline voice dictation", - vocalinux: "Local engines, plus an optional Remote API", + voculinux: "Local engines, plus an optional Remote API", nerdDictation: "Offline dictation, single CLI-centered flow", - winner: "Vocalinux", + winner: "Voculinux", icon: Command, }, { feature: "Wayland text injection", - vocalinux: "Native IBus integration for dictation in any app", + voculinux: "Native IBus integration for dictation in any app", nerdDictation: "IBus-based text injection on Wayland", - winner: "Vocalinux", + winner: "Voculinux", icon: Waypoints, }, { feature: "GPU acceleration", - vocalinux: "Vulkan acceleration across AMD, Intel, and NVIDIA", + voculinux: "Vulkan acceleration across AMD, Intel, and NVIDIA", nerdDictation: "CPU-focused workflow", - winner: "Vocalinux", + winner: "Voculinux", icon: Cpu, }, { feature: "Push-to-talk", - vocalinux: "Built-in push-to-talk and toggle mode", + voculinux: "Built-in push-to-talk and toggle mode", nerdDictation: "Terminal-first trigger workflow", - winner: "Vocalinux", + winner: "Voculinux", icon: Gauge, }, { feature: "Audio feedback", - vocalinux: "Built-in pleasant sound effects for start/stop/error", + voculinux: "Built-in pleasant sound effects for start/stop/error", nerdDictation: "No native desktop sound-feedback layer", - winner: "Vocalinux", + winner: "Voculinux", icon: Headphones, }, { feature: "System tray integration", - vocalinux: "Tray icon with status, controls, and settings access", + voculinux: "Tray icon with status, controls, and settings access", nerdDictation: "No native system tray app", - winner: "Vocalinux", + winner: "Voculinux", icon: Trophy, }, ]; export const metadata: Metadata = buildPageMetadata({ - title: "Nerd Dictation Alternative for Linux | Vocalinux", + title: "Nerd Dictation Alternative for Linux | Voculinux", description: - "Comparing Vocalinux and Nerd Dictation for offline Linux voice dictation. CLI vs GUI, GPU vs CPU-only, Wayland support, and more.", + "Comparing Voculinux and Nerd Dictation for offline Linux voice dictation. CLI vs GUI, GPU vs CPU-only, Wayland support, and more.", path: "/vs-nerd-dictation", keywords: [ - "vocalinux vs nerd dictation", + "voculinux vs nerd dictation", "linux voice dictation comparison", "offline speech to text linux", ], @@ -82,9 +82,9 @@ export default function VsNerdDictationPage() { const articleJsonLd = { "@context": "https://schema.org", "@type": "Article", - headline: "Vocalinux vs Nerd Dictation: Best Offline Voice Dictation for Linux", + headline: "Voculinux vs Nerd Dictation: Best Offline Voice Dictation for Linux", description: - "Comparing Vocalinux and Nerd Dictation for offline Linux voice dictation. CLI vs GUI, GPU vs CPU-only, Wayland support, and more.", + "Comparing Voculinux and Nerd Dictation for offline Linux voice dictation. CLI vs GUI, GPU vs CPU-only, Wayland support, and more.", dateModified: "2026-03-30", author: { "@type": "Person", @@ -93,10 +93,10 @@ export default function VsNerdDictationPage() { }, publisher: { "@type": "Organization", - name: "Vocalinux", + name: "Voculinux", logo: { "@type": "ImageObject", - url: absoluteUrl("/vocalinux.png"), + url: absoluteUrl("/voculinux.png"), }, }, mainEntityOfPage: absoluteUrl("/vs-nerd-dictation"), @@ -112,15 +112,15 @@ export default function VsNerdDictationPage() {

    - Vocalinux Comparison + Voculinux Comparison

    - Vocalinux vs Nerd Dictation + Voculinux vs Nerd Dictation

    Nerd Dictation is a popular offline CLI tool for Linux. But if you want a complete desktop dictation experience with GUI controls, tray integration, push-to-talk, and broad GPU support, - Vocalinux is the better choice. + Voculinux is the better choice.

    @@ -130,7 +130,7 @@ export default function VsNerdDictationPage() { Feature - Vocalinux + Voculinux Nerd Dictation Winner @@ -152,7 +152,7 @@ export default function VsNerdDictationPage() { {row.feature} - {row.vocalinux} + {row.voculinux} {row.nerdDictation} @@ -194,7 +194,7 @@ export default function VsNerdDictationPage() {

    Ready to switch from terminal-only dictation?

    - Install Vocalinux for a native Linux voice dictation workflow with offline privacy, better + Install Voculinux for a native Linux voice dictation workflow with offline privacy, better usability, and stronger performance options.

    @@ -202,7 +202,7 @@ export default function VsNerdDictationPage() { href="/install/" className="inline-flex items-center gap-2 rounded-full bg-primary px-4 py-2 text-sm font-semibold text-primary-foreground" > - Install Vocalinux + Install Voculinux

    Unlike X11 where applications can simulate keyboard input globally, - Wayland's security model requires a different approach. Vocalinux + Wayland's security model requires a different approach. Voculinux uses:

    • IBus Engine - A custom IBus input method that - receives text from Vocalinux and types it into the focused + receives text from Voculinux and types it into the focused application
    • @@ -293,7 +293,7 @@ export default function WaylandPage() {

      Start Dictating on Wayland

      - Vocalinux automatically detects your display server and configures the + Voculinux automatically detects your display server and configures the appropriate text injection method. Just install and run.

      diff --git a/web/src/app/whisper-model-guide/page.tsx b/web/src/app/whisper-model-guide/page.tsx index ae59fd9..6b19223 100644 --- a/web/src/app/whisper-model-guide/page.tsx +++ b/web/src/app/whisper-model-guide/page.tsx @@ -89,10 +89,10 @@ export default function WhisperModelGuidePage() { }, publisher: { "@type": "Organization", - name: "Vocalinux", + name: "Voculinux", logo: { "@type": "ImageObject", - url: absoluteUrl("/vocalinux.png"), + url: absoluteUrl("/voculinux.png"), }, }, mainEntityOfPage: absoluteUrl("/whisper-model-guide"), @@ -116,7 +116,7 @@ export default function WhisperModelGuidePage() {

      Picking the right model is the biggest performance decision for Linux voice dictation. Use this guide to choose between tiny, base, small, medium, and large based on RAM, - speed, and real-world transcription accuracy in Vocalinux. + speed, and real-world transcription accuracy in Voculinux.

      @@ -249,7 +249,7 @@ export default function WhisperModelGuidePage() {

      Ready to install?

      - Use the install guide to get Vocalinux running with the model size that fits your hardware. + Use the install guide to get Voculinux running with the model size that fits your hardware.

      Installation guide @@ -258,17 +258,17 @@ export default function WhisperModelGuidePage() {
    -

    Install Vocalinux and start dictating today

    +

    Install Voculinux and start dictating today

    Start with small if unsure, then move up or down after a day of use. - Vocalinux makes model changes simple, so you can tune for your exact speed/accuracy + Voculinux makes model changes simple, so you can tune for your exact speed/accuracy preference.

    - Install Vocalinux + Install Voculinux
    diff --git a/web/src/app/writers/page.tsx b/web/src/app/writers/page.tsx index 3a552b9..5cffdee 100644 --- a/web/src/app/writers/page.tsx +++ b/web/src/app/writers/page.tsx @@ -65,14 +65,14 @@ const integrations = [ { app: "Terminal Editors", description: - "Use Vocalinux with terminal apps and editors to write notes, commit messages, and drafts quickly.", + "Use Voculinux with terminal apps and editors to write notes, commit messages, and drafts quickly.", }, ]; export const metadata: Metadata = buildPageMetadata({ title: "Voice Dictation for Writers on Linux", description: - "Complete guide to voice dictation for writers on Linux. How to dictate novels, blog posts, and notes using Vocalinux. Hands-free writing workflow tips.", + "Complete guide to voice dictation for writers on Linux. How to dictate novels, blog posts, and notes using Voculinux. Hands-free writing workflow tips.", path: "/writers", keywords: [ "voice dictation for writers linux", @@ -89,7 +89,7 @@ export default function WritersPage() { "@type": "Article", headline: "Voice Dictation for Writers on Linux: Dictate Novels, Articles & Notes", description: - "Complete guide to voice dictation for writers on Linux. How to dictate novels, blog posts, and notes using Vocalinux. Hands-free writing workflow tips.", + "Complete guide to voice dictation for writers on Linux. How to dictate novels, blog posts, and notes using Voculinux. Hands-free writing workflow tips.", dateModified: "2026-03-30", author: { "@type": "Person", @@ -98,10 +98,10 @@ export default function WritersPage() { }, publisher: { "@type": "Organization", - name: "Vocalinux", + name: "Voculinux", logo: { "@type": "ImageObject", - url: absoluteUrl("/vocalinux.png"), + url: absoluteUrl("/voculinux.png"), }, }, mainEntityOfPage: absoluteUrl("/writers"), @@ -123,7 +123,7 @@ export default function WritersPage() { Voice Dictation for Writers on Linux: Dictate Novels, Articles & Notes

    - Write at the speed of thought. Vocalinux helps novelists, bloggers, students, and + Write at the speed of thought. Voculinux helps novelists, bloggers, students, and journalists dictate drafts hands-free in their favorite Linux apps.

    @@ -239,21 +239,21 @@ export default function WritersPage() { >

    More Use Cases

    -

    Explore all workflows powered by Vocalinux.

    +

    Explore all workflows powered by Voculinux.

    Start Writing with Your Voice

    - Install Vocalinux and start dictating novels, blog posts, academic notes, and newsroom + Install Voculinux and start dictating novels, blog posts, academic notes, and newsroom drafts directly on Linux - without cloud lock-in.

    - Install Vocalinux + Install Voculinux
    diff --git a/web/src/components/__tests__/optimized-image.test.tsx b/web/src/components/__tests__/optimized-image.test.tsx index 44d8281..0a1b20f 100644 --- a/web/src/components/__tests__/optimized-image.test.tsx +++ b/web/src/components/__tests__/optimized-image.test.tsx @@ -1,6 +1,6 @@ import React from 'react'; import { render, screen } from '@testing-library/react'; -import { OptimizedImage, VocalinuxLogo } from '../optimized-image'; +import { OptimizedImage, VoculinuxLogo } from '../optimized-image'; // Mock Next.js Image component jest.mock('next/image', () => ({ @@ -91,47 +91,47 @@ describe('OptimizedImage', () => { }); }); -describe('VocalinuxLogo', () => { +describe('VoculinuxLogo', () => { it('renders without crashing', () => { - render(); - const img = screen.getByAltText('Vocalinux'); + render(); + const img = screen.getByAltText('Voculinux'); expect(img).toBeInTheDocument(); }); it('uses the circular mark', () => { - render(); - const img = screen.getByAltText('Vocalinux'); - expect(img).toHaveAttribute('src', '/brand/vocalinux-mark-circle.svg'); + render(); + const img = screen.getByAltText('Voculinux'); + expect(img).toHaveAttribute('src', '/brand/voculinux-mark-circle.svg'); }); it('uses default dimensions when not specified', () => { - render(); - const img = screen.getByAltText('Vocalinux'); + render(); + const img = screen.getByAltText('Voculinux'); expect(img).toHaveAttribute('width', '32'); expect(img).toHaveAttribute('height', '32'); }); it('accepts custom dimensions', () => { - render(); - const img = screen.getByAltText('Vocalinux'); + render(); + const img = screen.getByAltText('Voculinux'); expect(img).toHaveAttribute('width', '64'); expect(img).toHaveAttribute('height', '64'); }); it('applies custom className', () => { - render(); - const img = screen.getByAltText('Vocalinux'); + render(); + const img = screen.getByAltText('Voculinux'); expect(img).toHaveClass('logo-class'); }); it('passes priority prop for eager loading', () => { - render(); - const img = screen.getByAltText('Vocalinux'); + render(); + const img = screen.getByAltText('Voculinux'); expect(img).toHaveAttribute('loading', 'eager'); }); it('uses empty alt text when decorative', () => { - const { container } = render(); + const { container } = render(); expect(container.querySelector('img')).toHaveAttribute('alt', ''); }); }); diff --git a/web/src/components/__tests__/screenshot-gallery.test.tsx b/web/src/components/__tests__/screenshot-gallery.test.tsx index 8f5b35d..83d0f94 100644 --- a/web/src/components/__tests__/screenshot-gallery.test.tsx +++ b/web/src/components/__tests__/screenshot-gallery.test.tsx @@ -134,11 +134,11 @@ describe("ScreenshotGallery lightbox", () => { "aria-pressed", "true", ); - expect(sessionStorage.getItem("vocalinux-shot-appearance")).toBe("dark"); + expect(sessionStorage.getItem("voculinux-shot-appearance")).toBe("dark"); }); it("restores a tab override from sessionStorage", async () => { - sessionStorage.setItem("vocalinux-shot-appearance", "dark"); + sessionStorage.setItem("voculinux-shot-appearance", "dark"); render( = ({ className = "" }) => { +// Legacy export - use VoculinuxLogo from optimized-image instead +export const VoculinuxLogoLegacy: React.FC<{ className?: string }> = ({ className = "" }) => { return ( Vocalinux Logo = ({ classNam }; // Alternative: Inline SVG version for when color customization is needed -export const VocalinuxLogoInline: React.FC> = (props) => { +export const VoculinuxLogoInline: React.FC> = (props) => { return ( diff --git a/web/src/components/logo.tsx b/web/src/components/logo.tsx index 487d3e4..0994156 100644 --- a/web/src/components/logo.tsx +++ b/web/src/components/logo.tsx @@ -1,5 +1,5 @@ import React from "react"; -import { VocalinuxLogo } from "./icons"; +import { VoculinuxLogo } from "./icons"; import { cn } from "@/lib/utils"; interface LogoProps { className?: string; @@ -12,7 +12,7 @@ export function Logo({ textClassName }: LogoProps) { return
    - - Vocalinux + + Voculinux
    ; } diff --git a/web/src/components/optimized-image.tsx b/web/src/components/optimized-image.tsx index 5d0df89..d073ffe 100644 --- a/web/src/components/optimized-image.tsx +++ b/web/src/components/optimized-image.tsx @@ -46,14 +46,14 @@ export const OptimizedImage: React.FC = ({ }; /** - * Specialized Vocalinux logo component with WebP support + * Specialized Voculinux logo component with WebP support */ -export const VocalinuxLogo: React.FC<{ +export const VoculinuxLogo: React.FC<{ className?: string; width?: number; height?: number; priority?: boolean; - /** Set when the visible "Vocalinux" text sits next to the mark. */ + /** Set when the visible "Voculinux" text sits next to the mark. */ decorative?: boolean; }> = ({ className = "", @@ -66,8 +66,8 @@ export const VocalinuxLogo: React.FC<{ // SVG lockup; next/image is for raster. // eslint-disable-next-line @next/next/no-img-element {decorative
    - - + - Vocalinux + Voculinux + + {/* Hosted brand asset: never vendored into the repository. */} + {/* eslint-disable-next-line @next/next/no-img-element */} + + by Bongbetic + @@ -191,13 +210,13 @@ export function SiteChrome({
    - - Vocalinux + Voculinux

    Offline voice typing for Linux. Local engines by default, no @@ -250,10 +269,22 @@ export function SiteChrome({ . - - Part of{" "} - - VocaHQ + + {/* Hosted brand assets: linked, never vendored. */} + + {/* eslint-disable-next-line @next/next/no-img-element */} + Bongbetic

    diff --git a/web/src/lib/__tests__/seo.test.ts b/web/src/lib/__tests__/seo.test.ts index b96bfad..063e9ac 100644 --- a/web/src/lib/__tests__/seo.test.ts +++ b/web/src/lib/__tests__/seo.test.ts @@ -2,22 +2,22 @@ import { absoluteUrl } from "../seo"; describe("absoluteUrl", () => { it("returns the site root for /", () => { - expect(absoluteUrl("/")).toBe("https://vocalinux.com/"); + expect(absoluteUrl("/")).toBe("https://voculinux.com/"); }); it("adds the trailing slash pages are served with", () => { expect(absoluteUrl("/install/debian")).toBe( - "https://vocalinux.com/install/debian/", + "https://voculinux.com/install/debian/", ); - expect(absoluteUrl("/faq/")).toBe("https://vocalinux.com/faq/"); + expect(absoluteUrl("/faq/")).toBe("https://voculinux.com/faq/"); }); it("leaves file URLs without a trailing slash", () => { - expect(absoluteUrl("/vocalinux.png")).toBe( - "https://vocalinux.com/vocalinux.png", + expect(absoluteUrl("/voculinux.png")).toBe( + "https://voculinux.com/voculinux.png", ); expect(absoluteUrl("/og-image.png")).toBe( - "https://vocalinux.com/og-image.png", + "https://voculinux.com/og-image.png", ); }); }); diff --git a/web/src/lib/__tests__/voculinux-rebrand.test.ts b/web/src/lib/__tests__/voculinux-rebrand.test.ts new file mode 100644 index 0000000..88f3d26 --- /dev/null +++ b/web/src/lib/__tests__/voculinux-rebrand.test.ts @@ -0,0 +1,11 @@ +import { SITE_NAME, SITE_URL } from "../seo"; + +describe("voculinux rebrand (ticket #24)", () => { + it("names the fork site", () => { + expect(SITE_NAME).toBe("Voculinux"); + }); + + it("points at the fork domain", () => { + expect(SITE_URL).toBe("https://voculinux.com"); + }); +}); diff --git a/web/src/lib/seo.ts b/web/src/lib/seo.ts index 6725e19..62777ff 100644 --- a/web/src/lib/seo.ts +++ b/web/src/lib/seo.ts @@ -1,7 +1,7 @@ import { type Metadata } from "next"; -export const SITE_URL = "https://vocalinux.com"; -export const SITE_NAME = "Vocalinux"; +export const SITE_URL = "https://voculinux.com"; +export const SITE_NAME = "Voculinux"; export const DEFAULT_OG_IMAGE_PATH = "/og-image.png"; export const DEFAULT_OG_IMAGE_ALT = "Dictate locally. In any app. Offline voice dictation for Linux."; @@ -26,8 +26,8 @@ const normalizePath = (path: string): string => { const trimmed = path.replace(/^\/+|\/+$/g, ""); - // Files such as /vocalinux.png must not get the page trailing slash: - // /vocalinux.png/ is a 404 on GitHub Pages. + // Files such as /voculinux.png must not get the page trailing slash: + // /voculinux.png/ is a 404 on GitHub Pages. if (/\.[a-z0-9]+$/i.test(trimmed)) { return `/${trimmed}`; } @@ -47,9 +47,9 @@ export const buildPageMetadata = ({ }: PageMetadataOptions): Metadata => { const canonical = absoluteUrl(path); - // The root layout applies the "%s | Vocalinux" template. Titles that already + // The root layout applies the "%s | Voculinux" template. Titles that already // carry the brand suffix are emitted as-is so search results do not show - // "| Vocalinux | Vocalinux". + // "| Voculinux | Voculinux". const pageTitle: Metadata["title"] = new RegExp( `[|\\-–—]\\s*${SITE_NAME}$`, ).test(title) diff --git a/web/src/lib/site-nav.ts b/web/src/lib/site-nav.ts index d4274f4..404586a 100644 --- a/web/src/lib/site-nav.ts +++ b/web/src/lib/site-nav.ts @@ -2,7 +2,6 @@ import { DISCORD_URL, EMAIL_URL, GITHUB_REPO_URL, - VOCAHQ_URL, X_URL, } from "@/lib/seo"; @@ -104,7 +103,7 @@ export const footerGroups: { title: string; links: NavLink[] }[] = [ { href: "/privacy/", label: "Privacy" }, { href: "/changelog/", label: "Changelog" }, { href: GITHUB_REPO_URL, label: "Source" }, - { href: VOCAHQ_URL, label: "VocaHQ" }, + { href: "https://bongbetic.com", label: "Bongbetic" }, ], }, ]; diff --git a/web/src/styles/globals.css b/web/src/styles/globals.css index 5d2c6c0..7034631 100644 --- a/web/src/styles/globals.css +++ b/web/src/styles/globals.css @@ -2,7 +2,7 @@ @tailwind components; @tailwind utilities; -/* Vocalinux — Voca family workbench. +/* Voculinux — Carbon-mapped house palette. Warm paper, deep ink, one teal accent. Flat fills only; no gradients. */ @layer base { @@ -379,6 +379,29 @@ border-color: var(--brand); } + .header-attribution { + display: inline-flex; + gap: 0.4rem; + align-items: center; + min-height: 44px; + padding: 0 0.6rem; + color: var(--muted-copy); + font-size: 0.82rem; + font-weight: 500; + text-decoration: none; + white-space: nowrap; + } + + .header-attribution img { + width: 18px; + height: 18px; + flex: none; + } + + .header-attribution:hover { + color: var(--brand-dark); + } + .nav-toggle { display: grid; place-items: center; @@ -1479,6 +1502,17 @@ text-underline-offset: 2px; } + .footer-attribution { + display: inline-flex; + align-items: center; + } + + .footer-attribution img { + display: block; + width: 96px; + height: 24px; + } + /* ---------- Interior pages ---------- */ .page-main { @@ -1929,6 +1963,12 @@ nextjs-portal { } } +@media (max-width: 920px) { + .header-attribution span { + display: none; + } +} + @media (min-width: 921px) { .nav-links { display: flex;