Commit Graph
702 Commits
Author SHA1 Message Date
xavierk c9be45d3c3 fix(web): link the fork's own source host and drop the upstream star count
The header badge fetched the star count of VocaHQ/vocalinux at build time
and labelled it as Voculinux's. The fetch and the count are gone; the
header, footer and social "source" links now go to the fork repository at
git.bongbetic.com/xavierk/voculinux, as do the issue links, the docs
anchors, the home page JSON-LD and the xbps release card.

Upstream GitHub stays only where it is the real artefact or provenance and
is labelled as such: the install script, the AppImage release card, the
upstream card and the changelog release links. The changelog now says its
entries are upstream history, the open-source page no longer claims
VocaHQ membership or an active GitHub community, and the organization
JSON-LD drops the upstream author as founder. DESIGN.md and PRODUCT.md
follow.
2026-11-06 18:22:17 +05:30
xavierk a2736ee6e4 fix(web): label the old launcher name as upstream on the install page
The install page spelled the old binary name on a line with no upstream
label, which fails the offline naming sweep. The launch note now leads
with voculinux and marks the old name as upstream on the same line.
2026-11-06 18:22:17 +05:30
xavierk cf14c5b27c fix(inject): add explicit niri guard and wtype-first key tool order
Autodetection on niri now never probes or selects the RemoteDesktop
portal, and the ibus-wayland bridge exception no longer reopens IBus
there. Key events after startup resolve wtype before ydotool, matching
_check_dependencies and the decided ladder.

conftest scrubs NIRI_SOCKET so tests modelling other desktops are not
affected when run inside a niri session.
2026-11-06 18:17:17 +05:30
xavierk 5075933677 chore: merge Gitea template main into integration/spec16
CI / security (push) Failing after 1m12s
CI / lint (push) Failing after 22s
CI / ai-review (push) Skipped
Keeps the template CI files (.gitea/workflows/ci.yml, .jscpd.json, CI.md)
and the Voculinux README from integration/spec16.
2026-11-06 16:36:34 +05:30
soubarnak 1dd3986383 Merge feature/29 into integration/spec16 2026-11-06 09:44:24 +05:30
soubarnak 4033f623c3 Merge feature/24 into integration/spec16 2026-11-06 09:44:20 +05:30
soubarnak e6c9069e0b fix(void): use concrete release-download URL for xbps client registration
Replace the self-referential <repo-url-from-release-notes> placeholder
in the root README, the release-notes template, and the Void packaging
README with the concrete per-tag download prefix the build-xbps job
attaches the signed repo to. Static docs default TAG to the current
version; release.yml renders github.ref_name at publish time.

Fixes #29
2026-11-06 09:42:12 +05:30
soubarnak cfd5bba65c fix(web): close AC1 gap on faq, faster-whisper and parakeet pages
Extend the AC1 honesty tests to the faq install answer and the
faster-whisper/parakeet install commands, and add fork-status plus
upstream-install-script disclosure on all three surfaces.

Fixes #24
2026-11-06 09:41:36 +05:30
soubarnak 7f1e4b8ace chore(29): merge integration tip cf87331 into feature/29 2026-11-06 09:40:11 +05:30
soubarnak 2721b57bc1 chore(24): merge integration/spec16 tip cf87331 2026-11-06 09:40:06 +05:30
soubarnak cf873319d4 Merge feature/31 into integration/spec16 (ticket #31: injection ladder order) 2026-11-06 09:37:14 +05:30
soubarnak 6eb8ff3d67 Merge feature/20 into integration/spec16 (ticket #20: measured ladder thresholds) 2026-11-06 09:37:13 +05:30
soubarnak fbddbecd7a Merge feature/17 into integration/spec16 (ticket #17: shared user-agent fix) 2026-11-06 09:37:13 +05:30
soubarnak e100af7bcd fix(injection): align fallback ladder to portal>wtype>ydotool>xdotool>manual
Ticket #31 review found startup and demote paths preferring ydotool
over wtype, with a KDE ydotool-first exception, contradicting the
decided order in spec #16 (portal first where a backend implements
it, then direct keysym typing, then the virtual-input tool, then
XWayland-only injection, then manual paste).

- Auto-selection is now portal, wtype, ready ydotool, daemonless
  ydotool, xdotool on every desktop including KDE; the __init__ wtype
  probe validates wtype and demotes on compositor rejection.
- Portal-deny demotion, IBus-fallback switch, XWayland recovery, and
  a new wtype runtime-failure retry all follow the same rung order
  with partial-type accounting preserved.
- Ladder suite grows to 14 tests pinning KDE portal selection,
  wtype-before-ydotool selection, and each demotion trigger.
- USER_GUIDE states the full rung order and portal-first on KDE.
2026-11-06 09:21:13 +05:30
soubarnak da450e32db fix(void): wire signed xbps repo into release, README, and release process
Add build-xbps tag job to release.yml: verifies the tag against
src/vocalinux/version.py, fails closed when XBPS_SIGNING_KEY is unset,
builds and signs via podman-only repo.sh, and attaches packages,
signatures, repodata, and client key files to the release. Fold the
xbps-repo artifact into publish-checksums (manifest + SHA256SUMS).

Document the Void install in the root README (glibc x86_64 scope,
fingerprint check, third-party repo caveat) and the post-tag template
version/checksum bump as a pull request in docs/RELEASE_PROCESS.md.

Proof: local podman run with a throwaway RSA4096 key built all four
templates, signed packages + repodata, and verified voculinux installs
from the signed repo in a clean rootdir (fingerprint
eb:29:5d:9e:5c:94:c1:63:ae:35:cd:35:db:7a:28:da).
2026-11-06 09:15:22 +05:30
soubarnak 9a289548ba fix(web): honest fork-status notes on all packaged-artefact surfaces
Every download/install surface now states that fork AppImage, .deb/.rpm,
Flatpak, Snap, AUR and xbps artefacts are not published yet, labels
upstream GitHub Releases links as upstream, corrects 'Then launch
voculinux' to the upstream vocalinux binary the install script ships
today, and softens the NixOS xbps line to future tense. Adds AC1 honesty
tests to voculinux-rebrand.test.ts.

Fixes #24
2026-11-06 09:04:49 +05:30
soubarnak d08cacb0b4 fix(identity): share one model-download user agent definition
Both model-download call sites built the User-Agent string separately:
recognition_manager used a hardcoded literal while settings_dialog
interpolated APP_ID. Add app_identity.user_agent() and use it in both,
with a test pinning the shared definition.

Fixes #17
2026-11-06 09:01:15 +05:30
soubarnak 987d8eec29 fix(models): use ticket 19 measured peaks for ladder thresholds
q8_0 threshold becomes 1644 MiB (1132+512) and q5_0 becomes 1358 MiB
(846+512) per the recorded baseline recommendation, replacing the
on-disk-size proxies. Tests pin the measured values and the 1644/1358
boundaries.
2026-11-06 09:00:47 +05:30
soubarnak da97b676a7 Merge feature/29 into integration/spec16 (ticket #29: signed xbps pipeline) 2026-11-06 06:29:27 +05:30
soubarnak 9bc04936b6 feat(void): add signed xbps repository pipeline
Build every template in smoke-gate order, index the full repository and
sign packages plus metadata with the RSA4096 key, in the pinned Void
container via podman. Fail-closed without a key: no key file, no repo.

Ticket #29 (needs #27, #28).
2026-11-06 06:29:22 +05:30
soubarnak 1ae453e7d9 Merge feature/28 into integration/spec16 (ticket #28: Void package smoke gate) 2026-11-06 05:57:40 +05:30
soubarnak bd7b624f50 feat(void): add package smoke gate across all templates
Ticket xavierk/voculinux#28, needs #27. One documented command
(packaging/void/smoke.sh, just void-smoke) lints, builds, installs
and smoke-tests every template under packaging/void/srcpkgs in
dependency order in the pinned Void container via podman, failing
fast naming the package with the harness echoing each stage.

The gate caught three latent breaks in the per-package harness and
the app template, fixed here:
- container-main.sh scoped the libggml scan to python3-pywhispercpp
  and gave the leaf packages their own import smokes (pynput by
  presence: no display in the container), failing loudly for
  packages without a smoke recipe;
- voculinux template drops the deprecated wrksrc override (xbps-src
  renames the single-top-dir archive itself; xlint rejects wrksrc)
  and builds the PEP 517 wheel (the sdist ships no setup.py);
- post_install promotes the pre-rename sdist names (desktop entry
  content, icons, /usr/bin launchers) to the renamed identity, and
  the payload smoke rejects pre-rename leftovers in OS-visible paths.

Offline policy tests (tests/test_void_smoke_gate.py) pin the gate to
the template set, the app-last order, podman-only pinned inputs and
per-package failure identity; the #27 policy tests and the rename
sweep cover the harness and template contracts.
2026-11-06 05:57:37 +05:30
soubarnak edaa3a57d3 Merge feature/24 fix into integration/spec16 (ticket #24: fork-status install notes, xbps claim) 2026-11-06 03:17:08 +05:30
soubarnak fe209e70ad fix(web): honest fork-status notes on install paths, soften xbps claim
Install one-liners still fetch the upstream script, so each install
entry point now says so plainly (Nix-page precedent): upstream
installs Vocalinux, not Voculinux, and fork release artefacts are not
published yet. Homepage xbps card no longer claims signed repository
data ships with every release while the packaging pipeline (#29) is
open. Also 'VocaHQ remote' -> 'Flatpak remote' on the install page.

Refs #24
2026-11-06 03:16:39 +05:30
soubarnak f660471757 Merge feature/31 into integration/spec16 (ticket #31: injection ladder tests and first-dictation docs) 2026-11-06 03:04:14 +05:30
soubarnak d320cdae14 Merge feature/27 into integration/spec16 (ticket #27: Void xbps app template) 2026-11-06 03:04:11 +05:30
soubarnak fa14552a2a Merge feature/24 into integration/spec16 (ticket #24: web rebrand to Voculinux) 2026-11-06 03:04:09 +05:30
soubarnak c8cdb810a6 Merge feature/22 into integration/spec16 (ticket #22: niri keybind pack) 2026-11-06 03:04:06 +05:30
soubarnak d7a4b8c21e feat(void): add xbps template for the voculinux app
Ticket xavierk/voculinux#27, built on #18 (rename) plus the #25/#26
dependency templates. The template builds the app from the canonical
checksum-verified release sdist, depends on Void's interpreter, GTK,
desktop bindings and packaged Python libraries, and installs the
renamed desktop entry, icons and a packaged-install marker. No speech
models, no vendored wheels, no pip at build or install time.

Packaged installs keep background update checks as a signal, but every
update affordance presents the package-manager path
(src/vocalinux/utils/packaging.py). Also corrects the Void distro
inventory (Ayatana provider name; ydotool marked absent) and regens
the installer map.
2026-11-06 03:03:33 +05:30
soubarnak f26e0a9111 feat(web): rebrand marketing site to Voculinux
Names, wordmarks, package and install references move to voculinux;
site domain to voculinux.com with renamed public assets. Layout keeps
Carbon spacing/type/motion discipline remapped to the house palette
(teal interactive, warm paper, system stacks, red reserved). Header
and footer gain Bongbetic attribution chrome linking hosted brand
assets; no brand binaries vendored. Engine copy states whisper.cpp as
guaranteed default, others as best-effort extras, remote API as
user-configured with audio leaving the machine. Nix page carries a
fork-status note (upstream flake installs Vocalinux).

Refs #24
2026-11-06 02:30:01 +05:30
soubarnak e6f7938068 test(injection): pin fallback ladder per desktop class and niri first-run
Locks the ordered rungs without real compositors: portal first where a
backend implements it (GNOME), direct typing first on niri with IBus
excluded and no portal selected, deny demoting to direct typing with the
full dictation kept, terminal probe choosing Ctrl+Shift+V, held modifiers
delaying the XWayland paste, and clipboard manual paste as last resort.

USER_GUIDE states the niri first run (no prompt, typing goes direct,
never pin portal there) and the GNOME/KDE grant, persistence and deny
fallback under the renamed backend setting and override names.

Refs #31
2026-11-06 02:27:15 +05:30
soubarnak c27d204a00 feat(niri): add niri keybind pack and Dank Material Shell notes
Docs-only slice of ticket #22: include file, integration page, index
links. Tray-watcher observation stays open for hardware run (#32); no
probe code changed.

Refs #22
2026-11-06 02:23:40 +05:30
soubarnak 27f157355d style(models): fix isort import block in recognition_manager
Removes the blank line between the function-level imports so
isort --check-only passes on integration/spec16.
2026-11-06 01:58:07 +05:30
soubarnak 59086820a7 Merge feature/21 into integration/spec16 (ticket #21: D-Bus state signal) 2026-11-06 01:51:05 +05:30
soubarnak 74ea855220 feat(dbus): expose dictation state signal and property
Alongside Toggle/Start/Stop, the renamed interface now publishes
dictation state (idle/listening/processing) as a StateChanged signal
and a readable State property, so status bars and scripts can follow
dictation without scraping the tray. Signals fire only on change, so
double start/stop emits no duplicates; command-line triggers behave
exactly as before.

Refs #21
2026-11-06 01:51:05 +05:30
soubarnak 701266ac2e Merge feature/20 into integration/spec16 (ticket #20: memory-aware model ladder) 2026-11-06 01:48:24 +05:30
soubarnak df771d8fb1 feat(models): memory-aware whisper.cpp ladder with conditional backend order
Free memory picks the load-time rung (large-v3-turbo-q8_0 default,
q5_0 under 1086 MiB free, small/small.en floor) for unpinned default
configs; thresholds derive from catalog sizes plus the protocol's
512 MiB headroom. A manual pin is never overridden, and a failed load
steps one rung down and retries exactly once before surfacing.

CUDA ranks before Vulkan only with a complete architecture-matching
toolkit (nvidia-smi GPU, nvcc, compute capability >= 7.0); otherwise
Vulkan, then CPU. The driver-only CUDA recommendation now demotes to
CPU logic instead of naming an unreachable VRAM ladder.

Refs #20
2026-11-06 01:48:20 +05:30
soubarnak 426f524145 Merge feature/18 into integration/spec16 (ticket #18: rename to voculinux) 2026-11-06 01:29:42 +05:30
soubarnak ea7be5f111 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
2026-11-06 01:29:39 +05:30
soubarnak c565e6d946 Merge feature/30 into integration/spec16 (ticket #30: upstream intake policy) 2026-11-06 00:06:02 +05:30
soubarnak d4be3caf7a Merge feature/26 into integration/spec16 (ticket #26: void pywhispercpp template)
Conflict in packaging/void/tool_checksums.txt (add/add with #25):
kept #26 rows (base-image digest + void-packages pin the kept
build.sh reads) with the #25 header reference folded in. #25's
base-image digest differed; flagged for re-pin on next bump.
2026-11-06 00:06:02 +05:30
soubarnak cc9db31450 Merge feature/25 into integration/spec16 (ticket #25: void pynput/pyaudio templates) 2026-11-06 00:05:40 +05:30
soubarnak 9d09319ba1 Merge feature/23 into integration/spec16 (ticket #23: brand accent hook) 2026-11-06 00:05:37 +05:30
soubarnak c5c42fedee Merge feature/19 into integration/spec16 (ticket #19: perf baseline protocol) 2026-11-06 00:05:35 +05:30
soubarnak 0b3f01227f Merge feature/17 into integration/spec16 (ticket #17: centralise app identity) 2026-11-06 00:05:32 +05:30
soubarnak 203b51ab78 feat(ui): add brand accent hook to GTK colour scheme
BRAND_ACCENT single source with shade()-derived states; accent CSS
covers suggested-action buttons and the listening chip, installed at
USER priority from main().

Refs #23
2026-11-06 00:05:29 +05:30
soubarnak d7a0273da1 refactor(identity): centralise user-visible app identity
Single app_identity module owns APP_NAME/APP_ID, D-Bus names,
desktop/icon/IBus names and related surfaces; 16 consumers import
from it with zero value changes. Deliberately excludes
settings_about and dictation_pad literals pinned by existing tests.

Refs #17
2026-11-06 00:05:26 +05:30
soubarnak 1d8b07727e feat(void): add xbps template for python3-pywhispercpp
Spec #16 ticket #26: Void template for the whisper.cpp Python binding,
built from the pinned 1.5.0 sdist with the Vulkan backend (default-on
option), shared libraries, and portable CPU flags. Includes the podman
build/smoke harness, pinned base-image pins, and offline policy tests.

Refs: #26
2026-11-06 00:04:47 +05:30
soubarnak 6713722daf feat(perf): lock installed-build baseline protocol and take target-machine numbers
Ticket #19 (spec #16): fixed three-metric protocol as a runnable script
(idle memory both keep-alive states, wake latency from debug logs,
real-time factor on the fixed 30 s sample per backend) plus per-rung
load footprints, portal/direct injection probe, and threshold
derivation for the model-ladder ticket (#20). Offline unit tests for
the parsing/statistics/report helpers. Evidence recorded on the ticket.

One debug-only marker (Toggle requested in state ...) makes wake
latency derivable from logs alone.
2026-11-05 23:11:28 +05:30
soubarnak c462ffb4b2 feat(void): add xbps templates for pynput and updated PyAudio
Ticket: #25

Two in-repo void-packages-layout templates under packaging/void/srcpkgs:
python3-pynput 1.8.2 (new; Void does not ship it) and python3-PyAudio
0.2.14 (updated local template; Void ships 0.2.12, below the project's
pyaudio>=0.2.13 floor). Versions and checksums track uv.lock and
requirements/runtime.txt; pynput post_patch strips setup_requires so the
build never fetches helpers over the network (setuptools-lint and twine
are not in void-packages). No noverifypydeps/nopyprovides anywhere.

Adds tests/test_void_small_deps.py (offline policy test): template
layout and metadata shape, lock/export/floor pins, checksum pins,
no verification-disabling options, linux dep coverage, verified-only
dependency names, and the digest-pinned base image in
packaging/void/tool_checksums.txt.

Verified: xlint clean on both templates; both packages build with
xbps-src in the pinned ghcr.io/void-linux/void-glibc-full container
(podman) and install in a fresh container with pyaudio 0.2.14
importing against PortAudio V19.6.0.
2026-11-05 23:09:16 +05:30