venom-os
The final bundle: venom-os up supervises venomx, venom, venom-desk and the rest. It covers login/session integration, curated defaults, and a catalog of TUI apps. A distro image comes later.
Part of Venom. Status: alpha; interfaces may still change. Documentation: venom.tools.
Build from source with the Zig version in .zigversion (see Build).
Licensed under the MIT License. To report a vulnerability, see SECURITY.md.
Build
Zig 0.17 (see .zigversion). zig build fetches venom-std at the commit pinned in build.zig.zon; to build against a local checkout instead, add --fork=../venom-std to any zig build command:
zig build # zig-out/bin/venom-os
zig build test-unit # unit tests
zig build test-conformance # agent-contract conformance suite against `venom-os serve`
zig build test # both, plus the `venom-os up` integration test
The integration test (zig build test-up) drives a real venomx: build
../venomx first (zig build there) or pass -Dvenomx=<path>. It runs in
temporary XDG directories and kills every process it starts.
Usage
$ venom-os up # supervise a persistent `venomx serve` until SIGTERM/SIGINT
$ venom-os defaults # print the curated venomx defaults
$ venom-os defaults --dir=/etc/xdg # packagers: install them as /etc/xdg/venomx/defaults.zon
$ venom-os status --json # mode, installed defaults, supervised venomx
$ venom-os doctor # config, socket, defaults, venomx supervised and answering
$ venom-os --help # every command; `venom-os skill` for agents
venom-os follows the agent contract: src/verbs.zon and venom-std’s
shared bundles generate the CLI, venom-os mcp, docs and completions; every
command takes --json. venom-os up is the daemon in up mode: it serves
$XDG_RUNTIME_DIR/venom/venom-os.sock like venom-os serve and also installs
the defaults and supervises venomx. venom-os serve never starts venomx.
venom-os service disable --name=venomx makes the next up skip venomx
(service enable undoes it); neither stops or starts a running venomx.
venom-os up installs share/venomx/defaults.zon as
$XDG_DATA_HOME/venom/venom-os/xdg/venomx/defaults.zon and puts that directory
first in the daemon’s $XDG_CONFIG_DIRS. venomx reads it
read-only below your own ~/.config/venomx/config.zon, so any key you set wins.
The defaults turn off daemon.interactive_start (a stray venomx never starts
a second daemon), enable durable checkpoints, put the status line
at the top with a curated segment order, and add a leader g table that opens
lazygit (g), yazi (f), helix (e) and btop (t) in a new window, and
s opens your venomx config.zon in $EDITOR as a popup. They also ship the
float presets venom-os.launcher and venom-os.settings;
resize them in your config under floats.presets.
The supervisor (venom-std supervisor) restarts venomx after any exit with
backoff and writes $XDG_RUNTIME_DIR/venom/venom-os.status.json. Typing
venomx in a terminal then opens a new session on that daemon; exiting the
last shell ends the session but not the daemon.
Starting at login
venom-os login install makes venom-os up start at login and gives every
login session the same $XDG_CONFIG_DIRS, so a venomx typed in an ordinary
terminal reads the venom-os defaults even while the daemon is down (and fails
unavailable.not_running instead of starting a second, on-demand daemon). It
writes only under $XDG_CONFIG_HOME:
systemd/user/venom-os.service, runningvenom-os upwith the absolute paths of venom-os and venomx (--venomx=<path>; a bare name is resolved inPATHat install time);systemd/user/default.target.wants/venom-os.service, the linksystemctl --user enablewould make (--enable=falseskips it);environment.d/50-venom-os.conf, putting venom-os’s directory first in$XDG_CONFIG_DIRS;
and installs the defaults file. It never runs systemctl: start the unit now
with systemctl --user daemon-reload && systemctl --user start venom-os.service.
Sessions that do not read environment.d (a plain tty login, some window
managers) can add eval "$(venom-os env)" to their shell rc instead.
venom-os login uninstall removes exactly those files (files venom-os did not
write are never touched) and leaves a running unit running.
When a venomx that venom-os did not start already serves venomx’s socket,
venom-os up exits with conflict.venomx_running (5) instead of restarting
a second venomx with backoff; the unit does not restart on that exit.