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
+10 -10
View File
@@ -1,6 +1,6 @@
# Vocalinux for Nix
# Voculinux for Nix
A flake that builds Vocalinux against nixpkgs: GTK 3, PyGObject and the
A flake that builds Voculinux against nixpkgs: GTK 3, PyGObject and the
AppIndicator typelib come from nixpkgs, and `pywhispercpp` — which nixpkgs
does not package — is built from its PyPI sdist (it vendors whisper.cpp and
pybind11). Every host tool the app probes for (`xdotool`, `wtype`, `ydotool`,
@@ -24,14 +24,14 @@ nix profile install github:VocaHQ/vocalinux
```nix
{
inputs.vocalinux.url = "github:VocaHQ/vocalinux";
inputs.voculinux.url = "github:VocaHQ/vocalinux";
outputs = { nixpkgs, vocalinux, ... }: {
outputs = { nixpkgs, voculinux, ... }: {
nixosConfigurations.host = nixpkgs.lib.nixosSystem {
modules = [
vocalinux.nixosModules.vocalinux
voculinux.nixosModules.voculinux
{
programs.vocalinux.enable = true;
programs.voculinux.enable = true;
users.users.you.extraGroups = [ "input" "uinput" ];
}
];
@@ -53,14 +53,14 @@ and can skip the group lines entirely.
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
inputs.home-manager.url = "github:nix-community/home-manager";
inputs.home-manager.inputs.nixpkgs.follows = "nixpkgs";
inputs.vocalinux.url = "github:VocaHQ/vocalinux";
inputs.voculinux.url = "github:VocaHQ/vocalinux";
outputs = { nixpkgs, home-manager, vocalinux, ... }: {
outputs = { nixpkgs, home-manager, voculinux, ... }: {
homeConfigurations.you = home-manager.lib.homeManagerConfiguration {
pkgs = nixpkgs.legacyPackages.x86_64-linux;
modules = [
vocalinux.homeManagerModules.vocalinux
{ programs.vocalinux.enable = true; }
voculinux.homeManagerModules.voculinux
{ programs.voculinux.enable = true; }
];
};
};
+6 -6
View File
@@ -1,4 +1,4 @@
# Home Manager module for Vocalinux.
# Home Manager module for Voculinux.
#
# Installs the package into the user profile; device permissions are a
# system concern, so pair it with the NixOS module (or the manual group
@@ -6,16 +6,16 @@
{ config, lib, pkgs, ... }:
let
cfg = config.programs.vocalinux;
cfg = config.programs.voculinux;
in
{
options.programs.vocalinux = {
enable = lib.mkEnableOption "Vocalinux voice dictation";
options.programs.voculinux = {
enable = lib.mkEnableOption "Voculinux voice dictation";
package = lib.mkOption {
type = lib.types.package;
defaultText = "the package built by the vocalinux flake";
description = "The vocalinux package to install.";
defaultText = "the package built by the voculinux flake";
description = "The voculinux package to install.";
};
};
+9 -9
View File
@@ -1,9 +1,9 @@
# NixOS module for Vocalinux.
# NixOS module for Voculinux.
#
# The flake wraps this file and injects the flake-built package as the
# default (programs.vocalinux.package), so importing the module through
# nixosModules.vocalinux needs no extra wiring. Imported on its own, set
# programs.vocalinux.package to a vocalinux derivation.
# default (programs.voculinux.package), so importing the module through
# nixosModules.voculinux needs no extra wiring. Imported on its own, set
# programs.voculinux.package to a voculinux derivation.
#
# What it cannot do for you: membership in the "input" group is per-user,
# so the module documents it and each user opts in:
@@ -16,16 +16,16 @@
{ config, lib, pkgs, ... }:
let
cfg = config.programs.vocalinux;
cfg = config.programs.voculinux;
in
{
options.programs.vocalinux = {
enable = lib.mkEnableOption "Vocalinux voice dictation";
options.programs.voculinux = {
enable = lib.mkEnableOption "Voculinux voice dictation";
package = lib.mkOption {
type = lib.types.package;
defaultText = "the package built by the vocalinux flake";
description = "The vocalinux package to install.";
defaultText = "the package built by the voculinux flake";
description = "The voculinux package to install.";
};
};
+10 -10
View File
@@ -1,6 +1,6 @@
# Vocalinux for Nix.
# Voculinux for Nix.
#
# Consumed by the repo flake (packages.<system>.vocalinux) and buildable with
# Consumed by the repo flake (packages.<system>.voculinux) and buildable with
# plain callPackage:
#
# pkgs.python3Packages.callPackage ./packaging/nix/package.nix {
@@ -75,7 +75,7 @@ let
];
in
buildPythonApplication {
pname = "vocalinux";
pname = "voculinux";
# Track src/vocalinux/version.py so release bumps need no edit here.
# builtins.match is POSIX ERE (no \s class), so flatten newlines first.
@@ -136,15 +136,15 @@ buildPythonApplication {
'';
postInstall = ''
install -Dm644 vocalinux.desktop \
$out/share/applications/vocalinux.desktop
install -Dm644 resources/icons/scalable/vocalinux.svg \
$out/share/icons/hicolor/scalable/apps/vocalinux.svg
install -Dm644 voculinux.desktop \
$out/share/applications/voculinux.desktop
install -Dm644 resources/icons/scalable/voculinux.svg \
$out/share/icons/hicolor/scalable/apps/voculinux.svg
'';
dontCheck = true; # test suite needs a session bus and X display
pythonImportsCheck = [ "vocalinux" ];
pythonImportsCheck = [ "voculinux" ];
meta = {
description = "Free, offline voice dictation for Linux";
@@ -155,11 +155,11 @@ buildPythonApplication {
Wayland/evdev shortcuts and ydotool injection need device access: on
NixOS enable hardware.uinput and add your user to the "input" and
"uinput" groups; the programs.vocalinux NixOS module does the first part.
"uinput" groups; the programs.voculinux NixOS module does the first part.
'';
homepage = "https://github.com/VocaHQ/vocalinux";
license = lib.licenses.agpl3Only;
mainProgram = "vocalinux";
mainProgram = "voculinux";
platforms = lib.platforms.linux;
};
}
+1 -1
View File
@@ -52,7 +52,7 @@ buildPythonPackage rec {
env = {
# The sdist ships no version.txt; setup.py falls back to this env var.
PYWHISPERCPP_VERSION = version;
# Build Vulkan as a shared backend: Vocalinux's GPU detector looks for
# Build Vulkan as a shared backend: Voculinux's GPU detector looks for
# libggml-vulkan.so. CMake's build-tree RPATH can leak /build into the
# wheel; disable CMake RPATHs and let autoPatchelfHook set Nix runtime paths.
CMAKE_ARGS = "-DBUILD_SHARED_LIBS=ON -DGGML_NATIVE=OFF -DGGML_VULKAN=ON -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_SKIP_RPATH=ON";