build
Type
External
Status
Published
Created
Jun 13, 2026
Updated
Jun 13, 2026
Source
View

Build reference#

Requirements#

ToolWhyInstall
podman (rootful + rootless)BST container + export/bootPre-installed on Bluefin
justAll build/test commandsPre-installed on Bluefin
qemuVM bootbrew install qemu
virtiofsdjust boot-fast onlyrpm-ostree install virtiofsd then reboot
bcvkEphemeral VM from containerAuto-installed by just boot-fast via cargo
~100 GB disk, ~16 GB RAMBST cache + parallel builds

Repo layout#

PathPurpose
elements/freedesktop-sdk.bstfdsdk junction — pinned to a release tag
elements/gnome-build-meta.bstGBM junction — tracks gnome-50 branch
elements/bluefin/Bluefin-specific elements (~40 elements)
elements/oci/OCI image assembly — layers + final image
patches/freedesktop-sdk/Patches applied to fdsdk via patch_queue
patches/gnome-build-meta/Patches applied to GBM via patch_queue
patches/linux/Kernel patches (via fdsdk linux element)
files/Static files installed by elements
docs/skills/Agent skills — task-focused, lazy-loaded
JustfileAll local dev commands — run just --list first

Dev loop#

just validate # graph check — always run first (~5 min, no build)

export BUILD_SKIP_NVIDIA=1
just build default # build image — warm cache: 2–5 min; cold: 60–90 min

just lint # bootc container lint — must pass before PR

just boot-test # automated smoke test — exits 0 on success
just boot-fast # interactive ephemeral VM via virtiofs (requires virtiofsd)

just show-me-the-future # full loop: build → export → disk image → QEMU VM

First run is slow (cold BST cache). Subsequent runs are fast — BST caches by content hash.

Useful BST commands#

just validate # check element graph
just bst build bluefin/tailscale.bst # build one element
just bst shell --build bluefin/tailscale.bst # sandbox shell
just bst show --deps all oci/bluefin.bst # full dependency graph

What NOT to do#

Don'tWhy
rpm-ostree, pip install, apt-get in elementsBST-only build; all deps from junctions
$(date), $(hostname), $(curl ...) in install-commandsBreaks reproducibility and BST caching
Patch junction files directlyUse patch_queue source in the junction .bst
Force-push to mainThe merge queue owns merges
Close issues via API or commentUse Closes #NNN in the PR body
Open a PR without running just validateWastes everyone's time