# ============================================================================ # external-upstream-map.toml — Red Bear OS graphical/desktop external sources # ============================================================================ # # Purpose # Declarative description of every external (non-fork, non-path) upstream # source consumed by the graphical / desktop build surface. Drives two # tools: # - local/scripts/check-external-versions.sh (read-only status report) # - local/scripts/bump-graphics-recipes.sh (rewrites tar=/rev=/blake3=) # # Schema # [groups.] a version-coherent family (one version resolved, applied # to every member). Qt6 / KF6 / Plasma each resolve their # upstream version ONCE per group. # version_index URL listing available versions (HTML or JSON). # version_regex Python regex; capture group 1 holds the version token. # resolve "version" (default; index lists full X.Y.Z) or # "majmin" (index lists X.Y series dirs; full version # is constructed as ".0"). # recipe_root directory holding every member recipe (e.g. # "local/recipes/kde"). Members are "/". # tar_template default tar URL; supports {ver}, {majmin}, {name}. # url_name_strip_prefix strip this prefix from a member's directory name # to get its URL name (e.g. "kf6-" → "attica"). Members # not starting with the prefix are used verbatim. # members explicit recipe directory-name list. # member_url_names overrides: { "" = "" } for irregulars # (kf6-kded6 → kded, qt6-sensors → qtsensors, ...). # member_templates overrides: { "" = { tar_template = "..." } } # for members whose URL family differs from the group # default (kirigami on invent.kde.org, plasma members # on invent.kde.org, ...). # # [packages.] a singleton (one recipe, independently versioned). # kind "tar" — version_index + tar_template bump model. # "git-rev" — git ls-remote --tags + tag_regex bump model. # recipe canonical recipe directory ("local/recipes/..."). # For kind = "tar": version_index, version_regex, resolve, tar_template. # For kind = "git-rev": git_url, tag_regex. # # Update policy # - Operator-edited. Agents MUST NOT edit this file without operator approval. # - Every entry MUST be verifiable against the real recipe.toml before commit # (run check-external-versions.sh and confirm CURRENT/OUTDATED is accurate). # - When a series moves (e.g. Qt 6.11 → 6.12, KF6 6.28 → 6.29, GNOME series # bump), update the affected version_index URL. The bumper then resolves # the new series automatically. # - series-locked indexes (glib/pango point at a specific X.Y subdir of # download.gnome.org) are intentional: GNOME ships many patch releases # within a series; locking the index avoids cross-series noise. Bump the # series in this map when GNOME moves. # # Exclusions (deliberately NOT in this map) # - Git branch-followers (curl, openssl, sdl2, seatd, polkit-qt6, icon themes): # they track a branch tip, not a versioned release. # - path = recipes (libepoxy, libdisplay-info, libpciaccess, libudev, # libxcvt, zbus, pam-redbear, qt6-wayland-smoke): in-tree sources, no # upstream tarball. # - recipes/core/*: fork territory, managed by the fork pipeline. # - icu: non-standard tag/tarball separator transform (release-75-1 tag vs # icu4c-75_1-src.tgz); cannot be expressed by {ver}/{majmin} cleanly. # Manually managed until the templating supports separator transforms. # - fontconfig, gdk-pixbuf: no local/recipes/ entry exists (only mainline # recipes/dev/*). Added to the map when a local fork/recipe is created. # # Verified 2026-07-18 against actual recipe.toml tar=/rev= lines. # ============================================================================ # --------------------------------------------------------------------------- # Groups # --------------------------------------------------------------------------- # ---- KF6 Frameworks ------------------------------------------------------- # 45 members: 44 tar from download.kde.org/stable/frameworks// + # kirigami (same 6.28.0 version, different host/template). # Irregulars verified against recipe.toml: # kf6-extra-cmake-modules → extra-cmake-modules # kf6-kded6 → kded # kf6-pty → kpty # kf6-notifyconfig → knotifyconfig # kf6-parts → kparts # kf6-syntaxhighlighting → syntax-highlighting # NOTE: kf6-kwayland and kf6-plasma-activities are Plasma-group members # (they pull from stable/plasma/) and are listed under [groups.plasma]. [groups.kf6] version_index = "https://download.kde.org/stable/frameworks/" version_regex = 'href="([0-9]+\.[0-9]+)/"' resolve = "majmin" recipe_root = "local/recipes/kde" url_name_strip_prefix = "kf6-" tar_template = "https://download.kde.org/stable/frameworks/{majmin}/{name}-{ver}.tar.xz" members = [ "kf6-attica", "kf6-extra-cmake-modules", "kf6-karchive", "kf6-kauth", "kf6-kbookmarks", "kf6-kcmutils", "kf6-kcodecs", "kf6-kcolorscheme", "kf6-kcompletion", "kf6-kconfig", "kf6-kconfigwidgets", "kf6-kcoreaddons", "kf6-kcrash", "kf6-kdbusaddons", "kf6-kdeclarative", "kf6-kded6", "kf6-kglobalaccel", "kf6-kguiaddons", "kf6-ki18n", "kf6-kiconthemes", "kf6-kidletime", "kf6-kimageformats", "kf6-kio", "kf6-kitemmodels", "kf6-kitemviews", "kf6-kjobwidgets", "kf6-knewstuff", "kf6-knotifications", "kf6-kpackage", "kf6-kservice", "kf6-ksvg", "kf6-ktexteditor", "kf6-ktextwidgets", "kf6-kwallet", "kf6-kwidgetsaddons", "kf6-kwindowsystem", "kf6-kxmlgui", "kf6-notifyconfig", "kf6-parts", "kf6-prison", "kf6-pty", "kf6-solid", "kf6-sonnet", "kf6-syntaxhighlighting", "kirigami", ] [groups.kf6.member_url_names] "kf6-extra-cmake-modules" = "extra-cmake-modules" "kf6-kded6" = "kded" "kf6-notifyconfig" = "knotifyconfig" "kf6-parts" = "kparts" "kf6-pty" = "kpty" "kf6-syntaxhighlighting" = "syntax-highlighting" # kirigami ships the same framework version but via invent.kde.org archive. [groups.kf6.member_templates.kirigami] tar_template = "https://invent.kde.org/frameworks/kirigami/-/archive/v{ver}/kirigami-v{ver}.tar.gz" # ---- Qt6 ------------------------------------------------------------------ # 6 members. qt6-sensors recipe → "qtsensors" URL submodule name. [groups.qt6] version_index = "https://download.qt.io/official_releases/qt/6.11/" version_regex = 'href="([0-9]+\.[0-9]+\.[0-9]+)/"' resolve = "version" recipe_root = "local/recipes/qt" url_name_strip_prefix = "" tar_template = "https://download.qt.io/official_releases/qt/{majmin}/{ver}/submodules/{name}-everywhere-src-{ver}.tar.xz" members = ["qtbase", "qtdeclarative", "qtsvg", "qtwayland", "qtshadertools", "qt6-sensors"] [groups.qt6.member_url_names] "qt6-sensors" = "qtsensors" # ---- Plasma --------------------------------------------------------------- # Version resolved ONCE from download.kde.org/stable/plasma/, applied to: # - download.kde.org/stable/plasma/ family (default template): # breeze, kf6-kwayland(→kwayland), kf6-plasma-activities(→plasma-activities), # plasma-workspace # - invent.kde.org/plasma// family (per-member overrides): # kwin, kdecoration, kglobalacceld, kde-cli-tools, plasma-desktop # - invent.kde.org/frameworks/plasma-framework/ (different group path): # plasma-framework # plasma-wayland-protocols is intentionally OUT of this group (independent # 1.21.0 versioning); it is a singleton below. [groups.plasma] version_index = "https://download.kde.org/stable/plasma/" version_regex = 'href="([0-9]+\.[0-9]+\.[0-9]+)/"' resolve = "version" recipe_root = "local/recipes/kde" url_name_strip_prefix = "kf6-" tar_template = "https://download.kde.org/stable/plasma/{ver}/{name}-{ver}.tar.xz" members = [ "breeze", "kf6-kwayland", "kf6-plasma-activities", "plasma-workspace", "kwin", "kdecoration", "kglobalacceld", "kde-cli-tools", "plasma-desktop", "plasma-framework", ] [groups.plasma.member_url_names] "kf6-kwayland" = "kwayland" "kf6-plasma-activities" = "plasma-activities" [groups.plasma.member_templates.kwin] tar_template = "https://invent.kde.org/plasma/kwin/-/archive/v{ver}/kwin-v{ver}.tar.gz" [groups.plasma.member_templates.kdecoration] tar_template = "https://invent.kde.org/plasma/kdecoration/-/archive/v{ver}/kdecoration-v{ver}.tar.gz" [groups.plasma.member_templates.kglobalacceld] tar_template = "https://invent.kde.org/plasma/kglobalacceld/-/archive/v{ver}/kglobalacceld-v{ver}.tar.gz" [groups.plasma.member_templates.kde-cli-tools] tar_template = "https://invent.kde.org/plasma/kde-cli-tools/-/archive/v{ver}/kde-cli-tools-v{ver}.tar.gz" [groups.plasma.member_templates.plasma-desktop] tar_template = "https://invent.kde.org/plasma/plasma-desktop/-/archive/v{ver}/plasma-desktop-v{ver}.tar.gz" [groups.plasma.member_templates.plasma-framework] tar_template = "https://invent.kde.org/frameworks/plasma-framework/-/archive/v{ver}/plasma-framework-v{ver}.tar.gz" # --------------------------------------------------------------------------- # Singletons — tar # --------------------------------------------------------------------------- # mesa — software 3D / LLVMpipe / virgl. GitLab archive URL. [packages.mesa] kind = "tar" recipe = "local/recipes/libs/mesa" version_index = "https://archive.mesa3d.org/" version_regex = 'href="mesa-([0-9]+\.[0-9]+\.[0-9]+)\.tar' resolve = "version" tar_template = "https://gitlab.freedesktop.org/mesa/mesa/-/archive/mesa-{ver}/mesa-mesa-{ver}.tar.gz" # libdrm — DRM user-space library. Static dri.freedesktop.org listing for # version discovery; tarball from GitLab archive. [packages.libdrm] kind = "tar" recipe = "local/recipes/libs/libdrm" version_index = "https://dri.freedesktop.org/libdrm/" version_regex = 'href="libdrm-([0-9]+\.[0-9]+\.[0-9]+)\.tar' resolve = "version" tar_template = "https://gitlab.freedesktop.org/mesa/libdrm/-/archive/libdrm-{ver}/libdrm-libdrm-{ver}.tar.gz" # libwayland — Wayland protocol C library. [packages.libwayland] kind = "tar" recipe = "local/recipes/wayland/libwayland" version_index = "https://gitlab.freedesktop.org/wayland/wayland/-/tags" version_regex = '/wayland/wayland/-/tags/([0-9]+\.[0-9]+\.[0-9]+)' resolve = "version" tar_template = "https://gitlab.freedesktop.org/wayland/wayland/-/releases/{ver}/downloads/wayland-{ver}.tar.xz" # wayland-protocols — Wayland protocol XML. [packages.wayland-protocols] kind = "tar" recipe = "local/recipes/wayland/wayland-protocols" version_index = "https://gitlab.freedesktop.org/wayland/wayland-protocols/-/tags" version_regex = '/wayland/wayland-protocols/-/tags/([0-9]+\.[0-9]+(?:\.[0-9]+)?)' resolve = "version" tar_template = "https://gitlab.freedesktop.org/wayland/wayland-protocols/-/releases/{ver}/downloads/wayland-protocols-{ver}.tar.xz" # libevdev — evdev wrapper. Static freedesktop.org listing. [packages.libevdev] kind = "tar" recipe = "local/recipes/libs/libevdev" version_index = "https://www.freedesktop.org/software/libevdev/" version_regex = 'libevdev-([0-9]+\.[0-9]+\.[0-9]+)\.tar' resolve = "version" tar_template = "https://www.freedesktop.org/software/libevdev/libevdev-{ver}.tar.xz" # libinput — input device management. GitLab tags page. [packages.libinput] kind = "tar" recipe = "local/recipes/libs/libinput" version_index = "https://gitlab.freedesktop.org/libinput/libinput/-/tags" version_regex = '/libinput/libinput/-/tags/([0-9]+\.[0-9]+\.[0-9]+)' resolve = "version" tar_template = "https://gitlab.freedesktop.org/libinput/libinput/-/archive/{ver}/libinput-{ver}.tar.bz2" # libxkbcommon — keyboard description library. GitHub archive tag. [packages.libxkbcommon] kind = "tar" recipe = "local/recipes/libs/libxkbcommon" version_index = "https://github.com/xkbcommon/libxkbcommon/tags" version_regex = 'xkbcommon-([0-9]+\.[0-9]+\.[0-9]+)' resolve = "version" tar_template = "https://github.com/xkbcommon/libxkbcommon/archive/refs/tags/xkbcommon-{ver}.tar.gz" # dbus — system + session message bus. Static freedesktop.org releases listing. [packages.dbus] kind = "tar" recipe = "local/recipes/system/dbus" version_index = "https://dbus.freedesktop.org/releases/dbus/" version_regex = 'dbus-([0-9]+\.[0-9]+\.[0-9]+)\.tar' resolve = "version" tar_template = "https://dbus.freedesktop.org/releases/dbus/dbus-{ver}.tar.xz" # glib — GNOME core library. Series-locked index (operator bumps series here). [packages.glib] kind = "tar" recipe = "local/recipes/libs/glib" version_index = "https://download.gnome.org/sources/glib/2.89/" version_regex = 'glib-([0-9]+\.[0-9]+\.[0-9]+)\.tar' resolve = "version" tar_template = "https://download.gnome.org/sources/glib/{majmin}/glib-{ver}.tar.xz" # cairo — 2D graphics. Static cairographics.org releases listing. [packages.cairo] kind = "tar" recipe = "local/recipes/libs/cairo" version_index = "https://www.cairographics.org/releases/" version_regex = 'cairo-([0-9]+\.[0-9]+\.[0-9]+)\.tar' resolve = "version" tar_template = "https://www.cairographics.org/releases/cairo-{ver}.tar.xz" # pango — text layout. Series-locked GNOME index. [packages.pango] kind = "tar" recipe = "local/recipes/libs/pango" version_index = "https://download.gnome.org/sources/pango/1.56/" version_regex = 'pango-([0-9]+\.[0-9]+\.[0-9]+)\.tar' resolve = "version" tar_template = "https://download.gnome.org/sources/pango/{majmin}/pango-{ver}.tar.xz" # harfbuzz — text shaping. GitHub tags HTML is JS-only; use the API (JSON). [packages.harfbuzz] kind = "tar" recipe = "local/recipes/libs/harfbuzz" version_index = "https://api.github.com/repos/harfbuzz/harfbuzz/tags" version_regex = '"name":\s*"([0-9]+\.[0-9]+\.[0-9]+)"' resolve = "version" tar_template = "https://github.com/harfbuzz/harfbuzz/releases/download/{ver}/harfbuzz-{ver}.tar.xz" # freetype2 — font rendering. GitLab tags use VER-X-Y-Z format; ver_transform # converts the captured dashes to dots. Tarball via sourceforge (canonical URL # used by the recipe). [packages.freetype2] kind = "tar" recipe = "local/recipes/libs/freetype2" version_index = "https://gitlab.freedesktop.org/freetype/freetype/-/tags" version_regex = '/freetype/freetype/-/tags/VER-([0-9]+-[0-9]+-[0-9]+)' ver_transform = "s/-/./g" resolve = "version" tar_template = "https://sourceforge.net/projects/freetype/files/freetype2/{ver}/freetype-{ver}.tar.xz/download" # lcms2 — Little CMS. GitHub archive tag (tag "lcms2.19" → version "2.19"). [packages.lcms2] kind = "tar" recipe = "local/recipes/libs/lcms2" version_index = "https://github.com/mm2/Little-CMS/tags" version_regex = 'lcms([0-9]+\.[0-9]+)' resolve = "version" tar_template = "https://github.com/mm2/Little-CMS/archive/refs/tags/lcms{ver}.tar.gz" # konsole — KDE terminal. Independent release cycle (KDE Gear, not Frameworks). # invent.kde.org tags page. [packages.konsole] kind = "tar" recipe = "local/recipes/kde/konsole" version_index = "https://invent.kde.org/utilities/konsole/-/tags" version_regex = '/utilities/konsole/-/tags/v([0-9]+\.[0-9]+\.[0-9]+)' resolve = "version" tar_template = "https://invent.kde.org/utilities/konsole/-/archive/v{ver}/konsole-v{ver}.tar.gz" # plasma-wayland-protocols — INDEPENDENT versioning (1.21.0, NOT plasma 6.7.x). [packages.plasma-wayland-protocols] kind = "tar" recipe = "local/recipes/kde/plasma-wayland-protocols" version_index = "https://invent.kde.org/libraries/plasma-wayland-protocols/-/tags" version_regex = '/libraries/plasma-wayland-protocols/-/tags/v([0-9]+\.[0-9]+\.[0-9]+)' resolve = "version" tar_template = "https://invent.kde.org/libraries/plasma-wayland-protocols/-/archive/v{ver}/plasma-wayland-protocols-v{ver}.tar.gz" # --------------------------------------------------------------------------- # Singletons — git-rev # --------------------------------------------------------------------------- # sddm — display manager. rev is a commit sha; resolve latest tag's sha. [packages.sddm] kind = "git-rev" recipe = "local/recipes/kde/sddm" git_url = "https://github.com/sddm/sddm.git" tag_regex = '^v?[0-9]+\.[0-9]+\.[0-9]+$' # pipewire — audio/video server. rev is a tag name (e.g. "0.3.85"). [packages.pipewire] kind = "git-rev" recipe = "local/recipes/libs/pipewire" git_url = "https://gitlab.freedesktop.org/pipewire/pipewire.git" tag_regex = '^[0-9]+\.[0-9]+\.[0-9]+$' # wireplumber — PipeWire session manager. rev is a tag name (e.g. "0.4.14"). [packages.wireplumber] kind = "git-rev" recipe = "local/recipes/libs/wireplumber" git_url = "https://gitlab.freedesktop.org/pipewire/wireplumber.git" tag_regex = '^[0-9]+\.[0-9]+\.[0-9]+$'