September 2026
1.0.0-rc.5
CLIThe third, fourth and fifth 1.0 release candidates, released on 1, 15 and 17 September. rc.3 and rc.4 carried the features; rc.5 is a fix release and is the build to install. Download it from peridio.com/downloads or the GitHub release.
rc.5: the fixes
No new features. Most of these are regressions from rc.4, but not all: the i.MX
build failure is a regression in rc.3, and the stone_include_paths and
post_build bugs are older still. Upgrade from any earlier release candidate,
not only from rc.4.
- i.MX builds work again.
avocado builddeleted the BSP's ownimx-bootimages while clearing a previous re-keyed bootloader, so everyimx8mp-evkandimx93-evkbuild failed instone validatewith two files not found, and a reinstall did not recover it. A re-keyed bootloader now lives in its ownrekeyed/directory that the build owns. Regression in rc.3. avocado install --dnf-argno longer leaves a project unbuildable. An extension installed with--dnf-arg(or undersdk.disable_weak_dependencies) lost its install stamp, so everyext buildfailed with "dependencies not satisfied" and the advertised fix deleted the stamp again. Regression in rc.4.avocado ext buildno longer fails withFailed to walkand an empty path on the defaultavocado.yamlwhen an extension uses a glob inpackage_files. Regression in rc.4.- A package-sourced extension that declares a compile script builds again,
which is how every
ext-*repository ships. Regression in rc.4. kernel.cmdlineandkernel.cmdline_extrareach the build hook again. rc.4 shipped the field inert on targets that bake the command line into a UKI at build time (RB3 Gen 2, Rubik Pi 3). The value is now resolved per target, so atarget-<name>:override is honored, setting both keys is an error rather than two exports the hook had to reconcile, and editing the command line alone rebuilds the runtime. See Kernel configuration.ext buildrebuilds an extension whose content comes from apost_buildhook instead of reporting it up to date and shipping the previous build. An extension that declarespackage_filesfor a local compile source is still skipped when those files are unchanged.avocado installruns the SDK phase in parallel without--force. One rule for the install DAG, the build DAG and the SDK phase:AVOCADO_PARALLEL_TASKS, elsemin(cpus, 4), and1under--runs-on.-fonsdk installandruntime installis hidden; it still parses.runtimes.<name>.stone_include_pathsaccepts more than one path. A second path used to vanish silently.- Security.
cryptoki0.12.1 for RUSTSEC-2026-0286, and the extension source symlink guard is armed on the default config path.
rc.4: package feeds, kernel command line, HITL, stamps
Package feeds
- Named feeds:
repos:anddistro.feeds. A project can pull from any mix of the public feed, a mirror, a third-party RPM repository and a directory of RPMs on disk.repos:defines feeds;distro.feedsorders and enables them, and position is the dnf priority.stages:scopes a feed tosdk,rootfs,runtime,extorinitramfs; credentials come from{{ env.X }}references and are refused inside a URL. The resolved feed set is written to.avocado/feeds/<target>.jsonand folded into the build stamps. - Private organization feeds:
org:.repos: { acme: { org: acme } }exchanges your Connect credential for a short-lived feed token once per invocation; the token is never a build input. Not logged in points atavocado login. avocado login, a top-level shortcut foravocado connect auth login. Logging in raises the feed rate limit and unlocks private feeds.- The lock records the feed set per target, and each package's origin.
Configuration
kernel.cmdlineandkernel.cmdline_extra.cmdlinereplaces the board's kernel command line outright;cmdline_extraappends to it. Both resolve per runtime with a top-level fallback and reach the build and provision hooks asAVOCADO_KERNEL_CMDLINE/AVOCADO_KERNEL_CMDLINE_EXTRA, soisolcpusorearlyconno longer need a Yocto rebuild. Complete in rc.5 (see above); on rc.4 the build hook did not see it.
Hardware-in-the-loop
avocado hitlis a managed NFS server:start,status,stop,logs,sync.startruns a detached, named container and fails loudly when an export did not load;statuslists every server on the machine;syncre-runs the extension lifecycle on a device after a rebuild. The old foreground behaviour remains ashitl server. See Hardware-in-the-loop.
Build, install and provision
- Breaking:
avocado buildno longer produces the var image;avocado provisiondoes. The split is by consumer: everything an OTA requires is at the tail ofruntime build, everything only provisioning consumes is at the start ofprovision. A pipeline that runsavocado buildand then flashes will find no var image; runavocado provision. - Installs never prompt, and
--forceno longer means "don't prompt".avocado install,ext install,runtime installandsdk installpass-yunconditionally;avocado install --forcenow means reinstall every extension from scratch.--output jsonno longer implies--force. - Steps skip when nothing they read has changed.
avocado installskips extensions that are already up to date,runtime buildreuses the rootfs and initramfs images,ext buildandext imageskip on unchanged inputs, and stamps hash the files a build reads rather than the paths that name them. A secondinstallwith nothing changed is a no-op instead of ~26 s of redundant transactions. - One session container per invocation. Build steps exec into a reused per-shape container instead of starting a fresh one each time, and Ctrl-C removes the containers the CLI started.
avocado sbomemits asoftware_Sbomper runtime and per extension, not only one for the whole device, so Connect can ingest something narrower than "everything on the device".- Fixes.
avocado buildbuilds thedepends_onclosure, not just the authored list; a kernel version change invalidates every extension's install stamp;--no-stampsremoves the step's own stamp; stamp errors name the target, docker volume and daemon they searched. - Security.
rustls0.23.45 for RUSTSEC-2026-0285.
rc.3: encrypted /var recovery, FIT signing, runtime scope
runtimes.<name>.var.recoveryandavocado var-key: an operator-held recovery key for the encrypted/var.var.recoverynames an HMAC-SHA256 master secret in the key registry that is stored host-only, outside the directory the SDK bind-mounts into build containers.avocado var-key enroll <runtime> --device user@hostderives a unit's passphrase from its SoC UID and adds it as a LUKS2 keyslot;avocado var-key derivereproduces it on a bench to recover a unit whose hardware keyslot is gone.runtimes.<name>.var.hardware:auto(default),caam,tpm2ornone. An explicit engine must hold a keyslot or the initrd refuses to boot/varon the derived key;nonerequiresvar.recovery.runtimes.<name>.signing.fit_key: boot-FIT signing from the key registry. Names an RSA key the runtime build materializes formkimage, so a signed boot image is reproducible fromavocado.yamlalone;signing.fit_unsigned: trueis the explicit opt-out. Replaces the interimAVOCADO_FIT_KEY_DIR/AVOCADO_FIT_UNSIGNEDenvironment variables, which are no longer read. Withfit_keyset the build also re-packs the feed's bootloader so U-Boot enforces that key from the first flash.runtimes.<name>.targets: a runtime's target scope, declared as a list.default_targetis never consulted for scope.var.encryptis scoped by this declaration, so a multi-target project can encrypt on every target it names, and an opt-in outside the declared scope is a loud refusal rather than a plaintext/var.avocado installfollows the feed afteravocado update. With no pins recorded the install runs adnf distro-sync, for the SDK and runtime sysroots as well as rootfs and initramfs, so a rebuilt BSP (avocado-sdk-target,avocado-img-bootfiles) actually reaches the project. With pins present the lock stays authoritative.- Fixes.
avocado installexits non-zero when a sysroot install could not finish instead of writing a current stamp; the platform build hook runs again beforestone bundle(Tegra needs it forboot.img); the initramfs build id is actually written into the shipped image;avocado deploy --verboseno longer fails to parse the hash collection;deployaccepts a runtime with rootfs verity;sdk installworks afterruntime clean;provision --listresolves its target like every other command.
The full record of each release is in the CHANGELOG.