Skip to main content

Spec

Note: tuna-os/kde-build-meta was consolidated directly into this repo's elements/ tree (junction removed, repo archived) β€” the "two-repo model" described below is historical. All KDE .bst elements now live in this repo; the diagrams below reflect the current single-repo state. See AGENTS.md's "Single-Repo Model" section for details.

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 KDE elements​

All KDE elements live in this repo now (the kde-build-meta junction was removed), so updating a KDE stack element is an ordinary commit to elements/kde/… β€” no separate repo or junction-bump step:

cd /path/to/tromso
# edit elements/kde/<stack>/<element>.bst (bump url/ref, patch, etc.)
TMPDIR=/var/tmp git commit -m "Update <element> to <version>"
git push origin main

For the freedesktop-sdk base SDK junction, bump elements/freedesktop-sdk.bst (url, ref, base-dir) the same way.


CI/CD​

Only image-build workflow: .github/workflows/build-tromso-multirunner.yml

GitHub Actions runners
β†’ shared bst-ci planning/core/dependency chunks
β†’ merge chunk CAS archives
β†’ build_final: just bst build oci/tromso.bst + just export
β†’ sign and push ghcr.io/tuna-os/tromso tags

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

The multi-runner workflow splits the build into 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). It is triggered manually or by the daily schedule and is the only workflow permitted to build or publish the TromsΓΈ OCI image.


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 β€” see investigation (#2) for what that entails