CLI reference
hal0 ships a single hal0 binary built with Typer
(src/hal0/cli/main.py). Every non-serve subcommand talks to the
local daemon on 127.0.0.1:8080 — meaning the CLI and the dashboard
end up calling the same code paths.
Implementation status is verified against the
docs/handoff-2026-05-15-autonomous.md “What landed” section.
Real commands hit live endpoints; stub commands return a
NOT_IMPLEMENTED (501) envelope today.
System
Section titled “System”hal0 status # system + slot summary (real)hal0 probe # re-run hardware detection (real)hal0 serve [--host] [--port] [--reload] # daemon mode (real)hal0 status is what you run first when something looks off.
hal0 probe rewrites /etc/hal0/hardware.json — re-run after BIOS
UMA changes, GPU swaps, or RAM upgrades.
hal0 slot list # realhal0 slot load <name> [--model M] # realhal0 slot unload <name> # realhal0 slot restart <name> # realhal0 slot swap <name> --model M # realhal0 slot logs <name> [--follow] # real — SSE tail of journaldhal0 slot swap is the most-used command in normal operation —
change a slot’s model in one call, watch it transition through
unloading → starting → warming → ready.
hal0 slot logs <name> --follow is the journald tail wrapped over
SSE; it shows the same stream the dashboard’s Logs view tails.
Models
Section titled “Models”hal0 model list # realhal0 model pull <ref> # stub — 501 todayhal0 model rm <ref> # realhal0 model assign <ref> --slot S # realConfiguration
Section titled “Configuration”hal0 config show # realhal0 config edit # real — opens $EDITORhal0 config validate # real — schema checkhal0 config migrate # real — apply schema migrationshal0 config validate is safe to run at any time and doesn’t write
anything. Use it before hal0 config edit to confirm your starting
point is clean.
Updates
Section titled “Updates”hal0 update # real — apply latest stablehal0 update --channel stable # realhal0 update --channel nightly # realhal0 update --check # real — print version, don't applyhal0 update --rollback # real — revert to previous versionSee Updates & rollback for the atomic symlink-swap mechanics.
Uninstall
Section titled “Uninstall”hal0 uninstall [--keep-data] # stub — not implemented yetTalking to the daemon
Section titled “Talking to the daemon”Almost every subcommand is a thin client on the API. You can hit the same endpoints directly:
curl http://localhost:8080/api/slotscurl http://localhost:8080/api/modelscurl -X POST http://localhost:8080/api/slots/primary/restartThe CLI is for ergonomics; the API is the truth.