Skip to content

Edit configuration

hal0’s configuration lives as plain TOML (plus one env file) under /etc/hal0. The directory is preserved across updates — the updater only swaps code, never your config. The hal0 config CLI is a thin layer over the same files and the running daemon.

FileWhat it holds
hal0.tomlTop-level config: [meta] schema_version, [slots] port_range_start/end, [dispatcher] prefetch_timeout_s, [telemetry] channel.
api.envEnvironment for the hal0-api service (systemd EnvironmentFile) — feature flags and env knobs like HAL0_MODEL_STORE, HAL0_COMFYUI_SWITCHOVER_ENABLED, HAL0_MCP_ALLOWED_HOSTS.
upstreams.tomlExternal / upstream provider routing.
providers.tomlProvider credential references (key names, never plaintext secrets).
profiles.tomlOptional profile catalogue. Absent → built-in seed profiles are used.
capabilities.tomlPersisted capability selections (embed / voice / img / vision). Carries its own schema_version.
slots/<name>.tomlOne file per slot — model, device, profile, port, and per-slot tables like [image].

Other files the runtime drops here: hardware.json (cached hardware probe), manifest.json (release image pins), openwebui.env.

Terminal window
hal0 config show

Prints hal0.toml as it is on disk. If the file is root-owned and you run as a non-root user, the command tells you to re-run with sudo (or to chmod the config tree once) instead of crashing.

Terminal window
hal0 config edit

Opens hal0.toml in $EDITOR (falling back to $VISUAL, then vi). If the file doesn’t exist yet, it’s created with a valid skeleton ([meta] schema_version, [slots] port range).

Terminal window
hal0 config validate

Loads and validates hal0.toml, upstreams.toml, and providers.toml against the current Pydantic schema. It prints each problem and exits non-zero on any failure, or ✓ All configs pass schema validation. when clean.

After editing, ask the live daemon to re-read its TOMLs without a full restart:

Terminal window
hal0 config reload

This hits POST /api/settings/reload on the local API. If the daemon is down, the command exits non-zero — start hal0-api first.

Settings page showing live reload status Settings page with live daemon status and reload controls.

When you update hal0 across a schema bump, bring hal0.toml to the latest version:

Terminal window
hal0 config migrate

It reads meta.schema_version, runs the registered migration chain, and atomically writes the result back only if the version actually advanced. If the config is already current (or absent), nothing is written and that is reported honestly.

Every config write hal0 performs — config migrate, the settings API, the updater’s hal0.previous record — uses a tempfile + os.replace pattern so a write is either fully applied or not at all; an interrupted write never leaves a half-written, unparseable file in place.