vincent on Linux
x86-64 and ARM64 are both released, and Linux is the platform CI runs the acceptance gates on first.
Install
Stable releases attach deb and rpm packages for both supported architectures:
# Debian / Ubuntu (use _arm64.deb on ARM64)
sudo apt install ./vincent_*_amd64.deb
# Fedora / RHEL family (use .aarch64.rpm on ARM64)
sudo dnf install ./vincent-*.x86_64.rpm
Download the package from the
latest release first.
These are release assets rather than an apt/dnf repository, so install the next
downloaded package the same way to upgrade. Both formats put the binary at
/usr/bin/vincent, depend on git, carry the license documents, and deliberately
do not create a root-owned service for Vincent’s per-user daemon.
mise works across distributions without a distro package:
mise use -g github:lezli01/vincent
Package-manager metadata moves on stable releases only. If a newly introduced channel has not received its first stable release, use mise or the archive:
tar -xzf vincent_*_linux_amd64.tar.gz # or _linux_arm64
sudo mv vincent /usr/local/bin/
vincent version
~/.local/bin avoids sudo entirely. Nothing needs clearing on first launch —
Linux has no Gatekeeper or SmartScreen equivalent — though you may need
chmod +x vincent if your extraction tool dropped the bit.
Full detail, including signature verification: Installation.
Directories
XDG, with the standard fallbacks:
| Purpose | Location | Env override honored |
|---|---|---|
| Config | ~/.config/vincent/ |
XDG_CONFIG_HOME |
| Data | ~/.local/share/vincent/ |
XDG_DATA_HOME |
~/.config/vincent/config.yaml # 0600, in a 0700 directory
~/.config/vincent/workflows/*.yaml
~/.local/share/vincent/vincent.db
~/.local/share/vincent/token # 0600
~/.local/share/vincent/daemon.json
~/.local/share/vincent/logs/daemon.log
~/.local/share/vincent/worktrees/{task_id}/
~/.local/share/vincent/transcripts/{task_id}/
VINCENT_CONFIG_DIR and VINCENT_DATA_DIR override both outright — see
Files and directories.
Running at login
vincent service install
vincent service status
systemctl --user status vincent # the OS's own view
That writes a systemd user unit to ~/.config/systemd/user — per-user, no
elevation, no sudo systemctl. The OS user is vincent’s trust boundary: an
agent gets your privileges, your agent-CLI logins and your git identity, and
nothing more.
Restart=on-failure, not always. A daemon that exits 0 was asked to stop, and
restarting it would make vincent daemon stop impossible.
Read its logs either way you prefer:
journalctl --user -u vincent -f
tail -f ~/.local/share/vincent/logs/daemon.log
Surviving logout
A systemd user manager stops when your last session ends, taking the daemon with it. Lingering is what changes that:
loginctl enable-linger "$USER"
vincent service install attempts this itself and, if it cannot, prints the
exact command for you to run. The service is installed and running either way —
this is a warning, not a failed install.
Check it:
loginctl show-user "$USER" --property=Linger
Without lingering the daemon still survives everything except logging out entirely; with it, the daemon comes up at boot and stays up across logins.
The PATH problem
A systemd user manager supplies a minimal PATH — barely wider than
/usr/bin:/bin — and every agent CLI installs outside it: an npm prefix, an nvm
shim directory, ~/.local/bin, a distro package in /opt.
Left alone, an installed service therefore resolves no agent CLI at all,
while the same daemon started by hand finds every one. So
vincent service install captures the PATH of the shell that ran it,
along with the config and data directories, and writes them into the unit.
Two consequences:
- It goes stale. Install a CLI somewhere new, then run
vincent service installagain to recapture — the same “reinstall to recapture” contract the directories have. -
It is not the only answer.
agents.<name>.pathinconfig.yamlis absolute and never consultsPATH:agents: codex: { path: "/home/me/.local/bin/codex" }
If vincent daemon status under a running service lists no adapters, this is
why. Reinstall from a shell where which claude works.
Terminal notes
- Native text selection needs the TUI’s mouse handling off: press
M, or hold shift while dragging. Ctrl+Shift+Vpastes; it arrives as a bracketed paste and lands in the focused field.$EDITORis honored for edit-and-retry and description editing. It must run in the terminal and block until closed.- All three adapters support
restrictedpermission mode here, including cursor — the sandbox that is unavailable on Windows works fine on Linux.