Skip to content

A stack or packaging channel is a long-term dependency. The right question is not “which project is most popular?” but “who will fix the security bug in three years, and how quickly?”

This page gives you a repeatable check. It is not a scorecard with a single winner. It is a set of signals that help you separate a healthy project from an abandoned one, a real standard from a vendor promotion, and a maintainable choice from a demo.

Before adopting a toolkit, runtime, or channel, check:

  1. Release recency and support policy — is there a maintained release, and when does it end?
  2. Activity — are people committing, reviewing, and releasing?
  3. Bus factor — can the project survive one maintainer leaving?
  4. Responsiveness — do issues and security reports get answered?
  5. Release engineering — CI, signed releases, reproducible builds, metadata validation.
  6. Governance and funding — is there a foundation, company, or community structure?
  7. Standards and adoption — does it implement the open contracts the desktop relies on?
  8. Adoption — is it used by real apps and distributions, not just starred on a forge?

If several of these are weak, the project is a risk, even if it is popular. If most are strong, it is a reasonable dependency even if it is smaller.

Signal What to measure Where to verify Healthy sign Red flag
Release recency Date of the last stable release; planned next release Repository releases/tags, project roadmap A stable release within the supported window; a stated cadence No release for a year with no explanation
Support policy Supported branches, EOL dates, backport policy Project docs, distro package pages Explicit support window and security-backport policy “Use latest” with no maintenance statement
Commit activity Commits and distinct authors in the last 90 and 365 days Git log, repository hosting API Regular activity across multiple people Bursts from one person, then months of silence
Bus factor Share of commits by the top contributor; number of active maintainers/reviewers Repository insights, MAINTAINERS, governance docs At least two active maintainers; no single point of failure One person does everything; no review path
Issue responsiveness Median time to first response; share of issues/PRs closed in 90 days repository hosting API, issue search A stated response window and recent closures Hundreds of unanswered issues; stale PRs
Security process SECURITY.md, disclosure policy, CVE handling Repository, OSV, forge security advisories Private reporting path and a patch cadence No security contact; vulnerabilities ignored
Dependency health Outdated or vulnerable dependencies; update automation OSV, Dependabot/Renovate, cargo audit, pip-audit Automated updates and a clean advisory history Known critical CVEs with no fix
Release engineering CI status, signed tags, checksums, SBOM, reproducible builds CI badges, release assets, Reproducible Builds Tested builds, signed releases, verifiable artifacts Untagged builds, no checksums, “works on my machine”
Governance and funding Foundation/company backing, maintainer count, roadmap Project site, governance docs, foundation pages Transparent decision-making and funded maintenance Single vendor with no succession plan
Standards compliance XDG, Wayland, portals, AppStream, MIME, accessibility Specifications, appstreamcli, desktop-file-validate Implements the contracts instead of private replacements Proprietary APIs that lock users in
Adoption Real apps, distro packages, store listings Distro package pages, Flathub/Snap, app repositories Used by maintained apps and shipped by distros Only demo apps; no packager interest

Download counts and stars on a code forge are secondary. They can indicate adoption, but they do not prove maintenance, security, or quality. Never use them as the only signal.

Use primary sources and reproducible queries:

  • Releases and tags: repository releases page, git tag --sort=-creatordate, or the hosting API.
  • Activity: git log --since="90 days ago" --format='%an' | sort | uniq -c | sort -rn.
  • Bus factor: compare the top author’s commit share with the total and count maintainers in MAINTAINERS/CODEOWNERS.
  • Issues: use the forge’s search filters for open issues, stale issues, and median response time.
  • Security: check SECURITY.md, the forge’s security advisories, and OSV.
  • Release engineering: inspect CI configuration, release assets, checksums, and the Reproducible Builds status where available.
  • OpenSSF Scorecard: use OpenSSF Scorecard as one input for repository security practices; a missing score is not proof of a problem.
  • Standards: run appstreamcli validate, desktop-file-validate, flatpak-builder-lint, and the relevant xdg-* tools.
  • Distro/store: check the package in the Ubuntu archive, the Snap Store, or Flathub; confirm the publisher and the supported runtime.

Record the date of the check. A project can change quickly, and a health check without a date is a rumor.

For a toolkit or language binding, the signals map to practical questions:

  • GTK/libadwaita: release notes and NEWS, GNOME’s release cadence, the number of active maintainers, the accessibility and portal story, and whether the binding tracks the C API.
  • Qt/Kirigami: Qt’s release and LTS policy (LTS is commercially maintained; open-source users should track their distro or the latest stable), KDE Frameworks’ monthly cadence, and the health of the QML/Kirigami ecosystem.
  • Rust bindings: whether gtk-rs/libadwaita-rs support the target GTK/libadwaita release, the feature-flag matrix, and the maintenance of the higher-level frameworks you choose.
  • Web/custom-render runtimes: whether the runtime is open source, actively maintained, accessible, sandboxable, and packaged in a way that respects the desktop. A named runtime is an example, not an endorsement.

Channels need the same scrutiny:

  • deb/PPA: who maintains the package, whether it tracks security updates, whether it builds in a clean chroot, and whether the archive or PPA is the source of truth.
  • Snap: base support (core26 for 26.04), confinement, refresh behavior, Snapcraft version, review status, and whether the publisher is the upstream project.
  • Flatpak/Flathub: runtime branch and EOL, finish-args, portal usage, linter status, metainfo quality, verification, and whether the Flathub repository is maintained by upstream.
  • AppImage: no sandbox, no standard update channel; only use it when the portability trade-off is explicit.
  • Source/self-hosted: build reproducibility, release signing, dependency pinning, and a documented update path.

A channel that is convenient but unmaintained is not high quality. A smaller channel with a clear maintainer, a security process, and reproducible builds can be the better choice.

Use this as a release gate, not a beauty contest:

  • The project has a stable release and a stated support window.
  • At least two people have commit or review rights, or there is a documented succession plan.
  • There is a security contact and a disclosed vulnerability process.
  • CI runs on the default branch and releases are built from tags.
  • The project implements the relevant open standards and validates its metadata.
  • The channel/runtime is supported and not end-of-life.
  • The choice is documented with the date and the sources you checked.

If a dependency fails several gates, write down the risk and the migration path. Do not hide it behind a popularity claim.