Bluefin Image Contents#
Bluefin ships across three distinct images, each with a different mechanism for defining what goes into it:
| Image | Build system | Package manifest |
|---|---|---|
| Bluefin (production) | Containerfile + dnf install | RPM lists in Containerfile layers |
| Bluefin LTS | Containerfile + dnf install | RPM lists in Containerfile layers |
| Dakota | BuildStream 2 (from source) | .bst element files in elements/bluefin/ |
Production Bluefin builds as a Containerfile overlay: it starts from a base image and installs RPMs. Common branding, udev rules, wallpapers, and shared system files are assembled in the projectbluefin/common repo and imported into the image . The ~80 base RPMs plus ~60 DX-variant packages are all managed via dnf in these Containerfiles.
Dakota takes the opposite approach — no RPMs, no dnf, no Containerfile package installs. Its Containerfile is a lint helper only . All image content is declared as BuildStream .bst elements.
The authoritative package manifest for Dakota is elements/bluefin/deps.bst — a kind: stack element that wires every Dakota-specific component into the dependency graph.
Naming note: The
elements/bluefin/path is historical. These are Dakota's BST paths — not a signal that thednf/RPM workflow applies.
Dakota Package Manifest (deps.bst)#
elements/bluefin/deps.bst is kind: stack — it produces zero filesystem output; it exists solely to aggregate dependencies into the build graph.
Bluefin-Specific Elements#
| Element | What it provides |
|---|---|
bluefin/brew.bst | Homebrew (Linux), system-installed for CLI tooling |
bluefin/tailscale.bst | Tailscale VPN, pre-built binary v1.98.3 |
bluefin/uupd.bst | Auto-updater daemon v1.4.0, daily 4AM systemd timer |
bluefin/ghostty.bst | Ghostty terminal emulator v1.3.1 (Zig) |
bluefin/gum.bst | Charm Gum — interactive shell scripts |
bluefin/tealdeer.bst | tldr pages client |
bluefin/umotd.bst | Bluefin MOTD |
bluefin/uutils-coreutils.bst | Rust coreutils v0.9.0 (memory-safe; excludes cp/mv/rm) |
bluefin/sudo-rs.bst | Rust sudo v0.2.14 (memory-safe) |
bluefin/distrobox.bst | Distrobox v1.8.2.5 (Go rewrite, next branch) |
bluefin/incus.bst | Incus system container & VM manager v7.2.0 |
bluefin/common.bst | Branding, GNOME settings, ujust completions, dconf profiles |
bluefin/gnome-shell-extensions.bst | Curated GNOME Shell extensions |
bluefin/network.bst | Network configuration |
bluefin/wallpapers.bst | Bluefin wallpaper set |
bluefin/wallpaper-month.bst | Monthly wallpaper rotation |
bluefin/firstboot-services.bst | First-boot setup services |
bluefin/bootc-install-config.bst | bootc installation configuration |
bluefin/gnome-ponytail-daemon.bst | GNOME Ponytail daemon |
bluefin/efibootmgr.bst | EFI boot manager |
bluefin/xdg-terminal-exec.bst | XDG terminal executor |
bluefin/nautilus-python.bst | Nautilus Python bindings |
From Upstream Junctions#
Dakota pulls additional components directly from its upstream junctions:
| Source | Components |
|---|---|
gnome-build-meta | fwupd, bpftop, sysprof-app, just, wl-clipboard, snapd, plus the full GNOME OS base |
freedesktop-sdk | podman, skopeo, git, git-lfs, buildstream2, containers-common, debuginfod, flatpak-builder, bpf, vmlinuxh |
Notable Dakota-Specific Components#
The components below are unique to Dakota or built differently than their production Bluefin equivalents:
Memory-safe Rust replacements — Dakota's defining characteristic. sudo-rs (sudo-rs.bst) installs sudo with setuid bit (4755) and a sudoedit symlink. uutils-coreutils (uutils-coreutils.bst) replaces most GNU coreutils with Rust equivalents; cp, mv, and rm are intentionally excluded due to unresolved TOCTOU issues.
Ghostty terminal — built from source via Zig (ghostty.bst), with GTK4/Wayland dependencies vendored inline.
Incus — system container and VM manager v7.2.0 (incus.bst), built from upstream release tarballs with vendored Go deps. Pulls in cowsql/raft/libuv, liblxc, and lxcfs. QEMU/dnsmasq/nftables come from junctions.
uupd — the Universal Blue Update daemon ships as a pre-built binary (v1.4.0) with a daily 4:00 AM systemd timer. Manages brew, distrobox, flatpak, and system updates with polkit rules for unprivileged invocation.
Tailscale — pre-built binary (v1.98.3), x86_64 and aarch64, with a patched systemd unit for the tailscaled service.
Distrobox — ships the Go rewrite (next branch, v1.8.2.5) with bash/zsh completions and man pages, depends on podman.
Dakota vs. Production Bluefin — Gap Analysis#
Dakota is a curated subset of production Bluefin, not a 1:1 clone. It intentionally excludes things impractical for from-source builds and adds components unique to its from-source approach.
What's Missing From Dakota (present in production Bluefin)#
| Package | Notes |
|---|---|
fish shell | Alternative shell; requires from-source build |
zsh | Alternative shell |
tmux | Terminal multiplexer |
fastfetch | System info display tool |
| Starship prompt | Shell prompt; pre-built binary — priority gap |
wireguard-tools | VPN tooling |
What Dakota Has That Production Doesn't#
| Feature | Notes |
|---|---|
sudo-rs | Memory-safe Rust sudo |
uutils-coreutils | Memory-safe Rust coreutils |
incus | System containers & VMs |
distrobox | Container-based environment manager |
riscv64 architecture support | Neither production Bluefin nor Bluefin LTS support this |
GNOME nightly (:next/:btw streams) | Ahead of any distribution |
Permanently Out of Scope for Dakota#
Nvidia drivers, ZFS, Xbox controller support (xone), Framework laptop modules, enterprise AD/Kerberos — building these from source is not practical.
Checking Current Package Versions#
The Changelogs and Feeds page tracks current versions across all Bluefin streams (production, LTS, Dakota). For verifying live image contents, use skopeo inspect ghcr.io/projectbluefin/dakota:stable or podman run --rm — not a local machine unless you're explicitly checking your own install.
Key Source Files#
| File | Role |
|---|---|
elements/bluefin/deps.bst | Authoritative Dakota package manifest — add/remove image content here |
elements/oci/layers/bluefin.bst | Compose chain — filters deps into the actual filesystem layer |
elements/oci/bluefin.bst | Final OCI assembly (kind: script) |
projectbluefin/common Containerfile | Production Bluefin shared branding/system files |
docs/skills/oci-layers.md | Canonical doc for Dakota's layer assembly pipeline |
| Changelogs and Feeds | Live version tracking for all Bluefin image streams |
BST Caching Gotcha#
Adding a package to deps.bst (kind: stack) does not automatically trigger a rebuild of downstream compose layers in non-strict mode — the package will be missing from the final image even though bst show lists it. Force a clean rebuild with:
just bst --no-cache-buildtrees build oci/bluefin.bst