# Quarry flavors

Status: **paper** (updated 2026-09-10 CDT). **Active:** clean Fedora desktop (`quarry-desktop-fedora`, flavors order 5) —
local build + boot smoke PASS 2026-09-10; still **no** public promote. **Papers landed
(not blocking):** NVIDIA gaming — `docs/nvidia-flavor.md`; Deck/handheld — `docs/deck-flavor.md`
(no builds this run). Fedora server `server-testing` is public. `quarry-server-deb`
is **local-only / historical spike** — **no** public Debian / `server-deb-testing`
promote (parked; not near roadmap). PhreeStyle wants a **matrix** of images:
**server and desktop** on **Fedora and Debian** bases, with room for other bases
later — Debian public cells stay parked. NVIDIA / Deck are later *gaming*
siblings of the Bazzite cut, not matrix base rows.

Nothing here changes the main gaming image `FROM` line or blocks publish of
desktop `stable`. Spikes stay gated on a Gitea registry `:stable` for the
current Bazzite cut (or an explicit PhreeStyle exception).

## Product matrix

|  | **Server / headless** | **Desktop** |
| --- | --- | --- |
| **Fedora** | `quarry-server` — **v1 base decided: Fedora bootc** | **Near-term:** main Quarry = Bazzite *cut* (gaming). **Later clean path:** Plasma (or chosen DE) layered on `quarry-server` |
| **Debian** | `quarry-server-deb` — **local-only spike; public parked** | `quarry-deb` — parked with public Debian (gaming out of scope for v1) |
| **Other (later)** | e.g. Ubuntu / openSUSE / Arch bootc server | Matching desktop only after server spike for that base |

Shared idea: **Quarry = policy + publish path.** Base family × edition =
flavor. Tags must never overload desktop `stable` with server or deb builds
(`server-*`, `deb-*`, `server-deb-*`, etc.).

### Layer sketch

```text
                    quarry-server (Fedora bootc)
                         │
          ┌──────────────┴──────────────┐
          │                             │
   (future clean                 main today:
    Fedora desktop)              FROM bazzite:stable
                                 gaming stack

                    quarry-server-deb (Debian bootc)
                         │
                    quarry-deb (desktop)
```

Do **not** force main gaming Quarry to `FROM quarry-server` until someone
proves Steam/Gamescope/NVIDIA (or equivalent) layers cleanly. Bazzite-cut
remains the Fedora **gaming** desktop product unless overturned.



## Desktop environments (cross-cutting)

- **Default (gold):** KDE Plasma on all desktop-capable flavors.
- **Alternate:** exactly one TBD DE — **not GNOME** for now.
- Applies across Bazzite-cut, clean Fedora, Debian desktop, and later bases.
- Server/headless: no DE axis.
- Full rules: [`docs/desktop-environment-variants.md`](desktop-environment-variants.md).

## Decisions locked

| Decision | Date | Choice |
| --- | --- | --- |
| Main gaming desktop | prior | Bazzite cut, not a git fork of ublue/Bazzite |
| Desktop independence track | 2026-09-09 | Keep main; paper Debian/Ubuntu sibling |
| Server edition wanted | 2026-09-09 | Yes; candidate future base under desktops |
| Server **v1** base | 2026-09-09 | **Fedora bootc** |
| Full matrix | 2026-09-09 | Fedora + Debian, each server + desktop; other bases later |
| Post-Fedora-server spike | 2026-09-09 | **Debian server** before Debian desktop |

## Non-goals (all flavors)

- Fork or vendor `ublue-os/bazzite` git.
- Rebase live machines onto unproven images.
- Packaging-agnostic apt|dnf|zypper as a near-term CI product (research only).
- Killing `act_runner` mid-job, copying tokens off VMs, or crowding Pyro.
- Claiming deb desktop reproduces Bazzite gaming.
- Using Quarry server as a silent replacement for estate k3s/PVE hosts (out of scope unless separately decided).

## Policy shared across flavors

Lift intent from `docs/desktop-policy.md` and `docs/tooling.md`. Mechanics
differ per package manager.

| Policy | Fedora desktop (main) | Fedora server | Debian server | Debian desktop |
| --- | --- | --- | --- | --- |
| CLI | Mise, never Homebrew | Same | Same | Same |
| Containers | Podman; no Docker Engine on base | Same | Same | Same |
| Apps | Flatpak → AppImage → Distrobox | CLI/containers; Flatpak optional | Same as Fedora server | Flatpak + Flathub; Discover if KDE |
| Store fight | No Bazaar; Discover restored | n/a | n/a | No GNOME-Software-as-only-path requirement |
| Terminal | Konsole; Ghostty secondary | n/a | n/a | Same intent if KDE |
| Tailscale | ujust-shaped on main today | Our systemd/just | Our systemd/just | Our systemd/just |
| Sunshine | Desktop gaming path | **No** | **No** | Optional later |
| Gaming stack | From Bazzite | No | No | Not in v1 |
| Fonts | Adwaita Sans/Mono | n/a | n/a | Same if apt has them |
| Brand | Crystal, no mascot | Optional mark | Optional mark | Shared artwork ok |

## Upstream map

| Piece | Upstream | Role |
| --- | --- | --- |
| Fedora server | [Fedora bootc base images](https://gitlab.com/fedora/bootc/base-images) / `quay.io/fedora/fedora-bootc` | `quarry-server` FROM |
| Fedora gaming desktop | `ghcr.io/ublue-os/bazzite:stable` | main Quarry FROM (cut) |
| Debian server/desktop bases | [bootcrew/mono](https://github.com/bootcrew/mono) (replaces archived debian-bootc) | Pin digests; experimental |
| Optional modular stacks | [KyleGospo/snosi](https://github.com/KyleGospo/snosi) (Debian + mkosi/sysexts) | Track for add-ons, not v1 requirement |
| Ubuntu / others | bootcrew ubuntu/opensuse/arch, community Containerfiles | “Other bases later” row |

## Sequencing (disk-aware)

`quarry-builder-01` is ~80G. Bazzite FROM alone is large. **Do not** pull
Fedora bootc + Debian bootc + Bazzite concurrently without checking free
space (or use a second VM).

| Order | Work | Gate |
| --- | --- | --- |
| 0 | Main Bazzite-cut publish + consume | **Publish done** 2026-09-09; **consume-gate PASS** 2026-09-09/10 on VM 141 — see `docs/consume-gate.md`. ISO/minimal-installer spike: `docs/iso-spike.md`. |
| 1 | `quarry-server` spike on **Fedora bootc** | **Local rebuild OK** 2026-09-10 on quarry-builder-01 (`c61ca48619fa`, bootc lint pass w/ 3 warnings). Base digest pinned in `Containerfile.server`. |
| 2 | `quarry-server` publish (`server-testing`) + consume-server doc | **PASS** 2026-09-10: CI run 32216 green on `d34a27f`; public `server-testing`+`server-git-d34a27f` digest `sha256:ddfab295e4c3d8fa06a227b58e9382a5081d69f64fa99833668946c881f52b5c`; **consume-gate PASS** on VM 143 (sshd kept). See `docs/consume-server.md`. |
| 3 | Debian server spike (`quarry-server-deb`) | **Local-only historical.** Build+lint+boot+ESP-helper PASS 2026-09-10. **Parked / not near-term for public.** No `server-deb-testing`, no debian-testing CI promote. See `docs/server-deb-spike.md`. |
| 4 | `quarry-deb` desktop spike | **Parked** with public Debian — not near roadmap. |
| **5 (ACTIVE)** | Clean Fedora desktop FROM `quarry-server` (non-gaming) | **Local build + boot smoke PASS** 2026-09-10 (VM 149 destroyed). Tag `localhost/quarry-desktop-fedora:clean-spike` `43daef1505d6`. Tags `desktop-fedora-*` / `clean-*` only. Does **not** replace Bazzite-cut gaming. Default **no** public promote. See `docs/desktop-fedora-spike.md`. |
| **5b (paper)** | NVIDIA gaming desktop (`bazzite-nvidia-open` candidate) | **Paper only** 2026-09-10 — `docs/nvidia-flavor.md`. Same policy overlay as main; tags `nvidia-*` / `nvidia-open-*` never `:stable`. **No build / no promote / do not touch VM 141.** Not blocking clean-desktop day-2 or Deck paper. |
| **5c (paper)** | Deck / handheld (`bazzite-deck` candidate) | **Paper only** 2026-09-10 — `docs/deck-flavor.md`. Same policy overlay where Gamescope/HHD allows; tags `deck-*` never `:stable`. Optional later `deck-nvidia-open-*`. **No build / no promote / do not touch VM 141.** Not blocking clean-desktop day-2 or NVIDIA local build gate. |
| 5d (later) | Deck / NVIDIA local builds | Disk-safe on 140 one FROM at a time; throwaway consume only |
| 6 | Other bases | Only after clean Fedora desktop is real; Debian public cells still parked |

Repo layout default: **same Gitea repo** `desktop/quarry` with
`Containerfile` (main), later `Containerfile.server`, `Containerfile.server-deb`,
`Containerfile.deb` — split to `desktop/quarry-server` only if builder/CI
clarity demands it.

## Edition notes

### Fedora server (`quarry-server`)

- **Base:** Fedora bootc (locked).
- SSH ready, Podman, Mise, Tailscale path documented; no GUI; no Sunshine.
- Tags: `server-git-<sha7>`, `server-testing` — never desktop `stable`.
- Promote: workflow_dispatch `.gitea/workflows/image-build-server.yml` only (no main-push auto-promote).
- Future base for clean Fedora desktop and estate-shaped appliances.

### Fedora desktop

- **Gaming (now):** Bazzite cut — ship this first (`:stable`).
- **Clean (active):** Plasma (non-gaming) + shared policy on
  `quarry-server` / `Containerfile.desktop-fedora`. Local build + one-shot
  boot smoke **PASS** 2026-09-10. Tags `desktop-fedora-*` / `clean-*` only.
  No Sunshine/gaming; **no** Bazzite parity claim. Paper:
  `docs/desktop-fedora-spike.md`.
- **NVIDIA (paper, not blocking):** later gaming sibling FROM
  `bazzite-nvidia-open` (legacy `bazzite-nvidia` optional). Same desktop-policy
  overlay; tags `nvidia-*` / `nvidia-open-*` — **never** `:stable`. No build
  this run. See `docs/nvidia-flavor.md`.
- **Deck / handheld (paper, not blocking):** later Gamescope/HHD sibling FROM
  `bazzite-deck` (optional `bazzite-deck-nvidia-open`). Same policy overlay
  where the session allows; tags `deck-*` — **never** `:stable`. No build
  this run. See `docs/deck-flavor.md`.

### Debian server (`quarry-server-deb`) — **local-only / parked**

- bootcrew-class Debian bootc; pin digest in `Containerfile.server-deb`.
- **2026-09-10:** local overlay **unblocked** via varseed; boot + ESP-helper
  smoke **PASS** on throwaway VMs (destroyed). Interim
  `scripts/server-deb/` while bootupd absent. Details: `docs/server-deb-spike.md`.
- **PhreeStyle (2026-09-10):** stays **local-only**. **No** public
  `server-deb-testing`, **no** debian-testing CI promote — **not near roadmap**.
- Keep the spike in-tree as historical/local reference; do not list it in
  public installer `catalog.json`.

### Debian desktop (`quarry-deb`) — **parked**

- Policy parity where possible; gaming/NVIDIA **out of scope** for v1.
- Prefer `FROM quarry-server-deb` once public Debian is un-parked.
- **Not near-term** while public Debian server promote is parked.

### Other bases (future)

Add a row only after: bootc base exists, one successful server spike, disk
plan, and a one-page addendum under `docs/flavors/`. Do not open CI matrix
rows speculatively.

## Independence ladder

1. Main = Bazzite cut; overlay away ublue *opinions*.
2. `quarry-server` (Fedora) = bootc without ublue desktop/gaming.
3. Clean Fedora desktop on `quarry-server` (**active**; local smoke PASS).
4. NVIDIA gaming sibling FROM `bazzite-nvidia-open*` (**paper**; same overlay; not `:stable`).
5. Deck / handheld sibling FROM `bazzite-deck*` (**paper**; Gamescope/HHD; tags `deck-*` never `:stable`).
6. Debian server + desktop = apt line, shared policy (**parked** public; local spike historical).
7. Other bases / multi-VARIANT research.
8. Avoid: forking Bazzite git.

## Risks

- Builder disk exhaustion from multiple FROM caches.
- Tag confusion (`stable` must mean main gaming desktop only until renamed deliberately).
- Expectation that every matrix cell ships in one quarter — it will not.
- Experimental Debian bootc upstream churn — pin digests; be ready to keep a minimal Containerfile recipe.

## Open questions

1. ~~After Fedora server, which Debian cell~~ — Debian server spike done **local-only**; **public Debian parked** (2026-09-10 PhreeStyle).
2. Clean Fedora desktop DE: **Plasma (non-gaming)** for policy parity with main; minimal DE only if Plasma disk cost blocks builder — see `docs/desktop-fedora-spike.md`.
3. Long-term: should gaming Quarry ever leave Bazzite FROM, or stay a permanent special Fedora desktop?

Remaining defaults: same repo + multiple Containerfiles if disk allows;
Bazzite-cut remains the gaming product unless overturned.

4. NVIDIA: ship `nvidia-open` only, or also a legacy `nvidia` (proprietary) image? Default paper: **open-only** until a legacy host is named — `docs/nvidia-flavor.md`.

5. Deck: ship `bazzite-deck` only, or also `deck-nvidia-open`? Default paper: **deck-only** until a named NVIDIA handheld exists — `docs/deck-flavor.md`.
