12 Fishes in the Sea: The TunaOS Variant Landscape
Picking a Linux distro has always felt weirder to me than it should be. Most of them are like 95% the same packages with 5% different defaults, and yet somehow choosing one feels like a permanent decision you're stuck with forever.
I didn't come up with this idea, to be clear. Bedrock Linux was mixing packages from different distros on one system back in 2012. Lennart Poettering wrote the whole blueprint out in his mkosi posts β sysext, confext, repart, UKIs, the works. CarbonOS took a run at OCI image delivery with btrfs snapshots on Fedora Atomic back in 2021. And Jessie Frazelle was running her whole desktop out of Docker containers in 2015, which honestly should have gotten more attention than it did. Everyone kept poking at the same idea from a different angle.
What actually made it usable were two things. bootc β you get an OCI image, you switch to it, it's atomic, and you can roll back if you screwed something up. And Project Bluefin proved people would actually use this every day, not just as a tech demo. Once I saw that working at scale I started wondering how far you could actually push it.
So that's what TunaOS is, I guess β pushing it. We ship 12 variants right now across 5 package managers and pretty much every major Linux family, and they all end up as the same desktop experience underneath. If you can swap the base OS out from under a desktop and nothing changes, the distro isn't really a decision anymore. It's just a setting.
It's a factory, not a distroβ
I keep saying "TunaOS" like it's one thing, but really it's a factory that spits out images. The inputs are just data:
base OS + desktop + kernel + drivers = bootable image
Out the other end you get an OCI image you bootc switch to, atomically, with rollback if it goes bad. Want a different desktop on the same base? Switch. Want a beefier kernel? Switch. The whole matrix is on the menu:
# Same base, different desktop
sudo bootc switch ghcr.io/tuna-os/marlin:kde
sudo bootc switch ghcr.io/tuna-os/marlin:gnome
# Same desktop, different kernel
sudo bootc switch ghcr.io/tuna-os/marlin:kde-hwe
bootc switch works within the same storage backend β both source and target images must use either ComposeFS or OSTree. Cross-backend migration (e.g. OSTree β ComposeFS) requires bootc-migrate-composefs [alpha].
Cross-family migration (AlmaLinux β Arch in place, say) is on the roadmap but not there yet. Even just same-family switching already makes the base OS swappable in a way regular distros never let you do.
Under the hood it's the same stuff server folks have been using for years β bootc, CI, Podman. We're basically just treating the desktop like a container deployment. Nothing revolutionary, the server side figured this out a while ago, the desktop's just catching up.
The variantsβ
Everything's named after a fish, because I like fish and also because "AlmaLinux 10 + KDE + hwe kernel" is a mouthful. 12 of them right now:
| Variant | Base Distribution | Status |
|---|---|---|
| π Yellowfin | Stable | |
| π Albacore | Stable | |
| π£ Skipjack | Beta | |
| π Redfin | Local-build | |
| π£ Bonito | Beta | |
| π Bonito Rawhide | Beta | |
| π Grouper | Beta | |
| π‘ Flounder | Beta | |
| β’οΈ Flounder Sid | Beta | |
| π Marlin | Beta | |
| π¦ Sailfin | Beta | |
| π Guppy | Beta |
Most variants get the same 5 desktops: GNOME,
KDE Plasma,
COSMIC,
Niri +
DMS, and
XFCE on Wayland. Guppy ships 2 (GNOME, KDE). Sailfin ships 4 (no COSMIC). Stack a custom kernel or NVIDIA drivers on top of any of them if you want.
How this got easierβ
Not that long ago, adding a new base OS meant writing a few hundred lines of shell. Now it's three things:
- A Containerfile that bootc-ifies the stock image (started from bootcrew's base images, saved me a ton of work)
- A package manager manifest (
pacman:,apt:, whatever) listing what that OS needs for each desktop - An entry in
build-config.ymlβ name, base image, platforms
That's the whole job now. CI does the rest and spits out container images and ISOs on its own. No per-distro bash, no combinatorial mess of per-desktop-per-distro scripts to keep in sync.
The desktops themselvesβ
Mostly the same desktops on every variant, and none of them are built from scratch β we're layering existing customization work on top of stock packages and just running that layer across every base OS we support. Each one has an upstream project doing the actual hard work, and honestly they deserve more credit than they get.
GNOMEβ
GNOME already looks good out of the box, but we still pull from Project Bluefin's common layer on top of it β dev tooling, curated Flatpaks, and just years of them running bootc desktops in the real world that we'd be dumb not to use. Every GNOME image we build, Arch or Fedora or Gentoo, gets the same Bluefin layer. They also have a distroless BuildStream build on freedesktop-sdk if you want to go further down that hole.
KDE Plasmaβ
Plasma's look comes from Aurora's common layer β theming and branding that makes stock Plasma actually feel like one coherent thing instead of a pile of defaults. That's what gives our KDE its look across all 12 bases. They've also got a source-based BuildStream build on freedesktop-sdk if you're into that.
Niri +
DMSβ
Niri is a scrollable-tiling compositor β windows line up horizontally on a ribbon you scroll through instead of stacking into workspaces. It's the odd one out in the lineup and probably the most "pure Wayland" thing we ship.
We pair it with DMS (DankMaterialShell) for the greeter, a control panel, and app launching. So the stack is greetd β Niri β DMS. DMS is still pretty early but it's enough to make Niri feel like an actual desktop and not just bare windows on a ribbon.
Config and theming come from Zirconium, same deal as Bluefin and Aurora β one layer, applied everywhere.
XFCE (Wayland)β
XFCE 4.20 shipped experimental Wayland support with a new compositor, xfwl4, replacing the old X11 xfwm4. It's still maturing but it's already good enough to daily-drive on Fedora and EL10 β we ship the optional xfce4-wayland package and default to GDM so the Wayland session actually shows up in the login list. Basically: XFCE, but with tear-free rendering and per-monitor refresh rates now.
XFCE's the only desktop here without a dedicated customization layer β no Bluefin, no Aurora, no Zirconium equivalent. If you use XFCE and have opinions on what it should look like, I'd take the help.
COSMICβ
COSMIC is System76's Rust desktop, Wayland from the ground up. We ship it mostly stock β it's already opinionated enough on its own that it doesn't really need our fingerprints on it.
Same story as XFCE β no dedicated layer yet. If you want to be the person who defines what a curated COSMIC setup looks like across every variant, go for it.
What's nextβ
- Getting CI actually green across all 12 variants on all platforms (we're not there yet, not going to pretend otherwise)
- More desktops β Hyprland, Sway, Budgie are basically just a manifest file away at this point
- Cross-backend migration β
bootc-migrate-composefs(alpha) does OSTree β ComposeFS in place, cross-family (AlmaLinux β Arch) is the next hard problem - Letting people contribute a desktop definition without having to touch the actual build scripts
Credit where it's dueβ
None of this happens without a bunch of other projects doing the hard work first. If any of this is useful to you, go support the people who actually built it.
Infraβ
- bootcrew β reference bootc setups for Arch, Gentoo, openSUSE, Debian
- atomic-shindig / shindig-deb β bootc-deb packaging for Ubuntu and Debian
- Universal Blue and Project Bluefin β did the bootc desktop thing at scale before anyone else
- bootc β none of this exists without this project
Desktop upstreamsβ
These are the folks whose customization layers we're shipping. They did the actual work of making each desktop feel cohesive β go support them if you can.
Project Bluefin (GNOME): sponsor @castrojo Β· sponsor @tulilirockz
Aurora (KDE Plasma): sponsor @NiHaiden
Zirconium (Niri): sponsor @tulilirockz
The desktops themselvesβ
And obviously the desktop environments are their own massive community efforts, worth supporting directly too.
Full list on the Support page if you want more ways to help out.
Pick your fish. It's less of a decision than it used to be.
