Skip to content

desktops: migrate from config/desktop/ tree to armbian-config module_desktops#9683

Open
igorpecovnik wants to merge 11 commits intomainfrom
desktop-to-armbian-config
Open

desktops: migrate from config/desktop/ tree to armbian-config module_desktops#9683
igorpecovnik wants to merge 11 commits intomainfrom
desktop-to-armbian-config

Conversation

@igorpecovnik
Copy link
Copy Markdown
Member

@igorpecovnik igorpecovnik commented Apr 16, 2026

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-side armbian-desktop/armbian-bsp-desktop meta-package producers) with a single YAML-driven desktop pipeline maintained in armbian/configng under tools/modules/desktops/.

At image-build time the rootfs-create pipeline now calls:

armbian-config --api module_desktops install de=${DESKTOP_ENVIRONMENT} tier=${DESKTOP_TIER:-mid} mode=build

inside the chroot. configng's module_desktops reads 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 from config/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:

  1. desktops: replace legacy config/desktop/ tree with armbian-config module_desktops — the core wire-up. Rewrites interactive_desktop_main_configuration, hooks module_desktops install mode=build into rootfs-create.sh, deletes config/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.
  2. tools: source desktop inventory from armbian-configng YAMLsarmbian_utils.armbian_get_all_userspace_inventory now subprocesses parse_desktop_yaml.py --list-json instead of walking the removed tree. Keeps status: supported for the auto-generated matrix (community DEs are installable but don't fan out into CI by default; unsupported DEs never).
  3. targets-compositor: add tiers + skip/only-arches to items-from-inventory — two orthogonal knobs for userpatches/targets-*.yaml: tiers: [minimal, mid, full] to emit one rootfs per tier per matched DE, and skip-arches: / only-arches: for arch-level filtering on the items side (mirrors the existing desktops-side filters).
  4. desktops: backwards-compat for legacy DESKTOP_APPGROUPS_SELECTED — userpatches in the wild still set this; map non-empty values to tier=full when DESKTOP_TIER isn't explicit, with "none" treated as empty.
  5. 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.
  6. artifact-rootfs: stop forcing SKIP_ARMBIAN_REPO=yes; default to noarmbian-config lives in <release>-utils on apt.armbian.com; the new rootfs-create flow needs the repo attached during assembly.
  7. rootfs cache: refresh configng every build; fingerprint tier + hash into cache_type — two cache-correctness bugs: (a) fetch_from_repo armbian-configng was gated on -z $DESKTOP_ENVIRONMENT so non-interactive (CI / items-from-inventory) builds never refreshed the clone and the cache-key input was stale; (b) cache_type encoded DE but not DESKTOP_TIER and 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=yes opt-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 desktop

  • New tools/modules/desktops/ subsystem: 11 per-DE YAML files, common.yaml with shared tier definitions + browser substitution table + tier_overrides (arch-wide and per-release-per-arch), the standalone scripts/parse_desktop_yaml.py CLI, the main module_desktops.sh dispatcher, per-module helpers (module_desktop_branding.sh, module_desktop_repo.sh, module_desktop_yamlparse.sh, module_desktop_getuser.sh, module_update_skel.sh), optional postinst/<de>.sh hooks, shared branding (wallpapers, greeters, skel, browser policy files), and greeter configs (lightdm + sddm plasma-chili theme).
  • module_desktops supports: install / remove / upgrade / downgrade / set-tier / tier / at-tier / status / auto / manual / login / supported / installed. install mode=build skips user / DM / skel work for image-build contexts.
  • Install pipeline: apt pin write → custom repo setup → apt install of 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.
  • Remove pipeline: manifest-driven purge with essential-package filtering (apt-get -s purge dry-run, drop anything flagged as essential-breaking, then real purge) — avoids the e2fsprogs / libext2fs2t64 vetos that cancel the whole transaction on post-t64 base images.
  • Runtime networking transition: _module_desktops_configure_networking flips /etc/netplan/ from renderer: networkd to renderer: NetworkManager on a live install so the NM applet actually controls the link, mirroring the build-time extension in armbian/build/extensions/network/.
  • parse_desktop_yaml.py emits DESKTOP_PACKAGES / DESKTOP_PACKAGES_UNINSTALL / DESKTOP_DM / DESKTOP_STATUS / DESKTOP_AVAILABLE / DESKTOP_PRIMARY_PKG / DESKTOP_REPO_*, plus --list / --list-json / --primaries modes with --filter available|unavailable|all and --status <csv> axes.
  • Maintenance GHA workflows: 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).
  • Test harness: per-DE tests/<DE>NN.conf with RELEASE / TESTARCH / tier knobs. Current coverage: XFCE01/02 + GNME01/02 on bookworm/trixie/noble/resolute × arm64/amd64/armhf/riscv64 where supported.

armbian/os — targets YAML catch-up

  • userpatches/targets-all-not-eos.yaml rewritten: tiers: [minimal, mid, full] on every items-from-inventory.userspace block, skip-releases: [questing, sid], only-desktops: dropped (rely on configng's status filter in the compositor), loong64 scoped to sid + tiers: [minimal] only.
  • external/widevine-noble.conf added — pulls libwidevinecdm0 arm64/armhf from liujianfeng1994/rockchip-multimedia PPA so Chromium can play DRM-protected streams on noble desktops.
  • external/chromium-*.conf + firefox-*.conf suite aligned with the browser map in configng's common.yaml.

armbian/documentationDeveloper-Guide_Desktops.md

Full rewrite of the Desktops developer guide: YAML schema, tier model, resolution algorithm, browser virtual-token lookup, tier_overrides two-layer schema, module_desktops bash 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.yml gained 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.yml added for github-actions ecosystem tracking.

armbian/armbian.github.io — publish + repo plumbing

  • infrastructure-download-external.yml: preclean / postclean purge jobs now gated on CHUNK_INDEX == 0 so 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: added Fix workspace ownership pre-checkout steps on every runs-on: repository job so rerun / multi-runner handoffs don't trip actions/checkout@v6 on root-owned workspace leftovers.
  • configng unit-test-results publishing added (new data branch feed) modelled after data-update-jira-excerpt.yml — commits to data branch with retry-rebase, then repository_dispatchWeb: Directory listing to 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=build pulls xfce from configng YAML, image boots with NM-driven network + lightdm + XFCE default wallpaper.
  • Non-desktop builds (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.
  • configng unit-test matrix green across (arm64, amd64, armhf, riscv64) × (trixie, noble, resolute) where configng YAML declares support.
  • items-from-inventory expansion produces the right slot count for targets-all-not-eos.yaml (~360 userspace rootfs + board-based all-desktop/all-cli images).
  • Bumping configng's main HEAD and re-running any desktop build produces a cache miss (filename suffix changes due to commit cma error #7's CONFIGNG_DESKTOPS_HASH fingerprint in cache_type).
  • DESKTOP_APPGROUPS_SELECTED=office,multimedia ./compile.sh … logs the back-compat mapping and produces a tier=full rootfs.

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.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 16, 2026

Important

Review skipped

Too many files!

This PR contains 300 files, which is 150 over the limit of 150.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 2dd6ce4c-bac7-4e7a-9c4b-3b01380e0356

📥 Commits

Reviewing files that changed from the base of the PR and between 83ddc22 and 7d01006.

📒 Files selected for processing (300)
  • .github/labeler.yml
  • action.yml
  • config/boards/README.md
  • config/boards/aml-t95z-plus.tvb
  • config/boards/ayn-odin2mini.csc
  • config/boards/ayn-odin2portal.csc
  • config/boards/ayn-thor.csc
  • config/boards/gateway-dk.conf
  • config/boards/olimex-som204-a20.eos
  • config/boards/virtual-qemu.eos
  • config/desktop/README.md
  • config/desktop/_all_distributions/appgroups/programming/packages
  • config/desktop/_all_distributions/appgroups/programming/sources/apt/githubcli.gpg
  • config/desktop/_all_distributions/appgroups/programming/sources/apt/githubcli.source
  • config/desktop/bookworm/appgroups/browsers/armbian/create_desktop_package.sh
  • config/desktop/bookworm/appgroups/browsers/debian/postinst
  • config/desktop/bookworm/appgroups/browsers/packages
  • config/desktop/bookworm/appgroups/chat
  • config/desktop/bookworm/appgroups/desktop_tools
  • config/desktop/bookworm/appgroups/editors
  • config/desktop/bookworm/appgroups/internet/packages
  • config/desktop/bookworm/appgroups/multimedia
  • config/desktop/bookworm/appgroups/office
  • config/desktop/bookworm/appgroups/programming/packages
  • config/desktop/bookworm/appgroups/remote_desktop
  • config/desktop/bookworm/environments/budgie/architectures
  • config/desktop/bookworm/environments/budgie/armbian/create_desktop_package.sh
  • config/desktop/bookworm/environments/budgie/config_base/packages
  • config/desktop/bookworm/environments/budgie/debian/postinst
  • config/desktop/bookworm/environments/budgie/support
  • config/desktop/bookworm/environments/cinnamon/architectures
  • config/desktop/bookworm/environments/cinnamon/armbian/create_desktop_package.sh
  • config/desktop/bookworm/environments/cinnamon/config_base/packages
  • config/desktop/bookworm/environments/cinnamon/config_base/packages.uninstall
  • config/desktop/bookworm/environments/cinnamon/debian/postinst
  • config/desktop/bookworm/environments/cinnamon/support
  • config/desktop/bookworm/environments/gnome/architectures
  • config/desktop/bookworm/environments/gnome/armbian/create_desktop_package.sh
  • config/desktop/bookworm/environments/gnome/config_base/packages
  • config/desktop/bookworm/environments/gnome/debian/postinst
  • config/desktop/bookworm/environments/gnome/support
  • config/desktop/bookworm/environments/i3-wm/architectures
  • config/desktop/bookworm/environments/i3-wm/armbian
  • config/desktop/bookworm/environments/i3-wm/config_base/packages
  • config/desktop/bookworm/environments/i3-wm/debian
  • config/desktop/bookworm/environments/i3-wm/support
  • config/desktop/bookworm/environments/kde-plasma/architectures
  • config/desktop/bookworm/environments/kde-plasma/armbian/create_desktop_package.sh
  • config/desktop/bookworm/environments/kde-plasma/config_base/packages
  • config/desktop/bookworm/environments/kde-plasma/debian/postinst
  • config/desktop/bookworm/environments/kde-plasma/support
  • config/desktop/bookworm/environments/mate/architectures
  • config/desktop/bookworm/environments/mate/armbian/create_desktop_package.sh
  • config/desktop/bookworm/environments/mate/config_base/packages
  • config/desktop/bookworm/environments/mate/debian/postinst
  • config/desktop/bookworm/environments/mate/support
  • config/desktop/bookworm/environments/xfce/architectures
  • config/desktop/bookworm/environments/xfce/armbian/create_desktop_package.sh
  • config/desktop/bookworm/environments/xfce/config_base/packages
  • config/desktop/bookworm/environments/xfce/debian/postinst
  • config/desktop/bookworm/environments/xfce/support
  • config/desktop/bookworm/environments/xmonad/architectures
  • config/desktop/bookworm/environments/xmonad/armbian/create_desktop_package.sh
  • config/desktop/bookworm/environments/xmonad/config_base/packages
  • config/desktop/bookworm/environments/xmonad/debian/postinst
  • config/desktop/bookworm/environments/xmonad/support
  • config/desktop/common/appgroups/browsers/armbian/create_desktop_package.sh
  • config/desktop/common/appgroups/browsers/debian/postinst
  • config/desktop/common/appgroups/browsers/packages
  • config/desktop/common/appgroups/chat/packages
  • config/desktop/common/appgroups/desktop_tools/packages
  • config/desktop/common/appgroups/editors/packages
  • config/desktop/common/appgroups/email/packages
  • config/desktop/common/appgroups/internet/packages
  • config/desktop/common/appgroups/multimedia/packages
  • config/desktop/common/appgroups/office/packages
  • config/desktop/common/appgroups/programming/custom/desktops/cinnamon/packages
  • config/desktop/common/appgroups/programming/custom/desktops/gnome/packages
  • config/desktop/common/appgroups/programming/custom/desktops/kde/packages
  • config/desktop/common/appgroups/programming/packages
  • config/desktop/common/appgroups/remote_desktop/packages
  • config/desktop/common/environments/budgie/architectures
  • config/desktop/common/environments/budgie/armbian/create_desktop_package.sh
  • config/desktop/common/environments/budgie/config_base/packages
  • config/desktop/common/environments/budgie/config_base/packages.uninstall
  • config/desktop/common/environments/budgie/debian/postinst
  • config/desktop/common/environments/budgie/support
  • config/desktop/common/environments/cinnamon/architectures
  • config/desktop/common/environments/cinnamon/armbian/create_desktop_package.sh
  • config/desktop/common/environments/cinnamon/config_base/packages
  • config/desktop/common/environments/cinnamon/config_base/packages.uninstall
  • config/desktop/common/environments/cinnamon/debian/postinst
  • config/desktop/common/environments/cinnamon/support
  • config/desktop/common/environments/deepin/architectures
  • config/desktop/common/environments/deepin/armbian/create_desktop_package.sh
  • config/desktop/common/environments/deepin/config_base/packages
  • config/desktop/common/environments/deepin/config_base/packages.uninstall
  • config/desktop/common/environments/deepin/debian/postinst
  • config/desktop/common/environments/deepin/support
  • config/desktop/common/environments/enlightenment/architectures
  • config/desktop/common/environments/enlightenment/armbian/create_desktop_package.sh
  • config/desktop/common/environments/enlightenment/config_base/packages
  • config/desktop/common/environments/enlightenment/config_base/packages.uninstall
  • config/desktop/common/environments/enlightenment/debian/postinst
  • config/desktop/common/environments/enlightenment/support
  • config/desktop/common/environments/gnome/architectures
  • config/desktop/common/environments/gnome/armbian/create_desktop_package.sh
  • config/desktop/common/environments/gnome/config_base/packages
  • config/desktop/common/environments/gnome/debian/postinst
  • config/desktop/common/environments/gnome/support
  • config/desktop/common/environments/i3-wm/architectures
  • config/desktop/common/environments/i3-wm/armbian/create_desktop_package.sh
  • config/desktop/common/environments/i3-wm/config_base/packages
  • config/desktop/common/environments/i3-wm/debian/postinst
  • config/desktop/common/environments/i3-wm/support
  • config/desktop/common/environments/kde-plasma/architectures
  • config/desktop/common/environments/kde-plasma/armbian/create_desktop_package.sh
  • config/desktop/common/environments/kde-plasma/config_base/packages
  • config/desktop/common/environments/kde-plasma/config_base/packages.uninstall
  • config/desktop/common/environments/kde-plasma/debian/postinst
  • config/desktop/common/environments/kde-plasma/support
  • config/desktop/common/environments/mate/architectures
  • config/desktop/common/environments/mate/armbian/create_desktop_package.sh
  • config/desktop/common/environments/mate/config_base/packages
  • config/desktop/common/environments/mate/debian/postinst
  • config/desktop/common/environments/mate/support
  • config/desktop/common/environments/xfce/appgroups/programming/packages
  • config/desktop/common/environments/xfce/architectures
  • config/desktop/common/environments/xfce/armbian/create_desktop_package.sh
  • config/desktop/common/environments/xfce/config_base/packages
  • config/desktop/common/environments/xfce/config_base/packages.uninstall
  • config/desktop/common/environments/xfce/debian/armbian-bsp-desktop/postinst
  • config/desktop/common/environments/xfce/debian/armbian-bsp-desktop/prepare.sh
  • config/desktop/common/environments/xfce/debian/postinst
  • config/desktop/common/environments/xfce/support
  • config/desktop/common/environments/xmonad/architectures
  • config/desktop/common/environments/xmonad/armbian/create_desktop_package.sh
  • config/desktop/common/environments/xmonad/config_base/packages
  • config/desktop/common/environments/xmonad/debian/postinst
  • config/desktop/common/environments/xmonad/support
  • config/desktop/forky
  • config/desktop/jammy/appgroups
  • config/desktop/jammy/environments/budgie/architectures
  • config/desktop/jammy/environments/budgie/armbian
  • config/desktop/jammy/environments/budgie/config_base/packages
  • config/desktop/jammy/environments/budgie/config_base/packages.uninstall
  • config/desktop/jammy/environments/budgie/debian
  • config/desktop/jammy/environments/budgie/support
  • config/desktop/jammy/environments/cinnamon/architectures
  • config/desktop/jammy/environments/cinnamon/armbian
  • config/desktop/jammy/environments/cinnamon/config_base/packages
  • config/desktop/jammy/environments/cinnamon/config_base/packages.uninstall
  • config/desktop/jammy/environments/cinnamon/debian
  • config/desktop/jammy/environments/cinnamon/support
  • config/desktop/jammy/environments/gnome/architectures
  • config/desktop/jammy/environments/gnome/armbian
  • config/desktop/jammy/environments/gnome/config_base/packages
  • config/desktop/jammy/environments/gnome/debian
  • config/desktop/jammy/environments/gnome/support
  • config/desktop/jammy/environments/i3-wm/architectures
  • config/desktop/jammy/environments/i3-wm/armbian
  • config/desktop/jammy/environments/i3-wm/config_base/packages
  • config/desktop/jammy/environments/i3-wm/debian
  • config/desktop/jammy/environments/i3-wm/support
  • config/desktop/jammy/environments/kde-neon/architectures
  • config/desktop/jammy/environments/kde-neon/armbian
  • config/desktop/jammy/environments/kde-neon/config_base/packages
  • config/desktop/jammy/environments/kde-neon/config_base/packages.uninstall
  • config/desktop/jammy/environments/kde-neon/debian
  • config/desktop/jammy/environments/kde-neon/sources/apt/neon.gpg
  • config/desktop/jammy/environments/kde-neon/sources/apt/neon.source
  • config/desktop/jammy/environments/kde-neon/support
  • config/desktop/jammy/environments/kde-plasma/architectures
  • config/desktop/jammy/environments/kde-plasma/armbian
  • config/desktop/jammy/environments/kde-plasma/config_base/packages
  • config/desktop/jammy/environments/kde-plasma/config_base/packages.uninstall
  • config/desktop/jammy/environments/kde-plasma/debian
  • config/desktop/jammy/environments/kde-plasma/support
  • config/desktop/jammy/environments/mate/architectures
  • config/desktop/jammy/environments/mate/armbian
  • config/desktop/jammy/environments/mate/config_base/packages
  • config/desktop/jammy/environments/mate/debian
  • config/desktop/jammy/environments/mate/support
  • config/desktop/jammy/environments/xfce/appgroups
  • config/desktop/jammy/environments/xfce/architectures
  • config/desktop/jammy/environments/xfce/armbian
  • config/desktop/jammy/environments/xfce/config_base/packages
  • config/desktop/jammy/environments/xfce/config_base/packages.uninstall
  • config/desktop/jammy/environments/xfce/debian
  • config/desktop/jammy/environments/xfce/support
  • config/desktop/jammy/environments/xmonad/architectures
  • config/desktop/jammy/environments/xmonad/armbian
  • config/desktop/jammy/environments/xmonad/config_base/packages
  • config/desktop/jammy/environments/xmonad/debian
  • config/desktop/jammy/environments/xmonad/support
  • config/desktop/noble/appgroups
  • config/desktop/noble/environments/cinnamon
  • config/desktop/noble/environments/gnome
  • config/desktop/noble/environments/i3-wm/architectures
  • config/desktop/noble/environments/i3-wm/armbian/create_desktop_package.sh
  • config/desktop/noble/environments/i3-wm/config_base/packages
  • config/desktop/noble/environments/i3-wm/debian/postinst
  • config/desktop/noble/environments/i3-wm/support
  • config/desktop/noble/environments/kde-neon/architectures
  • config/desktop/noble/environments/kde-neon/armbian
  • config/desktop/noble/environments/kde-neon/config_base/packages
  • config/desktop/noble/environments/kde-neon/config_base/packages.uninstall
  • config/desktop/noble/environments/kde-neon/debian
  • config/desktop/noble/environments/kde-neon/sources/apt/neon.gpg
  • config/desktop/noble/environments/kde-neon/sources/apt/neon.source
  • config/desktop/noble/environments/kde-neon/support
  • config/desktop/noble/environments/kde-plasma
  • config/desktop/noble/environments/xfce/appgroups
  • config/desktop/noble/environments/xfce/architectures
  • config/desktop/noble/environments/xfce/armbian
  • config/desktop/noble/environments/xfce/config_base/packages
  • config/desktop/noble/environments/xfce/config_base/packages.uninstall
  • config/desktop/noble/environments/xfce/debian
  • config/desktop/noble/environments/xfce/support
  • config/desktop/oracular
  • config/desktop/plucky/appgroups/browsers/armbian/create_desktop_package.sh
  • config/desktop/plucky/appgroups/browsers/debian/postinst
  • config/desktop/plucky/appgroups/browsers/packages
  • config/desktop/plucky/appgroups/chat/packages
  • config/desktop/plucky/appgroups/desktop_tools/packages
  • config/desktop/plucky/appgroups/editors/packages
  • config/desktop/plucky/appgroups/email/packages
  • config/desktop/plucky/appgroups/internet/packages
  • config/desktop/plucky/appgroups/multimedia/packages
  • config/desktop/plucky/appgroups/office/packages
  • config/desktop/plucky/appgroups/programming/custom/desktops/cinnamon/packages
  • config/desktop/plucky/appgroups/programming/custom/desktops/gnome/packages
  • config/desktop/plucky/appgroups/programming/custom/desktops/kde/packages
  • config/desktop/plucky/appgroups/programming/packages
  • config/desktop/plucky/appgroups/remote_desktop/packages
  • config/desktop/plucky/environments/cinnamon/architectures
  • config/desktop/plucky/environments/cinnamon/armbian/create_desktop_package.sh
  • config/desktop/plucky/environments/cinnamon/config_base/packages
  • config/desktop/plucky/environments/cinnamon/config_base/packages.uninstall
  • config/desktop/plucky/environments/cinnamon/debian/postinst
  • config/desktop/plucky/environments/cinnamon/support
  • config/desktop/plucky/environments/gnome
  • config/desktop/plucky/environments/i3-wm/architectures
  • config/desktop/plucky/environments/i3-wm/armbian/create_desktop_package.sh
  • config/desktop/plucky/environments/i3-wm/config_base/packages
  • config/desktop/plucky/environments/i3-wm/debian/postinst
  • config/desktop/plucky/environments/i3-wm/support
  • config/desktop/plucky/environments/kde-neon/architectures
  • config/desktop/plucky/environments/kde-neon/armbian
  • config/desktop/plucky/environments/kde-neon/config_base/packages
  • config/desktop/plucky/environments/kde-neon/config_base/packages.uninstall
  • config/desktop/plucky/environments/kde-neon/debian
  • config/desktop/plucky/environments/kde-neon/sources/apt/neon.gpg
  • config/desktop/plucky/environments/kde-neon/sources/apt/neon.source
  • config/desktop/plucky/environments/kde-neon/support
  • config/desktop/plucky/environments/kde-plasma/architectures
  • config/desktop/plucky/environments/kde-plasma/armbian
  • config/desktop/plucky/environments/kde-plasma/config_base/packages
  • config/desktop/plucky/environments/kde-plasma/config_base/packages.uninstall
  • config/desktop/plucky/environments/kde-plasma/debian
  • config/desktop/plucky/environments/kde-plasma/support
  • config/desktop/plucky/environments/xfce/appgroups
  • config/desktop/plucky/environments/xfce/architectures
  • config/desktop/plucky/environments/xfce/armbian
  • config/desktop/plucky/environments/xfce/config_base/packages
  • config/desktop/plucky/environments/xfce/config_base/packages.uninstall
  • config/desktop/plucky/environments/xfce/debian
  • config/desktop/plucky/environments/xfce/support
  • config/desktop/sid/appgroups
  • config/desktop/sid/environments/cinnamon
  • config/desktop/sid/environments/gnome
  • config/desktop/sid/environments/kde-plasma
  • config/desktop/sid/environments/mate
  • config/desktop/sid/environments/xfce/architectures
  • config/desktop/sid/environments/xfce/armbian/create_desktop_package.sh
  • config/desktop/sid/environments/xfce/config_base/packages
  • config/desktop/sid/environments/xfce/debian/postinst
  • config/desktop/sid/environments/xfce/support
  • config/desktop/trixie/appgroups/browsers/armbian/create_desktop_package.sh
  • config/desktop/trixie/appgroups/browsers/debian/postinst
  • config/desktop/trixie/appgroups/browsers/packages
  • config/desktop/trixie/appgroups/chat
  • config/desktop/trixie/appgroups/desktop_tools
  • config/desktop/trixie/appgroups/editors
  • config/desktop/trixie/appgroups/internet/packages
  • config/desktop/trixie/appgroups/multimedia
  • config/desktop/trixie/appgroups/office
  • config/desktop/trixie/appgroups/programming/packages
  • config/desktop/trixie/appgroups/remote_desktop
  • config/desktop/trixie/environments/budgie/architectures
  • config/desktop/trixie/environments/budgie/armbian/create_desktop_package.sh
  • config/desktop/trixie/environments/budgie/config_base/packages
  • config/desktop/trixie/environments/budgie/debian/postinst
  • config/desktop/trixie/environments/budgie/support
  • config/desktop/trixie/environments/cinnamon/architectures
  • config/desktop/trixie/environments/cinnamon/armbian/create_desktop_package.sh
  • config/desktop/trixie/environments/cinnamon/config_base/packages
  • config/desktop/trixie/environments/cinnamon/config_base/packages.uninstall
  • config/desktop/trixie/environments/cinnamon/debian/postinst
  • config/desktop/trixie/environments/cinnamon/support

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch desktop-to-armbian-config

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions github-actions Bot added 05 Milestone: Second quarter release size/large PR with 250 lines or more Desktop Graphical user interface Needs review Seeking for review Framework Framework components Documentation Documentation changes or additions labels Apr 16, 2026
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).
@igorpecovnik igorpecovnik force-pushed the desktop-to-armbian-config branch from ddbbcc0 to bda6655 Compare April 16, 2026 12:15
@igorpecovnik igorpecovnik changed the title desktops: replace legacy machinery with armbian-config module_desktops desktops: replace legacy machinery with armbian-config + silence build log noise Apr 16, 2026
@igorpecovnik igorpecovnik force-pushed the desktop-to-armbian-config branch 4 times, most recently from 9e10a14 to e7fbcdc Compare April 16, 2026 22:22
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 16, 2026

Caution

Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted.

Error details
{}

@igorpecovnik igorpecovnik force-pushed the desktop-to-armbian-config branch 6 times, most recently from bef77d3 to f2b2344 Compare April 16, 2026 23:58
@igorpecovnik igorpecovnik changed the title desktops: replace legacy machinery with armbian-config + silence build log noise desktops: replace legacy machinery with armbian-config module_desktops Apr 16, 2026
@igorpecovnik igorpecovnik force-pushed the desktop-to-armbian-config branch from 4e957b7 to 8cefebb Compare April 17, 2026 09:38
@github-actions github-actions Bot added the GitHub GitHub-related changes like labels, templates, ... label Apr 17, 2026
@igorpecovnik igorpecovnik force-pushed the desktop-to-armbian-config branch from 4dfe80e to ca3f9e9 Compare April 18, 2026 05:35
@igorpecovnik igorpecovnik added Work in progress Unfinished / work in progress and removed Needs review Seeking for review labels Apr 19, 2026
@github-actions github-actions Bot added Needs review Seeking for review Patches Patches related to kernel, U-Boot, ... labels Apr 19, 2026
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).
@igorpecovnik igorpecovnik force-pushed the desktop-to-armbian-config branch from 43eae27 to 0f8c676 Compare April 20, 2026 13:30
@igorpecovnik igorpecovnik changed the title desktops: migrate from config/desktop/ tree to armbian-config module_desktops desktops: migrate from config/desktop/ tree to armbian-config module_desktops Apr 20, 2026
@igorpecovnik igorpecovnik marked this pull request as ready for review April 20, 2026 15:35
@igorpecovnik igorpecovnik removed the Work in progress Unfinished / work in progress label Apr 20, 2026
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).
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.
@github-actions github-actions Bot added the BSP Board Support Packages label Apr 21, 2026
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).
@igorpecovnik igorpecovnik force-pushed the desktop-to-armbian-config branch from 84ba011 to b9cc0b1 Compare April 21, 2026 17:12
… 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.
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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

05 Milestone: Second quarter release BSP Board Support Packages Desktop Graphical user interface Documentation Documentation changes or additions Framework Framework components GitHub GitHub-related changes like labels, templates, ... Needs review Seeking for review Patches Patches related to kernel, U-Boot, ... size/large PR with 250 lines or more

Development

Successfully merging this pull request may close these issues.

1 participant