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
@@ -1,15 +1,15 @@
[Desktop Entry]
Version=1.0
Type=Application
Name=Vocalinux
Name=Voculinux
Comment=Free, offline voice dictation for Linux
GenericName=Voice Typing
Exec=vocalinux
Icon=${SNAP}/usr/share/icons/hicolor/scalable/apps/vocalinux.svg
Exec=voculinux
Icon=${SNAP}/usr/share/icons/hicolor/scalable/apps/voculinux.svg
Terminal=false
Categories=Utility;Accessibility;AudioVideo;
Keywords=voice;typing;dictation;speech;recognition;transcription;accessibility;
StartupNotify=true
StartupWMClass=com.vocalinux.Vocalinux
StartupWMClass=com.voculinux.Voculinux
X-GNOME-UsesNotifications=true
X-SnapInstanceName=vocalinux
X-SnapInstanceName=voculinux

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

+1 -1
View File
@@ -54,7 +54,7 @@ def relocate_scripts(install: Path, tooling: Path) -> None:
"if __name__ == '__main__':\n"
" sys.exit(main())\n"
)
for name in ("vocalinux", "vocalinux-gui"):
for name in ("voculinux", "voculinux-gui"):
path = install / "bin" / name
if path.is_symlink() or not path.is_file():
raise RuntimeError(f"Missing installed entry point: {path}")
+2 -2
View File
@@ -17,7 +17,7 @@ import runpy
import sys
from pathlib import Path
MANIFEST = Path("usr/share/vocalinux/python-inputs.json")
MANIFEST = Path("usr/share/voculinux/python-inputs.json")
def normalize(name: str) -> str:
@@ -80,7 +80,7 @@ def record(root: Path, source: Path) -> None:
if importlib.metadata.version(name) != expected_version:
raise RuntimeError(f"Build tool {name} differs from its locked version")
expected = locked_versions(source / "requirements/runtime.txt")
expected["vocalinux"] = runpy.run_path(str(source / "src/vocalinux/version.py"))["__version__"]
expected["voculinux"] = runpy.run_path(str(source / "src/vocalinux/version.py"))["__version__"]
audit(root, expected)
manifest = {
"python": list(sys.version_info[:2]),
+5 -5
View File
@@ -7,16 +7,16 @@ if [ "$#" -ne 1 ] || [ ! -f "$1" ]; then
echo "Usage: bash snap/local/smoke-test.sh PATH.snap" >&2
exit 1
fi
if snap list vocalinux >/dev/null 2>&1; then
echo "Refusing to replace an existing Vocalinux snap; use a disposable host" >&2
if snap list voculinux >/dev/null 2>&1; then
echo "Refusing to replace an existing Voculinux snap; use a disposable host" >&2
exit 1
fi
sudo snap install --dangerous "$1"
snap run vocalinux --version
snap run voculinux --version
# --shell does not run the application's command chain. Explicitly enter the
# same GNOME desktop-launch environment before checking the installed payload.
PYNPUT_BACKEND=dummy snap run --shell vocalinux -c '
PYNPUT_BACKEND=dummy snap run --shell voculinux -c '
exec "$SNAP/snap/command-chain/desktop-launch" "$SNAP/bin/python3" \
"$SNAP/usr/lib/vocalinux/check_runtime.py" --root "$SNAP"
"$SNAP/usr/lib/voculinux/check_runtime.py" --root "$SNAP"
'
+24 -24
View File
@@ -1,4 +1,4 @@
# Vocalinux Snap packaging
# Voculinux Snap packaging
#
# First ship: strict confinement, default whisper.cpp engine path, GTK tray UI,
# mic capture, model download, and text injection (RemoteDesktop portal, wtype, xdotool).
@@ -8,15 +8,15 @@
# snapcraft pack
# See docs/SNAP.md for controlled inputs, the build gate and verification limits.
name: vocalinux
name: voculinux
base: core24 # Ubuntu 24.04 / Python 3.12 (project requires-python >=3.11)
# Fallback version; live version is set from src/vocalinux/version.py via
# adopt-info + craftctl set in the vocalinux part (required for craftctl).
# adopt-info + craftctl set in the voculinux part (required for craftctl).
version: "0.17.0"
adopt-info: vocalinux
adopt-info: voculinux
summary: Free offline voice dictation for Linux
description: |
Vocalinux is free voice typing for Linux. Hold a shortcut or toggle dictation, and text lands in almost any app on X11 or Wayland.
Voculinux is free voice typing for Linux. Hold a shortcut or toggle dictation, and text lands in almost any app on X11 or Wayland.
Speech recognition runs on your machine after you download a model. No Voca account. No cloud transcription on the default path.
@@ -29,33 +29,33 @@ description: |
- Text injection via the Wayland RemoteDesktop portal, wtype, or xdotool
Sandbox notes:
- Global hotkeys need: sudo snap connect vocalinux:raw-input
and sudo snap connect vocalinux:hardware-observe
- Global hotkeys need: sudo snap connect voculinux:raw-input
and sudo snap connect voculinux:hardware-observe
- Native Wayland typing uses the RemoteDesktop portal: the compositor
asks once on first dictation. The snap ships no uinput plug and no
ydotool; the Store denied the super-privileged grant.
- KDE Plasma: KWin's portal can mistype letter case (KDE bug 489021);
set "Virtual Keyboard = IBus Wayland" so the IBus path delivers text.
- Microphone may need: sudo snap connect vocalinux:audio-record
- Microphone may need: sudo snap connect voculinux:audio-record
The microphone list comes from the sound server, so pick a device
in Settings rather than relying on the system default.
- whisper.cpp runs on the CPU in this snap; it has no GPU backend.
For Vulkan acceleration install the AppImage or use install.sh.
- Config and models live under ~/snap/vocalinux/
- Config and models live under ~/snap/voculinux/
grade: stable
confinement: strict
license: AGPL-3.0-only
icon: snap/gui/vocalinux.png
icon: snap/gui/voculinux.png
contact: https://github.com/VocaHQ/vocalinux/issues
issues: https://github.com/VocaHQ/vocalinux/issues
website: https://vocalinux.com
website: https://voculinux.com
source-code: https://github.com/VocaHQ/vocalinux
donation: https://github.com/sponsors/jatinkrmalik
apps:
vocalinux:
command: bin/vocalinux
voculinux:
command: bin/voculinux
extensions: [gnome]
plugs:
# gnome extension already grants desktop, desktop-legacy, gsettings,
@@ -67,17 +67,17 @@ apps:
- network-bind # optional remote_api engine
# Global hotkeys via python-evdev (/dev/input/event*).
# Super-privileged: not auto-connected; user must:
# sudo snap connect vocalinux:raw-input
# sudo snap connect voculinux:raw-input
- raw-input
# Needed for /proc/bus/input/devices; not auto-connected:
# sudo snap connect vocalinux:hardware-observe
# sudo snap connect voculinux:hardware-observe
- hardware-observe
# No uinput plug; the RemoteDesktop portal types on Wayland instead.
# The Store denied the super-privileged grant
# (https://forum.snapcraft.io/t/53528), and ydotool is not staged
# because it cannot reach /dev/uinput under confinement.
common-id: com.vocalinux.Vocalinux
desktop: usr/share/applications/vocalinux.desktop
common-id: com.voculinux.Voculinux
desktop: usr/share/applications/voculinux.desktop
environment:
# Prefer bundled CLI helpers (xdotool, xsel, xclip, wl-copy).
# Do NOT prepend $SNAP/usr/lib over the gnome extension platform path:
@@ -103,7 +103,7 @@ layout:
bind: $SNAP/usr/lib/$CRAFT_ARCH_TRIPLET/alsa-lib
parts:
vocalinux:
voculinux:
# The Python plugin would resolve dependencies and build tools again.
plugin: nil
source: .
@@ -151,13 +151,13 @@ parts:
--source "${CRAFT_PART_BUILD}" --install "${CRAFT_PART_INSTALL}" \
--work "${CRAFT_PART_BUILD}/.snap-python-build"
install -Dm644 "${CRAFT_PART_SRC}/snap/local/check_runtime.py" \
"${CRAFT_PART_INSTALL}/usr/lib/vocalinux/check_runtime.py"
install -Dm644 "${CRAFT_PROJECT_DIR}/snap/gui/vocalinux.desktop" \
"${CRAFT_PART_INSTALL}/usr/share/applications/vocalinux.desktop"
install -Dm644 "${CRAFT_PROJECT_DIR}/resources/icons/scalable/vocalinux.svg" \
"${CRAFT_PART_INSTALL}/usr/share/icons/hicolor/scalable/apps/vocalinux.svg"
"${CRAFT_PART_INSTALL}/usr/lib/voculinux/check_runtime.py"
install -Dm644 "${CRAFT_PROJECT_DIR}/snap/gui/voculinux.desktop" \
"${CRAFT_PART_INSTALL}/usr/share/applications/voculinux.desktop"
install -Dm644 "${CRAFT_PROJECT_DIR}/resources/icons/scalable/voculinux.svg" \
"${CRAFT_PART_INSTALL}/usr/share/icons/hicolor/scalable/apps/voculinux.svg"
# meta/gui is what snapd uses for the store/desktop icon when present.
install -Dm644 "${CRAFT_PROJECT_DIR}/resources/icons/scalable/vocalinux.svg" \
install -Dm644 "${CRAFT_PROJECT_DIR}/resources/icons/scalable/voculinux.svg" \
"${CRAFT_PART_INSTALL}/meta/gui/icon.svg"
install -Dm644 "${CRAFT_PROJECT_DIR}/snap/local/alsa/asound.conf" \
"${CRAFT_PART_INSTALL}/etc/asound.conf"