You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
desktops: refresh browser map, tier_overrides, remove lifecycle, release list
Four corrections after the build framework / CI work:
1. Browser virtual table was stuck on a pre-apt.armbian.com draft where
noble and plucky both used epiphany-browser on every arch. Reality:
amd64 uses google-chrome-stable, arm64/armhf use chromium from
apt.armbian.com (Ubuntu's chromium deb is a snap-shim), Debian
riscv64 uses firefox-esr, Ubuntu riscv64 falls back to
epiphany-browser. Also document the loong64/sid entry and drop the
plucky block entirely — plucky is EOS, resolute replaced it.
2. tier_overrides example was built around plucky. Replace with the
current common.yaml shape: arch-wide strip of armbian-imager
(armhf/riscv64/loong64) at mid, arch-wide strip of 'code' (armhf
pre-t64 .deb + no riscv64 upstream) at full, and the current
per-release thunderbird-on-armhf-or-riscv64 holes.
3. Remove lifecycle step 9 was documented as 'pkg_remove → apt-get
autopurge'. The remove path now calls apt-get purge directly after
filtering out any package apt flags as essential-breaking from a
dry-run. Update the step list and add a paragraph explaining why
autopurge was dropped (t64-era orphan-cascade into e2fsprogs) and
why a dry-run-filter is still needed (some base images ship
without e2fsprogs, so the DE install pulls it in and the purge
list would otherwise target it).
4. Release list in overview, schema table, packages_uninstall pitfall,
and audit report example all mentioned plucky. Replace with
resolute/forky/sid/jammy to match the actual release set the
inventory declares in 2026.
Copy file name to clipboardExpand all lines: docs/Developer-Guide_Desktops.md
+78-38Lines changed: 78 additions & 38 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -14,8 +14,8 @@ The submodule provides:
14
14
-**Per-install manifest** — every install records exactly which packages it added so removal and downgrades only undo what they themselves did.
15
15
-**Custom APT repositories**, branding, group memberships, and skel sync.
16
16
-**Auto-login** management for `gdm3`, `sddm`, and `lightdm`, with non-destructive in-place edits of the underlying config files.
17
-
-**Per-release / per-arch package overrides** so the same YAML works across Debian bookworm/trixie and Ubuntu noble/plucky on amd64/arm64/armhf/riscv64 with different package availability.
18
-
-**Browser virtual token** that resolves per-release-per-arch (chromium on Debian, epiphany-browser on Ubuntu, firefox-esr on Debian riscv64, …).
17
+
-**Per-release / per-arch package overrides** so the same YAML works across Debian bookworm/trixie/forky/sid and Ubuntu jammy/noble/resolute on amd64/arm64/armhf/riscv64/loong64 with different package availability.
18
+
-**Browser virtual token** that resolves per-release-per-arch (google-chrome-stable on amd64, chromium on Debian/Ubuntu arm arches, firefox-esr on Debian riscv64, epiphany-browser on Ubuntu riscv64, …).
19
19
-**Container/CI awareness** so the same code path can be used inside Docker without trying to start a display manager.
20
20
21
21
## Tier model
@@ -110,7 +110,7 @@ Each desktop is defined in a single YAML file under `tools/modules/desktops/yaml
110
110
|`status`| string | yes | Editorial label — one of `supported`, `community`, `unsupported`. Reported via `DESKTOP_STATUS`. Affects only labelling and catalog filtering — does not block install. `community` is used for DEs that work but are maintained on a best-effort basis; `unsupported` for DEs that are known-broken or not vetted. |
111
111
|`tiers`| mapping | yes | Per-tier package lists, keyed by `minimal`, `mid`, `full`. See [Tier blocks](#tier-blocks). |
112
112
|`tier_overrides`| mapping | optional | Per-arch and/or per-release-per-arch package removals (and additions) for tier holes. See [tier_overrides](#tier-overrides). |
# The 'code' (VSCode) .deb on apt.armbian.com links against the
361
+
# pre-t64 library names, which don't exist on post-t64 releases
362
+
# (trixie+, noble+). amd64/arm64 were rebuilt; armhf wasn't. No
363
+
# riscv64 upstream build exists at all. Strip arch-wide on both
364
+
# until/unless the armhf .deb is refreshed.
365
+
architectures:
366
+
armhf: { packages_remove: [code] }
367
+
riscv64: { packages_remove: [code] }
339
368
releases:
340
369
bookworm:
341
370
architectures:
@@ -344,17 +373,14 @@ tier_overrides:
344
373
architectures:
345
374
armhf: { packages_remove: [thunderbird] }
346
375
noble:
347
-
# thunderbird on Ubuntu is a snap-shim that requires snapd
348
-
# which Armbian doesn't ship — strip it on every arch.
376
+
# thunderbird on Ubuntu noble armhf/riscv64 is absent (no
377
+
# upstream Ubuntu deb there), so strip on those two arches
378
+
# only. amd64/arm64 get the real .deb from apt.armbian.com.
349
379
architectures:
350
-
amd64: { packages_remove: [thunderbird] }
351
-
arm64: { packages_remove: [thunderbird] }
352
380
armhf: { packages_remove: [thunderbird] }
353
381
riscv64: { packages_remove: [thunderbird] }
354
-
plucky:
382
+
resolute:
355
383
architectures:
356
-
amd64: { packages_remove: [thunderbird] }
357
-
arm64: { packages_remove: [thunderbird] }
358
384
armhf: { packages_remove: [thunderbird] }
359
385
riscv64: { packages_remove: [thunderbird] }
360
386
```
@@ -370,9 +396,12 @@ The literal string `browser` inside any tier block resolves to a real package na
370
396
The per-release layer is needed because the same arch can resolve differently across releases:
371
397
372
398
- Debian has `firefox-esr` but **no** `firefox` package.
373
-
- Ubuntu's `chromium` deb is a snap-shim wrapper that requires `snapd`. Armbian doesn't ship snapd, so the shim is broken at runtime — substitute a real GTK browser instead. `epiphany-browser` (GNOME Web) is small, native deb, and available on every Ubuntu arch.
399
+
- Ubuntu's `chromium` / `firefox` debs are snap-shim wrappers that require `snapd`. Armbian doesn't ship snapd, so the shims are broken at runtime — apt.armbian.com hosts real `chromium` / `firefox` / `google-chrome-stable` .debs used instead.
400
+
- amd64 always gets `google-chrome-stable` (Google publishes no arm/riscv builds, so this is amd64-only).
374
401
- `chromium`isn't built for riscv64 in either Debian or Ubuntu.
375
-
- `firefox`isn't built for noble/plucky riscv64 either.
402
+
- Ubuntu doesn't publish `firefox` or `firefox-esr` for riscv64 (Mozilla has no riscv64 binaries, and `firefox-esr` is a Debian-only package name). Fall back to `epiphany-browser` (GNOME Web) there — native GTK, small, and available on every Ubuntu arch.
403
+
- Debian riscv64 gets `firefox-esr` because the Debian archive does publish it for riscv64.
404
+
- `loong64`is only declared for `sid` in the inventory; `chromium` isn't built there yet either, so it uses `firefox-esr`.
376
405
377
406
## Python helper: parse_desktop_yaml.py
378
407
@@ -661,24 +690,35 @@ If step 11 or 12 fails, the function returns 1 with no further state changes —
The `set-default` and `isolate` calls together ensure the user gets a console login on tty1 immediately after the uninstall, without needing to reboot. Without them, the system stays pinned to `graphical.target` with no DM behind it and the local console is blank.
681
715
716
+
**Why the essential filter (step 9).** The remove path calls `apt-get -y purge` directly — **not**`pkg_remove` (which wraps `apt-get autopurge`). `autopurge` adds an orphan-cleanup cascade on top of the removal, and on fresh post-t64 images (trixie+, noble+) several shared libs pulled in alongside `e2fsprogs` (`libext2fs2t64`, `libss2`, `logsave`) are marked auto-installed. Once the DE is gone nothing manual depends on them, autopurge proposes to orphan-remove the whole chain, and apt 2.9+ / solver 3.0 vetoes the transaction with `E: Essential packages were removed and -y was used without --allow-remove-essential` — nothing actually gets removed. A plain `apt-get purge` avoids the cascade, and the manifest is already the complete list, so no cascade is needed.
717
+
718
+
A separate case the filter catches: some base images (notably `armbian/repository-update:*-armhf` tags rebuilt from debian-slim) ship without `e2fsprogs` pre-installed. When a DE's install pulls in `dracut-install` or `gnome-disk-utility` transitively, those pull `e2fsprogs`, it lands in the manifest, and purging it would touch an Essential package. Step 9 simulates the purge, parses apt's essential-warning block (stripping `(due to X)` annotations), and drops every flagged name from the list before the real purge runs.
719
+
720
+
On failure of step 10 the function returns 1 with the manifest left in place, so the next `remove` retries against the same list rather than falling into the less-precise YAML-walk path.
721
+
682
722
## Lifecycle: upgrade and downgrade
683
723
684
724
`upgrade` and `downgrade` are the two halves of `_module_desktops_change_tier`:
@@ -890,7 +930,7 @@ If Claude judged the report non-actionable (e.g. the only finding is a `csc`-tie
890
930
891
931
### packages_uninstall cascade
892
932
893
-
Listing a package in `tiers.minimal.packages_uninstall` runs `apt-get remove --purge` on it after the install. If that package is a hard `Depends:` of any meta package the DE install pulled in, apt's autoremove cascade will yank the meta package along with it — and on systems with `APT::Get::AutomaticRemove "true"` (Ubuntu noble/plucky), the cascade keeps going and rips out a chunk of the desktop. Real examples that bit us:
933
+
Listing a package in `tiers.minimal.packages_uninstall` runs `apt-get remove --purge` on it after the install. If that package is a hard `Depends:` of any meta package the DE install pulled in, apt's autoremove cascade will yank the meta package along with it — and on systems with `APT::Get::AutomaticRemove "true"` (Ubuntu noble/resolute), the cascade keeps going and rips out a chunk of the desktop. Real examples that bit us:
894
934
895
935
- Listing any `xfce4-goodies` plugin (e.g. `xfce4-clipman-plugin`) yanks `xfce4-goodies` itself, then half the desktop.
896
936
- Listing `language-selector-gnome` yanks `gnome-control-center` (which has it as a hard Depends on Ubuntu), so the user loses Settings.
0 commit comments