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:
| Repo | Role |
|---|---|
tuna-os/tromso | This repo β Aurora-specific layers, OCI composition, CI |
hanthor/kde-build-meta | KDE .bst elements β Qt6, Frameworks, Plasma, Apps, base image |
Reference sources used during development:
| Source | Purpose |
|---|---|
invent.kde.org/kde-linux/kde-linux | Authoritative KDE package list and versions |
projectbluefin/dakota | OCI/bootc composition patterns, Justfile |
GNOME/gnome-build-meta | Build infrastructure patterns (bootc, initramfs, etc.) |
freedesktop-sdk | Base 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β
| Decision | Choice | Rationale |
|---|---|---|
| Display protocol | Wayland-only | Matches KDE Linux upstream; no X11 session |
| Display manager | SDDM | KDE's preferred DM; integrates with KWallet PAM |
| Init system | systemd | Via freedesktop-sdk |
| Bootloader | systemd-boot | Via bootc install |
| Image format | OCI/bootc | Enables atomic upgrades via bootc upgrade |
| Build system | BuildStream 2 | Same as GNOME OS and dakota; hermetic builds |
| Artifact cache | BuildGrid (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(notcmake-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:
| Package | Notes |
|---|---|
openrazer-daemon | DKMS-based; needs special handling |
yubikey-full-disk-encryption | Hardware security key disk encryption |
vpl-gpu-rt | Intel VPL GPU runtime |
| Python bindings (Shiboken6/PySide6) | Requires packaging from scratch |