Releases#
The first release goes out when every item on the release checklist is done; it is not published yet.
1bit engine is pinned upstream: every backend it builds is a submodule at a fixed commit
(third_party/), and the bump-* workflows open a PR whenever an upstream moves. The engine
runs inside Lemonade, which releases on Fridays. The release run (scripts/weekly.sh) rebuilds
everything from scratch at the current pins, so each release carries that week's upstreams.
Releases are tagged v<ISO year>.<ISO week> (v2026.40), like Lemonade's 2026.39.1; a second
release in the same week gets .1.
What a release carries#
| file | what |
|---|---|
lemonade-onebit-<tag>-linux-x86_64.tar.zst |
Lemonade (lemond, lemonade, its web app) from our fork with the onebit recipe, and the engine in 1bit/: 1bit and every backend: HRX (and the CPU, from the same llama-server), ONNX (ryzenai-server), DwarfStar, and the NPU engine's runtime (the NPU route is in progress, below). No Vulkan or ROCm llama.cpp since RFC #213 stage 3 |
1bit-os-<tag>.img.zst, 1bit-os-<tag>.efi |
1bit OS, a Lemonade appliance with the engine as a bootable USB image (os/README.md) |
changes.json, SHA256SUMS |
what moved upstream since the last release, as data; checksums |
The engine is embedded in Lemonade, so it ships only inside those two: there is no standalone engine tarball and no Windows package (Lemonade has its own Windows build). On the GPU the engine is pure HRX with HIP kernels: no Vulkan, ROCm backend, Metal, ZINC or CUDA. Lemonade serves those with its own backends.
The engine in 1bit/ keeps the build tree's layout (scripts/package-linux.sh): 1bit finds each
backend at the same path relative to itself as in the build (app/built_path.h), and every program
finds its libraries beside itself. Unpack the package anywhere and start Lemonade through
lemond-onebit, which points Lemonade's onebit backend at the packaged 1bit
(LEMONADE_ONEBIT_BIN):
tar --zstd -xf lemonade-onebit-v2026.40-linux-x86_64.tar.zst
lemonade-onebit-v2026.40/lemond-onebit # lemond with the onebit recipe on the packaged engine
The builds target Strix Halo: the llama.cpp backends are built with GGML_NATIVE on its Zen 5. HRX needs TheRock in
/opt/rocm-therock; the NPU needs the amdxdna kernel driver. The closed NPU add-ons
(NPU engine) are never in a release.
The NPU engine#
The release is the HRX runtime with our HIP kernels and the NPU engine, all inside Lemonade. The
release carries the NPU runtime, compiled into 1bit, and the onebit recipe's npu backend.
The NPU kernels are closed too: they ship as compiled, encrypted artifacts (config/npu-kernels.config,
ONEBIT_NPU_PRIVATE) that 1bit verifies and decrypts in memory at load, failing cleanly on a
wrong key with no network callback of any kind; a lifted kernel file is ciphertext and does not run
(NPU engine). The release package carries them, and serves dense Qwen3 (0.6B, 1.7B, 4B)
on the NPU.
scripts/weekly.sh packs them by default (WEEKLY_NPU_KERNELS=0 builds without): the sealed
kernel sets go beside 1bit in npu/kernels, the build loads sealed kernels only
(ONEBIT_NPU_RELEASE), the lemond-onebit launcher sets ONEBIT_KCRYPT_REQUIRE_SEALED=1, and the package checks refuse a plaintext kernel,
an ELF for anything but the host, a symbol table in 1bit, or a private source name in it. The
release machine holds the kernel key in ONEBIT_NPU_KEY_DIR (default ~/.config/1bit-npu-key).
Private components#
Two components of the release binaries are proprietary and compiled in; their source is not in
this repository or in any release. They ship under the 1bit Binary License:
anyone may use them for any purpose, including commercial use, and pass on exact unmodified
copies with the license and notices; modifying them, reverse engineering them (except where the law
expressly allows it) and removing notices are not allowed. The third-party code inside them is listed
with its licenses in NOTICE-BINARY. Every release package and the 1bit OS image
carry both files beside the engine's LICENSE and NOTICE:
| Component | Compiled into | Pin | Build option |
|---|---|---|---|
| The 1bit NPU runtime (NPU engine) | 1bit (static) |
config/npu-runtime.config |
ONEBIT_NPU_RT_DIR (or a prebuilt ONEBIT_NPU_RT_LIB) |
| The private HIP kernels for HRX (HRX, "Private HIP kernels") | hrx/llama/bin/libggml-hrx.so (code objects) |
config/gpu-kernels.config |
ONEBIT_GPU_PRIVATE |
The build stage fetches each with scripts/fetch-private.sh <pin> <dir>: the pinned path at the
pinned commit only, with the release machine's gh login (read access to the private
repositories). The run stops if either cannot be fetched or is not at its pinned sha. Move a pin
by hand, after the NPU check or the HRX checks on Strix Halo.
The public binary drop#
A source build outside the org has no private HIP kernels and no private NPU runtime, so it cannot
compile those parts itself. scripts/make-binary-drop.sh <engine checkout> <out dir> packs them
already compiled, for one engine pin, as binary-drop-<version>.tar.zst + SHA256SUMS:
binary-drop-<version>/
hrx/llama/bin/ llama-server, llama-bench and the libraries beside them, libggml-hrx.so
with the private HIP kernels compiled in
npu/libnpu_rt_api.a the NPU runtime behind the engine's public npu/npu_rt_api.h
npu/include/ npu_rt_api.h (the engine's own public header)
LICENSE-BINARY NOTICE-BINARY LICENSE NOTICE
MANIFEST the pins below, the build host, the compilers, sha256 of every file
It takes the HRX tree from a release build (--build <dir>, packed the way package-linux.sh
packs it: the same scripts/pack-elf.sh steps copy the libraries it loads beside it, set RUNPATH
to $ORIGIN and strip it) or from an already packed release (--from-package <tar.zst>), and the NPU library either prebuilt (--npu-lib) or built from the
pinned private sources (--npu-rt <dir>, its build-api-lib.sh). It then runs the same class of
checks the release package runs: the NPU runtime compiled in, the kernels really are compiled in, no source files,
nothing named like the private sources, both binary licenses present, every library found. It publishes nothing; the
orchestrator publishes the tarball and adds its line to config/binary-drop.config.
To build against a drop, point CMake at it — a directory or the tarball's URL:
cmake -B build -DONEBIT_HRX=ON -DONEBIT_NPU=ON -DONEBIT_BINARY_DROP=/path/to/binary-drop-<version>
# or -DONEBIT_BINARY_DROP=https://…/binary-drop-<version>.tar.zst
A URL is only accepted when config/binary-drop.config pins its sha256 for the engine commit being
built (drop=<engine sha> <version> <sha256>); file(DOWNLOAD) refuses a body that does not match.
A directory is verified against its MANIFEST — every file's sha256, and the engine commit it was
built from — and a mismatch, or a drop built for another commit, stops the configure. With a drop in
place, ONEBIT_GPU_PRIVATE and ONEBIT_NPU_RT_DIR are not needed and not used: the build links
hrx/llama/bin/llama-server and npu/libnpu_rt_api.a from the drop, and does not build llama.cpp,
so the llama.cpp and hrx-system submodules are not required either. HRX still needs TheRock's
HSA runtime on the machine that runs it.
The NPU engine's runtime is compiled into 1bit; no packed program needs a separate NPU runtime
library. scripts/package-linux.sh strips every packed program and library (strip
--strip-unneeded) and makes each find its libraries beside itself ($ORIGIN, scripts/pack-elf.sh),
with LLVM's OpenMP runtime (libomp.so, which the HRX llama.cpp libraries link when TheRock's
amdclang builds them; credited in NOTICE-BINARY) packed in hrx/llama/bin. After packing the engine tarball the package stage checks
(logs/package-checks.log; a failure stops the release):
- Self-contained NPU runtime: for the build's
1bitand every program and library in the tarball, no separate NPU runtime library is needed or packed. - Kernels in: the packed
libggml-hrx.soexports the add-on'sggml_hrx_hip_addon_register. - No source: no source file (
.hip,.c,.cc,.cpp,.cxx,.h,.hpp,.inc,.cu,.py,.cmake) and no file named like one of the private checkouts' files. - Licensed:
LICENSE,NOTICE,LICENSE-BINARYandNOTICE-BINARYare in the tarball. - Libraries found:
ldd(withROCR_VISIBLE_DEVICES=-1) finds every library each packed program and library needs, except the TheRock runtime the package documents (HIP, hipBLAS(Lt), rocBLAS, HSA, which DwarfStar links). - Links inside: every symlink in the engine tarball and in the Lemonade + onebit tarball is
relative and resolves inside the package (
pack_outside_links); thelibggml*.so->.so.0links stay links. Lemonade's build links its web app's KaTeX fonts to the build machine's/usr/share/fonts/truetype/katex; the package stage andos/mini/mkimage.shcopy every link that points out of the tree as a file (pack_localize_links,scripts/pack-elf.sh). - Web app: the Lemonade + onebit tarball carries Lemonade's web app
(
bin/resources/web-app/index.html), the UIlemondserves at/, as 1bit OS does.
SHA256SUMS is written again by the release stage, after changes.json, so it covers every file.
To exercise only the private builds and the packaging without releasing, on Strix Halo:
WEEKLY_DRY_RUN=1 WEEKLY_TAG=rehearsal-private scripts/weekly.sh ~/.cache/1bit-weekly build package
The release run#
scripts/weekly.sh <workdir> on Strix Halo, in stages:
- bumps: each open
bump-*PR is merged ontomainlocally, built with every backend, and tested:ctest(with theserveend-to-end tests on Qwen3-0.6B) plus the check that bump needs, below. A PR that passes is brought up to date, waits for CI, and is merged. One that fails stays open, and the release lists it as held back. - build and test:
mainat the merged pins, the same way. - package: the two packages above.
scripts/package-linux.shpacks the engine first; its tarball goes into the Lemonade + onebit package as1bit/, not into the release on its own. - release:
tools/weekly_changes.pylists, for every pin that moved since the last release, the upstream commits (authors, PRs) and releases in between; that becomes the release notes andchanges.json, andgh release createpublishes it all.
WEEKLY_DRY_RUN=1 merges and publishes nothing; stages can be run one at a time
(scripts/weekly.sh ~/.cache/1bit-weekly build test).
Before the first stage runs, weekly.sh checks what the machine must have (the 2026-10-19
rehearsal found these only after the build) and stops with a message naming what is missing:
- bumps, build: TheRock in
/opt/rocm-therock, or-DONEBIT_HRX_TOOLCHAIN=<dir>inWEEKLY_CMAKE_ARGS;hipccfor DwarfStar, in TheRock or/opt/rocm, orROCM_PATH. - package:
patchelf(scripts/package-linux.sh);nodeandnpmfor Lemonade's web app (LEMONADE_WEB_APP=1 scripts/build-lemonade.sh; itsnpm cineeds the network); a readable kernel image for 1bit OS,/boot/vmlinuz-$(uname -r)orVMLINUZ=<copy>(Ubuntu's/boot/vmlinuz-*is root-only). The image's licences step copies from the submodules of the run's own checkout (<workdir>/src, checked out by the build stage), so runos/mini/mkimage.shfrom there, not from a plain worktree without submodules.
Bumps#
| PR | check beyond build + ctest |
|---|---|
bump-lemonade/* |
Lemonade's LLM suite through the onebit recipe on HRX (Lemonade) |
bump-laya/* |
tests/laya_route_e2e.sh on the pinned checkpoint |
bump-ds4/* |
DwarfStar's routed-MoE test (DS4_TEST=1 scripts/build-ds4.sh) |
bump-hrx/* |
every hrx row of registry/check_models.tsv through tools/registry_check.py (serve end to end per architecture, ZAYA1 and the Qwen MoE models included); any FAIL holds the bump |
bump-xdna/*, bump-tokenizers/* |
covered by build + ctest (serve end to end on each device); the xdna-driver pin is the amdxdna kernel driver, which the release does not build: check it on Strix Halo with the module loaded (NPU engine, "The XDNA driver") |
Before the build, every bump also checks that each pin it moves is on the branch .gitmodules
names for that submodule (GitHub's compare API: the branch equals or contains the pin). A pin off
its branch is held: the shallow clones follow the branch and cannot fetch it, and GitHub may drop
an unreferenced commit.
The announcement#
After the release, the 1bit engine Discord gets a new post in #announcements, written from
changes.json in the layout of Lemonade's release posts: what the week brings, the notable upstream
changes with credit to their authors, the rest as a list, and the downloads (the two packages
above). Then two lists written
straight from the data: New models (repos published under our Hugging Face org, models added to
Lemonade's catalog, architectures the registry gained or that gained a backend) and Updates (every
upstream as pinned in the release, with its latest release and changelog). Each release gets its own post, and earlier ones stay.