<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://tunaos.org/blog</id>
    <title>TunaOS Blog</title>
    <updated>2026-07-07T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://tunaos.org/blog"/>
    <subtitle>TunaOS Blog</subtitle>
    <icon>https://tunaos.org/img/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[New Variants: Arch Linux (Marlin) and CachyOS (Wahoo)]]></title>
        <id>https://tunaos.org/blog/arch-linux-and-cachyos</id>
        <link href="https://tunaos.org/blog/arch-linux-and-cachyos"/>
        <updated>2026-07-07T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[TunaOS is no longer Enterprise-Linux-only. Today we're adding two rolling-release variants to the build matrix: Marlin (Arch Linux) and Wahoo (CachyOS).]]></summary>
        <content type="html"><![CDATA[<p>TunaOS is no longer Enterprise-Linux-only. Today we're adding two rolling-release variants to the build matrix: <strong>Marlin</strong> (Arch Linux) and <strong>Wahoo</strong> (CachyOS).</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-rolling-release">Why Rolling Release?<a href="https://tunaos.org/blog/arch-linux-and-cachyos#why-rolling-release" class="hash-link" aria-label="Direct link to Why Rolling Release?" title="Direct link to Why Rolling Release?">​</a></h2>
<p>The project vision is clear: erase the mystique of the Linux distribution. A "distro" is just <code>base OS × desktop × kernel × drivers</code> — assembled by a build factory. If that's true, it shouldn't matter whether the base is RHEL-compatible, Fedora, Ubuntu, Arch, or CachyOS. The same factory should produce them all.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="-marlin--arch-linux-on-bootc">🐟 Marlin — Arch Linux on bootc<a href="https://tunaos.org/blog/arch-linux-and-cachyos#-marlin--arch-linux-on-bootc" class="hash-link" aria-label="Direct link to 🐟 Marlin — Arch Linux on bootc" title="Direct link to 🐟 Marlin — Arch Linux on bootc">​</a></h2>
<p>Arch Linux with the stability guarantees of bootc: atomic updates, rollback, immutable base.</p>
<ul>
<li><strong>Base</strong>: <code>archlinux/archlinux:latest</code></li>
<li><strong>Kernel</strong>: stock <code>linux</code> (latest stable)</li>
<li><strong>Package manager</strong>: pacman</li>
<li><strong>bootc</strong>: built from source (Arch doesn't package it yet)</li>
<li><strong>Desktops</strong>: gnome, kde, cosmic, niri, xfce</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="how-it-works">How It Works<a href="https://tunaos.org/blog/arch-linux-and-cachyos#how-it-works" class="hash-link" aria-label="Direct link to How It Works" title="Direct link to How It Works">​</a></h3>
<p><code>Containerfile.arch</code> bootcifies a stock Arch container:</p>
<ol>
<li>Builds bootc from source (~2 min Rust compile)</li>
<li>Moves <code>/var</code> → <code>/usr/lib/sysimage</code> for pacman+ostree compatibility</li>
<li>Installs kernel, dracut, ostree, filesystem tools</li>
<li>Builds initramfs with bootc dracut modules</li>
<li>Sets up composefs + ostree rootfs layout</li>
</ol>
<p>Desktop packages come from the same manifest system — the <code>pacman:</code> section in each <code>manifests/desktops/*.yaml</code>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="-wahoo--cachyos-on-bootc">🐟 Wahoo — CachyOS on bootc<a href="https://tunaos.org/blog/arch-linux-and-cachyos#-wahoo--cachyos-on-bootc" class="hash-link" aria-label="Direct link to 🐟 Wahoo — CachyOS on bootc" title="Direct link to 🐟 Wahoo — CachyOS on bootc">​</a></h2>
<p>The performance variant. CachyOS ships:</p>
<ul>
<li><strong>BORE scheduler</strong> — better desktop interactivity under load</li>
<li><strong>LTO-compiled packages</strong> — 5-15% faster binaries</li>
<li><strong>x86-64-v3 targeting</strong> — uses modern CPU instructions (AVX2, BMI2, etc.)</li>
<li><strong>Performance-tuned sysctl</strong> — optimized for desktop workloads</li>
</ul>
<p>Same <code>Containerfile.arch</code> — it auto-detects CachyOS repos in pacman.conf and installs <code>linux-cachyos</code> instead of stock <code>linux</code>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-matrix">The Matrix<a href="https://tunaos.org/blog/arch-linux-and-cachyos#the-matrix" class="hash-link" aria-label="Direct link to The Matrix" title="Direct link to The Matrix">​</a></h2>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">              │ gnome │ kde  │ niri │ cosmic │ xfce │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">──────────────┼───────┼──────┼──────┼────────┼──────┤</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">EL10          │  ✅   │  ✅  │  ✅  │   ✅   │  ✅  │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Fedora        │  ✅   │  ✅  │  ✅  │   ✅   │  ✅  │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Ubuntu        │  ✅   │  ✅  │  ✅  │   —    │  ✅  │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Arch          │  ✅   │  ✅  │  ✅  │   ✅   │  ✅  │  ← NEW</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">CachyOS       │  ✅   │  ✅  │  ✅  │   ✅   │  ✅  │  ← NEW</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="try-it">Try It<a href="https://tunaos.org/blog/arch-linux-and-cachyos#try-it" class="hash-link" aria-label="Direct link to Try It" title="Direct link to Try It">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># Build locally</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">just build marlin gnome</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">just build wahoo kde</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Or switch a running system</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sudo bootc switch ghcr.io/tuna-os/marlin:gnome</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sudo bootc switch ghcr.io/tuna-os/wahoo:kde</span><br></span></code></pre></div></div>
<p>Both variants are marked <strong>experimental</strong> — expect rough edges. ISOs coming once the builds stabilize.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="credits">Credits<a href="https://tunaos.org/blog/arch-linux-and-cachyos#credits" class="hash-link" aria-label="Direct link to Credits" title="Direct link to Credits">​</a></h2>
<p>This work stands on the shoulders of:</p>
<ul>
<li><strong><a href="https://github.com/bootcrew/mono" target="_blank" rel="noopener noreferrer">bootcrew</a></strong> — the reference implementation for Arch Linux on bootc. Their <code>arch-bootc</code> project proved the composefs-native backend works on Arch and pioneered the <code>/var</code> → <code>/usr/lib/sysimage</code> pacman migration. Our <code>Containerfile.arch</code> is directly based on their work.</li>
<li><strong><a href="https://github.com/bootc-shindig" target="_blank" rel="noopener noreferrer">jumpvi / bootc-shindig</a></strong> — the <code>bootc-deb</code> apt packages that make bootc work on Ubuntu/Debian. Without their work packaging bootc for apt-based systems, our Grouper (Ubuntu) variant wouldn't exist. The entire deb-based bootc ecosystem traces back to their packaging effort.</li>
<li><strong><a href="https://cachyos.org/" target="_blank" rel="noopener noreferrer">CachyOS</a></strong> — for maintaining performance-optimized Arch repos (BORE scheduler, LTO, x86-64-v3) and publishing Docker images we can build on.</li>
<li><strong><a href="https://universal-blue.org/" target="_blank" rel="noopener noreferrer">Universal Blue</a></strong> and <strong><a href="https://projectbluefin.io/" target="_blank" rel="noopener noreferrer">Project Bluefin</a></strong> — for proving that bootc-based desktop images work at scale and inspiring this entire approach.</li>
</ul>]]></content>
        <author>
            <name>James Reilly</name>
            <uri>https://github.com/jreilly1821</uri>
        </author>
        <category label="variants" term="variants"/>
        <category label="arch" term="arch"/>
        <category label="cachyos" term="cachyos"/>
        <category label="rolling-release" term="rolling-release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Erasing the Mystique: 10 Fishes in the Sea]]></title>
        <id>https://tunaos.org/blog/erasing-the-mystique</id>
        <link href="https://tunaos.org/blog/erasing-the-mystique"/>
        <updated>2026-07-07T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[A Linux distribution shouldn't be a sacred artifact maintained by priesthood. It should be a composition of choices — base OS, desktop, kernel, drivers — assembled by a factory and delivered as an image. Today, TunaOS has 10 variants spanning 4 package managers and every major Linux family. Here's why, and where we're going.]]></summary>
        <content type="html"><![CDATA[<p>A Linux distribution shouldn't be a sacred artifact maintained by priesthood. It should be a composition of choices — base OS, desktop, kernel, drivers — assembled by a factory and delivered as an image. Today, TunaOS has <strong>10 variants</strong> spanning 4 package managers and every major Linux family. Here's why, and where we're going.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-mystique">The Mystique<a href="https://tunaos.org/blog/erasing-the-mystique#the-mystique" class="hash-link" aria-label="Direct link to The Mystique" title="Direct link to The Mystique">​</a></h2>
<p>For decades, "making a Linux distro" meant: fork a package set, maintain an installer, hand-tune configs, ship ISOs on a 6-month cadence, and pray nothing breaks between your packages and upstream. The result: hundreds of distros that are 95% the same packages with 5% different defaults.</p>
<p>The mystique is that this is <em>hard</em>. That it takes a team of package maintainers and release engineers. That choosing Arch vs Fedora vs Debian is a permanent, load-bearing decision.</p>
<p><strong>We reject this.</strong></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-factory">The Factory<a href="https://tunaos.org/blog/erasing-the-mystique#the-factory" class="hash-link" aria-label="Direct link to The Factory" title="Direct link to The Factory">​</a></h2>
<p>TunaOS is not a distribution. It's an <strong>image factory</strong>. The inputs are:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">base OS  ×  desktop  ×  kernel  ×  drivers  =  bootable image</span><br></span></code></pre></div></div>
<p>The output is an OCI container image you can <code>bootc switch</code> to — atomically, with rollback. Changing your "distro" is a one-line command. The factory stamps out every combination automatically.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-fishes">The Fishes<a href="https://tunaos.org/blog/erasing-the-mystique#the-fishes" class="hash-link" aria-label="Direct link to The Fishes" title="Direct link to The Fishes">​</a></h2>
<p>Every TunaOS variant is named after a fish. Today there are 10:</p>
<table><thead><tr><th>Fish</th><th>Base</th><th>Package Manager</th><th>Character</th></tr></thead><tbody><tr><td>🐠 <strong>Yellowfin</strong></td><td>AlmaLinux Kitten 10</td><td>dnf</td><td>Bleeding-edge Enterprise Linux</td></tr><tr><td>🐟 <strong>Albacore</strong></td><td>AlmaLinux 10</td><td>dnf</td><td>Stable Enterprise Linux</td></tr><tr><td>🍣 <strong>Skipjack</strong></td><td>CentOS Stream 10</td><td>dnf</td><td>Upstream RHEL</td></tr><tr><td>🔒 <strong>Redfin</strong></td><td>RHEL 10</td><td>dnf</td><td>Supported, subscription-based</td></tr><tr><td>🎣 <strong>Bonito</strong></td><td>Fedora 44</td><td>dnf</td><td>Cutting-edge Fedora</td></tr><tr><td>🐟 <strong>Grouper</strong></td><td>Ubuntu 26.04</td><td>apt</td><td>Ubuntu on bootc</td></tr><tr><td>🐟 <strong>Flounder</strong></td><td>Debian Trixie</td><td>apt</td><td>Debian stable on bootc</td></tr><tr><td>🐟 <strong>Flounder-sid</strong></td><td>Debian Sid</td><td>apt</td><td>Debian rolling on bootc</td></tr><tr><td>🐟 <strong>Marlin</strong></td><td>Arch Linux</td><td>pacman</td><td>Rolling release, latest everything</td></tr><tr><td>🐟 <strong>Wahoo</strong></td><td>CachyOS</td><td>pacman</td><td>Performance-optimized Arch (BORE, LTO, v3)</td></tr></tbody></table>
<p>Each fish gets <strong>6 desktops</strong>: GNOME, GNOME 50, KDE Plasma, COSMIC, Niri, and XFCE. Each desktop can optionally layer an HWE kernel or NVIDIA drivers on top.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-we-got-here">How We Got Here<a href="https://tunaos.org/blog/erasing-the-mystique#how-we-got-here" class="hash-link" aria-label="Direct link to How We Got Here" title="Direct link to How We Got Here">​</a></h2>
<p>A week ago, adding a new base OS meant writing hundreds of lines of new shell scripts. Today it means:</p>
<ol>
<li><strong>A Containerfile</strong> that bootcifies the stock container image (~150 lines, mostly the ostree filesystem layout)</li>
<li><strong>A <code>pacman:</code> or <code>apt:</code> section</strong> in each desktop manifest (the packages that make up GNOME/KDE/etc. on that OS)</li>
<li><strong>An entry in <code>build-config.yml</code></strong> (the variant name, base image, platforms)</li>
</ol>
<p>That's it. The generic installer reads the YAML, installs the right packages for the detected OS, and produces a working image. No per-distro bash scripts. No per-DE-per-distro combinatorial explosion.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-this-means-for-users">What This Means For Users<a href="https://tunaos.org/blog/erasing-the-mystique#what-this-means-for-users" class="hash-link" aria-label="Direct link to What This Means For Users" title="Direct link to What This Means For Users">​</a></h2>
<p><strong>You're not locked in.</strong> Want to try Arch after running AlmaLinux for a year? <code>sudo bootc switch ghcr.io/tuna-os/marlin:kde</code>. Want the CachyOS performance kernel on your KDE desktop? <code>sudo bootc switch ghcr.io/tuna-os/wahoo:kde</code>. Don't like GNOME 50? Switch to GNOME 49: <code>sudo bootc switch ghcr.io/tuna-os/yellowfin:gnome</code>.</p>
<p>The matrix is your menu. Every cell is a valid, tested, bootable system.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="whats-next">What's Next<a href="https://tunaos.org/blog/erasing-the-mystique#whats-next" class="hash-link" aria-label="Direct link to What's Next" title="Direct link to What's Next">​</a></h2>
<ul>
<li><strong>Build validation</strong> — getting CI green for all 10 variants across all platforms</li>
<li><strong>ISOs</strong> — tacklebox-generated live ISOs for every variant×desktop combination</li>
<li><strong>NVIDIA on Arch/CachyOS</strong> — <code>pacman -S nvidia-open</code> as a manifest entry (no akmods needed)</li>
<li><strong>More desktops</strong> — Hyprland, Sway, Budgie are each one YAML file away</li>
<li><strong>Community manifests</strong> — let anyone contribute a desktop definition without touching build scripts</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="credits">Credits<a href="https://tunaos.org/blog/erasing-the-mystique#credits" class="hash-link" aria-label="Direct link to Credits" title="Direct link to Credits">​</a></h2>
<p>This wouldn't be possible without:</p>
<ul>
<li><strong><a href="https://github.com/bootcrew/mono" target="_blank" rel="noopener noreferrer">bootcrew</a></strong> — reference bootc implementations for Arch and Debian</li>
<li><strong><a href="https://github.com/bootc-shindig" target="_blank" rel="noopener noreferrer">jumpvi / bootc-shindig</a></strong> — bootc-deb packages for Ubuntu/Debian</li>
<li><strong><a href="https://cachyos.org/" target="_blank" rel="noopener noreferrer">CachyOS</a></strong> — performance-optimized Arch repos and Docker images</li>
<li><strong><a href="https://universal-blue.org/" target="_blank" rel="noopener noreferrer">Universal Blue</a></strong> &amp; <strong><a href="https://projectbluefin.io/" target="_blank" rel="noopener noreferrer">Project Bluefin</a></strong> — proving bootc desktop works at scale</li>
<li><strong><a href="https://github.com/bootc-dev/bootc" target="_blank" rel="noopener noreferrer">bootc</a></strong> — the engine that makes all of this possible</li>
</ul>
<hr>
<p><em>The mystique is dead. A distro is just data in, image out. Pick your fish.</em></p>]]></content>
        <author>
            <name>James Reilly</name>
            <uri>https://github.com/jreilly1821</uri>
        </author>
        <category label="vision" term="vision"/>
        <category label="variants" term="variants"/>
        <category label="architecture" term="architecture"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[The Image Factory: Manifest-Driven Builds]]></title>
        <id>https://tunaos.org/blog/manifest-driven-build-system</id>
        <link href="https://tunaos.org/blog/manifest-driven-build-system"/>
        <updated>2026-07-07T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[TunaOS just shipped the biggest architectural change since the project started: declarative desktop manifests. Adding a new desktop environment is now a YAML file — no shell scripts, no Containerfile changes, no CI edits.]]></summary>
        <content type="html"><![CDATA[<p>TunaOS just shipped the biggest architectural change since the project started: <strong>declarative desktop manifests</strong>. Adding a new desktop environment is now a YAML file — no shell scripts, no Containerfile changes, no CI edits.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-problem">The Problem<a href="https://tunaos.org/blog/manifest-driven-build-system#the-problem" class="hash-link" aria-label="Direct link to The Problem" title="Direct link to The Problem">​</a></h2>
<p>The old build system had a 150-line bash script per desktop (gnome.sh, kde.sh, cosmic.sh, niri.sh, xfce.sh). Each one was an imperative mess of <code>if fedora; dnf install X; elif el10; dnf group install Y; fi</code>. Adding GNOME 50 meant duplicating gnome.sh. Adding Ubuntu support meant adding <code>elif apt; pkg_install Z</code> to every single script.</p>
<p>The Justfile's <code>_build</code> recipe was 150 lines of positional-argument spaghetti. Understanding what <code>arg 7</code> meant required reading the recipe signature.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-solution">The Solution<a href="https://tunaos.org/blog/manifest-driven-build-system#the-solution" class="hash-link" aria-label="Direct link to The Solution" title="Direct link to The Solution">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="desktop-manifests">Desktop Manifests<a href="https://tunaos.org/blog/manifest-driven-build-system#desktop-manifests" class="hash-link" aria-label="Direct link to Desktop Manifests" title="Direct link to Desktop Manifests">​</a></h3>
<p>Each desktop is now a YAML file in <code>manifests/desktops/</code>:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># manifests/desktops/kde.yaml</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">display_manager</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> sddm</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">packages</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">fedora</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">groups</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">kde</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">desktop</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">packages</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">sddm</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> dolphin</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> konsole</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> kate</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">...</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">el10</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">groups</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"KDE Plasma Workspaces"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">...</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">optional</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">kdeconnect</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> nvtop</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">...</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">pacman</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> plasma</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">desktop</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> sddm</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> dolphin</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> konsole</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">apt</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> kde</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">plasma</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">desktop</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> sddm</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">versionlock</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">plasma</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">desktop</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"qt6-*"</span><span class="token punctuation" style="color:#393A34">]</span><br></span></code></pre></div></div>
<p>A single generic installer (<code>install-desktop.sh</code>) reads the manifest and handles everything: groups, packages, COPRs, version locks, display manager enablement.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="build-engine-extraction">Build Engine Extraction<a href="https://tunaos.org/blog/manifest-driven-build-system#build-engine-extraction" class="hash-link" aria-label="Direct link to Build Engine Extraction" title="Direct link to Build Engine Extraction">​</a></h3>
<p>The Justfile <code>_build</code> monolith became <code>scripts/build-image-inner.sh</code> — 198 lines, env-var driven (not 11 positional args). The Justfile is now a 25-line export wrapper.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="flavor-resolution">Flavor Resolution<a href="https://tunaos.org/blog/manifest-driven-build-system#flavor-resolution" class="hash-link" aria-label="Direct link to Flavor Resolution" title="Direct link to Flavor Resolution">​</a></h3>
<p><code>scripts/resolve-flavor.sh</code> maps any flavor to its build parameters. 18 BATS tests cover every path. The old 50-line if/elif/case block in the Justfile is gone.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-numbers">The Numbers<a href="https://tunaos.org/blog/manifest-driven-build-system#the-numbers" class="hash-link" aria-label="Direct link to The Numbers" title="Direct link to The Numbers">​</a></h2>
<table><thead><tr><th>Before</th><th>After</th></tr></thead><tbody><tr><td>5 × 150-line DE scripts</td><td>1 × 159-line generic installer + 5 YAML manifests</td></tr><tr><td>150-line <code>_build</code> recipe (11 positional args)</td><td>25-line wrapper + 198-line env-var script</td></tr><tr><td>3 Containerfiles for HWE/nvidia (213 lines dead code)</td><td>1 parameterized <code>Containerfile.overlay</code> (72 lines)</td></tr><tr><td>0 tests for flavor routing</td><td>18 BATS cases</td></tr></tbody></table>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="whats-next">What's Next<a href="https://tunaos.org/blog/manifest-driven-build-system#whats-next" class="hash-link" aria-label="Direct link to What's Next" title="Direct link to What's Next">​</a></h2>
<p>The manifest system now supports <strong>4 package managers</strong> (dnf, apt, pacman, zypper) and we've added Arch Linux (marlin) and CachyOS (wahoo) variants. The matrix grows:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">9 base variants × 6 desktops × 3 hardware layers = image factory</span><br></span></code></pre></div></div>
<p>Adding a new distro = write a Containerfile that bootcifies it + add pacman/apt/dnf sections to the manifests. The build system handles the rest.</p>]]></content>
        <author>
            <name>James Reilly</name>
            <uri>https://github.com/jreilly1821</uri>
        </author>
        <category label="architecture" term="architecture"/>
        <category label="build-system" term="build-system"/>
        <category label="refactor" term="refactor"/>
    </entry>
</feed>