Linux desktop companion for Vaner — the predictive-context engine. Menu-bar / tray app that watches the daemon's active predictions over SSE and lets the user adopt a prepared package into whichever AI agent (Claude Code, Cursor, Zed, etc.) is running.
Tauri v2 + SvelteKit. Rust backend depends on the shared
vaner-contract
crate from the Vaner monorepo; the SwiftUI macOS sibling
(vaner-desktop) uses the
same conformance fixtures to stay in lock-step without sharing a
runtime.
Target: Ubuntu 22.04+ / Debian 12+, X11 or KDE Wayland. Stock
GNOME on Wayland needs gnome-shell-extension-appindicator for the
tray icon to appear — the app detects this at first launch and
surfaces install guidance.
Three paths, all signed — pick whichever fits your workflow:
The installer adds a signed apt repo at https://apt.vaner.ai and
installs the vaner-desktop package. Every future release arrives
through apt upgrade without you running anything else.
Naming: the desktop client's apt package is
vaner-desktop. The barevanername is reserved for the daemon CLI (the Python engine that watches your sources and exposes the cockpit on 127.0.0.1:8473), so future apt distribution of the engine doesn't collide.
curl -fsSL https://raw.githubusercontent.com/Borgels/vaner-desktop-linux/main/scripts/install.sh | bashPrefer the plain-apt form (identical result, no pipe-to-bash):
curl -fsSL https://apt.vaner.ai/release-key.asc \
| sudo gpg --dearmor -o /etc/apt/keyrings/vaner.gpg
echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/vaner.gpg] https://apt.vaner.ai stable main" \
| sudo tee /etc/apt/sources.list.d/vaner.list
sudo apt update && sudo apt install vaner-desktoparch=amd64 keeps apt from asking the repo for i386 package lists
(the repo is amd64-only).
VANER_MODE=deb curl -fsSL https://raw.githubusercontent.com/Borgels/vaner-desktop-linux/main/scripts/install.sh | bashSame fingerprint-pin + detached-sig verification as the apt path; subsequent releases don't auto-install unless you re-run.
VER=$(curl -fsSL https://api.github.com/repos/Borgels/vaner-desktop-linux/releases/latest | jq -r .tag_name)
curl -LO https://github.com/Borgels/vaner-desktop-linux/releases/download/$VER/vaner-desktop_${VER#v}_amd64.deb
curl -LO https://github.com/Borgels/vaner-desktop-linux/releases/download/$VER/vaner-desktop_${VER#v}_amd64.deb.asc
curl -LO https://github.com/Borgels/vaner-desktop-linux/releases/download/$VER/release-key.asc
gpg --import release-key.asc
gpg --verify vaner-desktop_${VER#v}_amd64.deb.asc vaner-desktop_${VER#v}_amd64.deb
sudo apt install ./vaner-desktop_${VER#v}_amd64.debThe release key fingerprint is
506B8FA959917D530E5EE7203D219B47A7E4F046 — pinned in
scripts/install.sh, published on
keys.openpgp.org,
and also available as scripts/release-key.asc on main.
Every release ships an .AppImage alongside the .deb. Download,
verify, chmod +x, run:
VER=$(curl -fsSL https://api.github.com/repos/Borgels/vaner-desktop-linux/releases/latest | jq -r .tag_name)
curl -LO https://github.com/Borgels/vaner-desktop-linux/releases/download/$VER/vaner-desktop_${VER#v}_amd64.AppImage
curl -LO https://github.com/Borgels/vaner-desktop-linux/releases/download/$VER/vaner-desktop_${VER#v}_amd64.AppImage.asc
curl -LO https://github.com/Borgels/vaner-desktop-linux/releases/download/$VER/release-key.asc
gpg --import release-key.asc
gpg --verify vaner-desktop_${VER#v}_amd64.AppImage.asc vaner-desktop_${VER#v}_amd64.AppImage
chmod +x vaner-desktop_${VER#v}_amd64.AppImage
./vaner-desktop_${VER#v}_amd64.AppImageThe app checks for updates on every launch via
tauri-plugin-updater; every
update is signed with a separate minisign key whose public half is
embedded in the app. A small banner appears in the popover when a
new release is ready; click Install to download + verify +
replace in place. The apt-repo path gets the same updates through
your system's normal update flow — pick one, not both.
- L1:
vaner-contractcrate (upstream) - L2: conformance fixtures bridge (upstream)
- L3: Swift conformance test consumption (scheduled with Vaner tag)
- L4: Tauri app skeleton
- L5: tray + popover + menu + first-run AppIndicator modal
- L6: signed
.debrelease workflow + install.sh verification - L7: Docker ship-gate (
Dockerfile.ship-gate+scripts/ship-gate.sh)
Prereqs:
# Ubuntu 24.04 system deps for WebKitGTK-based Tauri:
sudo apt install -y libwebkit2gtk-4.1-dev libgtk-3-dev \
libayatana-appindicator3-dev librsvg2-dev patchelf
# Rust toolchain (1.85+ for edition 2024):
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# Node 20+ and pnpm:
corepack enable && corepack prepare pnpm@latest --activateDev:
pnpm install
pnpm tauri devBuild (no packaging yet — L6 wires up .deb):
pnpm tauri build --no-bundleSee /home/abo/.claude/plans/task-finish-phase-d-async-reef.md in the
original planning session; the short version:
┌─────────────────────────────────────────────┐
│ vaner daemon (Python) │
│ /predictions/active • /events/stream │
│ /predictions/{id}/adopt • /status │
└──────────────────────┬──────────────────────┘
│ HTTP / SSE (loopback)
│
┌────────────▼──────────────┐
│ vaner-contract (Rust) │
│ • models + enums │
│ • HTTP client + SSE │
│ • reducer + handoff │
└────────────┬──────────────┘
│ (compiled in)
│
┌────────────▼──────────────┐
│ Tauri v2 Rust backend │
│ commands + SSE task │
└────────────┬──────────────┘
│ invoke / emit
│
┌────────────▼──────────────┐
│ SvelteKit (WebView) │
│ QuietShell popover UI │
└───────────────────────────┘
Design tokens (src/lib/tokens.css) are vendored from Vaner's
ui/cockpit/src/styles/tokens.css so the visual language stays 1:1
with the web cockpit and the SwiftUI macOS app.
Apache-2.0, inherited from the Vaner project.