docker-imagestarts dockerd at boot. Pulls in Alpine'sdocker-openrc
package (which ships/etc/init.d/dockerand the/etc/conf.d/dockerconfig
template upstream maintains) and adds the default-runlevel symlink at
packaging time, sodockerdis supervised on a fresh boot without manual
rc-update add.prefer_modulesonproject()pins a unit to a specific module. Set
prefer_modules = {"xz": "alpine"}inPROJECT.starand thexzunit
registers only frommodule-alpine, regardless of which module wins the
default last-module shadowing. Use it whenmodule-core's source-built
version of a package is broken or under-configured and the Alpine prebuilt is
the right answer; the shadow appears on the Diagnostics tab the same way an
ordinary cross-module shadow does.modprobeworks on the booted system. Image assembly now runsdepmod
inside the rootfs afterapk add, so/lib/modules/<ver>/carries a real
modules.depindex instead of just bare.kofiles. The kernel build still
skips depmod (the toolchain container has no copy of it); the rootfs's own
kmodsupplies it via chroot.- Kernel ships container-runtime CONFIG by default. A
container.cfg
fragment (overlayfs, bridge/veth, the full netfilter chain including
NFT_COMPATso iptables-nft works, IPv4 + IPv6 NAT, namespaces, seccomp,
cgroup BPF, eBPF) is merged into the kernel's defconfig during the linux
unit's build, sodockerdandcontainerdstart cleanly without per-image
kernel customisation. The cost on non-container images is a few hundred KB of
kernel modules that nothing references. - TUI flash remembers the last device. Picking and confirming a flash target
writesflash_device = "/dev/sdX"tolocal.star, and re-entering the flash
view positions the cursor on that device when it shows up in the candidate
list. Reflashing the same SD card or USB stick is nowf→ Enter →y. /etc/os-releasenow reports the project version.VERSION,
VERSION_ID, andPRETTY_NAMEcome fromversion = "..."inPROJECT.star,
so tools that read/etc/os-release(and humans on the device) can tell which
build is running. Templates can reach the value as{{.project_version}}.- Image rows in the TUI show the project version. The
image()class
defaults each image unit'sversiontoPROJECT_VERSION(from
PROJECT.star), so the VERSION column in the units table — which used to be
blank for image rows — now shows the version the resulting.imgrepresents. - OpenRC replaces the old rcS startup script. Services now boot under
Alpine's OpenRC service manager, so they get dependency ordering, supervised
start/stop, and proper status/restart commands (rc-service sshd restart,
rc-status) instead of the silent run-everything-in-/etc/init.d/S*pattern.
Units declareservices = ["sshd"](plain names, noS40prefix) and the
resulting apk drops the script in/etc/init.d/plus a runlevel symlink in
/etc/runlevels/default/. - Source-built libraries auto-declare what they ship. Each
.apkyoe builds
from a destdir now listsprovides = so:<soname>=<ver>-r<rel>for every
shared library in the package, matching Alpine's convention. Alpine prebuilt
packages whose upstream PKGINFO declaresdepend = so:libcrypto.so.3or
similar now resolve cleanly against yoe-source-builtopenssl,zlib, etc. —
no manual SONAME bookkeeping in the.starfile. module-alpinepackages now ship with their upstream metadata intact.
Prebuilt Alpine apks pass through yoe's pipeline verbatim — only the signature
is swapped for the project's key — soreplaces,provides,triggers, and
post-install hooks (busybox applet symlink creation, sshd privsep user adds,
…) reach the on-target system the way Alpine intended. Image assembly drops
--no-scriptsso those hooks actually run; this fixes the no-/sbin/init
kernel panic that hit when relying on Alpine's busybox.- Alpine packages no longer end up with doubled-
-rfilenames.alpine_pkg
splits upstream pkgver like1.2.5-r11into yoe's separate version + release
fields, so the published apk ismusl-1.2.5-r11.apkinstead of
musl-1.2.5-r11-r0.apk. Apk's solver finds the file at the URL it constructs
from the index, fixing "package mentioned in index not found" on every
module-alpine package. - noarch passthrough packages route correctly across the repo. apk-tools
constructs fetch URLs from PKGINFO'sarch =field (always
<base>/noarch/<file>for noarch packages), but its solver only reads one
arch's APKINDEX per repo. Three coordinated fixes:- Passthrough alpine_pkg units with
arch = noarchpublish under
<repo>/noarch/(where apk fetches them from). - Each per-arch
APKINDEXnow scans the siblingnoarch/tree at generation
time, so the solver sees noarch packages from any arch's perspective. - A noarch publish refreshes every per-arch
APKINDEX(since each one
references those noarch entries). - Cache validation also looks under
noarch/for the published apk, so noarch
units don't rebuild on every invocation.
- Passthrough alpine_pkg units with
- base-files ships an Alpine-style runlevel baseline. OpenRC services
cgroups,devfs,dmesg(sysinit),bootmisc,hostname,modules,
sysctl(boot), andmount-ro,killprocs(shutdown) are now wired into the
rootfs via/etc/runlevels/<level>/<svc>symlinks, so a fresh image boots
with the hostname set, kernel modules loaded, the cgroup hierarchy mounted (so
container runtimes don't trip on "Devices cgroup isn't mounted"), and shutdown
that unmounts cleanly. - TUI SIZE column for images shows installed content, not partition size. An
image whose machine reserves a 600 MB rootfs partition now reports the ~50 MB
actually populated byapk add, so you can see what your image contains
rather than how big the partition was sized. - New
docker-image. Builds a dev-image-style rootfs that also ships Docker
(engine, CLI, buildx, containerd, runc) so you can poke at the docker
userspace on a yoe-built system. Kernel and init still need the container
pieces beforedockerdcan actually launch a container — that's the next
step. - Files tab on the unit detail page. Tab into a sortable list of every file
the unit installs and its on-disk size — easy to spot the biggest payloads or
confirm a binary actually landed where you expected without leaving the TUI. - Drop into a shell on the source. Press
$in the units tab or detail page
to open a shell in the unit's checked-out source directory, or in the Modules
tab to open a shell in a module's clone — handy forgit status, spot-edits,
or running an out-of-tree command without leaving the TUI. VERSIONcolumn in the unit table. Each row now shows the unit's declared
version next to its module, sortable from theocycle, and the same version
appears next to the unit name on the detail page — so spotting a stale pin or
confirming what's about to build is a glance, not a file open.- TUI auto-follow no longer yanks the cursor mid-navigation. The units list
scrolls to whatever is actively building only when you're idle — pressing j/k
or typing a query keeps the cursor where you put it, whilebstill hands
control back to the build so you can watch what's compiling.
To update, run: yoe update
Or download the binary for your architecture and place it in your PATH.
Note: Yoe is in heavy development. We recommend cleaning your build directory and re-creating projects (yoe init) with each new release.