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.

All KDE .bst elements (Qt6, Frameworks, Plasma, Apps, base image) live directly in this repo's elements/ tree β€” see AGENTS.md for the current structure.

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: tromso)
β”œβ”€β”€ Justfile # Build recipes (bst, build, boot-vm, etc.)
β”œβ”€β”€ include/
β”‚ └── aliases.yml # URL aliases (kde:, github:, gnome:, etc.)
└── elements/
β”œβ”€β”€ freedesktop-sdk.bst # Junction β†’ freedesktop-sdk (base SDK)
β”œβ”€β”€ kde/ # KDE stack (consolidated in from kde-build-meta)
β”‚ β”œβ”€β”€ qt6/ # Qt6 base, declarative, multimedia, etc.
β”‚ β”œβ”€β”€ frameworks/ # kcoreaddons, kio, kirigami, kwin deps, etc.
β”‚ β”œβ”€β”€ libs/ # libkscreen, qcoro, phonon, etc.
β”‚ β”œβ”€β”€ plasma/ # plasma-workspace, kwin, sddm, discover, etc.
β”‚ β”œβ”€β”€ apps/ # dolphin, kate, okular, konsole, etc.
β”‚ └── deps.bst # Master KDE stack
β”œβ”€β”€ kde-linux-deps/ # KDE Linux base deps (consolidated in)
β”œβ”€β”€ kde-linux-system/ # KDE Linux system config/initramfs (consolidated in)
β”œβ”€β”€ core/ # Core freedesktop-sdk-facing elements
β”œβ”€β”€ core-deps/ # Core dependency elements
β”œβ”€β”€ gnomeos-deps/
β”‚ └── bootc.bst # bootc compiled from source (Rust)
β”œβ”€β”€ sdk/ # SDK-facing elements
β”œβ”€β”€ sdk-deps/
β”œβ”€β”€ plugins/ # BuildStream plugins (junctions)
β”œβ”€β”€ 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 (Aurora fork, no bootc build)
β”‚ β”œβ”€β”€ 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

All KDE .bst elements live directly in this repo β€” the former tuna-os/kde-build-meta junction was removed and its elements consolidated into elements/ (kde/, kde-linux-deps/, kde-linux-system/, core/, core-deps/, patches/, files/, keys/, plugins/; see AGENTS.md for the full history). The role formerly played by the kde-build-meta junction (gnome-build-meta scaffolding rebranded for KDE) is now filled by this repo's own elements/ tree plus the freedesktop-sdk junction.


Build Pipeline​

freedesktop-sdk (base SDK, via elements/freedesktop-sdk.bst junction)
└── elements/kde/ # Qt6, Frameworks 6, Plasma 6, KDE Applications
└── elements/kde-linux-deps/ # KDE Linux base deps
└── elements/kde-linux-system/ # system config, initramfs, signed modules
└── oci/kde-linux/ # KDE Linux base image
└── elements/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 a pinned element​

There is no second repo to keep in sync β€” elements live in this repo:

# 1. Edit the .bst element (or its source ref) under elements/
# 2. Update the pinned git ref / tarball SHA256 in the element
# 3. Commit + push tromso
cd /path/to/tromso
TMPDIR=/var/tmp git commit -m "Update <element> to <upstream> <ref>"
git push origin main

The only remaining junction is elements/freedesktop-sdk.bst (and the BuildStream plugins under elements/plugins/); it is pinned by ref and tracked with track-bst-sources.yml.


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 the shared tuna-os/bst-ci reusable workflow (scripts/ci-build-matrix.py no longer lives in this repo). 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