Declarative, stamp-based builder for the canonical product image on top of the
IR0 kernel: runit PID 1, BusyBox, login/auth, firstboot, recovery, and /etc
overlays.
Sibling kernel: IR0 — public UAPI
(headers_install), pack adapters, and QEMU/first-boot orchestration. See
Documentation/DISTRO_CONTRACT.md and
Documentation/PACKAGES.md.
| Layer | Repo | Role |
|---|---|---|
| Kernel | IR0 | mechanisms, drivers, UAPI, boot ISO |
| Distro | ISD (this tree) | packages, init, services, rootfs, disk.img |
ISD first boot wizard (generic account; password also authenticates doas).
After login: BusyBox vi on the MINIX rootfs — edit guest sources under QEMU (make run PROFILE=minimal from IR0).
BusyBox top: runit as PID 1 with supervised services (runsvdir/runsv) and an interactive shell — product process tree on QEMU.
Doom on the desktop profile: fbdev + evdev clients on the ISD rootfs under QEMU (make run PROFILE=desktop from IR0).
git clone https://github.com/IRodriguez13/IR0.git
cd IR0
make first-boot PROFILE=minimal # clones ../ISD, asks before sudo install
make run PROFILE=minimalLayout:
parent/
├── IR0/ # kernel + first-boot / run-isd
└── ISD/ # this repo — owns out/<arch>/images/<profile>/disk.img
make first-boot does not inject BusyBox/runit one-by-one. It builds the
ISD image for PROFILE and boots that disk. Legacy inject remains behind
IR0_LEGACY_USERSPACE=1 for smokes.
export IR0_ROOT=../IR0
make isd-defconfig # writes .isdconfig if missing
make fetch
make headers # or: IR0_UAPI_TARBALL=/path/ir0-uapi.tar
make build ARCH=x86_64 PROFILE=minimal
make rootfs-tree PROFILE=minimal
make image-minix PROFILE=minimal # → out/x86_64/images/minimal/disk.imgExtras (interactive — packages + BusyBox applets such as top):
make isdconfig PROFILE=minimal
# or non-interactive:
# python3 scripts/isdconfig.py set CONFIG_PKG_NANO=y
# python3 scripts/isdconfig.py set CONFIG_APPLET_TOP=y
make isd-image PROFILE=minimal # apply after changing .isdconfigprofiles/*/packages.txt is lean (busybox+runit). Defconfig enables nano, ncurses, opendoas, and applet top by default.
| Profile | Role |
|---|---|
minimal |
Default — first-boot user registration + doas + nano |
development |
Lab only (root autologin / fixtures) |
desktop |
desktop policy + nano/ncurses |
appliance |
Services only (busybox + runit) |
Per-profile outputs:
out/<arch>/rootfs/<profile>/
out/<arch>/images/<profile>/disk.img
out/<arch>/stamps/{toolchain,uapi,packages,services,rootfs,images}/
Package stamps depend on the toolchain only (not UAPI). Services need UAPI.
See Documentation/PACKAGES.md.
packages/ upstream recipes + setuid.allowlist
profiles/ profile.conf (policy), packages.txt (truth), overlay/
rootfs/base/ canonical /etc (no personal accounts)
scripts/ resolve-packages, isdconfig, stamp-run, stage-rootfs, …
services/ runit stages, console, firstboot, …
out/<arch>/ product/ stamps/ rootfs/<profile>/ images/<profile>/
Documentation/ distro contract and guides
./tests/contracts/run.sh
make toolchain-check ARCH=x86_64
make profiles-check
make personal-data-check
make rootfs-check PROFILE=minimal
make release-check PROFILE=minimal ARCH=x86_64


