desktops: migrate from config/desktop/ tree to armbian-config module_desktops#9683
Open
igorpecovnik wants to merge 11 commits intomainfrom
Open
desktops: migrate from config/desktop/ tree to armbian-config module_desktops#9683igorpecovnik wants to merge 11 commits intomainfrom
igorpecovnik wants to merge 11 commits intomainfrom
Conversation
Contributor
|
Important Review skippedToo many files! This PR contains 300 files, which is 150 over the limit of 150. ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (300)
You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Merged
3 tasks
igorpecovnik
added a commit
to armbian/documentation
that referenced
this pull request
Apr 16, 2026
Adds the `mode=build` parameter to the command synopsis and the install lifecycle table. Each step is now tagged: [B] = runs in both modes (build + runtime) [R] = runtime-only (skipped when mode=build) Explains when/why mode=build is used (image-build time, no user) and how the first boot inherits skel + graphical.target. Matches armbian/configng#859 (implementation) and armbian/build#9683 (build framework consumer).
ddbbcc0 to
bda6655
Compare
9e10a14 to
e7fbcdc
Compare
Contributor
|
Caution Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted. Error details |
bef77d3 to
f2b2344
Compare
4e957b7 to
8cefebb
Compare
4dfe80e to
ca3f9e9
Compare
Two orthogonal knobs for userspace blocks in
userpatches/targets-*.yaml:
* tiers: [minimal, mid, full]
Emit one item per tier for every matched (release, arch,
desktop) triple. armbian-config's module_desktops treats
minimal / mid / full as separate install targets with
different package sets, so they can't share a rootfs
artifact — they need separate matrix items. Default stays
['mid'] so pre-existing targets that don't know about this
knob keep producing one userspace per desktop, same as
before. Targets that want the full fan-out set
'tiers: [minimal, mid, full]' explicitly.
* skip-arches: [loong64]
only-arches: [armhf]
Post-filter the arch set after the inventory expansion.
Existed on the desktops axis before ('skip-desktops' /
'only-desktops'); now mirrored on the arches axis. Used
by the os-repo targets yaml to e.g. skip loong64 from an
otherwise all-arches block that would normally pick it up.
Also fold a few per-board ARCH overrides into
config/boards/ (aml-t95z-plus.tvb gains its fourth arch, the
new ayn-odin2* boards declare arm64 explicitly, etc.) since the
inventory expansion is now arch-aware at the target-yaml level
and boards need to declare their arch for the filter to match.
The tier model (minimal / mid / full) subsumes the old per-group package axis — 'full' already includes everything the old appgroups provided (office, multimedia, programming, chat, remote_desktop, desktop_tools, editors, email, internet). Userpatches and board configs in the wild still set DESKTOP_APPGROUPS_SELECTED, and silently ignoring it would produce a thinner desktop than the user expects. Map it to tier=full when DESKTOP_TIER isn't set explicitly, with one carve-out: the sentinel 'none' (meaning 'base DE, no extras') is treated as empty — the user didn't actually pick any appgroups, so don't upgrade them to tier=full on the basis of a placeholder value. Print a one-liner warning so the operator sees the mapping and can switch to explicit tier= when they next edit the config.
armbian-plymouth-theme was installed from rootfs-create.sh after the rootfs cache was extracted. That's the wrong place for it: distro-agnostic.sh already owns the 'post-cache, pre-image' step where branding and bsp packages land, and splitting plymouth out into its own call in rootfs-create means it runs in the per-chroot pre-cache path on builds that hit a cache miss, but NOT in the post-cache path on a cache hit — inconsistent. Move the install back into distro-agnostic.sh where every desktop build passes through it regardless of rootfs cache state, and drop the corresponding stanza from rootfs-create.sh. Net: plymouth ends up on every desktop image, cache-hit or cache-miss, with no code duplication.
artifact_rootfs_cli_adapter_config_prep set SKIP_ARMBIAN_REPO=yes unconditionally, which made sense when rootfs assembly only needed the distro archive. It doesn't anymore: the new desktop install path runs 'armbian-config --api module_desktops install mode=build' from inside rootfs-create.sh (see earlier commit in this PR), and armbian-config itself lives in the <release>-utils component of apt.armbian.com, with firefox / chromium / GNOME branding in <release>-desktop. With SKIP_ARMBIAN_REPO=yes forced on, the install step would hit 'E: Unable to locate package armbian-config' at rootfs-create time for every desktop build. Default the variable to 'no' instead, so apt.armbian.com is attached during rootfs assembly, and make it a readonly '-g -r' declaration so a hook can't flip it back under our feet. Boards / userpatches that still need the old repo-free behaviour (air-gapped mirror setups, exotic embedded use cases) can still pre-set SKIP_ARMBIAN_REPO=yes before the function runs — the ':-' default only kicks in when it's unset.
…nto cache_type
Two bugs that conspired to make 'new configng commit but still
served the old rootfs from cache' the default behaviour.
1. The fetch_from_repo for armbian-configng was gated inside the
'[[ -z $DESKTOP_ENVIRONMENT ]]' branch of
interactive_desktop_main_configuration, so it only fired when
the user picked a DE from the interactive dialog. Every
non-interactive build (CI, items-from-inventory, scripted
local with DESKTOP_ENVIRONMENT= pre-set) skipped the fetch —
which left whatever stale clone happened to live in
cache/sources/armbian-configng/ as the source of truth for
the CONFIGNG_DESKTOPS_HASH input.
Hoist the fetch + parser-path sanity check up above the gate
so every BUILD_DESKTOP=yes invocation pulls branch:main.
fetch_from_repo is idempotent on an already-cloned tree
(just a git pull) so the warm-cache cost is one up-to-date
check.
2. The resolved rootfs tarball filename is
rootfs-<arch>-<release>-<cache_type>_<yyyymm>-<cache_id>.tar.zst.
cache_id = packages_hash came from AGGREGATED_ROOTFS_HASH +
hook hash + bash hash — none of which see armbian-configng.
cache_type encoded DESKTOP_ENVIRONMENT ('xfce-desktop',
'gnome-desktop', …) but not DESKTOP_TIER and not any
fingerprint of the configng tree. Consequences:
- A tier=minimal rootfs and a tier=full rootfs for the same
DE collided on one filename. Whichever built first got
cached; every subsequent tier silently reused its tarball.
- A configng commit that changed which packages a DE
installs (yaml edit, tier_override bump, new browser
mapping) produced a different CONFIGNG_DESKTOPS_HASH in
artifact_input_variables, but the local tarball was still
named the same, so the lookup kept hitting the pre-change
artifact.
Fold both into cache_type. Net rename:
rootfs-arm64-trixie-xfce-desktop_…tar.zst
→
rootfs-arm64-trixie-xfce-desktop-mid-a1b2c3d4_…tar.zst
8-char suffix is the configng commit prefix. Only injected
for BUILD_DESKTOP=yes; only when the value is a real SHA
(not the 'undetermined' / 'unknown' sentinels the
computation falls back to on clone failures).
43eae27 to
0f8c676
Compare
5 tasks
config/desktop/ tree to armbian-config module_desktops
igorpecovnik
added a commit
to armbian/documentation
that referenced
this pull request
Apr 20, 2026
Adds the `mode=build` parameter to the command synopsis and the install lifecycle table. Each step is now tagged: [B] = runs in both modes (build + runtime) [R] = runtime-only (skipped when mode=build) Explains when/why mode=build is used (image-build time, no user) and how the first boot inherits skel + graphical.target. Matches armbian/configng#859 (implementation) and armbian/build#9683 (build framework consumer).
5 tasks
igorpecovnik
added a commit
to armbian/armbian.github.io
that referenced
this pull request
Apr 21, 2026
armbian-config's module_desktops treats minimal / mid / full as three distinct install targets. The build framework hard-requires an explicit DESKTOP_TIER whenever BUILD_DESKTOP=yes; a missing value causes 'module_desktops install' to bail at config-validation time. generate_targets.py emits 12 'desktop-*' target blocks across the stable / legacy / edge / nightly flavours. None of them set DESKTOP_TIER today, so every regenerated targets.yaml will start failing desktop builds once the build-side migration (armbian/build#9683 — replace config/desktop/ tree with armbian-config module_desktops) lands. Map tier from the existing DESKTOP_APPGROUPS_SELECTED value that each block already carries: DESKTOP_APPGROUPS_SELECTED='' → DESKTOP_TIER='minimal' 8 blocks: plain DE + display manager, ~500 MB. Matches the bare desktop the empty-appgroup target produced before. DESKTOP_APPGROUPS_SELECTED='programming' → DESKTOP_TIER='mid' 4 blocks: DE + browser + everyday user-facing tools (editor, calculator, media, archive, torrent), ~1 GB. Roughly what the 'programming' appgroup pulled in on top of the bare desktop. Neither maps to 'full' — none of the current generate_targets.py blocks wanted the full tier (office suite + creative tools, ~2.5 GB). Future targets can override per block when needed.
igorpecovnik
added a commit
to armbian/armbian.github.io
that referenced
this pull request
Apr 21, 2026
armbian-config's module_desktops treats minimal / mid / full as three distinct install targets. The build framework hard-requires an explicit DESKTOP_TIER whenever BUILD_DESKTOP=yes; a missing value causes 'module_desktops install' to bail at config-validation time. generate_targets.py emits 12 'desktop-*' target blocks across the stable / legacy / edge / nightly flavours. None of them set DESKTOP_TIER today, so every regenerated targets.yaml will start failing desktop builds once the build-side migration (armbian/build#9683 — replace config/desktop/ tree with armbian-config module_desktops) lands. Map tier from the existing DESKTOP_APPGROUPS_SELECTED value that each block already carries: DESKTOP_APPGROUPS_SELECTED='' → DESKTOP_TIER='minimal' 8 blocks: plain DE + display manager, ~500 MB. Matches the bare desktop the empty-appgroup target produced before. DESKTOP_APPGROUPS_SELECTED='programming' → DESKTOP_TIER='mid' 4 blocks: DE + browser + everyday user-facing tools (editor, calculator, media, archive, torrent), ~1 GB. Roughly what the 'programming' appgroup pulled in on top of the bare desktop. Neither maps to 'full' — none of the current generate_targets.py blocks wanted the full tier (office suite + creative tools, ~2.5 GB). Future targets can override per block when needed.
Three lines in armbian-bsp-cli's postinst:
if [[ -L "/usr/lib/chromium-browser/master_preferences.dpkg-dist" ]]; then
mv /usr/lib/chromium-browser/master_preferences.dpkg-dist /usr/lib/chromium-browser/master_preferences
fi
shipped in 2018 (commit e7657a5) alongside
packages/bsp/common/usr/lib/chromium-browser/master_preferences.dpkg-dist,
as the tail half of a rescue pattern that dealt with chromium-browser's
conffile clashing with an armbian-supplied symlink/preseed file.
The ship-side half was removed long ago — bsp-cli no longer packages
anything under /usr/lib/chromium-browser/ — so the -L test is never
true on a fresh install. Dead code.
It's also the wrong architectural coupling in the new world:
chromium branding (master_preferences, policies, chromium.d flags)
lives in armbian-config as of the first commit in this PR
(configng:tools/modules/desktops/branding/browsers/etc/). bsp-cli
shouldn't be touching chromium at all.
Drop the dead rescue.
Also wipe packages/blobs/desktop/ wholesale. The entire subtree
(124 files, ~4000 lines: chromium.conf / firefox.conf / icons /
desktop-icons / desktop-splash / desktop-wallpapers / lightdm /
lightdm-wallpapers / sddm / skel / xorg.conf.cubox) was consumed
exclusively by the per-DE create_desktop_package.sh scripts under
config/desktop/, deleted in the first commit of this PR. No live
reference remains — grep -rln across lib/ config/ extensions/
packages/ returns zero hits for every path under
packages/blobs/desktop/.
Source of truth for desktop branding assets is now
configng:tools/modules/desktops/branding/ (wallpapers, greeters,
skel, browser policies).
84ba011 to
b9cc0b1
Compare
… armbian-config
Two hooks in extensions/mesa-vpu.sh are now redundant with
armbian-config's module_desktops:
* extension_prepare_config__3d — appended panthor-gpu to
DEFAULT_OVERLAYS on rockchip-rk3588 / rk35xx + BRANCH=vendor.
module_desktops now enables the same overlay via
_module_desktops_add_3d_overlay (configng commit 8248b497),
which delegates to the existing module_devicetree_overlays
install path — atomic armbianEnv.txt rewrite, .bak preserved,
validates against the discovered .dtbo set, idempotent. Same
gating (BOARDFAMILY + BRANCH + release + tier + DE) enforced
on the configng side. Covers both image-build
(module_desktops install mode=build) and install-on-minimal
(runtime armbian-config invocation).
* post_armbian_repo_customize_image__browser — installed a
browser (google-chrome-stable on amd64, chromium on arm64 /
armhf, firefox elsewhere) via chroot_sdcard_apt_get_install
AFTER module_desktops had already placed our branded
chromium conffiles. That second apt run — without
--force-confdef --force-confold — tripped dpkg's 'File on
system created by you or by a script' prompt on our
/etc/chromium/master_preferences. The hook is also
architecturally duplicated: configng's common.yaml 'browser'
virtual token resolves to the correct package per
(release, arch), more correctly than this hook (this fallback
used plain 'firefox' which only exists on Ubuntu — Debian
riscv64 needs firefox-esr; Ubuntu riscv64 needs
epiphany-browser; configng handles both). Drop the hook.
The remaining hook (post_install_kernel_debs__3d) stays — it
carries genuine build-framework-only responsibilities: the
rk3588-specific rockchip-multimedia PPA + its packages
(rockchip-multimedia-config / libv4l-rkmpp / gstreamer1.0-rockchip /
libwidevinecdm0), the KDE Neon base-files / libdav1d7 holds, and
the final dist-upgrade pass. Those all gate on board / kernel /
release combinations that configng (which only knows release ×
arch, not LINUXFAMILY × BRANCH) can't express today.
…d tier Second phase of the mesa-vpu → configng migration (first phase: Hook 1 overlay + Hook 3 browser, commit deb764d). The package list in post_install_kernel_debs__3d (libgl1-mesa-dri, libglx-mesa0, mesa-utils, mesa-vulkan-drivers, vulkan-tools, and the four glmark2-{,es2-}{wayland,x11} flavours) is DE-agnostic desktop GPU-runtime content. Moving it to armbian-configng's common.yaml mid tier (configng commit f175558d) means every mid-tier desktop install gets the same set, whether it's an image-build going through module_desktops mode=build or a runtime install on an already-booted minimal image via armbian-config. Three phantom entries from the original list were dropped on the configng side and also removed from this hook: mesa-utils-extra — no such binary package in any Debian/Ubuntu release (archive dropped it years ago) glmark2 — source package only; only the -{wayland,es2-wayland,x11,es2-x11} binaries ship glmark2-es2 — same, no binary package ships under that name apt has been silently skipping them on every mesa-vpu run with 'E: Unable to locate package', cluttering logs without affecting the build outcome. What remains in post_install_kernel_debs__3d after this trim is genuinely build-framework-only territory — things configng (RELEASE × ARCH keyed) can't express because they need LINUXFAMILY × BRANCH awareness: - rockchip-rk3588 / rk35xx + noble + vendor conditional rockchip multimedia PPA (liujianfeng1994/rockchip-multimedia), with its rockchip-multimedia-config / libv4l-rkmpp / gstreamer1.0-rockchip / libwidevinecdm0 payload - libv4l-0 pre-req install (precedes rockchip-multimedia) - KDE Neon base-files hold/unhold workaround - noble/oracular arm libdav1d7 hold/unhold - final dist-upgrade pass (to pick up whatever the PPAs shift) The install call is now gated on `pkgs` being non-empty so non-rk3588 boards don't invoke apt with zero package names.
This was referenced Apr 21, 2026
All remaining responsibilities of post_install_kernel_debs__3d moved to
armbian-configng's module_desktops, invoked via `module_desktops install
mode=build` during rootfs cache assembly:
- Mesa runtime + Vulkan drivers + glmark2/mesa-utils/vulkan-tools:
configng common.yaml mid tier (armbian/configng 3d8fff72).
- panthor-gpu DT overlay: _module_desktops_rockchip_multimedia
stage 2 (armbian/configng 41310eff).
- amazingfated ppa:liujianfeng1994/rockchip-multimedia + pin at
priority 1001 + rockchip-multimedia-config, libv4l-rkmpp,
gstreamer1.0-rockchip, libwidevinecdm0 install on noble/rk3588/
vendor: _module_desktops_rockchip_multimedia stage 1
(armbian/configng 1329d6b4, follow-up in armbian/configng#887
for the libv4l-0 pre-install ordering).
Caveat: configng sets up the PPA + pin and installs the multimedia
packages, but does not run a post-install `apt-get dist-upgrade
--allow-downgrades` to actively swap pre-installed chromium from
apt.armbian.com to the PPA's hardware-accelerated build. That swap
now happens on the user's first `apt upgrade` after boot (priority
1001 permits the downgrade-across-origins); shipped images carry
the apt.armbian.com chromium. If we want image-time swap back, a
follow-up in configng can add the dist-upgrade inside the same
noble/rk3588/vendor gate. The KDE-neon `apt-mark hold base-files`
and arm-noble/oracular `apt-mark hold libdav1d7` bracket calls are
dropped along with the dist-upgrade they were guarding.
No enable_extension or config references to mesa-vpu remain in the
build tree; no other callers to remove.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Overview
Replaces Armbian's legacy
config/desktop/machinery (~10,000 lines of package lists, per-DE/per-release postinst scripts, create-package shell scripts, and build-sidearmbian-desktop/armbian-bsp-desktopmeta-package producers) with a single YAML-driven desktop pipeline maintained inarmbian/configngundertools/modules/desktops/.At image-build time the rootfs-create pipeline now calls:
inside the chroot. configng's
module_desktopsreads its YAML definitions, resolves packages / repo pins / branding / tier overrides for the target(release, arch, DE, tier)and installs the result. The build framework no longer synthesises package lists fromconfig/desktop/…/config_base/packages+ appgroup fan-out — that tree is deleted wholesale.What's in this PR
7 commits, each a self-contained logical unit, in dependency order:
desktops: replace legacy config/desktop/ tree with armbian-config module_desktops— the core wire-up. Rewritesinteractive_desktop_main_configuration, hooksmodule_desktops install mode=buildintorootfs-create.sh, deletesconfig/desktop/+artifact-armbian-desktop+artifact-armbian-bsp-desktop+rootfs-desktop.sh, drops the duplicate DM-disable, regenerates the library-functions loader. ~9,500 deletions, ~200 insertions.tools: source desktop inventory from armbian-configng YAMLs—armbian_utils.armbian_get_all_userspace_inventorynow subprocessesparse_desktop_yaml.py --list-jsoninstead of walking the removed tree. Keepsstatus: supportedfor the auto-generated matrix (community DEs are installable but don't fan out into CI by default; unsupported DEs never).targets-compositor: add tiers + skip/only-arches to items-from-inventory— two orthogonal knobs foruserpatches/targets-*.yaml:tiers: [minimal, mid, full]to emit one rootfs per tier per matched DE, andskip-arches:/only-arches:for arch-level filtering on the items side (mirrors the existing desktops-side filters).desktops: backwards-compat for legacy DESKTOP_APPGROUPS_SELECTED— userpatches in the wild still set this; map non-empty values totier=fullwhenDESKTOP_TIERisn't explicit, with"none"treated as empty.rootfs-create: restore armbian-plymouth-theme install to distro-agnostic— move the install back into the post-cache path so it lands on every desktop image, cache-hit or cache-miss.artifact-rootfs: stop forcing SKIP_ARMBIAN_REPO=yes; default to no—armbian-configlives in<release>-utilson apt.armbian.com; the new rootfs-create flow needs the repo attached during assembly.rootfs cache: refresh configng every build; fingerprint tier + hash into cache_type— two cache-correctness bugs: (a)fetch_from_repo armbian-configngwas gated on-z $DESKTOP_ENVIRONMENTso non-interactive (CI / items-from-inventory) builds never refreshed the clone and the cache-key input was stale; (b)cache_typeencoded DE but notDESKTOP_TIERand not any fingerprint of the configng tree, so tier=minimal and tier=full collided, and configng commits didn't produce cache misses. Both fixed.Non-desktop-related cleanup commits were split out of this PR into #9704 (verbose mmdebstrap,
DOCKER_PRUNE=yesopt-in, broken drm/xe patches disabled). #9704 is not a prerequisite here and vice-versa.Companion work in other repos
This PR lands alongside a large body of work in the rest of the Armbian org:
armbian/configng— new home of everything desktoptools/modules/desktops/subsystem: 11 per-DE YAML files,common.yamlwith shared tier definitions + browser substitution table +tier_overrides(arch-wide and per-release-per-arch), the standalonescripts/parse_desktop_yaml.pyCLI, the mainmodule_desktops.shdispatcher, per-module helpers (module_desktop_branding.sh,module_desktop_repo.sh,module_desktop_yamlparse.sh,module_desktop_getuser.sh,module_update_skel.sh), optionalpostinst/<de>.shhooks, shared branding (wallpapers, greeters, skel, browser policy files), and greeter configs (lightdm + sddm plasma-chili theme).module_desktopssupports:install/remove/upgrade/downgrade/set-tier/tier/at-tier/status/auto/manual/login/supported/installed.install mode=buildskips user / DM / skel work for image-build contexts.apt installof resolved package list → DM install → armbian-plymouth-theme (runtime only) → manifest + tier marker under/etc/armbian/desktop/→ branding copy → (if live) group adds, skel propagation, DM start, auto-login config.apt-get -s purgedry-run, drop anything flagged as essential-breaking, then real purge) — avoids thee2fsprogs/libext2fs2t64vetos that cancel the whole transaction on post-t64 base images._module_desktops_configure_networkingflips/etc/netplan/fromrenderer: networkdtorenderer: NetworkManageron a live install so the NM applet actually controls the link, mirroring the build-time extension inarmbian/build/extensions/network/.parse_desktop_yaml.pyemitsDESKTOP_PACKAGES/DESKTOP_PACKAGES_UNINSTALL/DESKTOP_DM/DESKTOP_STATUS/DESKTOP_AVAILABLE/DESKTOP_PRIMARY_PKG/DESKTOP_REPO_*, plus--list/--list-json/--primariesmodes with--filter available|unavailable|alland--status <csv>axes.maintenance-desktop-audit.yml(weekly, Claude-assisted YAML drift PRs),maintenance-unit-tests.yml(multi-arch matrix with native + qemu-emulated runners, per-test JSON results, publish to armbian.github.io, backfill for runner-killed jobs).tests/<DE>NN.confwithRELEASE/TESTARCH/tierknobs. Current coverage: XFCE01/02 + GNME01/02 on bookworm/trixie/noble/resolute × arm64/amd64/armhf/riscv64 where supported.armbian/os— targets YAML catch-upuserpatches/targets-all-not-eos.yamlrewritten:tiers: [minimal, mid, full]on everyitems-from-inventory.userspaceblock,skip-releases: [questing, sid],only-desktops:dropped (rely on configng'sstatusfilter in the compositor), loong64 scoped tosid+tiers: [minimal]only.external/widevine-noble.confadded — pullslibwidevinecdm0arm64/armhf fromliujianfeng1994/rockchip-multimediaPPA so Chromium can play DRM-protected streams on noble desktops.external/chromium-*.conf+firefox-*.confsuite aligned with the browser map in configng'scommon.yaml.armbian/documentation— Developer-Guide_Desktops.mdFull rewrite of the Desktops developer guide: YAML schema, tier model, resolution algorithm, browser virtual-token lookup,
tier_overridestwo-layer schema,module_desktopsbash API surface, lifecycle diagrams for install / remove / upgrade / downgrade / set-tier, container/CI awareness, "adding a new desktop" recipe, matrix-audit automation, common pitfalls (packages_uninstall cascade, gdm3 daemon.conf vs custom.conf, login-regex anchoring), security notes (path traversal, shell-escaping, GPG keyring fetch, apt[signed-by=]).armbian/docker-armbian-build— build-time container images.github/workflows/build-docker-images.ymlgained riscv64 + armhf in its matrix so the configng unit-test workflow can pull per-(release, arch) base images for every slot including the qemu-emulated ones..github/dependabot.ymladded for github-actions ecosystem tracking.armbian/armbian.github.io— publish + repo plumbinginfrastructure-download-external.yml:preclean/postcleanpurge jobs now gated onCHUNK_INDEX == 0so the repo-side delete op runs exactly once per workflow instead of 4× in parallel (the fan-out is only useful for per-package download, not for shared-state aptly deletes).infrastructure-repository-update.yml: addedFix workspace ownershippre-checkout steps on everyruns-on: repositoryjob so rerun / multi-runner handoffs don't tripactions/checkout@v6on root-owned workspace leftovers.databranch feed) modelled afterdata-update-jira-excerpt.yml— commits todatabranch with retry-rebase, thenrepository_dispatch→Web: Directory listingto trigger the site rebuild.Test plan
./compile.sh BOARD=uefi-x86 BRANCH=current RELEASE=trixie BUILD_DESKTOP=yes DESKTOP_ENVIRONMENT=xfce DESKTOP_TIER=mid— rootfs assembles, armbian-config installs from apt.armbian.com,module_desktops install mode=buildpulls xfce from configng YAML, image boots with NM-driven network + lightdm + XFCE default wallpaper.BUILD_MINIMAL=yes, CLI) unaffected — no configng clone pulled, no desktop code paths touched.parse_desktop_yaml.py --list-json <release> <arch>resolves the expected supported DEs for every non-eos release we ship.items-from-inventoryexpansion produces the right slot count fortargets-all-not-eos.yaml(~360 userspace rootfs + board-basedall-desktop/all-cliimages).CONFIGNG_DESKTOPS_HASHfingerprint incache_type).DESKTOP_APPGROUPS_SELECTED=office,multimedia ./compile.sh …logs the back-compat mapping and produces atier=fullrootfs.Rollback
Revert in reverse order. Commit #1 is the hardest to roll back cleanly (legacy
config/desktop/tree is recoverable from git history but is 10K+ lines). Commits #2–#7 are each small and independently revertable.