Install hal0
hal0 installs from a single command. The bootstrap script is the trust
boundary: it fetches the release manifest, verifies the tarball, unpacks
it, and hands off to the real installer (installer/install.sh).
curl -fsSL https://hal0.dev/install.sh | sudo bashChannels
Section titled “Channels”By default the bootstrap fetches the latest stable release manifest.
Pick a different channel with HAL0_CHANNEL:
HAL0_CHANNEL=preview curl -fsSL https://hal0.dev/install.sh | sudo bashAccepted values: stable (default), preview, nightly.
Requirements
Section titled “Requirements”- Linux, x86_64 — hal0 ships amd64-only binaries (the FastFlowLM
.deband the toolbox container images). ARM and macOS/Windows are not supported. - systemd —
systemctlmust be onPATH(outside--devmode). - Python ≥ 3.12 —
pip installof the release tree hard-requires 3.12+. If the defaultpython3is older, the installer resolves or auto-installs a 3.12 interpreter; otherwise it fails with a remediation hint. - A container runtime — every inference slot runs in a container. The installer prefers podman (auto-installed if neither podman nor docker is found); docker is accepted if already present.
- Node.js — only needed to build the dashboard UI from a source/git
checkout. Signed release tarballs ship a prebuilt
ui/distand skip this requirement entirely; the installer auto-provisions Node when it’s needed and can’t find a suitable version.
What the installer does
Section titled “What the installer does”The bootstrap hands off to installer/install.sh, which runs 16 steps,
in order:
- Pre-flight checks — architecture, systemd, Python, container runtime, disk space, free ports.
- System user — creates the
hal0service account. - Filesystem layout — creates the FHS directory tree (or the
--devtree under$PWD/.hal0ai). - Python environment — builds the shared venv and
pip installs hal0 into it. - Node.js toolchain — provisions Node only if this tree ships the dashboard’s npm project.
- Dashboard UI — builds
ui/dist(or reuses a release’s prebuilt copy). - Configuration — writes
/etc/hal0/hal0.toml,api.env,upstreams.toml,openwebui.env— never overwriting existing files. - Systemd units — writes and enables
hal0-api.serviceandhal0-openwebui.service(unless--no-start). - Container slot seeds — copies default slot TOMLs into
/etc/hal0/slots/(never overwriting operator edits). - Hardware probe — detects CPU/RAM/GPU/NPU and writes
/etc/hal0/hardware.json. - Steward + agent models — seeds a hardware-recommended slot and profile.
- NPU prerequisites — installs the FastFlowLM runtime on AMDXDNA/apt hosts (fail-soft elsewhere).
- ComfyUI model share — sets up the image-generation model path.
- Bundle picker manifests — writes the dashboard’s first-run bundle catalog.
- Bundled agent skills — installs the shipped agent skill set.
- Service start — starts
hal0-apiandhal0-openwebui(unless--no-start).
The installer is idempotent — safe to re-run after a partial failure, or just to pick up new configuration defaults. Existing config files are never clobbered.
Flags and environment variables
Section titled “Flags and environment variables”curl -fsSL https://hal0.dev/install.sh | sudo bash -s -- --no-start --models-dir=/mnt/ai-models| Flag | Effect |
|---|---|
--dev |
Local-only editable install under $PWD/.hal0ai — no systemd, no host package changes |
--no-start |
Set everything up but do not enable/start the units |
--models-dir=PATH |
Absolute path where Hugging Face pulls land (same as HAL0_MODELS_DIR) |
| Variable | Default | Purpose |
|---|---|---|
HAL0_PREFIX |
/usr/lib/hal0 |
Installation root (versioned dir + current symlink) |
HAL0_PORT |
8080 |
API bind port |
HAL0_PYTHON |
python3 |
Python interpreter to build the venv from |
HAL0_MODELS_DIR |
/var/lib/hal0/models |
Where Hugging Face pulls land |
HAL0_NONINTERACTIVE |
(unset) | Set to 1 to force flag/env values everywhere instead of prompting on a terminal |
HAL0_NO_PROBE |
(unset) | Set to 1 to skip the hardware probe / first-run seeding |
HAL0_SKIP_HINDSIGHT |
(unset) | Set to 1 to skip installing the Hindsight memory service |
HAL0_PY_AUTOINSTALL |
(unset) | Set to 1 to let the installer auto-install a Python 3.12 interpreter when the default is too old |
Production filesystem layout
Section titled “Production filesystem layout”${HAL0_PREFIX}/hal0-<version> # versioned code tree${HAL0_PREFIX}/current # symlink hal0 update swaps atomically/etc/hal0 # config: hal0.toml, slots/, profiles.toml/var/lib/hal0 # state: models, registry, slots, openwebui, cacheUnder --dev, all of the above lands under $PWD/.hal0ai/ instead.
Verify the install
Section titled “Verify the install”hal0 statushal0 slot listcurl http://localhost:8080/api/healthjournalctl -fu hal0-apihal0 status reports system + slot + memory health; hal0 slot list
shows configured slots; the /api/health curl is a lightweight liveness
probe (200 the moment the API is serving); journalctl -fu hal0-api
tails the control-plane log if something looks wrong.
Uninstall
Section titled “Uninstall”hal0 uninstall # conservative: keep /etc/hal0 + models/registryhal0 uninstall --keep-data # legacy alias for the same conservative defaulthal0 uninstall --purge # clean slate: also wipe config, data, user, imagesThe conservative default stops services and removes code, units, venvs,
binaries, and every hal0 podman container, but keeps /etc/hal0 (config)
and the data directory (models, registry, OpenWebUI state) so a re-install
reuses them. --purge (alias --clean-slate) additionally removes the
config and data directories, the hal0 system user and group, and all
hal0/toolbox podman images — it prompts for a typed DELETE confirmation
unless you pass --force (or set HAL0_FORCE=1).
Next steps
Section titled “Next steps”- Pull a model and assign it to a slot — see Load your first model.
- Open the dashboard at
http://<host>:8080/to manage slots, profiles, and stacks.