feat(identity): rename user-visible identity to voculinux with one-time legacy import

The fork takes its own name everywhere a user can see it: binaries
(voculinux, voculinux-gui), desktop entry, autostart, tray, D-Bus
namespace (com.voculinux.Voculinux, no alias for the old name),
config/data/cache dirs, single-instance lock, IBus engine identity,
tray icons, resource prefixes, VOCULINUX_* environment names, and the
update-checker user agent. The internal Python module stays vocalinux
and the distribution metadata keeps the upstream URLs as provenance.

On first run a previous Vocalinux install's config.json, custom
dictionary, and portal restore token are copied once into the new
locations (new config always wins, no merge, no write-back); models
re-resolve through the pinned-checksum download path. An offline
naming-sweep test proves no old-name strings remain on user-visible
surfaces outside the allowlist.

Refs #18
This commit is contained in:
soubarnak
2026-11-06 01:29:39 +05:30
parent c565e6d946
commit ea7be5f111
251 changed files with 2449 additions and 1991 deletions
+39 -39
View File
@@ -27,8 +27,8 @@ const homeJsonLd = [
{
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"@id": "https://vocalinux.com/#softwareapplication",
name: "Vocalinux",
"@id": "https://voculinux.com/#softwareapplication",
name: "Voculinux",
applicationCategory: "UtilitiesApplication",
operatingSystem: "Linux",
isAccessibleForFree: true,
@@ -46,9 +46,9 @@ const homeJsonLd = [
name: "Jatin K Malik",
url: "https://github.com/jatinkrmalik",
},
url: "https://vocalinux.com/",
url: "https://voculinux.com/",
downloadUrl: GITHUB_REPO_URL,
screenshot: "https://vocalinux.com/og-image.png",
screenshot: "https://voculinux.com/og-image.png",
featureList: [
"Local speech recognition with whisper.cpp, Faster Whisper, Whisper, VOSK, and Parakeet",
"Remote API speech recognition for compatible self-hosted transcription servers",
@@ -85,7 +85,7 @@ const homeJsonLd = [
mainEntity: [
{
"@type": "Question",
name: "Does Vocalinux work offline?",
name: "Does Voculinux work offline?",
acceptedAnswer: {
"@type": "Answer",
text: "Local engines process speech on your Linux machine. Remote API is optional and only talks to servers you configure.",
@@ -93,10 +93,10 @@ const homeJsonLd = [
},
{
"@type": "Question",
name: "Does Vocalinux collect usage telemetry?",
name: "Does Voculinux collect usage telemetry?",
acceptedAnswer: {
"@type": "Answer",
text: "No. The installed app does not send usage telemetry, analytics events, or background usage pings. Even the project maintainer cannot see how many people install or actively use Vocalinux.",
text: "No. The installed app does not send usage telemetry, analytics events, or background usage pings. Even the project maintainer cannot see how many people install or actively use Voculinux.",
},
},
{
@@ -104,7 +104,7 @@ const homeJsonLd = [
name: "Which Linux distributions are supported?",
acceptedAnswer: {
"@type": "Answer",
text: "Vocalinux supports Ubuntu, Fedora, Debian, Arch, Linux Mint, Pop!_OS, and other modern Linux distributions across X11 and Wayland.",
text: "Voculinux supports Ubuntu, Fedora, Debian, Arch, Linux Mint, Pop!_OS, and other modern Linux distributions across X11 and Wayland.",
},
},
{
@@ -120,12 +120,12 @@ const homeJsonLd = [
name: "What happens when I close my laptop lid?",
acceptedAnswer: {
"@type": "Answer",
text: "Vocalinux v0.10.1+ automatically recovers speech recognition and keyboard shortcuts after system suspend/resume. No manual restart needed.",
text: "Voculinux v0.10.1+ automatically recovers speech recognition and keyboard shortcuts after system suspend/resume. No manual restart needed.",
},
},
{
"@type": "Question",
name: "Does Vocalinux preserve my keyboard layout?",
name: "Does Voculinux preserve my keyboard layout?",
acceptedAnswer: {
"@type": "Answer",
text: "Yes. v0.10.1+ preserves your XKB keyboard layout when activating IBus, so you won't unexpectedly switch to US layout mid-dictation.",
@@ -136,27 +136,27 @@ const homeJsonLd = [
{
"@context": "https://schema.org",
"@type": "HowTo",
name: "Install Vocalinux on Linux",
name: "Install Voculinux on Linux",
description: "Install offline voice dictation on Linux in a few minutes.",
totalTime: "PT10M",
step: [
{
"@type": "HowToStep",
name: "Run the install command",
text: "Copy the install command from vocalinux.com and run it in terminal.",
url: "https://vocalinux.com/#install",
text: "Copy the install command from voculinux.com and run it in terminal.",
url: "https://voculinux.com/#install",
},
{
"@type": "HowToStep",
name: "Complete the guided setup",
text: "Pick your speech engine and model size in the interactive installer.",
url: "https://vocalinux.com/#install",
url: "https://voculinux.com/#install",
},
{
"@type": "HowToStep",
name: "Start dictating",
text: "Launch vocalinux and hold Right Alt (Option) to begin dictation, or choose toggle mode in Settings.",
url: "https://vocalinux.com/#install",
text: "Launch voculinux and hold Right Alt (Option) to begin dictation, or choose toggle mode in Settings.",
url: "https://voculinux.com/#install",
},
],
},
@@ -291,7 +291,7 @@ export default function HomePage() {
<div className="hero-cta">
<div className="hero-actions">
<a className="btn btn-primary" href="#install">
Install Vocalinux{" "}
Install Voculinux{" "}
<span className="btn-arrow btn-arrow-down" aria-hidden="true">
↓
</span>
@@ -319,10 +319,10 @@ export default function HomePage() {
<div
className="workbench min-w-0"
role="img"
aria-label="Vocalinux listening from the system tray and inserting text into a Linux editor"
aria-label="Voculinux listening from the system tray and inserting text into a Linux editor"
>
<div className="panel-bar">
<span>Vocalinux</span>
<span>Voculinux</span>
<span className="panel-status">
<i className="rec-dot" aria-hidden="true"></i>
listening
@@ -391,7 +391,7 @@ export default function HomePage() {
</div>
<pre>
<TerminalPrompt />
vocalinux
voculinux
{"\n"}
<span className="terminal-comment">
# audio stays on this machine
@@ -434,7 +434,7 @@ export default function HomePage() {
A small loop that stays out of the way.
</h2>
<p className="section-lede">
Vocalinux lives in the system tray, so dictation starts where your
Voculinux lives in the system tray, so dictation starts where your
work already is.
</p>
</div>
@@ -448,7 +448,7 @@ export default function HomePage() {
<h3>Speak where you already type.</h3>
<p>
Hold Right Alt, or switch to toggle mode. The tray tells you
when Vocalinux is listening, then text lands in the focused
when Voculinux is listening, then text lands in the focused
field.
</p>
</div>
@@ -599,7 +599,7 @@ export default function HomePage() {
<figure className="shot shot-frame">
<Image
src="/screenshots/00-transcription.png"
alt="Vocalinux dictating into a text editor with the tray menu open"
alt="Voculinux dictating into a text editor with the tray menu open"
width={2518}
height={2057}
className="h-auto w-full"
@@ -612,7 +612,7 @@ export default function HomePage() {
<figure className="shot shot-frame">
<Image
src="/screenshots/settings-speech-engine.png"
alt="Vocalinux settings dialog showing speech engine options"
alt="Voculinux settings dialog showing speech engine options"
width={2128}
height={1698}
className="h-auto w-full"
@@ -625,7 +625,7 @@ export default function HomePage() {
<figure className="shot shot-frame">
<Image
src="/screenshots/02-system-tray.png"
alt="Vocalinux system tray icon and menu"
alt="Voculinux system tray icon and menu"
width={315}
height={466}
className="mx-auto h-auto max-h-[18rem] w-auto object-contain"
@@ -658,7 +658,7 @@ export default function HomePage() {
Your voice has a path. We show you which one.
</h2>
<p className="section-lede">
Vocalinux does not need a Voca cloud to transcribe. The important
Voculinux does not need a Voca cloud to transcribe. The important
boundary is the engine you selected.
</p>
</div>
@@ -743,7 +743,7 @@ export default function HomePage() {
displayCommand={interactiveInstallDisplayCommand}
label="install.sh --interactive"
/>
<p className="section-lede">Then launch <code>vocalinux</code>.</p>
<p className="section-lede">Then launch <code>voculinux</code>.</p>
<div className="install-alts">
<a
className="install-alt"
@@ -784,25 +784,25 @@ export default function HomePage() {
</a>
<a
className="install-alt"
href="https://snapcraft.io/vocalinux"
href="https://snapcraft.io/voculinux"
rel="noopener noreferrer"
>
<p className="install-alt-kicker">Snap Store</p>
<h3>Snap</h3>
<p>
<code>snap install vocalinux --edge</code>. amd64 only for
<code>snap install voculinux --edge</code>. amd64 only for
now; a .snap is attached to every release too.
</p>
</a>
<a
className="install-alt"
href="https://aur.archlinux.org/packages/vocalinux"
href="https://aur.archlinux.org/packages/voculinux"
rel="noopener noreferrer"
>
<p className="install-alt-kicker">Arch</p>
<h3>AUR</h3>
<p>
<code>yay -S vocalinux</code>, or vocalinux-bin for the
<code>yay -S voculinux</code>, or voculinux-bin for the
prebuilt package.
</p>
</a>
@@ -852,7 +852,7 @@ export default function HomePage() {
{(
[
{
question: "Does Vocalinux work offline?",
question: "Does Voculinux work offline?",
answer: (
<>
Local engines (whisper.cpp, Faster Whisper, Whisper, VOSK,
@@ -865,7 +865,7 @@ export default function HomePage() {
open: true,
},
{
question: "Does Vocalinux collect usage telemetry?",
question: "Does Voculinux collect usage telemetry?",
answer:
"No. The installed app does not send usage telemetry, analytics events, or background usage pings.",
},
@@ -891,7 +891,7 @@ export default function HomePage() {
),
},
{
question: "Can Vocalinux use a remote transcription server?",
question: "Can Voculinux use a remote transcription server?",
answer: (
<>
Yes. OpenAI-compatible Whisper servers and the whisper.cpp
@@ -914,12 +914,12 @@ export default function HomePage() {
),
},
{
question: "Does Vocalinux preserve my keyboard layout?",
question: "Does Voculinux preserve my keyboard layout?",
answer:
"Yes. v0.10.1+ keeps your XKB layout when activating IBus.",
},
{
question: "Is Vocalinux free?",
question: "Is Voculinux free?",
answer: (
<>
Yes. Free and open source under AGPL-3.0, no premium
@@ -955,7 +955,7 @@ export default function HomePage() {
Same promise, other machines.
</h2>
<p className="section-lede">
Vocalinux is part of{" "}
Voculinux is part of{" "}
<a href="https://vocahq.com" rel="noopener noreferrer">
VocaHQ
</a>
@@ -976,7 +976,7 @@ export default function HomePage() {
</span>
<span className="chip">You are here</span>
</div>
<h3>Vocalinux</h3>
<h3>Voculinux</h3>
<p>
System tray app with whisper.cpp, Vulkan, and local engines on
Linux.
@@ -1082,7 +1082,7 @@ export default function HomePage() {
<div className="hero-cta">
<div className="hero-actions">
<a className="btn btn-primary" href="#install">
Install Vocalinux
Install Voculinux
</a>
<a
className="btn btn-secondary"