index

Rendered in CI from the real wizard β see the walkthrough.
Thin Qt 6 / Kirigami wizard that drives the fisherman bootc install backend.
The UI is built the way KDE's own initial-setup wizard
(KISS, landing in Plasma 6.5) is built: each step
is a self-contained module at modules/<name>/contents/ui/main.qml whose root
is a SetupModule exposing nextEnabled and contentItem, driven by
src/qml/Wizard.qml with hand-rolled slide animations rather than a SwipeView.
Kirigami, Kirigami Addons (FormCard) and Kirigami.Units throughout β no
hardcoded pixel metrics, and no more forced Fusion style.
Workflowβ
- Welcome β brief intro
- Target Disk β
lsblk -Jlists available disks; user picks one - Disk Encryption β none / passphrase / TPM / TPM + passphrase
- Confirm β summary of choices (disk, filesystem, encryption, hostname, image)
- Installing β writes recipe JSON, runs
fisherman <recipe.json>, streams output - Finished β success/failure with close button
Buildβ
# Dependencies (Fedora). Kirigami and Kirigami Addons are QML-only: nothing
# links against KF6, they are resolved at runtime from the QML import path.
sudo dnf install -y cmake gcc-c++ ninja-build \
qt6-qtbase-devel qt6-qtdeclarative-devel \
kf6-kirigami kf6-kirigami-addons kf6-qqc2-desktop-style breeze-icons
# Build
cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build
# Run
./build/tuna-installer-kde
Recipeβ
The installer writes a JSON recipe that fisherman consumes:
{
"disk": "/dev/nvme0n1",
"filesystem": "btrfs",
"btrfsSubvolumes": true,
"encryption": {"type": "luks-passphrase", "passphrase": "β¦"},
"image": "ghcr.io/tuna-os/albacore:gnome",
"additionalImageStores": ["/usr/share/tuna-installer/oci-store"],
"distroID": "tunaos",
"selinuxDisabled": true,
"hostname": "tunaos"
}
Encryption types: none, luks-passphrase, tpm2-luks, tpm2-luks-passphrase.
On a live ISO, image may be omitted β bootc installs the running container
(offline, no download). See ../INSTALLER-FRONTENDS.md for the full contract.
Licenseβ
GPL-3.0-only