Skip to main content

Spec

Overview​

Aurora Tromso is a bootable OCI/bootc image running KDE Plasma 6. It is built with BuildStream on top of freedesktop-sdk, using the same methodology as GNOME OS and Project Bluefin dakota.

The project uses a two-repo model:

RepoRole
tuna-os/tromsoThis repo β€” Aurora-specific layers, OCI composition, CI
hanthor/kde-build-metaKDE .bst elements β€” Qt6, Frameworks, Plasma, Apps, base image

Reference sources used during development:

SourcePurpose
invent.kde.org/kde-linux/kde-linuxAuthoritative KDE package list and versions
projectbluefin/dakotaOCI/bootc composition patterns, Justfile
GNOME/gnome-build-metaBuild infrastructure patterns (bootc, initramfs, etc.)
freedesktop-sdkBase SDK β€” Qt6, systemd, kernel, Mesa, pipewire, etc.

Repository Structure​

tuna-os/tromso (this repo)
β”œβ”€β”€ project.conf # BuildStream project config (name: aurora)
β”œβ”€β”€ Justfile # Build recipes (bst, build, boot-vm, etc.)
β”œβ”€β”€ include/
β”‚ └── aliases.yml # URL aliases (kde:, github:, etc.)
└── elements/
β”œβ”€β”€ kde-build-meta.bst # Junction β†’ hanthor/kde-build-meta (tarball ref)
β”œβ”€β”€ gnomeos-deps/
β”‚ └── bootc.bst # bootc compiled from source (Rust)
β”œβ”€β”€ test.bst # Minimal test element
β”œβ”€β”€ tromso/ # Aurora-specific additions over KDE Linux base
β”‚ β”œβ”€β”€ deps.bst # Master stack of all Aurora additions
β”‚ β”œβ”€β”€ system-config.bst # dbus, sshd, networkd, system users
β”‚ β”œβ”€β”€ containers-config.bst # containers policy.json for bootc runtime
β”‚ β”œβ”€β”€ ldconfig-paths.bst # ld.so.conf.d for Qt6 libraries in /usr/lib
β”‚ β”œβ”€β”€ hardware-enablement.bst # android-udev, iio-sensor-proxy, etc.
β”‚ β”œβ”€β”€ bluefin-common.bst # Bluefin-compatible common payload
β”‚ β”œβ”€β”€ common.bst # Aurora branding and config
β”‚ β”œβ”€β”€ logos.bst # Aurora logos
β”‚ β”œβ”€β”€ wallpapers.bst # Aurora wallpapers
β”‚ β”œβ”€β”€ docs.bst # Documentation
β”‚ β”œβ”€β”€ brew.bst # Homebrew (Linuxbrew) integration
β”‚ β”œβ”€β”€ tailscale.bst # Tailscale VPN
β”‚ β”œβ”€β”€ image-overlay.bst # Aurora image overlay files
β”‚ β”œβ”€β”€ multimedia-overrides.bst # Codec/multimedia config overrides
β”‚ β”œβ”€β”€ fcitx5-cluster.bst # Input method support (CJK, etc.)
β”‚ β”œβ”€β”€ sudo-rs.bst # sudo-rs to preserve setuid binary
β”‚ β”œβ”€β”€ kcm_ublue.bst # KDE Control Module for ublue-style settings
β”‚ β”œβ”€β”€ krunner-bazaar.bst # KRunner plugin for Bazaar
β”‚ └── kde-linux-noto-fontconfig.bst # Noto font configuration for SDDM
└── oci/
β”œβ”€β”€ tromso.bst # ← Main build target
β”œβ”€β”€ tromso-ostree.bst # OSTree variant
β”œβ”€β”€ os-release.bst # Aurora os-release (overrides KDE Linux)
β”œβ”€β”€ kde-linux/ # KDE Linux base image composition
β”‚ β”œβ”€β”€ image.bst # Parent OCI image (from kde-build-meta)
β”‚ β”œβ”€β”€ stack.bst # KDE Linux full stack
β”‚ └── filesystem.bst # Filesystem layout
└── layers/
β”œβ”€β”€ tromso.bst # Aurora OCI layer (depends on tromso/deps)
β”œβ”€β”€ tromso-runtime.bst
└── tromso-stack.bst # Combined: kde-linux/stack + tromso/deps

hanthor/kde-build-meta mirrors the role of gnome-build-meta:

hanthor/kde-build-meta
└── elements/kde/
β”œβ”€β”€ qt6/ (~30 elements β€” Qt6 base, declarative, multimedia, etc.)
β”œβ”€β”€ frameworks/ (~70 elements β€” kcoreaddons, kio, kirigami, kwin deps, etc.)
β”œβ”€β”€ libs/ (~17 elements β€” libkscreen, qcoro, phonon, etc.)
β”œβ”€β”€ plasma/ (~41 elements β€” plasma-workspace, kwin, sddm, discover, etc.)
β”œβ”€β”€ apps/ (~9 elements β€” dolphin, kate, okular, konsole, etc.)
└── deps.bst # Master KDE Linux stack (200+ packages)

Build Pipeline​

freedesktop-sdk (base SDK)
└── kde-build-meta junction
β”œβ”€β”€ kde/qt6/ # Qt6 compiled from source
β”œβ”€β”€ kde/frameworks/ # KDE Frameworks 6
β”œβ”€β”€ kde/plasma/ # KDE Plasma 6 (kwin, sddm, plasma-workspace, etc.)
β”œβ”€β”€ kde/apps/ # KDE Applications
└── oci/kde-linux/ # KDE Linux base image
└── tromso/deps.bst # Aurora additions
└── oci/tromso.bst # Final OCI image
└── ghcr.io/tuna-os/tromso:latest

The build is fully reproducible: all sources are pinned by git ref or tarball SHA256. BuildGrid is used for distributed compilation β€” build jobs run on the home cluster over Tailscale and results are cached as content-addressable artifacts.


Design Decisions​

DecisionChoiceRationale
Display protocolWayland-onlyMatches KDE Linux upstream; no X11 session
Display managerSDDMKDE's preferred DM; integrates with KWallet PAM
Init systemsystemdVia freedesktop-sdk
Bootloadersystemd-bootVia bootc install
Image formatOCI/bootcEnables atomic upgrades via bootc upgrade
Build systemBuildStream 2Same as GNOME OS and dakota; hermetic builds
Artifact cacheBuildGrid (gRPC)Home cluster via Tailscale; survives runner restarts

Key .bst Patterns​

KDE cmake element​

kind: cmake

build-depends:
- freedesktop-sdk.bst:public-stacks/buildsystem-cmake.bst
- kde/frameworks/extra-cmake-modules.bst
- kde/qt6/qt6-qtbase.bst # required at configure time for Qt6 CMake detection

variables:
cmake-local: >-
-DBUILD_TESTING=OFF
-DWITH_X11=OFF # most frameworks use this; kwindowsystem uses -DKWINDOWSYSTEM_X11=OFF

Note: Use cmake-local (not cmake-options) for cmake flags in this project.

Transitive build-depends​

BuildStream does not automatically propagate CMake config files through depends. If foo.bst calls find_package(KF6Bar) at configure time, then kde/frameworks/bar.bst must appear in foo.bst's build-depends, even if it's already in depends.

Updating the junction​

# 1. Commit + push kde-build-meta
cd /path/to/kde-build-meta
TMPDIR=/var/tmp git commit -m "..."
git push origin master

# 2. Compute new SHA (re-download β€” GitHub archive hashes are non-deterministic)
SHA=$(git rev-parse --short=7 HEAD)
curl -sL https://github.com/hanthor/kde-build-meta/archive/${SHA}.tar.gz | tee /tmp/kbm.tar.gz | sha256sum
tar tzf /tmp/kbm.tar.gz | head -1 # verify base-dir

# 3. Update elements/kde-build-meta.bst: url, ref, base-dir

# 4. Commit + push tromso
cd /path/to/tromso
TMPDIR=/var/tmp git commit -m "Update junction to kde-build-meta ${SHA}"
git push origin main

CI/CD​

Primary workflow: .github/workflows/build-buildgrid.yml

GitHub Actions runner
β†’ Generate CI BuildStream config
β†’ bst2 container pull (pinned image SHA)
β†’ just bst build oci/tromso.bst (local CASD build)
β†’ just export (exports OCI tarball)
β†’ skopeo push ghcr.io/tuna-os/tromso:latest

Triggers: push to main (elements/, project.conf, include/), daily at 06:00 UTC, manual dispatch.

Experimental parallel workflow: .github/workflows/build-tromso-multirunner.yml Splits the build into 10 parallel chunks across GitHub runners using scripts/ci-build-matrix.py. Triggered manually or by daily schedule.


Packages Not Yet in Aurora​

The following packages from the KDE Linux package list require new .bst elements that have not yet been written:

PackageNotes
openrazer-daemonDKMS-based; needs special handling
yubikey-full-disk-encryptionHardware security key disk encryption
vpl-gpu-rtIntel VPL GPU runtime
Python bindings (Shiboken6/PySide6)Requires packaging from scratch