desktops: route apt.armbian.com browsers + add code, armbian-imager, restore thunderbird#848
Conversation
apt.armbian.com hosts real .debs of chromium / firefox /
google-chrome-stable, so the existing browser virtual token can
point straight at them — no need for a separate package list or
temp-source juggling.
- common.yaml `browser:` map: amd64 every release -> google-chrome-
stable. Ubuntu releases (jammy/noble/plucky/questing/resolute)
switch arm64/armhf to chromium and riscv64 to firefox (real .debs
from apt.armbian.com instead of the previous epiphany-browser
fallback). Debian rules unchanged (chromium / firefox-esr).
- common.yaml `full.packages` += code (vscode from apt.armbian.com,
universal across arches).
Schema extension (kept for future use):
- _apply_tier_overrides() now honours per-arch / per-release-per-arch
`packages:` ADDS in addition to the existing `packages_remove`.
Symmetric with the top-level tier block. Not used by this commit
(the browser token is the cleaner place for browser substitution),
but available when a future change needs an arch-only addition
that isn't a browser.
Smoke-tested across xfce {trixie,noble} {amd64,arm64,riscv64}
{minimal,mid,full} plus bookworm/riscv64 (browser dropped — no
riscv64 port) and sid/loong64 (firefox-esr — chromium not built).
apt.armbian.com hosts both: armbian-imager (universal) and a real
thunderbird .deb that wins by version against Ubuntu's snap-shim
package on amd64/arm64. The previous tier_overrides stripped
thunderbird on every Ubuntu arch out of caution about the snap-shim.
- common.yaml `mid.packages` += armbian-imager (SD-card flasher,
universal — apt.armbian.com builds for every arch we ship).
- common.yaml `tier_overrides.full.releases.<release>.architectures`
for noble/plucky/jammy/questing/resolute: drop the amd64 + arm64
thunderbird strips. Keep armhf + riscv64 strips since the original
comment notes the upstream Ubuntu deb is missing on those arches
and we don't (yet) ship them via apt.armbian.com — the audit will
catch any false positive on the next run.
Debian armhf strips (bookworm, trixie, forky, sid) untouched —
those are Debian-side gaps, unrelated to the snap-shim issue.
Smoke-tested across xfce {noble,trixie} {amd64,arm64,armhf,riscv64}
{mid,full}: amd64 keeps chrome+thunderbird, arm64 keeps chromium+
thunderbird, armhf keeps chromium (no thunderbird), riscv64 keeps
firefox (no thunderbird), armbian-imager present on every mid+.
WalkthroughThis pull request introduces two changes. The first updates the Estimated code review effort🎯 3 (Moderate) | ⏱️ ~22 minutes 🚥 Pre-merge checks | ✅ 3✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 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 |
Mirrors the existing noble desktop sources for the new LTS so the desktop YAML in configng (PR armbian/configng#848) can rely on apt.armbian.com for chromium/firefox/thunderbird/code/chrome/edge on resolute, not just on noble. New per-release files: chromium-aarch64-resolute.conf — xtradeb/apps PPA, arm64 firefox-resolute.conf — mozillateam PPA, all 4 arches thunderbird-resolute.conf — mozillateam PPA, all 4 arches Multi-release RELEASE lists gain `resolute`: code.conf, codium.conf (vscode + vscodium) discord.conf edge.conf google-chrome.conf zoom.conf Untouched (utils, separate concern — split off if needed): urbackup-server-noble.conf, zfs-noble.conf, rpi-libraspberrypi-bin-noble.conf, rpi-pi-bluetooth-ubuntu.conf, rpi-ubuntu-firmware-raspi.conf If any upstream PPA does not yet publish for resolute, the aptly build of that source will surface the gap on the next run.
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (1)
tools/modules/desktops/scripts/parse_desktop_yaml.py (1)
190-193: Clarify the example to avoid mixing browser mapping with tier overrides.Lines 190–193 currently use
google-chrome-stableas a tier-override example, but browser selection is actually driven by the separatebrowser:map. A neutral example here would reduce schema confusion.Suggested doc-only tweak
- arch-wide additions/holes (e.g. google-chrome-stable always on - amd64, blender always missing on armhf), and the per-release-per- + arch-wide additions/holes (e.g. package X always present on + amd64, blender always missing on armhf), and the per-release-per-🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@tools/modules/desktops/scripts/parse_desktop_yaml.py` around lines 190 - 193, Replace the confusing example that uses "google-chrome-stable" (which is controlled by the separate browser: map) with a neutral package example when describing arch-wide additions/holes and per-release-per-arch overrides; update the prose near the "arch-wide additions/holes" and "per-release-per-arch" explanation to use a non-browser package name (e.g., a generic "foo-package" always on amd64 / missing on armhf) and keep the browser: mapping reference distinct so readers don't conflate browser selection with tier overrides (look for mentions of "google-chrome-stable", "browser:", "loupe", "bookworm", "amd64", and "armhf" to locate the text to edit).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@tools/modules/desktops/yaml/common.yaml`:
- Around line 59-60: The YAML currently lists packages "code" and "thunderbird"
without excluding OS release/architecture combos where apt.armbian.com is
missing them; update the common.yaml package entries for "code" and
"thunderbird" to include conditional removal rules (e.g., per-release and
per-arch booleans or if/when selectors) that exclude the combinations reported
(forky, sid, jammy, plucky, questing, resolute across all arches for "code", and
jammy/plucky/questing/resolute on amd64/arm64 for "thunderbird"), or alternately
add a documented note in the YAML comments indicating unsupported release/arch
combinations; ensure the changes target the package list entries named "code"
and "thunderbird" so installs skip unavailable packages rather than failing.
---
Nitpick comments:
In `@tools/modules/desktops/scripts/parse_desktop_yaml.py`:
- Around line 190-193: Replace the confusing example that uses
"google-chrome-stable" (which is controlled by the separate browser: map) with a
neutral package example when describing arch-wide additions/holes and
per-release-per-arch overrides; update the prose near the "arch-wide
additions/holes" and "per-release-per-arch" explanation to use a non-browser
package name (e.g., a generic "foo-package" always on amd64 / missing on armhf)
and keep the browser: mapping reference distinct so readers don't conflate
browser selection with tier overrides (look for mentions of
"google-chrome-stable", "browser:", "loupe", "bookworm", "amd64", and "armhf" to
locate the text to edit).
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 12698187-ba0e-47af-ac4d-b637034e2d6d
📒 Files selected for processing (2)
tools/modules/desktops/scripts/parse_desktop_yaml.pytools/modules/desktops/yaml/common.yaml
| - code # vscode (from apt.armbian.com) | ||
|
|
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
python - <<'PY'
import urllib.request, gzip, lzma, re
BASE = "https://apt.armbian.com/dists"
checks = {
"code": {
"releases": ["bookworm", "trixie", "forky", "sid", "jammy", "noble", "plucky", "questing", "resolute"],
"arches": ["amd64", "arm64", "armhf", "riscv64", "loong64"],
},
"thunderbird": {
"releases": ["jammy", "noble", "plucky", "questing", "resolute"],
"arches": ["amd64", "arm64"],
},
}
def fetch(url):
with urllib.request.urlopen(url, timeout=15) as r:
return r.read()
def get_components(release):
try:
txt = fetch(f"{BASE}/{release}/Release").decode("utf-8", "ignore")
except Exception as e:
return [], f"Release file missing/unreadable: {e}"
for line in txt.splitlines():
if line.startswith("Components:"):
parts = line.split()[1:]
return (parts if parts else ["main"]), None
return ["main"], None
def fetch_packages_index(release, comp, arch):
for ext, dec in [("xz", lzma.decompress), ("gz", gzip.decompress)]:
url = f"{BASE}/{release}/{comp}/binary-{arch}/Packages.{ext}"
try:
raw = fetch(url)
return dec(raw).decode("utf-8", "ignore"), None
except Exception:
pass
return None, "No Packages.{xz,gz} index"
def has_pkg(index_text, pkg):
return re.search(rf"(?m)^Package:\s*{re.escape(pkg)}\s*$", index_text) is not None
for pkg, spec in checks.items():
print(f"\n=== Checking package: {pkg} ===")
for rel in spec["releases"]:
comps, err = get_components(rel)
if err:
print(f"{rel:10} {'-':8} ERROR {err}")
continue
for arch in spec["arches"]:
found = False
idx_errs = []
for comp in comps:
idx, idx_err = fetch_packages_index(rel, comp, arch)
if idx is None:
idx_errs.append(f"{comp}:{idx_err}")
continue
if has_pkg(idx, pkg):
print(f"{rel:10} {arch:8} FOUND (component={comp})")
found = True
break
if not found:
reason = "; ".join(idx_errs) if idx_errs else "package not present"
print(f"{rel:10} {arch:8} MISSING ({reason})")
PYRepository: armbian/configng
Length of output: 2748
🏁 Script executed:
git ls-files tools/modules/desktops/yaml/ | head -20Repository: armbian/configng
Length of output: 588
🏁 Script executed:
cat -n tools/modules/desktops/yaml/common.yaml | sed -n '55,65p'Repository: armbian/configng
Length of output: 436
🏁 Script executed:
cat -n tools/modules/desktops/yaml/common.yaml | sed -n '230,260p'Repository: armbian/configng
Length of output: 1573
🏁 Script executed:
#!/bin/bash
python - <<'PY'
import urllib.request, gzip, lzma, re, ssl
# Disable SSL verification for sandbox environment
ssl._create_default_https_context = ssl._create_unverified_context
BASE = "https://apt.armbian.com/dists"
checks = {
"code": {
"releases": ["bookworm", "trixie", "forky", "sid", "jammy", "noble", "plucky", "questing", "resolute"],
"arches": ["amd64", "arm64", "armhf", "riscv64", "loong64"],
},
"thunderbird": {
"releases": ["jammy", "noble", "plucky", "questing", "resolute"],
"arches": ["amd64", "arm64"],
},
}
def fetch(url):
with urllib.request.urlopen(url, timeout=15) as r:
return r.read()
def get_components(release):
try:
txt = fetch(f"{BASE}/{release}/Release").decode("utf-8", "ignore")
except Exception as e:
return [], f"Release file missing/unreadable"
for line in txt.splitlines():
if line.startswith("Components:"):
parts = line.split()[1:]
return (parts if parts else ["main"]), None
return ["main"], None
def fetch_packages_index(release, comp, arch):
for ext, dec in [("xz", lzma.decompress), ("gz", gzip.decompress)]:
url = f"{BASE}/{release}/{comp}/binary-{arch}/Packages.{ext}"
try:
raw = fetch(url)
return dec(raw).decode("utf-8", "ignore"), None
except Exception:
pass
return None, "No Packages.{xz,gz} index"
def has_pkg(index_text, pkg):
return re.search(rf"(?m)^Package:\s*{re.escape(pkg)}\s*$", index_text) is not None
for pkg, spec in checks.items():
print(f"\n=== Checking package: {pkg} ===")
for rel in spec["releases"]:
comps, err = get_components(rel)
if err:
print(f"{rel:10} {'-':8} ERROR {err}")
continue
for arch in spec["arches"]:
found = False
idx_errs = []
for comp in comps:
idx, idx_err = fetch_packages_index(rel, comp, arch)
if idx is None:
idx_errs.append(f"{comp}:{idx_err}")
continue
if has_pkg(idx, pkg):
print(f"{rel:10} {arch:8} FOUND (component={comp})")
found = True
break
if not found:
reason = "; ".join(idx_errs) if idx_errs else "package not present"
print(f"{rel:10} {arch:8} MISSING ({reason})")
PYRepository: armbian/configng
Length of output: 2914
Fix apt.armbian.com package availability gaps or update YAML conditionals.
Verification reveals missing packages in apt.armbian.com that will cause install failures:
code(line 59): Missing on forky, sid, jammy, plucky, questing, resolute (all architectures), and riscv64/loong64 on bookworm/trixiethunderbird(lines 235–258): Missing on jammy, plucky, questing, resolute (amd64/arm64), yet YAML doesn't remove it for those combinations—only armhf/riscv64
Either add packages to apt.armbian.com, define release/arch conditionals in YAML to exclude unavailable combinations, or document the limitation.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@tools/modules/desktops/yaml/common.yaml` around lines 59 - 60, The YAML
currently lists packages "code" and "thunderbird" without excluding OS
release/architecture combos where apt.armbian.com is missing them; update the
common.yaml package entries for "code" and "thunderbird" to include conditional
removal rules (e.g., per-release and per-arch booleans or if/when selectors)
that exclude the combinations reported (forky, sid, jammy, plucky, questing,
resolute across all arches for "code", and jammy/plucky/questing/resolute on
amd64/arm64 for "thunderbird"), or alternately add a documented note in the YAML
comments indicating unsupported release/arch combinations; ensure the changes
target the package list entries named "code" and "thunderbird" so installs skip
unavailable packages rather than failing.
PR armbian/configng#848 expects apt.armbian.com to host the snap- shim workarounds (chromium / firefox / thunderbird) and vendor desktop apps (chrome / code / codium / edge / discord / zoom) on every non-eos release armbian/build supports. The previous commit covered noble + resolute; this one fills in the rest. Added per-release noble-style files for snap-shim workarounds: chromium-aarch64-jammy.conf — re-enabled (was .disabled); uses liujianfeng1994/chromium PPA chromium-aarch64-questing.conf — xtradeb/apps PPA, arm64 firefox-jammy.conf — mozillateam PPA, all 4 arches firefox-questing.conf — mozillateam PPA, all 4 arches thunderbird-jammy.conf — mozillateam PPA, all 4 arches thunderbird-questing.conf — mozillateam PPA, all 4 arches Multi-release RELEASE lists gain `jammy` (Ubuntu LTS, csc) and `forky` (next Debian stable, csc): code.conf, codium.conf discord.conf edge.conf google-chrome.conf zoom.conf Releases skipped on purpose: plucky — eos as of 2026-01-25 (armbian/build PR #9657) sid — Debian unstable; rolling, vendor debs may break loong64 — separate arch story; not yet a desktop target If a particular upstream PPA (notably mozillateam, xtradeb, liujianfeng1994) doesn't actually publish for a given release, the aptly build of that source will fail loudly on next run and we drop that single config — better than silent gaps.
Mirrors the existing noble desktop sources for the new LTS so the desktop YAML in configng (PR armbian/configng#848) can rely on apt.armbian.com for chromium/firefox/thunderbird/code/chrome/edge on resolute, not just on noble. New per-release files: chromium-aarch64-resolute.conf — xtradeb/apps PPA, arm64 firefox-resolute.conf — mozillateam PPA, all 4 arches thunderbird-resolute.conf — mozillateam PPA, all 4 arches Multi-release RELEASE lists gain `resolute`: code.conf, codium.conf (vscode + vscodium) discord.conf edge.conf google-chrome.conf zoom.conf Untouched (utils, separate concern — split off if needed): urbackup-server-noble.conf, zfs-noble.conf, rpi-libraspberrypi-bin-noble.conf, rpi-pi-bluetooth-ubuntu.conf, rpi-ubuntu-firmware-raspi.conf If any upstream PPA does not yet publish for resolute, the aptly build of that source will surface the gap on the next run.
PR armbian/configng#848 expects apt.armbian.com to host the snap- shim workarounds (chromium / firefox / thunderbird) and vendor desktop apps (chrome / code / codium / edge / discord / zoom) on every non-eos release armbian/build supports. The previous commit covered noble + resolute; this one fills in the rest. Added per-release noble-style files for snap-shim workarounds: chromium-aarch64-jammy.conf — re-enabled (was .disabled); uses liujianfeng1994/chromium PPA chromium-aarch64-questing.conf — xtradeb/apps PPA, arm64 firefox-jammy.conf — mozillateam PPA, all 4 arches firefox-questing.conf — mozillateam PPA, all 4 arches thunderbird-jammy.conf — mozillateam PPA, all 4 arches thunderbird-questing.conf — mozillateam PPA, all 4 arches Multi-release RELEASE lists gain `jammy` (Ubuntu LTS, csc) and `forky` (next Debian stable, csc): code.conf, codium.conf discord.conf edge.conf google-chrome.conf zoom.conf Releases skipped on purpose: plucky — eos as of 2026-01-25 (armbian/build PR #9657) sid — Debian unstable; rolling, vendor debs may break loong64 — separate arch story; not yet a desktop target If a particular upstream PPA (notably mozillateam, xtradeb, liujianfeng1994) doesn't actually publish for a given release, the aptly build of that source will fail loudly on next run and we drop that single config — better than silent gaps.
resolute just promoted to `supported` in armbian/build PR #9657. Mirrors the existing noble desktop sources for the new LTS so the desktop YAML in armbian/configng#848 can rely on apt.armbian.com for chromium / firefox / thunderbird and the vendor desktop apps on resolute. New per-release files: chromium-aarch64-resolute.conf — xtradeb/apps PPA, arm64 firefox-resolute.conf — mozillateam PPA, all 4 arches thunderbird-resolute.conf — mozillateam PPA, all 4 arches Multi-release RELEASE lists gain `resolute`: code.conf, codium.conf discord.conf edge.conf google-chrome.conf zoom.conf Releases skipped on purpose (no apt.armbian.com desktop coverage): plucky — eos as of 2026-01-25 jammy — csc; desktop story stale questing — 9-month interim, dropped from configng desktop YAML sid — Debian unstable; vendor debs may break loong64 — separate arch story; not yet a desktop target Out of scope (utils packages with their own scope): urbackup-server-*.conf, zfs-*.conf, harfbuzz-jammy.conf, libcec6-sid-to-jammy.conf, rpi-*.conf
Same pattern as Firefox: single Mozilla policies.json at /etc/thunderbird/policies/policies.json. Thunderbird is now installed by default at the full tier on amd64/arm64 (PR #848 unwound the Ubuntu snap-shim strip on those arches), so it gets the same privacy-respecting defaults as the rest of the Mozilla stack. Policies set: - DisableTelemetry: true - DisableFirefoxStudies: true (controls Mozilla Studies; same policy name applies to TB) - AppAutoUpdate: false (apt manages the package; TB should not try to self-update) - StartPageURL: https://www.armbian.com (the page shown in the message pane when no message is selected) Bookmarks / homepage policies don't apply to Thunderbird. First-run account-setup wizard isn't suppressible (and shouldn't be — users still need to add their account). File ships harmlessly even when thunderbird isn't installed (applies the same logic as the rest of the browsers/ overlay).
Same pattern as Firefox: single Mozilla policies.json at /etc/thunderbird/policies/policies.json. Thunderbird is now installed by default at the full tier on amd64/arm64 (PR #848 unwound the Ubuntu snap-shim strip on those arches), so it gets the same privacy-respecting defaults as the rest of the Mozilla stack. Policies set: - DisableTelemetry: true - DisableFirefoxStudies: true (controls Mozilla Studies; same policy name applies to TB) - AppAutoUpdate: false (apt manages the package; TB should not try to self-update) - StartPageURL: https://www.armbian.com (the page shown in the message pane when no message is selected) Bookmarks / homepage policies don't apply to Thunderbird. First-run account-setup wizard isn't suppressible (and shouldn't be — users still need to add their account). File ships harmlessly even when thunderbird isn't installed (applies the same logic as the rest of the browsers/ overlay).
Summary
apt.armbian.com is always present on Armbian systems, so packages it hosts can sit in the regular YAML lists without any conditional-source juggling. This PR uses that to clean up the desktop matrix:
amd64every release →google-chrome-stable(Google publishes no arm/riscv builds)arm64/armhf→ realchromium(wasepiphany-browserfallback because Ubuntu's deb is a snap-shim)riscv64→ realfirefox(wasepiphany-browser)chromiumfor amd64/arm64/armhf,firefox-esrfor riscv64midtier gainsarmbian-imager(SD-card flasher; universal across arches)fulltier gainscode(vscode; universal)thunderbirdon Ubuntu amd64/arm64 — apt.armbian.com's real .deb wins over the snap-shim. armhf/riscv64 still strip it (deb missing upstream and not yet shipped via apt.armbian.com); the audit will catch any false positive on the next run.Schema extension
_apply_tier_overrides()now honours per-arch / per-release-per-archpackages:ADDS in addition to the existingpackages_remove. Symmetric with how the top-level tier block already supports both. Not used after the browser-map refactor (the browser slot covers the only current need), but kept for future arch-only additions that don't fit the browser slot.Net effect
Test plan
Smoke-tested locally across the matrix in the table above plus edge cases:
bookworm/riscv64mid drops the browser silently (no riscv64 entry in the bookworm browser map; intentional)sid/loong64mid rendersfirefox-esr(chromium not yet built for loong64)codelands atfullon every archarmbian-imagerlands atmidon every archgoogle-chrome-stableregardless of releaseReal-board tests still wanted:
armbian-config --api module_desktops install de=xfce tier=fullinstalls google-chrome-stable + code + armbian-imager + thunderbird + the rest, all from apt.armbian.com or the distrochromiumresolves to the apt.armbian.com .deb (not the snap-transitional)chromium(Debian deb) replaced bygoogle-chrome-stable(apt.armbian.com)