Logs
hal0 logs everything through journald. The API, the dispatcher,
every slot — all flow into the system journal under a stable set of
unit names. The dashboard tails the same stream over SSE; the CLI
gives you raw journalctl access.
Unit names
Section titled “Unit names”| Unit | What it logs |
|---|---|
hal0-api.service | The main API + dispatcher process. |
hal0-slot@<name>.service | One per slot — e.g. hal0-slot@primary.service. |
hal0-openwebui.service | The bundled OpenWebUI on :3001. |
Read logs — CLI
Section titled “Read logs — CLI”For a slot, the simplest tool is the hal0 CLI — it wraps journalctl with sensible defaults:
hal0 slot logs primary # last 100 lineshal0 slot logs primary --follow # tail (SSE under the hood)For the API or raw journal access:
journalctl -u hal0-api.service -fjournalctl -u 'hal0-slot@*.service' -fjournalctl -u hal0-api.service --since '10 minutes ago'Read logs — dashboard
Section titled “Read logs — dashboard”The dashboard’s Logs view tails the journal stream over SSE in real time, with:
- Filter by unit (API / each slot / OpenWebUI).
- Filter by level (info, warn, error).
- Free-text grep against the stream.
- Pause / resume — useful when you’re trying to read a stack trace.
The SSE stream is the same one the CLI’s --follow flag uses, so
the dashboard and a terminal --follow show identical output.
Decision logs
Section titled “Decision logs”The dispatcher writes a decision log for every routing choice — which slot was considered, which was picked, what state each was in, which models were resolved. This is one of the most useful things for diagnosing “why didn’t my request go where I expected?”
In the dashboard, decision logs appear inline in the Logs view
filtered to dispatcher.decide. In the CLI:
journalctl -u hal0-api.service -g 'dispatcher.decide'Structured errors in the journal
Section titled “Structured errors in the journal”Every API error is logged with its structured envelope intact — so
when a user reports “I got slot.not_ready”, you can grep journald
for the exact request:
journalctl -u hal0-api.service -g 'slot.not_ready'The error code, message, and details block all come through as one
JSON line per error.
Coming soon — outline
Section titled “Coming soon — outline”- A queryable log API (
/api/logs?since=…&unit=…&grep=…) for programmatic log access. - Per-request trace IDs propagated end-to-end (API → dispatcher → slot → response).
- Optional OpenTelemetry export for sites that already have an observability stack.