hal0 1.6.5 is out
hal0 1.6.5 shipped on 24 October 2026. It’s a release on the 1.6 line. Most of it is about the NPU: FastFlowLM moves to 1.0.10, and FLM model pulls now use the FastFlowLM inside its runner image. It also closes several ways the hal0 service account could gain root, removes four CLI spellings that had a second name, and fixes a long list of bugs. There’s no config migration in this release.
Release: Release hal0 v1.6.5 · Hal0ai/hal0 · GitHub
Full changelog: CHANGELOG.md
Highlights
FastFlowLM 1.0.10, run from its runner image
On NPU hosts the installer now installs FastFlowLM 1.0.10, up from 0.9.44. More importantly, flm pull and the NPU model list now use the FastFlowLM inside the pinned flm runner image, not the copy installed on the host. A box that only ever ran hal0 update used to keep an old FastFlowLM that pulled old weights and missed newer models. Now pulls match the version your NPU slot actually serves.
The NPU fixes that came with it:
- Loading an NPU slot with a different model no longer downloads some other model and sits in
warming. - The NPU model pickers list every installed FLM chat model once, with its
flmchip. There are no more duplicates in two naming styles, and gemma4-it is back in the chat list. - The NPU slot drawer and the NPU occupancy cards now use the same model picker as the slot cards.
- GPU and CPU slots no longer offer FLM models they can’t load. The API refuses that combination too, instead of letting the slot crash-loop.
- Streamed NPU chat keeps exact token counts and speed figures.
Tighter privilege boundaries around the hal0 account
This release closes several ways the hal0 service account could escalate to root:
- The root helper scripts no longer load Python from whatever directory they were called from.
- Root writes under
/var/lib/hal0and/etc/hal0no longer follow a directory that was swapped for a symlink. - A dashboard Repair no longer hands the Hermes installer every secret hal0-api holds.
Settings → Secrets now refuses environment variables that could run code inside hal0-api or redirect or weaken its outbound connections. That covers OpenSSL, proxy, XDG and Hugging Face endpoint variables, among others. A custom CA bundle is still accepted, but only as a root-owned file. A new hal0 doctor all row lists any such entry that is already in /etc/hal0/api.env, by name only.
One name per command
Four commands and flags that had a second spelling now have exactly one. The old spellings are gone, with no aliases; see Before you update for the replacements. Pinning Hermes to a specific commit also changed: the pin now lasts until you clear it, the same way the Open WebUI override already worked. hal0 update status shows it on every run, so a forgotten pin stays visible.
The Hermes gateway move holds up in messy states
hal0 1.6.0 moves the Hermes gateway off upstream’s hermes-gateway-<hash>.service unit onto a plain hermes-gateway.service. That move now copes when it is interrupted or fails partway, and when you have masked the unit to keep the gateway off. You always end up with exactly one gateway, and if hal0 leaves it off, the command it tells you to run actually works.
Every dashboard tab in the sidebar
The sidebar now has a link for every tab on every page: Slots → Inference and Image Gen, Models → Upstream Models and Profiles, Benchmarks → Runs and Evals, and so on. Each tab has its own address (such as #slots/image or #benchmarks/evals), so you can bookmark it or send someone a link.
Also fixed
- Editing or switching your persona now reaches the running Hermes straight away. New sessions use the new prompt; a chat that’s already open keeps the old one.
- A second text-to-speech slot (one not named
tts) now answers/v1/audio/speechinstead of returning 404. - Benchmark cells no longer all fail on current runner images. A long bench session no longer leaves slots like
brainandflmstopped while reporting success. - On hosts whose GPU is forced to its highest performance level, the dashboard now labels the flat 100% GPU reading as “pinned” instead of showing it as real load.
- The Hermes card no longer says “memory is not available” on boxes with a large memory bank.
- The Pi card shows “unverified” for checks it can’t read, instead of “missing”.
- A CPU-only install whose model is slow to answer the installer’s final probe gets a warning instead of a false “Verify FAILED”.
hal0 model update --checknow notices when a later part of a split GGUF is replaced upstream.
Before you update
- Coming from 1.3.x? Run
hal0 update --target 1.5.0first, thenhal0 updateagain. Boxes on 1.4.x or later can update directly. - Update your scripts for the removed spellings:
hal0 agent upgrade hermes --to <sha>→hal0 update component hermes --target <sha>hal0 update owui→hal0 update component openwebuihal0 agent bootstrap hermes→hal0 agent reprovision hermeshal0 uninstall --keep-data→ drop the flag. It never did anything; keeping your data is already the default.hal0 uninstall --clean-slate→hal0 uninstall --purge
- A Hermes pin now sticks. If you pin Hermes with
--target, later updates keep that commit until you runhal0 update component hermes --clear-override. - Check
hal0 doctor allafter updating. Secrets entries you added before this release keep working until you remove them. Theapi-env-entriesrow tells you if any of them are the kind 1.6.5 now refuses. If you’re behind a corporate proxy, keep setting the proxy variables as root in/etc/hal0/api.env, as the docs describe. - On an NPU box, FLM pulls need the
flmrunner image. hal0 says so if it’s missing. To move the host’s own FastFlowLM to 1.0.10 as well, re-run the installer; FastFlowLM 1.0 needslibxrt22.25 or newer.
Update
hal0 update
hal0 doctor all
If something breaks, please open an issue using the bug template and include the hal0 doctor all output. Questions are welcome in Q&A.