- Class task merge semantics — units passing
tasks=[...]to a class
(autotools,cmake,go_binary) no longer fully replace the class's
default task list. Instead, overrides are merged by name: a same-named task
replaces in place (preserving position and using the override'ssteps
fully), a new-named task is appended, andtask("name", remove=True)drops a
base task. This lets units add a new task (e.g.,init-script) without
restating the class-generatedbuildtask. The merge is implemented in a new
classes/tasks.starhelper (merge_tasks(base, overrides)) shared by the
three classes. Thesimpleiotunit dropped its duplicatedbuildtask as a
result; existing units that overridebuildare unaffected (replace-in-place
yields the same result as the previous full-replacement semantics). - Fix install_template/install_file path resolution for helper functions —
template paths now resolve relative to the.starfile containing the
install_template()/install_file()call, not to the file that ultimately
callsunit(). Previously, a helper like
base_files(name = "base-files-dev")inunits/base/base-files.starinvoked
fromimages/dev-image.starlooked for templates under
images/base-files-dev/instead ofunits/base/base-files/, breaking the
dev-imagebuild. The base directory is now captured at install-step
construction time from the Starlark caller frame; existing units that define
and use install steps in the same.starfile are unaffected. - File templates — units can declare external template files (
.tmpl) and
static files in a directory alongside the.starfile and install them via
newinstall_template()andinstall_file()step-value constructors placed
directly intask(..., steps=[...])alongside shell strings. Templates render
through Gotext/templatewith a unifiedmap[string]anycontext
auto-populated with
name/version/release/arch/machine/console/projectand any extra
kwargs passed tounit(). The context map and the contents of the unit's
files directory are hashed so template edits and extra-kwarg changes
invalidate the cache. Install steps run on the host (not inside the sandbox),
so$DESTDIR/$SRCDIR/$SYSROOTin install paths expand to host paths
rather than the container bind-mount paths.base-files,network-config,
andsimpleiotmigrated off inline heredocs. Seedocs/file-templates.md. - CLI flag parsing with flag.NewFlagSet — refactored all subcommands
(build,run,flash,init,clean,log,refs,graph) from manual
switch-based parsing to Go'sflag.NewFlagSet. Adds free--helpfor every
subcommand, consistent-flag/--flagsupport, and repeatable flags (e.g.,
--port). Net reduction of ~70 lines. - Go module cache — Go units now persist module and build caches across
builds viacache_dirs = {"/go/cache": "go"}. The executor mountscache/go/
from the project directory into the container, andGOMODCACHEandGOCACHE
point to it. Subsequent builds skip module downloads. - Fix service enablement for S-prefixed init scripts — services declared
with anS<NN>prefix (likeS10network) no longer get a symlink created on
top of the actual script, which was causing a symlink loop and breaking
networking at boot. - Unit environment field — units can declare
environment = {"KEY": "VAL"}
which the executor merges into the build environment for all tasks. The Go
class uses this forGOMODCACHE/GOCACHEso custom tasks (like simpleiot)
get the cache env vars automatically. - QEMU port forwarding in machine config —
qemu_config()now accepts a
portsfield (e.g.,ports = ["2222:22", "8118:8118"]) for default port
forwarding. CLI--portflags extend these. Fixed a bug where multiple ports
created duplicate QEMU netdevs. Fixed hostfwd syntax to use QEMU's
host-:guestformat. QEMU machines default to SSH (2222:22), HTTP (8080:80),
and SimpleIoT (8118:8118). - Service enablement moved to units — units now declare
services = ["sshd"]to indicate which init scripts they provide. The image
assembly auto-enables services by readingservicemetadata from installed
APKs and creatingS50<name>symlinks (or custom priority likeS10network).
Theservicesparameter onimage()is removed. - Design specs — added
docs/starlark-packaging-images.md(move packaging
and image assembly to composable Starlark tasks) anddocs/file-templates.md
(external template files using Gotext/template, replacing inline heredocs
in units). - Go class uses golang container —
go_binary()now defaults to the
golang:1.24external container image instead oftoolchain-musl.
Cross-compilation is handled viaGOARCH/GOOSenvironment variables with
CGO_ENABLED=0for static binaries, so the container always runs at host
architecture (no QEMU overhead). - Per-unit sandbox and shell selection — units now have
sandbox(bool,
default false) andshell(string, default "sh") fields. The autotools,
cmake, and image classes setsandbox=True, shell="bash"for bwrap isolation.
External containers (likegolang:1.24) use the defaults — no bwrap, POSIX sh
— since they don't ship bwrap or bash. - simpleiot unit — new
go_binaryunit for SimpleIoT v0.18.5, an IoT
application for sensor data, telemetry, and device management. - ca-certificates unit — Mozilla CA bundle for TLS verification. Added to
dev-image alongside simpleiot. - Per-task container resolution — tasks can override the unit-level
container viatask(container = "..."). The executor resolves the container
per-task, falling back to the unit default. - TUI: amber
[yoe]title — the top-left title in the TUI now renders
[yoe]in amber on black, matching the project logo. - Fix module URLs in
initgenerated project file.
To update, run: yoe update
Or download the binary for your architecture and place it in your PATH.
Note: Yoe-NG is in heavy development. We recommend cleaning your build directory and re-creating projects (yoe init) with each new release.