<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://docs.flathub.org/blog</id>
    <title>Flathub Documentation Blog</title>
    <updated>2026-01-14T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://docs.flathub.org/blog"/>
    <subtitle>Flathub Documentation Blog</subtitle>
    <icon>https://docs.flathub.org/img/favicon.svg</icon>
    <entry>
        <title type="html"><![CDATA[What's new in Vorarbeiter]]></title>
        <id>https://docs.flathub.org/blog/vorarbeiter-2026</id>
        <link href="https://docs.flathub.org/blog/vorarbeiter-2026"/>
        <updated>2026-01-14T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[It is almost a year since the switch to Vorarbeiter for building and publishing]]></summary>
        <content type="html"><![CDATA[<p>It is almost a year since the switch to Vorarbeiter for building and publishing
apps. We've made several improvements since then, and it's time to brag about
them.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="runson">RunsOn<a href="https://docs.flathub.org/blog/vorarbeiter-2026#runson" class="hash-link" aria-label="Direct link to RunsOn" title="Direct link to RunsOn" translate="no">​</a></h2>
<p>In the initial announcement, I mentioned we were using <a href="https://runs-on.com/" target="_blank" rel="noopener noreferrer" class="">RunsOn</a>, a
just-in-time runner provisioning system, to build large apps such as Chromium.
Since then, we have fully switched to RunsOn for all builds. Free GitHub runners
available to open source projects are heavily overloaded and there are limits on
how many concurrent builds can run at a time. With RunsOn, we can request an
arbitrary number of threads, memory and disk space, for less than if we were
to use paid GitHub runners.</p>
<p>We also rely more on spot instances, which are even cheaper than the usual on
demand machines. The downside is that jobs sometimes get interrupted. To avoid
spending too much time on retry ping-pong, builds retried with the special
<code>bot, retry</code> command use the on-demand instances from the get-go. The same
catch applies to large builds, which are unlikely to finish in time before spot
instances are reclaimed.</p>
<p>The cost breakdown since May 2025 is as follows:</p>
<p><img decoding="async" loading="lazy" alt="Cost breakdown" src="https://docs.flathub.org/assets/images/aws_costs-171537d5e92952b23b5f5fb3b603ce9f.png" width="1543" height="648" class="img_ev3q"></p>
<p>Once again, we are not actually paying for anything thanks to the <a href="https://aws.amazon.com/blogs/opensource/aws-promotional-credits-open-source-projects/" target="_blank" rel="noopener noreferrer" class="">AWS credits
for open source projects program</a>. Thank you RunsOn team and AWS for
making this possible!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="caching">Caching<a href="https://docs.flathub.org/blog/vorarbeiter-2026#caching" class="hash-link" aria-label="Direct link to Caching" title="Direct link to Caching" translate="no">​</a></h2>
<p>Vorarbeiter now supports caching downloads and ccache files between builds.
Everything is an OCI image if you are feeling brave enough, and so we are
storing the per-app cache with <a href="https://oras.land/" target="_blank" rel="noopener noreferrer" class="">ORAS</a> in GitHub Container Registry.</p>
<p>This is especially useful for cosmetic rebuilds and minor version bumps, where
most of the source code remains the same. Your mileage may vary for anything more
complex.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="end-of-life-without-rebuilding">End-of-life without rebuilding<a href="https://docs.flathub.org/blog/vorarbeiter-2026#end-of-life-without-rebuilding" class="hash-link" aria-label="Direct link to End-of-life without rebuilding" title="Direct link to End-of-life without rebuilding" translate="no">​</a></h2>
<p>One of the Buildbot limitations was that it was difficult to retrofit pull requests
marking apps as end-of-life without rebuilding them. Flat-manager itself exposes
an API call for this since 2019 but we could not really use it, as apps had to
be in a buildable state only to deprecate them.</p>
<p>Vorarbeiter will now detect that a PR modifies only the end-of-life keys in the
<code>flathub.json</code> file, skip test and regular builds, and directly use the
flat-manager API to republish the app with the EOL flag set post-merge.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="web-ui">Web UI<a href="https://docs.flathub.org/blog/vorarbeiter-2026#web-ui" class="hash-link" aria-label="Direct link to Web UI" title="Direct link to Web UI" translate="no">​</a></h2>
<p>GitHub's UI isn't really built for a centralized repository building other
repositories. My love-hate relationship with Buildbot made me want to have a
similar dashboard for Vorarbeiter.</p>
<p>The new web UI uses PicoCSS and HTMX to provide a tidy table of recent builds.
It is unlikely to be particularly interesting to end users, but kinkshaming is
not nice, okay? I like to know what's being built and now you can too
<a href="https://builds.flathub.org/" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="reproducible-builds">Reproducible builds<a href="https://docs.flathub.org/blog/vorarbeiter-2026#reproducible-builds" class="hash-link" aria-label="Direct link to Reproducible builds" title="Direct link to Reproducible builds" translate="no">​</a></h2>
<p>We have started testing binary reproducibility of x86_64 builds targetting the
stable repository. This is possible thanks to <a href="https://github.com/flathub-infra/flathub-repro-checker" target="_blank" rel="noopener noreferrer" class="">flathub-repro-checker</a>, a
tool doing the necessary legwork to recreate the build environment and compare
the result of the rebuild with what is published on Flathub.</p>
<p>While these tests have been running for a while now, we have recently restarted them
from scratch after enabling S3 storage for diffoscope artifacts. The current
status is on <a href="https://builds.flathub.org/reproducible" target="_blank" rel="noopener noreferrer" class="">the reproducible builds page</a>.</p>
<p>Failures are not currently acted on. When we collect more results, we may
start to surface them to app maintainers for investigation. We also don't test
direct uploads at the moment.</p>]]></content>
        <author>
            <name>Bart Piotrowski</name>
        </author>
        <category label="infrastructure" term="infrastructure"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Enhanced License Compliance Tools for Flathub]]></title>
        <id>https://docs.flathub.org/blog/enhanced-license-compliance-tools</id>
        <link href="https://docs.flathub.org/blog/enhanced-license-compliance-tools"/>
        <updated>2025-10-24T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[tl;dr: Flathub has improved tooling to make license compliance easier for developers. Distros should rebuild OS images with updated runtimes from Flathub; app developers should ensure they're using up-to-date runtimes and verify that licenses and copyright notices are properly included.]]></summary>
        <content type="html"><![CDATA[<p><em><strong>tl;dr:</strong></em> Flathub has improved tooling to make license compliance easier for developers. Distros should rebuild OS images with updated runtimes from Flathub; app developers should ensure they're using up-to-date runtimes and verify that licenses and copyright notices are properly included.</p>
<p>In early August, a concerned community member brought to our attention that copyright notices and license files were being omitted when software was bundled as Flatpaks and distributed via Flathub. This was a genuine oversight across multiple projects, and we're glad we've been able to take the opportunity to correct and improve this for runtimes and apps across the Flatpak ecosystem.</p>
<p>Over the past few months, we've been working to enhance our tooling and infrastructure to better support license compliance. With the support of the Flatpak, freedesktop-sdk, GNOME, and KDE teams, we've developed and deployed significant improvements that make it easier than ever for developers to ensure their applications properly include license and copyright notices.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-new">What's New<a href="https://docs.flathub.org/blog/enhanced-license-compliance-tools#whats-new" class="hash-link" aria-label="Direct link to What's New" title="Direct link to What's New" translate="no">​</a></h2>
<p>In coordination with maintainers of the <a href="https://gitlab.com/freedesktop-sdk/freedesktop-sdk/-/merge_requests/27806" target="_blank" rel="noopener noreferrer" class="">freedesktop-sdk</a>, <a href="https://gitlab.gnome.org/GNOME/gnome-build-meta/-/merge_requests/4056" target="_blank" rel="noopener noreferrer" class="">GNOME</a>, and <a href="https://invent.kde.org/packaging/flatpak-kde-runtime/-/merge_requests/264" target="_blank" rel="noopener noreferrer" class="">KDE</a> runtimes, we've implemented enhanced license handling that automatically includes license and copyright notice files in the runtimes themselves, deduplicated to be as space-efficient as possible. This improvement has been applied to all supported freedesktop-sdk, GNOME, and KDE runtimes, plus backported to freedesktop-sdk 22.08 and newer, GNOME 45 and newer, KDE 5.15-22.08 and newer, and KDE 6.6 and newer. These updated runtimes cover over 90% of apps on Flathub and have already rolled out to users as regular Flatpak updates.</p>
<p>We've also worked with the Flatpak developers to add new functionality to <a href="https://github.com/flatpak/flatpak-builder/pull/655" target="_blank" rel="noopener noreferrer" class="">flatpak-builder 1.4.5</a> that automatically recognizes and includes common license files. This enhancement, now deployed to the Flathub build service, helps ensure apps' own licenses as well as the licenses of any bundled libraries are retained and shipped to users along with the app itself.</p>
<p>These improvements represent an important milestone in the maturity of the Flatpak ecosystem, making license compliance easier and more automatic for the entire community.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="recommended-actions">Recommended Actions<a href="https://docs.flathub.org/blog/enhanced-license-compliance-tools#recommended-actions" class="hash-link" aria-label="Direct link to Recommended Actions" title="Direct link to Recommended Actions" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="app-developers">App Developers<a href="https://docs.flathub.org/blog/enhanced-license-compliance-tools#app-developers" class="hash-link" aria-label="Direct link to App Developers" title="Direct link to App Developers" translate="no">​</a></h3>
<p>We encourage you to rebuild your apps with flatpak-builder 1.4.5 or newer to take advantage of the new automatic license detection. You can verify that license and copyright notices are properly included in your Flatpak's <code>/app/share/licenses</code>, both for your app and any included dependencies. In most cases, simply rebuilding your app will automatically include the necessary licenses, but you can also fine-tune which license files are included using the license-files key in your app's Flatpak manifest if needed.</p>
<p>For apps with binary sources (e.g. debs or rpms), we encourage app maintainers to explicitly include relevant license files in the Flatpak itself for consistency and auditability.</p>
<p><strong>End-of-life runtime transition:</strong> To focus our resources on maintaining high-quality, up-to-date runtimes, we'll be completing the removal of several end-of-life runtimes in January 2026. Apps using runtimes older than freedesktop-sdk 22.08, GNOME 45, KDE 5.15-22.08 or KDE 6.6 will be marked as EOL shortly. Once these older runtimes are removed, the apps will need to be updated to use a supported runtime to remain available on Flathub. While this won't affect existing app installations, after this date, new users will be unable to install these apps from Flathub until they're rebuilt against a current runtime. Flatpak manifests of any affected apps will remain on the Flathub GitHub organization to enable developers to update them at any time.</p>
<p>If your app currently targets an end-of-life runtime that did receive the backported license improvements, we still strongly encourage you to upgrade to a newer, supported runtime to benefit from ongoing security updates and platform improvements.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="distributors">Distributors<a href="https://docs.flathub.org/blog/enhanced-license-compliance-tools#distributors" class="hash-link" aria-label="Direct link to Distributors" title="Direct link to Distributors" translate="no">​</a></h3>
<p>If you redistribute binaries from Flathub, such as pre-installed runtimes or apps, you should rebuild your distributed images (ISOs, containers, etc.) with the updated runtimes and apps from Flathub. You can verify that appropriate licenses are included with the Flatpaks in the runtime filesystem at <code>/usr/share/licenses</code> inside each runtime.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="get-in-touch">Get in Touch<a href="https://docs.flathub.org/blog/enhanced-license-compliance-tools#get-in-touch" class="hash-link" aria-label="Direct link to Get in Touch" title="Direct link to Get in Touch" translate="no">​</a></h2>
<p>App developers, distributors, and community members are encouraged to connect with the team and other members of the community in our <a href="https://discourse.flathub.org/" target="_blank" rel="noopener noreferrer" class="">Discourse forum</a> and <a href="https://matrix.to/#/#flathub:matrix.org" target="_blank" rel="noopener noreferrer" class="">Matrix chat room</a>. If you are an app developer or distributor and have any questions or concerns, you may also reach out to us at <a href="mailto:admins@flathub.org" target="_blank" rel="noopener noreferrer" class="">admins@flathub.org</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="thank-you">Thank You!<a href="https://docs.flathub.org/blog/enhanced-license-compliance-tools#thank-you" class="hash-link" aria-label="Direct link to Thank You!" title="Direct link to Thank You!" translate="no">​</a></h2>
<p>We are grateful to Jef Spaleta from Fedora for his care and confidentiality in bringing this to our attention and working with us collaboratively throughout the process. Special thanks to Boudhayan Bhattcharya (bbhtt) for his tireless work across Flathub, Flatpak and freedesktop-sdk, on this as well as many other important areas. And thank you to Abderrahim Kitouni (akitouni), Adrian Vovk (AdrianVovk), Aleix Pol Gonzalez (apol), Bart Piotrowski (barthalion), Ben Cooksley (bcooksley), Javier Jardón (jjardon), Jordan Petridis (alatiera), Matthias Clasen (matthiasc), Rob McQueen (ramcq), Sebastian Wick (swick), Timothée Ravier (travier), and any others behind the scenes for their hard work and timely collaboration across multiple projects to deliver these improvements.</p>
<p>Our Linux app ecosystem is truly strongest when individuals from across companies and projects come together to collaborate and work towards shared goals. We look forward to continuing to work together to ensure app developers can easily ship their apps to users across all Linux distributions and desktop environments. ♥</p>]]></content>
        <author>
            <name>Cassidy James Blaede</name>
        </author>
        <author>
            <name>Robert McQueen</name>
        </author>
        <category label="legal" term="legal"/>
        <category label="license" term="license"/>
        <category label="floss" term="floss"/>
        <category label="builder" term="builder"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Vorarbeiter is here]]></title>
        <id>https://docs.flathub.org/blog/vorarbeiter-is-here</id>
        <link href="https://docs.flathub.org/blog/vorarbeiter-is-here"/>
        <updated>2025-05-02T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[We have replaced Buildbot with a custom service, and we hope you haven't noticed.]]></summary>
        <content type="html"><![CDATA[<p>We have replaced Buildbot with a custom service, and we hope you haven't noticed.</p>
<p><a href="https://github.com/flathub-infra/vorarbeiter" target="_blank" rel="noopener noreferrer" class="">Vorarbeiter</a> is a German word for "foreman" and a living proof of
my school-related trauma. The new service is a middleman between GitHub and
GitHub Actions. It has been happily humming since April 21st, and largely does what
Buildbot did: builds apps, with a sprinkle of publishing logic.</p>
<p>While what happens under the hood is solid, there is no UI yet. Flathub bot
will still inform developers about build status for their pull requests, but
there is little visibility of what happens post-merge.</p>
<p>Additionally, Vorarbeiter no longer allows to manually publish, cancel or
delete builds. The publishing happens every hour regardless of the age of the
build. The previous 3-hour-long delay was too conservative, and barely anyone
was giving a final test for a post-merge builds. Similarly, cancelling builds
doesn't seem as necessary as before. GitHub Actions runners are ephemeral and
new commits on the same branch or pull request will automatically cancel the
previous in-progress build.</p>
<p>Last but not least, because of limitations of the free GitHub Actions runners,
some apps are designated as <em>large builds</em>. Large builds take place on machines
provisioned in AWS, boasting faster CPUs and larger disks to accommodate
heavier requirements.</p>
<p>While large builds do not incur costs per se thanks to the generous <a href="https://aws.amazon.com/blogs/opensource/aws-promotional-credits-open-source-projects/" target="_blank" rel="noopener noreferrer" class="">AWS
credits for open source projects program</a>, we still want to be mindful of
how much credits we are spending, which is why we don't run large runners all
the time. This is possible thanks to <a href="https://runs-on.com/" target="_blank" rel="noopener noreferrer" class="">RunsOn</a>, which handles all the
magic for us. It receives pipeline events from GitHub and provisions new
machines automatically within seconds, and tears them down the moment the build
is finished. This is completely invisible to developers, but is both faster and
more cost-effective, even if we were to pay the bill ourselves.</p>
<p>There is still more work to be done. I want to improve observability of the new
service to make sure we can have automatic alerts when we have an abnormal build
error rate or unprocessed publishing queue. In fact, we already notify
maintainers and Flathub admins when a build triggered on the master branch
failed, but there is potential to be more proactive here.</p>
<p>The unsolved challenge so far is caching. Every new pipeline re-downloads
Flatpak runtimes, SDKs, and source code needed to build the app. Ideally, we
should cache at least the runtimes, but with runners being ephemeral, we should
also attempt to implement a distributed solution for ccache to reduce build
times.</p>
<p>Given <a href="https://docs.flathub.org/blog/flathub-build-infrastructure-revamp" target="_blank" rel="noopener noreferrer" class="">the challenging circumstances</a>, this is more than good enough,
though! If you encounter any issues with the new workflow, don't hesitate to
<a href="https://github.com/flathub-infra/vorarbeiter/issues" target="_blank" rel="noopener noreferrer" class="">open an issue</a> in the project's GitHub repository.</p>]]></content>
        <author>
            <name>Bart Piotrowski</name>
        </author>
        <category label="infrastructure" term="infrastructure"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Flathub Safety: A Layered Approach from Source to User]]></title>
        <id>https://docs.flathub.org/blog/app-safety-layered-approach-source-to-user</id>
        <link href="https://docs.flathub.org/blog/app-safety-layered-approach-source-to-user"/>
        <updated>2025-02-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[With thousands of apps and billions of downloads, Flathub has a responsibility to help ensure the safety of our millions of active users. We take this responsibility very seriously with a layered, in-depth approach including sandboxing, permissions, transparency, policy, human review, automation, reproducibility, auditability, verification, and user interface.]]></summary>
        <content type="html"><![CDATA[<p>With thousands of apps and billions of downloads, Flathub has a responsibility to help ensure the safety of our millions of active users. We take this responsibility very seriously with a layered, in-depth approach including sandboxing, permissions, transparency, policy, human review, automation, reproducibility, auditability, verification, and user interface.</p>
<p>Apps and updates can be fairly quickly published to Flathub, but behind the scenes each one takes a long journey full of safety nets to get from a developer’s source code to being used on someone’s device. While information about this process is available between various documentation pages and the Flathub source code, I thought it could be helpful to share a comprehensive look at that journey all in one place.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="flatpak-security--sandboxing">Flatpak Security &amp; Sandboxing<a href="https://docs.flathub.org/blog/app-safety-layered-approach-source-to-user#flatpak-security--sandboxing" class="hash-link" aria-label="Direct link to Flatpak Security &amp; Sandboxing" title="Direct link to Flatpak Security &amp; Sandboxing" translate="no">​</a></h2>
<p>Each app on Flathub is distributed as a <a href="https://flatpak.org/" target="_blank" rel="noopener noreferrer" class="">Flatpak</a>. This app packaging format was specifically designed with security and safety at its core, and has been continuously improved over the past decade. It has received endorsements, development, and wide adoption from organizations such as Bambu Lab, Bitwig, CodeThink, Collabora, Discord, The Document Foundation, elementary, Endless, GDevelop, KiCad, Kodi, GNOME, Intel, KDE, LibreOffice, Mozilla, OBS Studio, Plex, Prusa Research, Purism, Red Hat, System76, Telegram, Valve, and many more.</p>
<p><img decoding="async" loading="lazy" alt="Flatpak logo" src="https://docs.flathub.org/assets/images/flatpak-d50c84bc739f183bb3d4762fe629e0f5.png" width="1476" height="560" class="img_ev3q"></p>
<p>From a technical perspective, Flatpak does not require elevated privileges to install apps, isolates apps from one another, and limits app access to the host environment. It makes deep use of existing Linux security technologies such as cgroups, namespaces, bind mounts, and seccomp as well as <a href="https://github.com/containers/bubblewrap" target="_blank" rel="noopener noreferrer" class="">Bubblewrap</a> for sandboxing.</p>
<p>Flatpak apps are also built from a declarative manifest, which defines the exact sources and environment to build from to enable auditability and as much reproducibility as possible.</p>
<p>Due to Flatpak’s sandboxing, apps don’t have permission to access many aspects of the host OS or user data they might need. To get that access, apps must either request it using Portals or use static permissions.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="portals--static-permissions">Portals &amp; Static Permissions<a href="https://docs.flathub.org/blog/app-safety-layered-approach-source-to-user#portals--static-permissions" class="hash-link" aria-label="Direct link to Portals &amp; Static Permissions" title="Direct link to Portals &amp; Static Permissions" translate="no">​</a></h3>
<p>Most permissions can be requested and granted on demand via an API
called <a href="https://flatpak.github.io/xdg-desktop-portal/docs/" target="_blank" rel="noopener noreferrer" class="">Portals</a>.
These permissions do not need to be given ahead of time, as desktop
environments provide the mechanisms to give user consent and control
over them e.g. by indicating their use, directly prompting the user
before the permission is granted, and allowing revocation.</p>
<p><img decoding="async" loading="lazy" alt="Illustration of portal, light" src="https://docs.flathub.org/assets/images/xdg-portal-light-b91934f67cd2ff2747479b41952cc77b.png#gh-light-mode-only" width="1476" height="560" class="img_ev3q">
<img decoding="async" loading="lazy" alt="Illustration of a portal, dark" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABcQAAAIwCAMAAACfs5g9AAAA0GVYSWZJSSoACAAAAAoAAAEEAAEAAADEBQAAAQEEAAEAAAAwAgAAAgEDAAMAAACGAAAAEgEDAAEAAAABAAAAGgEFAAEAAACMAAAAGwEFAAEAAACUAAAAKAEDAAEAAAACAAAAMQECAA0AAACcAAAAMgECABQAAACqAAAAaYcEAAEAAAC+AAAAAAAAAAgACAAIAEgAAAABAAAASAAAAAEAAABHSU1QIDIuMTAuMzgAADIwMjU6MDI6MjAgMjA6Mjg6MzAAAQABoAMAAQAAAAEAAAAAAAAA1q69lwAAAYNpQ0NQSUNDIHByb2ZpbGUAAHicfZE9SMNAHMVfU0WRioMVRB0iVCe7qIhjrUIRKoRaoVUHk0u/oElDkuLiKLgWHPxYrDq4OOvq4CoIgh8g7oKToouU+L+k0CLGg+N+vLv3uHsHCPUy06yOGKDptplKxMVMdlXseoWAAQQxjFGZWcacJCXhO77uEeDrXZRn+Z/7c/SqOYsBAZE4xgzTJt4gntm0Dc77xGFWlFXic+IJky5I/Mh1xeM3zgWXBZ4ZNtOpeeIwsVhoY6WNWdHUiKeJI6qmU76Q8VjlvMVZK1dZ8578haGcvrLMdZojSGARS5AgQkEVJZRhI0qrToqFFO3HffxDrl8il0KuEhg5FlCBBtn1g//B726t/NSklxSKA50vjvMxBnTtAo2a43wfO07jBAg+A1d6y1+pA7OfpNdaWuQI6NsGLq5bmrIHXO4Ag0+GbMquFKQp5PPA+xl9UxbovwV61rzemvs4fQDS1FXyBjg4BMYLlL3u8+7u9t7+PdPs7wd3AHKoelFTRgAADXhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+Cjx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDQuNC4wLUV4aXYyIj4KIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgIHhtbG5zOkdJTVA9Imh0dHA6Ly93d3cuZ2ltcC5vcmcveG1wLyIKICAgIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIgogICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICB4bXBNTTpEb2N1bWVudElEPSJnaW1wOmRvY2lkOmdpbXA6YWZjZTJmNjgtZDRmZi00M2VmLWIxOWEtN2ZhYjc0ZDU2OTUyIgogICB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjZhMzVjZDRmLTQxMjItNDk5Mi1hNjEyLTUzNGJjY2I2MDNmYyIKICAgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOmU3ZjE2MmNjLTQ5MzUtNGM3Ny04NmNkLWY0MDRkMGNlYWIzNyIKICAgZGM6Rm9ybWF0PSJpbWFnZS9wbmciCiAgIEdJTVA6QVBJPSIyLjAiCiAgIEdJTVA6UGxhdGZvcm09IkxpbnV4IgogICBHSU1QOlRpbWVTdGFtcD0iMTc0MDEwODUxMTA3MTkyOSIKICAgR0lNUDpWZXJzaW9uPSIyLjEwLjM4IgogICB0aWZmOk9yaWVudGF0aW9uPSIxIgogICB4bXA6Q3JlYXRvclRvb2w9IkdJTVAgMi4xMCIKICAgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyNTowMjoyMFQyMDoyODozMC0wNzowMCIKICAgeG1wOk1vZGlmeURhdGU9IjIwMjU6MDI6MjBUMjA6Mjg6MzAtMDc6MDAiPgogICA8eG1wTU06SGlzdG9yeT4KICAgIDxyZGY6U2VxPgogICAgIDxyZGY6bGkKICAgICAgc3RFdnQ6YWN0aW9uPSJzYXZlZCIKICAgICAgc3RFdnQ6Y2hhbmdlZD0iLyIKICAgICAgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpjODQxMmQ0My00N2NkLTQwY2YtOTM5Ni0xMzdkZmU4MDczNGMiCiAgICAgIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkdpbXAgMi4xMCAoTGludXgpIgogICAgICBzdEV2dDp3aGVuPSIyMDI1LTAyLTIwVDIwOjI4OjMxLTA3OjAwIi8+CiAgICA8L3JkZjpTZXE+CiAgIDwveG1wTU06SGlzdG9yeT4KICA8L3JkZjpEZXNjcmlwdGlvbj4KIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAKPD94cGFja2V0IGVuZD0idyI/PvXnJBwAAAA2UExURXMubQAAAB0rU34lUwCHUatSNl9XT8LDx//x6P8ATf+jAP/sJwDkNimt/4N2nP93qP/MqgABBNHNtzIAAAABdFJOUwBA5thmAAAAAWJLR0QAiAUdSAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB+kCFQMcH4mh+tYAABVqSURBVHja7d3dchu5EYDRlB1b61Rp1+//tCEq6tpeBJjB/IFD6ZwbyhIlkiP540UXgH/9CwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADY4K/k7cN75fuDKwUg4gCIOAAiDvCKwW6FesmPB1cPQMQBEHEAERdxgM8YbREHEHEARBxAxEUc4JXi/X4iEQcQcQBEHEDERRzgrv58ODviQg4g4gCIOICIizjAHV0x2BRxABEHQMQBRFzEAb5KxH8lrjCAiAMg4gAiLuIAdxDBPTPi5U0hBptCDiDiAIg4gIiLOMAd4h0BP3sDrPLzys/N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#gh-dark-mode-only" width="1476" height="560" class="img_ev3q"></p>
<p>Portals include APIs for handling auto-start and background activity;
access to the camera, clipboard, documents, files, location, screen
casting, screenshots, secrets like passwords, trash, and USB devices;
setting global shortcuts; inhibiting suspend or shut down; capturing
input; monitoring memory, network, or power profiles; sending
notifications; printing; setting a wallpaper; and more. In each case,
the user’s desktop environment (like GNOME or KDE) manages if and how a
user is notified or prompted for permissions—and if the permission is
not granted, the app must handle it gracefully.</p>
<p>Some permissions are not covered by Portals, such as basic and generally safe
resources for which dynamic permissions wouldn’t make sense. In these cases—or
if a Portal does not yet exist or is not widely adopted for a certain
permission—developers may use <a href="https://docs.flathub.org/docs/for-app-authors/requirements#permissions" target="_blank" rel="noopener noreferrer" class="">static permissions</a>.
These are set by the developer at build time in the public build manifest.</p>
<p>Static permissions are intended to be as narrowly-scoped as possible and are
unchanging for the life of each release of an app. They are not generally
designed to be modified by an end user except in cases of development,
debugging, or <a href="https://docs.flathub.org/docs/for-users/permissions" target="_blank" rel="noopener noreferrer" class="">reducing permissions</a>.
Due to this, Flatpak always prefers apps to use Portals over static permissions
whenever possible.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="shared-runtimes--modules">Shared Runtimes &amp; Modules<a href="https://docs.flathub.org/blog/app-safety-layered-approach-source-to-user#shared-runtimes--modules" class="hash-link" aria-label="Direct link to Shared Runtimes &amp; Modules" title="Direct link to Shared Runtimes &amp; Modules" translate="no">​</a></h3>
<p>Every app is built against a <a href="https://docs.flatpak.org/en/latest/basic-concepts.html#runtimes" target="_blank" rel="noopener noreferrer" class="">Flatpak runtime</a> hosted by Flathub. The runtimes provide basic dependencies, are well-maintained by the Linux community, and are organized according to various platforms a developer may target; for example, GNOME, KDE, or a generic FreeDesktop SDK. This means many apps—especially those targeting a platform like GNOME or KDE and using its developer libraries—don’t need to pull in external dependencies for critical components.</p>
<p>Runtimes are automatically installed with apps that require them, and are updated separately by the user’s OS, app store, or CLI when needed. When a dependency in a runtime is updated, e.g. for a critical security update, it rolls out as an update to all users of apps that use that runtime.</p>
<p>In some cases there are commonly-used libraries not provided directly by one of the available runtimes. Flathub provides <a href="https://docs.flathub.org/docs/for-app-authors/shared-modules" target="_blank" rel="noopener noreferrer" class="">shared modules</a> for these libraries to centralize the maintenance. If an app needs to bundle other dependencies, they must be defined in the manifest. We also provide <a href="https://github.com/flathub-infra/flatpak-external-data-checker" target="_blank" rel="noopener noreferrer" class="">tooling to automatically suggest updates</a> to app dependencies.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="submission--human-review">Submission &amp; Human Review<a href="https://docs.flathub.org/blog/app-safety-layered-approach-source-to-user#submission--human-review" class="hash-link" aria-label="Direct link to Submission &amp; Human Review" title="Direct link to Submission &amp; Human Review" translate="no">​</a></h2>
<p>Once an app is developed, it must be submitted to Flathub for consideration to be hosted and distributed. At this stage, human Flathub reviewers will review the app to ensure it follows the <a href="https://docs.flathub.org/docs/for-app-authors/requirements" target="_blank" rel="noopener noreferrer" class="">requirements</a>. Of note:</p>
<ul>
<li class="">
<p><strong>Apps must be sandboxed with as narrow permissions as possible</strong> while still functioning, including using appropriate runtime permissions instead of broad static permissions when possible. All broad
static permissions need to be justified by the submitter during review.</p>
</li>
<li class="">
<p><strong>Apps must not be misleading or malicious</strong>, which covers impersonating other apps or including outright malicious code or functionality.</p>
</li>
<li class="">
<p><strong>App IDs must accurately reflect the developer’s domain name</strong> or code hosting location; e.g. if an app is submitted that purports to be Lutris, its ID must be obviously associated with that app (in this case, <a href="https://lutris.net/" target="_blank" rel="noopener noreferrer" class="">Lutris.net</a>).</p>
</li>
</ul>
<p>The app’s Flatpak manifest is reviewed, including all static permissions. Each of the documented requirements are checked—and if a reviewer finds something out of place they request changes to the submission, ask for rationale, or reject it completely.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="automated-testing">Automated Testing<a href="https://docs.flathub.org/blog/app-safety-layered-approach-source-to-user#automated-testing" class="hash-link" aria-label="Direct link to Automated Testing" title="Direct link to Automated Testing" translate="no">​</a></h2>
<p>In addition to human review, Flathub also makes use of automated testing for a number of quality and safety checks. For example, our automated tests block unsafe or outright wrong permissions, such as apps requesting access to whole session or system buses or unsafe bus names. Our automated tests also help ensure reproducible builds by disallowing pointing at bare git branches without a specific commit.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="reproducibility--auditability">Reproducibility &amp; Auditability<a href="https://docs.flathub.org/blog/app-safety-layered-approach-source-to-user#reproducibility--auditability" class="hash-link" aria-label="Direct link to Reproducibility &amp; Auditability" title="Direct link to Reproducibility &amp; Auditability" translate="no">​</a></h2>
<p>Once an app has been approved and passes initial tests, it is built using the open source and publicly-available flatpak-builder utility from the approved public manifest, on Flathub’s infrastructure, and without network access. Sources for the app are validated against the documented checksums, and the build fails if they do not match.</p>
<p>For further auditability, we specify the git commit of the manifest repo used for the build in the Flatpak build subject. The build itself is signed by Flathub’s key, and Flatpak/OSTree verify these signatures when installing and updating apps.</p>
<p>We mirror the exact sources each app is built against in case the original source goes down or there is some other issue, and anyone can build the Flatpak back from those mirrored sources to reproduce or audit the build. The manifest used to build the app is hosted on Flathub’s GitHub org, plus distributed to every user in the app’s sandbox at <code>/app/manifest.json</code>—both of which can be compared, inspected, and used to rebuild the app exactly as it was built by Flathub.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="verification">Verification<a href="https://docs.flathub.org/blog/app-safety-layered-approach-source-to-user#verification" class="hash-link" aria-label="Direct link to Verification" title="Direct link to Verification" translate="no">​</a></h2>
<p>Apps can be <a href="https://docs.flathub.org/docs/for-app-authors/verification" target="_blank" rel="noopener noreferrer" class="">verified</a> on Flathub; this process confirms that an app is published by the original developer or an authorized party by proving ownership of the app ID. While all apps are held to the same high standards of safety and review on Flathub, this extra layer helps users confirm that the app they are getting is <em>also</em> provided or authorized by its developer.</p>
<p><img decoding="async" loading="lazy" alt="Verified checkmark" src="https://docs.flathub.org/assets/images/verified-f93f6737d8c414a1b1be91179d85cc69.png" width="1362" height="517" class="img_ev3q"></p>
<p>Over half of the apps on Flathub so far are verified, with the number regularly increasing.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="app-store-clients">App Store Clients<a href="https://docs.flathub.org/blog/app-safety-layered-approach-source-to-user#app-store-clients" class="hash-link" aria-label="Direct link to App Store Clients" title="Direct link to App Store Clients" translate="no">​</a></h2>
<p>Once an app is developed, submitted, tested, approved, built, and distributed, it appears in app store clients like Flathub.org, KDE Discover, GNOME Software, and elementary AppCenter—as well as the Flatpak CLI. While exact implementations vary and the presentation is up to the specific app store client, generally each will show:</p>
<ul>
<li class="">Static permissions and their impact on safety</li>
<li class="">Open Age Rating Service rating and details</li>
<li class="">If an app uses outdated runtimes</li>
<li class="">Release notes for each release</li>
<li class="">If static permissions increase between releases</li>
</ul>
<p>Flathub.org and GNOME Software also display the app’s verified status.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="updates">Updates<a href="https://docs.flathub.org/blog/app-safety-layered-approach-source-to-user#updates" class="hash-link" aria-label="Direct link to Updates" title="Direct link to Updates" translate="no">​</a></h2>
<p>Once an app is accepted onto Flathub, it still remains subject to number of
safety protections built into the flow:</p>
<ul>
<li class=""><strong>Flathub maintains ownership over the manifest repo</strong>, while app developers are invited as limited collaborators</li>
<li class=""><strong>The manifest repo’s default branch is protected</strong>, preventing direct pushes without a pull request</li>
<li class=""><strong>The manifest repo’s commit history cannot be rewritten</strong>, making it harder to sneak something in</li>
<li class=""><strong>Flathub’s automated tests must pass</strong> before a PR can be merged and an update can be pushed</li>
<li class=""><strong>Static permission changes are held for human review</strong> before an update is released to users</li>
<li class=""><strong>Critical MetaInfo changes are held for human review</strong>, e.g. if an app name, developer name, app summary, or license changes</li>
</ul>
<p><img decoding="async" loading="lazy" alt="Build moderation dashboard showing permission changes of Kodi, light" src="https://docs.flathub.org/assets/images/moderation-light-31fcc57dcbde5c793f0002c758ecf4bb.png#gh-light-mode-only" width="1382" height="454" class="img_ev3q">
<img decoding="async" loading="lazy" alt="Build moderation dashboard showing permission changes of Kodi, dark" src="https://docs.flathub.org/assets/images/moderation-dark-9100656f3ee61ce86fc7a7620970feea.png#gh-dark-mode-only" width="1382" height="454" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="special-cases">Special Cases<a href="https://docs.flathub.org/blog/app-safety-layered-approach-source-to-user#special-cases" class="hash-link" aria-label="Direct link to Special Cases" title="Direct link to Special Cases" translate="no">​</a></h2>
<p>There are a few special cases to some of the points above which I would be remiss not to mention.</p>
<p>Flathub has granted a select group of trusted partners, including Mozilla and OBS Studio, the ability to directly upload their builds from their own infrastructure. These projects have an entire CI pipeline which validates the state of their app, and they perform QA before tagging the release and pushing it to Flathub. Even for these few cases of direct uploads, we require a public manifest and build pipeline to enable similar reproducibility and auditability as outlined above. We also require the apps to be verified, and still run automated tests such as our linter against them.</p>
<p>Lastly, some apps (around 6%) use <a href="https://docs.flatpak.org/en/latest/module-sources.html#extra-data" target="_blank" rel="noopener noreferrer" class="">extra-data</a> to instruct Flatpak to download and unpack an existing package (e.g. a Debian package) during installation. This process runs in a tight unprivileged Flatpak sandbox that does not allow host filesystem or network access, and the sandbox cannot be modified by app developers. These are largely proprietary apps that cannot be built on Flathub’s infrastructure, or apps using complex toolchains that require network access during build. This is discouraged since it does not enable the same level of auditability nor multi-architecture support that building from source does. As a result, this is heavily scrutinized during human review and only accepted as a last resort.</p>
<p>Even with the above, the vast majority of apps are built reproducibly from
source on Flathub’s infrastructure. The handful of apps that aren’t still
greatly benefit from the transparency and auditability built into all of the
other layers.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="incident-response">Incident Response<a href="https://docs.flathub.org/blog/app-safety-layered-approach-source-to-user#incident-response" class="hash-link" aria-label="Direct link to Incident Response" title="Direct link to Incident Response" translate="no">​</a></h2>
<p>While we expect to catch the vast majority of safety issues with the above, we are also able to respond to anything that may have slipped through. For example, we have the ability to remove an app from the Flathub remote in case we find that it’s malicious. We can also revert, recall, or block broken or malicious app updates.</p>
<p>We take security reports and legal issues very seriously; please <a href="mailto:admins@flathub.org" target="_blank" rel="noopener noreferrer" class="">contact the Flathub admins</a> to report an issue, or <a href="https://matrix.to/#/#flathub:matrix.org" target="_blank" rel="noopener noreferrer" class="">chat with us on Matrix</a>.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="in-summary">In Summary…<a href="https://docs.flathub.org/blog/app-safety-layered-approach-source-to-user#in-summary" class="hash-link" aria-label="Direct link to In Summary…" title="Direct link to In Summary…" translate="no">​</a></h2>
<p>As you can see, Flathub takes safety very seriously. We’ve worked with the greater Linux and FreeDesktop ecosystem for <em>over a decade</em> on efforts such as Flatpak, OSTree, Portals, and even desktop environments and app store clients to help build the best app distribution experience—for both users and app developers—with safety as a core requirement. We believe our in-depth, multi-layered approach to safety has set a high bar that few others have met—and we will continue to raise it.</p>
<p>Thank you to all contributors to Flatpak, Flathub, and the technologies
our ecosystem relies on. Thanks to the thousands of developers for
trusting us with app distribution, and to bbhtt, Jordan, and Sonny for
reviewing this post. And as always, thank you to the millions of users
trusting Flathub as your source of apps on Linux. ♥</p>]]></content>
        <author>
            <name>Cassidy James Blaede</name>
        </author>
        <category label="moderation" term="moderation"/>
        <category label="safety" term="safety"/>
        <category label="permissions" term="permissions"/>
        <category label="review" term="review"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[On the Go: Making it Easier to Find Linux Apps for Phones & Tablets]]></title>
        <id>https://docs.flathub.org/blog/on-the-go-linux-mobile-collection</id>
        <link href="https://docs.flathub.org/blog/on-the-go-linux-mobile-collection"/>
        <updated>2025-02-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[With apps made for different form factors, it can be hard to find what works for your specific device. For example, we know it can be a bit difficult to find great apps that are actually designed to be used on a mobile phone or tablet. To help solve this, we’re introducing a new collection: On the Go.]]></summary>
        <content type="html"><![CDATA[<p>With apps made for different form factors, it can be hard to find what works for your specific device. For example, we know it can be a bit difficult to find great apps that are actually designed to be used on a mobile phone or tablet. To help solve this, we’re introducing a new collection: On the Go.</p>
<p><a href="https://flathub.org/apps/collection/mobile/" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" alt="On the go: Apps for your Linux phones and tablets" src="https://docs.flathub.org/assets/images/banner-5b926fa8d591a0a78d6d7d91182221e7.png#gh-light-mode-only" width="2800" height="888" class="img_ev3q"> <img decoding="async" loading="lazy" alt="On the go: Apps for your Linux phones and tablets" src="https://docs.flathub.org/assets/images/banner-dark-aa945d7c5bee552d43977019f5be740d.png#gh-dark-mode-only" width="2800" height="888" class="img_ev3q"></a></p>
<p>As the premier source of apps for Linux, Flathub serves a wide range of people across a huge variety of hardware: from ultra powerful developer workstations to thin and light tablets; from handheld gaming consoles to a growing number of mobile phones. Generally any app on Flathub will work on a desktop or laptop with a large display, keyboard, and mouse or trackpad. However, devices with only touch input and smaller screen sizes have more constraints.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="revealing-the-app-ecosystem">Revealing the App Ecosystem<a href="https://docs.flathub.org/blog/on-the-go-linux-mobile-collection#revealing-the-app-ecosystem" class="hash-link" aria-label="Direct link to Revealing the App Ecosystem" title="Direct link to Revealing the App Ecosystem" translate="no">​</a></h2>
<p>Using <a href="https://docs.flathub.org/docs/for-app-authors/metainfo-guidelines/#device-support" target="_blank" rel="noopener noreferrer" class="">existing data</a> and open standards, we’re now highlighting apps on Flathub that report as being designed to work on these mobile form factors. This new <a href="https://flathub.org/apps/collection/mobile/" target="_blank" rel="noopener noreferrer" class="">On the Go collection</a> uses existing device support data submitted by app developers in their MetaInfo, the same spec that is used to build those app’s listings for Flathub and other app store clients. The collection is featured on the Flathub.org home page for all devices.</p>
<p><img decoding="async" loading="lazy" alt="Foliate app adapting across a desktop, tablet, and phone" src="https://docs.flathub.org/assets/images/foliate-adaptive-ac2537f4b445b3a31753a0a066949c04.png" width="1000" height="600" class="img_ev3q"></p>
<p>Many of these apps are adaptive across screen sizes and input methods; you might be surprised to know that your favorite app on your desktop will also work great on a Linux phone, tablet, or Steam Deck’s touch screen. We aim to help reveal just how rich and well-rounded the app ecosystem already is for these devices—and to give app developers another place for their apps to shine and be discovered.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="developers-its-up-to-you">Developers: It’s Up to You<a href="https://docs.flathub.org/blog/on-the-go-linux-mobile-collection#developers-its-up-to-you" class="hash-link" aria-label="Direct link to Developers: It’s Up to You" title="Direct link to Developers: It’s Up to You" translate="no">​</a></h2>
<p>As of this writing there are over 150 apps in the collection, but we expect there are cases where app developers have not provided the requisite device support data.</p>
<p>If you’re the creator of an app that should work well on mobile form factors but isn’t featured in the collection, take a minute to double-check the <a href="https://docs.flathub.org/docs/for-app-authors/metainfo-guidelines/#device-support" target="_blank" rel="noopener noreferrer" class="">documentation</a> and your own apps’s MetaInfo to ensure it’s accurate. Device support data can also be used by native app store clients across form factors to determine what apps are displayed or how they are ranked, so it’s a good idea to ensure it’s up to date regardless of what your app supports.</p>]]></content>
        <author>
            <name>Cassidy James Blaede</name>
        </author>
        <category label="quality" term="quality"/>
        <category label="mobile" term="mobile"/>
        <category label="moderation" term="moderation"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[What's next for Flathub build infrastructure]]></title>
        <id>https://docs.flathub.org/blog/flathub-build-infrastructure-revamp</id>
        <link href="https://docs.flathub.org/blog/flathub-build-infrastructure-revamp"/>
        <updated>2025-02-03T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[There is a storm coming and we are re-architecting our build infrastructure.]]></summary>
        <content type="html"><![CDATA[<p>There is a storm coming and we are re-architecting our build infrastructure.</p>
<p>Buildbot has never been designed to do what Flathub needs: taking arbitrary inputs like application IDs and dynamically creating new pipelines. However, there's no misuse one cannot achieve if something is being configured in A Real Programming Language, and so, back in 2019, <a href="https://blogs.gnome.org/alexl/" target="_blank" rel="noopener noreferrer" class="">Alex Larsson</a> piled a bunch of hacks so we could have not only dynamic configuration based on Flathub organization in GitHub, but also some custom views displaying latest builds.</p>
<p>Fast-forward to 2025, these hacks no longer work with the latest release of Buildbot, rendering our soft fork stuck on a version from 2021. For whatever reason, updating GitHub CI status stopped to work well, allowing people to merge untested code changes. It also requires periodical restarts because it grinds to a halt for no particular reason, dropping new builds in the meantime. The worst offense: I never liked it.</p>
<p>Interlude: Equinix Metal née Packet has been sponsoring our heavy-lifting servers doing actual building for the past 5 years. Unfortunately, they are shutting down, meaning we need to move out by the end of April 2025.</p>
<p>This perfect storm means we need to effectively re-architecture build infrastructure from scratch.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="webhook-proxy">webhook-proxy<a href="https://docs.flathub.org/blog/flathub-build-infrastructure-revamp#webhook-proxy" class="hash-link" aria-label="Direct link to webhook-proxy" title="Direct link to webhook-proxy" translate="no">​</a></h2>
<p>Let's start from improving Buildbot reliability where it falls short. While GitHub shows delivery status of webhook events, and even provides a button to trigger another attempt, there's no public API exposing this data.</p>
<p>As there's no way I'm fixing Buildbot itself, I decided we need a middleman which will take care of redelivering if Buildbot's webhook endpoint responded with non-200 response.</p>
<p><a href="https://github.com/flathub-infra/webhook-proxy" target="_blank" rel="noopener noreferrer" class="">webhook-proxy</a> is a simple Python service which accepts payloads from GitHub, marks new pull requests as pending CI, then forwards unchanged events to Buildbot. Should Buildbot have a hiccup, it will open a circuit breaker and retry with exponential back off until it eventually succeeds.</p>
<p>It ain't much, but it's honest work.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="justpak">justpak<a href="https://docs.flathub.org/blog/flathub-build-infrastructure-revamp#justpak" class="hash-link" aria-label="Direct link to justpak" title="Direct link to justpak" translate="no">​</a></h2>
<p>An important piece of the future Buildbot replacement is being agnostic of its CI/CD implementation. The idea is to provide only a business logic service, while actual building is delegated elsewhere. As such, it requires some relatively generic tool to execute tasks instead of maintaining two or more pipeline definitions for whatever is the CI/CD solution of the decade.</p>
<p>After evaluating modern <code>make</code> replacements, I settled on <a href="https://just.systems/" target="_blank" rel="noopener noreferrer" class="">just</a>. It seems simple enough for executing external commands, and has a nifty way of defining recipes with a specific shebang from the get-go, so it's all a single file even when using a mix of Python and Bash.</p>
<p>I copied all build steps done by the Buildbot workers to specific recipes to have a single entry point. Then I started doing back flips with GitHub Actions to see if this is a viable way in the first place; turns out it is, although not without some hurdles.</p>
<p>While GitHub Actions have a native way of executing all steps inside a Docker container, the host running said container is full of bloat and barely has any free disk space. <a href="https://bbhtt.in/about/" target="_blank" rel="noopener noreferrer" class="">bbhtt</a> suggested how to remove unneeded files, which also meant each build step is prefixed with <code>docker run</code> as we want to re-use existing <a href="https://github.com/flathub-infra/flatpak-builder-lint" target="_blank" rel="noopener noreferrer" class="">flatpak-builder-lint</a> image instead of meddling with Ubuntu.</p>
<p>Then I went to GNOME GitLab to implement identical pipeline because I have no mouth and I must write YAML. GitLab has its set of quirks but after configuring its runners to stop dropping job output and kindly asking GitLab to stop unconditionally kill jobs whose logs exceeded a certain size, we've got the answer: it will blend!</p>



































<table><thead><tr><th>Application ID</th><th>Buildbot</th><th>GitHub Actions</th><th>GNOME GitLab</th></tr></thead><tbody><tr><td>Vim</td><td>4m 29s</td><td>3m 03s</td><td>1m 46s</td></tr><tr><td>Fractal</td><td>28m 29s</td><td>31m 09s</td><td>23m 37s</td></tr><tr><td>QGIS</td><td>123m 00s</td><td>198m 00s</td><td>124m 43s</td></tr><tr><td>Ungoogled Chromium</td><td>75m 28s</td><td>timed out at 6h</td><td>177m 29s</td></tr></tbody></table>
<p>Apps on the smaller size can be safely built on GitHub Actions, but anything larger like Chromium, LibreOffice or KDE runtime will need some special treatment by being routed to GNOME GItLab. It's still not as fast as existing infrastructure is, but it will no longer be existing in a quarter, so there's nothing to be complaining about here. As both GitHub Actions and GitLab CI allow triggering workflows through API, it will be also easy to integrate with some external system.</p>
<p>The work-in-progress repo can be found <a href="https://github.com/barthalion/justpak" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
<p>I was initially panicking about replacing aarch64 runners, but it turns out GitHub is providing that since September 2024. Build times are in line with the table above, meaning we are only worried about outliers. I have submitted Flathub to Works on Arm program, and if it gets accepted, we will handle that similarly to x86_64.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-rest-of-the-owl">The rest of the owl<a href="https://docs.flathub.org/blog/flathub-build-infrastructure-revamp#the-rest-of-the-owl" class="hash-link" aria-label="Direct link to The rest of the owl" title="Direct link to The rest of the owl" translate="no">​</a></h2>
<p>It's all cool and dandy, but the crucial part is still missing: a service encapsulating business logic. Buildbot encapsulates starting new builds, figuring out where they should go (Is it a test build? Is it a beta build?), retries for failed builds and managing publishing, all of that with a fancy UI.</p>
<p>There's no punchline here: I'm only starting the legwork to figure out which language and framework to use. If you would like to see something specific implemented, don't hesitate to request it <a href="https://github.com/flathub-infra/vorarbaiter/issues" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>]]></content>
        <author>
            <name>Bart Piotrowski</name>
        </author>
        <category label="infrastructure" term="infrastructure"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[2 Billion Downloads & Other Milestones from 2024 So Far]]></title>
        <id>https://docs.flathub.org/blog/2-billion-downloads-2024</id>
        <link href="https://docs.flathub.org/blog/2-billion-downloads-2024"/>
        <updated>2024-08-13T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[It's been a busy year, and our platform and developer community-building efforts are paying off. Let's take a look at what we've been up to over the last six months, and measure its effect.]]></summary>
        <content type="html"><![CDATA[<p>It's been a busy year, and our platform and developer community-building efforts are paying off. Let's take a look at what we've been up to over the last six months, and measure its effect.</p>
<p>At the beginning of the year we announced an incredible milestone for Flathub: <a class="" href="https://docs.flathub.org/blog/over-one-million-active-users-and-growing">over one million active users</a>. But we didn't slow down; in February we <a class="" href="https://docs.flathub.org/blog/fosdem-2024">attended FOSDEM</a>, then announced <a class="" href="https://docs.flathub.org/blog/improved-build-validation">improved app moderation</a> and <a class="" href="https://docs.flathub.org/blog/introducing-app-brand-colors">app brand colors</a> in preparation for some new features. Those efforts ultimately launched with <a href="https://floss.social/@flathub/112315662449987878" target="_blank" rel="noopener noreferrer" class="">the new homepage and featured app banners</a> in April.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="milestones">Milestones<a href="https://docs.flathub.org/blog/2-billion-downloads-2024#milestones" class="hash-link" aria-label="Direct link to Milestones" title="Direct link to Milestones" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Flathub: 70% of top apps verified, 100+ curated quality apps, 4 million active users, 2 billion downloads" src="https://docs.flathub.org/assets/images/milestones-c133cfc68c2aaa2cd7b8ceb2e8e085d3.png" width="1920" height="1080" class="img_ev3q"></p>
<p>We're back with some new milestones thanks to the continued growth of Flathub as an app store and the incredible work of both our largely volunteer team and our growing app developer community:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="70-of-the-most-popular-apps-are-verified">70% of the most popular apps are verified<a href="https://docs.flathub.org/blog/2-billion-downloads-2024#70-of-the-most-popular-apps-are-verified" class="hash-link" aria-label="Direct link to 70% of the most popular apps are verified" title="Direct link to 70% of the most popular apps are verified" translate="no">​</a></h3>
<p>Over <a href="https://flathub.org/apps/collection/verified/" target="_blank" rel="noopener noreferrer" class="">1,000 apps</a> have been verified by their developers on Flathub, including 70% of the <a href="https://flathub.org/apps/collection/popular/1" target="_blank" rel="noopener noreferrer" class="">top 30 most popular apps</a>. Developers of verified apps are ultimately in charge of their own app listings, and their updates are delivered directly to Flathub users while passing our automated testing and human review of things like permission changes.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="100-curated-quality-apps">100+ curated quality apps<a href="https://docs.flathub.org/blog/2-billion-downloads-2024#100-curated-quality-apps" class="hash-link" aria-label="Direct link to 100+ curated quality apps" title="Direct link to 100+ curated quality apps" translate="no">​</a></h3>
<p>Over 100 apps are now passing our quality guidelines that include checks like icon contrast on both light and dark backgrounds, quality screenshots, and consistent app naming and descriptions so users get a better experience browsing Flathub. These guidelines are what enable us to curate and display visually appealing and consistent banners on the new home page, for example.</p>
<p>This means that between late February and July, the developers of over 100 apps went out of their way to improve—and sometimes make significant changes to—their apps' metadata to get ready for these new guidelines and features on Flathub. We're proud of these developers who have gone above and beyond, and we look forward to even more apps opting in over time.</p>
<p>Developers, if you'd like to see your app featured on the home page, please ensure you are following these guidelines! We've <a href="https://fosstodon.org/@bragefuglseth/112430463664651417" target="_blank" rel="noopener noreferrer" class="">heard from app developers</a> that getting your app featured not only gives a bump in downloads, but can also bring an increase in contributions to your project if it's open source.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-million-active-users">4 million active users<a href="https://docs.flathub.org/blog/2-billion-downloads-2024#4-million-active-users" class="hash-link" aria-label="Direct link to 4 million active users" title="Direct link to 4 million active users" translate="no">​</a></h3>
<p>Six months ago we passed one million active users based on a simple if conservative estimate of updates to a common runtime version we had served. Using that same methodology, we now estimate we have over 4 million active users!</p>
<p>As a reminder, this data is publicly available and anyone can check our work. In fact, I personally would love if we could work with a volunteer from the community to automate this statistic so we don't have to do manual collation each time. If you're interested, check out <a href="https://github.com/flathub-infra/website/issues/2945" target="_blank" rel="noopener noreferrer" class="">this GitHub issue</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="over-2-billion-downloads">Over 2 billion downloads<a href="https://docs.flathub.org/blog/2-billion-downloads-2024#over-2-billion-downloads" class="hash-link" aria-label="Direct link to Over 2 billion downloads" title="Direct link to Over 2 billion downloads" translate="no">​</a></h3>
<p>Those users have been busy, too: to date we have served over two billion downloads of different apps to people using different Linux flavors all around the world. This is a huge community of people trusting Flathub as their source of apps for Linux.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="thank-you">Thank you!<a href="https://docs.flathub.org/blog/2-billion-downloads-2024#thank-you" class="hash-link" aria-label="Direct link to Thank you!" title="Direct link to Thank you!" translate="no">​</a></h2>
<p>Thank you to our download-happy community of users who have put their trust in Flathub as their source of apps on Linux. Thank you to all of the developers of those apps, and in particular those developers who have chosen to follow the quality guidelines to help make Flathub a more consistent and engaging space. And thank you to every contributor to Flathub itself whether you are someone who fixed a typo in the developer documentation, helped translate the store, contributed mockups and design work, or spent countless hours keeping everything running smoothly.</p>
<p>As a grassroots effort, we wouldn't have become the Linux app store without each and every one of you. ❤️</p>]]></content>
        <author>
            <name>Cassidy James Blaede</name>
        </author>
        <category label="milestone" term="milestone"/>
        <category label="stats" term="stats"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Linter breaking change: restricting automatic merge]]></title>
        <id>https://docs.flathub.org/blog/linter-restricting-automatic-merge</id>
        <link href="https://docs.flathub.org/blog/linter-restricting-automatic-merge"/>
        <updated>2024-06-13T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Starting next week, June 17th, the linter will no longer allow enabling]]></summary>
        <content type="html"><![CDATA[<p>Starting next week, June 17th, the linter will no longer allow enabling
automatic merge for pull requests created by flatpak-external-data-checker,
unless the app uses an extra-data source or has been added to the exceptions list.</p>
<p>The verified apps utilizing <code>automerge-flathubbot-prs</code> before May 28th have
been grandfathered and no explicit action is required from the maintainers. If
your app does not meet these criteria, you can still
<a href="https://docs.flathub.org/docs/for-app-authors/linter/#exceptions" target="_blank" rel="noopener noreferrer" class="">request an exception</a> by creating a pull request to the
flatpak-builder-lint repository. Exception requests will be judged on a
case-by-case basis on providing valid reasons.</p>
<p>The <code>automerge-flathubbot-prs</code> feature has been introduced back in 2019 to
reduce maintenance overhead of applications dependent on non-redistributable
data. If <a href="https://docs.flatpak.org/en/latest/module-sources.html#extra-data" target="_blank" rel="noopener noreferrer" class="">an extra-data source</a> used by the app disappears because
of an update, the automation would ensure that it is still possible to install
the app, without requiring manual intervention from the maintainers.</p>
<p>Over time, the feature has started to be misused as a general purpose
automation for publishing updates without proper testing. This has led to a
number of issues where apps became broken overnight, which could have been
easily prevented if the update was tested before merging.</p>]]></content>
        <author>
            <name>Bart Piotrowski</name>
        </author>
        <category label="linter" term="linter"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Introducing App Brand Colors]]></title>
        <id>https://docs.flathub.org/blog/introducing-app-brand-colors</id>
        <link href="https://docs.flathub.org/blog/introducing-app-brand-colors"/>
        <updated>2024-02-26T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[We're gearing up to launch curated banners on the Flathub home page! However, before we can do that there's one more blocker: Banners need a background color for each app, and many apps don't provide this metadata yet. This is why today we're expanding our MetaInfo quality guidelines and quality checks on the website; If you haven't yet, please add these colors to your app's MetaInfo file using the `` appstream tag, and read on to learn more about brand colors.]]></summary>
        <content type="html"><![CDATA[<p>We're gearing up to launch curated banners on the Flathub home page! However, before we can do that there's one more blocker: Banners need a background color for each app, and many apps don't provide this metadata yet. This is why today we're expanding our MetaInfo quality guidelines and quality checks on the website; If you haven't yet, please add these colors to your app's MetaInfo file using the <code>&lt;branding/&gt;</code> appstream tag, and read on to learn more about brand colors.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-are-brand-colors">What are brand colors?<a href="https://docs.flathub.org/blog/introducing-app-brand-colors#what-are-brand-colors" class="hash-link" aria-label="Direct link to What are brand colors?" title="Direct link to What are brand colors?" translate="no">​</a></h2>
<p>App brand colors are an easy and effective way for app developers to give their listing a bit more personality in app stores. In combination with the app icon and name, they allow setting a tone for the app without requiring a lot of extra work, unlike e.g. creating and maintaining additional image assets.</p>
<p><img decoding="async" loading="lazy" alt="GNOME Software Explore view with brand colors on app banners" src="https://docs.flathub.org/assets/images/software-explore-d58dc692ba057248ae81947f54fc3ba4.png" width="1204" height="922" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-now">Why now?<a href="https://docs.flathub.org/blog/introducing-app-brand-colors#why-now" class="hash-link" aria-label="Direct link to Why now?" title="Direct link to Why now?" translate="no">​</a></h2>
<p>This idea was first implemented in elementary AppCenter, and later standardized as part of the <a href="https://www.freedesktop.org/software/appstream/docs/chap-Metadata.html#tag-branding" target="_blank" rel="noopener noreferrer" class="">AppStream specification</a>.</p>
<p>While it has been in AppStream itself <a href="https://github.com/ximion/appstream/issues/187" target="_blank" rel="noopener noreferrer" class="">for a few years</a>, it was unfortunately not possible for Flathub's backend to pick it up until the recent <a class="" href="https://docs.flathub.org/blog/improved-build-validation">port to libappstream</a>. This is why many apps are still not providing this metadata—even if it was available from the app side we were unable to display it until now.</p>
<p><img decoding="async" loading="lazy" alt="elementary AppCenter with brand colors on app banners" src="https://docs.flathub.org/assets/images/appcenter-2a23f6901160f6f9b5f2b2c3a43976a8.png" width="2816" height="1790" class="img_ev3q"></p>
<p>Now that we can finally pick these colors up from AppStream MetaInfo files, we want to make use of them—and they are essential for the new banners.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="adding-brand-colors">Adding brand colors<a href="https://docs.flathub.org/blog/introducing-app-brand-colors#adding-brand-colors" class="hash-link" aria-label="Direct link to Adding brand colors" title="Direct link to Adding brand colors" translate="no">​</a></h2>
<p>Apps are expected to provide two different brand colors for light and dark. <a href="https://github.com/pika-backup/pika-backup/blob/8f2f04a1a27d2b04db48f7dbf26577009ff39be3/data/app.metainfo.xml.in#L44" target="_blank" rel="noopener noreferrer" class="">Here's an example</a> of a MetaInfo file in the wild including brand colors.</p>
<p>This is the snippet you need to include in your MetaInfo file:</p>
<div class="language-xml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-xml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">branding</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">color</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">type</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">primary</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">scheme_preference</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">light</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">#faa298</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">color</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">color</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">type</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">primary</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">scheme_preference</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">dark</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">#7f2c22</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">color</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">branding</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre></div></div>
<p>In choosing the colors, try to make sure the colors work well in their respective context (e.g. don't use a light yellow for the dark color scheme), and look good as a background behind the app icon (e.g. avoid using exactly the same color to maintain contrast). In most cases it's recommended to pick a lighter tint of a main color from the icon for the light color scheme, and a darker shade for the dark color scheme. Alternatively you can also go with a complementary color that goes well with the icon's colors.</p>
<p><img decoding="async" loading="lazy" alt="Three examples of good/bad brand colors" src="https://docs.flathub.org/assets/images/color-examples-b5812a4e182bb2cd38b8a1dffc401bb1.png" width="556" height="204" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What's next?<a href="https://docs.flathub.org/blog/introducing-app-brand-colors#whats-next" class="hash-link" aria-label="Direct link to What's next?" title="Direct link to What's next?" translate="no">​</a></h2>
<p>Today we've updated the MetaInfo quality guidelines with <a href="https://docs.flathub.org/docs/for-app-authors/metainfo-guidelines/quality-guidelines/#brand-colors" target="_blank" rel="noopener noreferrer" class="">a new section on app brand colors</a>. Going forward, brand colors will be required as part of the MetaInfo quality review.</p>
<p>If you have an app on Flathub, check out the guidelines and update your MetaInfo with brand colors as soon as possible. This will help your app look as good as possible, and will make it eligible to be featured when the new banners ship. Let's make Flathub a more colorful, exciting place to find new apps!</p>]]></content>
        <author>
            <name>Kolja Lampe</name>
        </author>
        <author>
            <name>Tobias Bernard</name>
        </author>
        <category label="quality" term="quality"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Improved build validation, increased moderation, and the long-awaited switch to libappstream]]></title>
        <id>https://docs.flathub.org/blog/improved-build-validation</id>
        <link href="https://docs.flathub.org/blog/improved-build-validation"/>
        <updated>2024-02-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Flathub's automatic build validation is more thorough now, and includes checks for issues we previously would have only flagged manually. There is a chance that if your app has been passing the continuous integration checks previously, it will fail now; here's why, and what to do about it.]]></summary>
        <content type="html"><![CDATA[<p>Flathub's automatic build validation is more thorough now, and includes checks for issues we previously would have only flagged manually. There is a chance that if your app has been passing the continuous integration checks previously, it will fail now; here's why, and what to do about it.</p>
<p>If your application no longer passes the build validation stage in either Buildbot (for apps maintained on GitHub) or flat-manager (for direct uploads), make sure to look for specific messages in the log. Explanations for various error messages can be found in <a class="" href="https://docs.flathub.org/docs/for-app-authors/linter">the documentation</a>. If you are interested in running the linter locally or integrating it with your own CI, please refer to <a href="https://github.com/flathub-infra/flatpak-builder-lint" target="_blank" rel="noopener noreferrer" class="">the project page</a>.</p>
<p>We have also started moderating all permission changes and some critical MetaInfo changes. For example, if a build adds or removes a static permission (as seen in the <code>finish-args</code> array in the manifest) or changes the app’s user-facing name, it will be withheld for manual human review. Reviewers may reject a build and reach out for clarification about the change.</p>
<p><img decoding="async" loading="lazy" alt="An example build withheld for manual review" src="https://docs.flathub.org/assets/images/moderation-52a1363ea517f514595a2ff7f662953d.png" width="2191" height="934" class="img_ev3q"></p>
<p>Flathub has also switched to a modern, well-maintained AppStream library, known as <code>libappstream</code>. This enables developers to use all features described in the <a href="https://www.freedesktop.org/software/appstream/docs/" target="_blank" rel="noopener noreferrer" class="">AppStream 1.0 specification</a>, including specifying supported screen sizes for mobile devices, or video snippets to accompany static screenshots. It also improves the validation of AppStream metadata. Many thanks to <a href="https://tecnocode.co.uk/" target="_blank" rel="noopener noreferrer" class="">Philip Withnall</a>, <a href="https://nullrequest.com/" target="_blank" rel="noopener noreferrer" class="">Luna Dragon</a> and <a href="https://www.figuiere.net/hub/" target="_blank" rel="noopener noreferrer" class="">Hubert Figuière</a> for their work on this across the Flatpak stack, and <a href="https://blog.tenstral.net/" target="_blank" rel="noopener noreferrer" class="">Matthias Klumpp</a> for implementing knobs needed by Flathub in the library itself.</p>
<p>This work has been ongoing since 2021. At one point along the way we briefly switched over to <code>libappstream</code>, but had to revert due to unexpected breakage; however, today we are finally ready with all blocking issues addressed! While we were focused on closing the gaps to prevent potentially broken builds from being published, we regret that we failed to provide a heads-up about the coming validation changes. Any future breaking changes will be properly announced on this blog, and going forward we will also inform maintainers of affected apps about required changes in advance.</p>]]></content>
        <author>
            <name>Bart Piotrowski</name>
        </author>
        <category label="moderation" term="moderation"/>
        <category label="linter" term="linter"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Catch Us at FOSDEM 2024!]]></title>
        <id>https://docs.flathub.org/blog/fosdem-2024</id>
        <link href="https://docs.flathub.org/blog/fosdem-2024"/>
        <updated>2024-01-31T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[FOSDEM 2024—a free event for software developers to meet, share ideas, and collaborate—is this coming weekend in Brussels, Belgium and we'll be there! Learn where you can find us or even sit down and discuss Flathub itself, metadata and build validation, upcoming changes, and anything else on your mind.]]></summary>
        <content type="html"><![CDATA[<p>FOSDEM 2024—a free event for software developers to meet, share ideas, and collaborate—is this coming weekend in Brussels, Belgium and we'll be there! Learn where you can find us or even sit down and discuss Flathub itself, metadata and build validation, upcoming changes, and anything else on your mind.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bof-saturday-1600-cet">BoF: Saturday 16:00 CET<a href="https://docs.flathub.org/blog/fosdem-2024#bof-saturday-1600-cet" class="hash-link" aria-label="Direct link to BoF: Saturday 16:00 CET" title="Direct link to BoF: Saturday 16:00 CET" translate="no">​</a></h2>
<p>The <a href="https://fosdem.org/2024/" target="_blank" rel="noopener noreferrer" class="">FOSDEM website</a> describes BoFs pretty well:</p>
<blockquote>
<p>BOF stands for Birds Of a Feather who, as the saying goes, flock together. FOSDEM has three meeting rooms that may be booked in 30 or 60 minute blocks for discussions. All the meetings are public so anyone who is interested can attend if there is enough space.</p>
</blockquote>
<p>We've reserved a BoF room for <strong>Saturday, February 3 at 16:00</strong> local time (CET, UTC+1); seating is on a first-come, first-served basis, so arrive promptly! We'll be meeting to discuss recent developments around metadata and build validation, other upcoming changes, and anything else on the minds of the attendees. Check the <a href="https://fosdem.org/2024/schedule/event/fosdem-2024-3715-flathub-flatpak-bof/" target="_blank" rel="noopener noreferrer" class="">event</a> for the exact room details (and any scheduling changes).</p>
<p>We hope to see you there!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="stands">Stands<a href="https://docs.flathub.org/blog/fosdem-2024#stands" class="hash-link" aria-label="Direct link to Stands" title="Direct link to Stands" translate="no">​</a></h2>
<p>Various Flathub and Flatpak folks can also be found around associated <a href="https://fosdem.org/2024/stands/" target="_blank" rel="noopener noreferrer" class="">stands</a>:</p>
<ul>
<li class=""><strong>Kodi</strong>: building H, level 1, stand 4</li>
<li class=""><strong>GNOME</strong>: building H, level 1, stand 5</li>
<li class=""><strong>KDE</strong>: building H, level 1, stand 6</li>
<li class=""><strong>Fedora Project</strong>: building AW, level 1, booth 4</li>
<li class=""><strong>Linux on Mobile</strong>: building AW, level 1, booth 7</li>
</ul>
<p>Find us to chat about Flathub, app submission and maintenance, Flatpak, and the Linux desktop app ecosystem.</p>]]></content>
        <author>
            <name>Cassidy James Blaede</name>
        </author>
        <category label="event" term="event"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Over One Million Active Users, and Growing]]></title>
        <id>https://docs.flathub.org/blog/over-one-million-active-users-and-growing</id>
        <link href="https://docs.flathub.org/blog/over-one-million-active-users-and-growing"/>
        <updated>2024-01-26T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Earlier this month we shared new app metadata guidelines in response to the growth and maturity of Flathub. Today we're proud to share about that growth in a bit more detail including a huge milestone, how we calculate stats, and what we believe is driving that growth.]]></summary>
        <content type="html"><![CDATA[<p>Earlier this month we shared <a class="" href="https://docs.flathub.org/blog/quality-moderation">new app metadata guidelines</a> in response to the growth and maturity of Flathub. Today we're proud to share about that growth in a bit more detail including a huge milestone, how we calculate stats, and what we believe is driving that growth.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="milestones">Milestones<a href="https://docs.flathub.org/blog/over-one-million-active-users-and-growing#milestones" class="hash-link" aria-label="Direct link to Milestones" title="Direct link to Milestones" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Flathub: 1.6 billion downloads; 2,400+ apps; 850+ verified apps; 1 million+ active users" src="https://docs.flathub.org/assets/images/milestones-bbf06ea4ad300901c8f39663b7bd69ce.png" width="1920" height="1080" class="img_ev3q"></p>
<p>To date, Flathub has served a total of <strong>1.6 billion downloads</strong> of <strong>over 2,400 apps</strong> and their updates.</p>
<p>Since introducing <a class="" href="https://docs.flathub.org/docs/for-users/verification">verified apps</a> last year, <strong>over 850 apps have been verified</strong> by their original authors; more than one third of all apps, with that number constantly increasing.</p>
<p>And finally, we're thrilled to announce that Flathub has surpassed <strong>one million active users</strong>. 🎉️</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-we-measure-growth">How We Measure Growth<a href="https://docs.flathub.org/blog/over-one-million-active-users-and-growing#how-we-measure-growth" class="hash-link" aria-label="Direct link to How We Measure Growth" title="Direct link to How We Measure Growth" translate="no">​</a></h2>
<p>We have a <a href="https://flathub.org/statistics" target="_blank" rel="noopener noreferrer" class="">public dashboard</a> that shares some basic statistics, powered by an <a href="https://github.com/flathub-infra/flathub-stats" target="_blank" rel="noopener noreferrer" class="">open source script</a>. We don't track individual metrics from end user machines; instead, we look at downloads of specific artifacts from the Flathub infrastructure itself. This gives us a count of installs and updates over time, downloads per country (based on the origin of requests), and some derivative data like downloads of apps in different categories.</p>
<p>But how can we measure how many <em>active users</em> we have?</p>
<p>Since Flathub necessarily serves downloads of Flatpak <em>runtimes</em> (common platforms on which apps are built), we can estimate active users fairly well. For example, when installing or updating many apps, Flatpak will automatically install the base <a href="https://freedesktop-sdk.gitlab.io/" target="_blank" rel="noopener noreferrer" class="">FreeDesktop SDK</a> runtime on which the KDE and GNOME runtimes (and most other apps) are built. We can look at the number of downloads of <em>updates</em> to a recent release of this runtime to estimate how many active installs are out there getting Flatpaks from Flathub.</p>
<p>This methodology reveals that over the past few months there have been over a million updates of each of the latest FreeDesktop SDK runtime releases, meaning we've passed the one million active user mark.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>If anything, we believe this to be a conservative estimate as some users may be using apps that do not use the specific runtime measured.</p></div></div>
<p>If you'd like to explore more of this data yourself, there's this <a href="https://klausenbusk.github.io/flathub-stats/#ref=org.freedesktop.Platform/23.08&amp;interval=infinity&amp;downloadType=updates" target="_blank" rel="noopener noreferrer" class="">handy dashboard by Kristian Klausen</a> (<a href="https://github.com/klausenbusk/flathub-stats" target="_blank" rel="noopener noreferrer" class="">source</a>), or you can always chat with us in <a href="https://matrix.to/#/#flathub:matrix.org" target="_blank" rel="noopener noreferrer" class="">#flathub on Matrix</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-driving-growth">What's Driving Growth<a href="https://docs.flathub.org/blog/over-one-million-active-users-and-growing#whats-driving-growth" class="hash-link" aria-label="Direct link to What's Driving Growth" title="Direct link to What's Driving Growth" translate="no">​</a></h2>
<p>We attribute the growth of Flathub to a few developments over the years, and especially the last several months:</p>
<ol>
<li class="">
<p><strong>Popular app availability</strong>: Since we started Flathub, we've seen apps like <a href="https://flathub.org/apps/org.mozilla.firefox" target="_blank" rel="noopener noreferrer" class="">Firefox</a>, <a href="https://flathub.org/apps/com.google.Chrome" target="_blank" rel="noopener noreferrer" class="">Google Chrome</a>, <a href="https://flathub.org/apps/com.discordapp.Discord" target="_blank" rel="noopener noreferrer" class="">Discord</a>, <a href="https://flathub.org/apps/org.videolan.VLC" target="_blank" rel="noopener noreferrer" class="">VLC</a>, <a href="https://flathub.org/apps/com.spotify.Client" target="_blank" rel="noopener noreferrer" class="">Spotify</a>, <a href="https://flathub.org/apps/org.telegram.desktop" target="_blank" rel="noopener noreferrer" class="">Telegram</a>, <a href="https://flathub.org/apps/com.microsoft.Edge" target="_blank" rel="noopener noreferrer" class="">Microsoft Edge</a>, <a href="https://flathub.org/apps/com.valvesoftware.Steam" target="_blank" rel="noopener noreferrer" class="">Steam</a>, <a href="https://flathub.org/apps/com.obsproject.Studio" target="_blank" rel="noopener noreferrer" class="">OBS Studio</a>, <a href="https://flathub.org/apps/us.zoom.Zoom" target="_blank" rel="noopener noreferrer" class="">Zoom</a>, <a href="https://flathub.org/apps/org.mozilla.Thunderbird" target="_blank" rel="noopener noreferrer" class="">Thunderbird</a>, and <em>many</em> more make their way into the store. These are many of the apps people want and expect, especially if they're coming to a Linux desktop for the first time. Each time another popular app hits Flathub, it makes both Flathub and Linux that much more compelling to users.</p>
</li>
<li class="">
<p><strong>Verified apps</strong>: We've heard that some folks have held off installing specific apps or even using Flathub altogether because they didn't want a third-party maintainer redistributing an app they rely on; <a class="" href="https://docs.flathub.org/docs/for-users/verification">verifying apps</a> solves this by assuring users their favorite app is actually coming from its developer. With an ever-increasing number of <a href="https://flathub.org/apps/collection/verified" target="_blank" rel="noopener noreferrer" class="">apps choosing to get verified</a>—including both big names and many newer indie apps—the trust and adoption of Flathub increases.</p>
</li>
<li class="">
<p><strong>Steam Deck</strong>: It's not <a href="https://mastodon.blaede.family/@cassidy/111031129234702967" target="_blank" rel="noopener noreferrer" class="">just a meme</a>; we suspect Flathub being included as the default app source for the Steam Deck's desktop mode has had a large positive effect on the usage of Flathub. Just look at some of the <a href="https://flathub.org/apps/collection/popular" target="_blank" rel="noopener noreferrer" class="">most popular apps</a>: retro game emulators, game compatibility tools, gaming-oriented chat services, alternate game launchers—all the kinds of apps you'd expect Steam Deck users to want. And in fact, "game" is the single most common category of app on Flathub. It turns out selling <a href="https://www.theverge.com/2023/11/9/23954205/valve-steam-deck-multiple-millions" target="_blank" rel="noopener noreferrer" class="">"multiple millions" of devices</a> has an impact on the ecosystem!</p>
</li>
<li class="">
<p><strong>Linux distro adoption</strong>: In addition to shipping on Steam Deck, Flathub now comes included out of the box on at least Clear Linux, Endless OS, KDE Neon, Linux Mint, Pop!_OS, and Zorin OS—and <a href="https://pagure.io/fesco/issue/2939" target="_blank" rel="noopener noreferrer" class="">as of Fedora 38</a>, Flathub is available in its entirety when enabling third-party software sources. <strong>Flathub is the preferred app store for Linux, and its grassroots adoption across the Linux desktop ecosystem proves that.</strong></p>
</li>
<li class="">
<p><strong>New apps</strong>: Last but definitely not least, we've entered a thrilling chapter of Flathub as an ecosystem. It's not just another source to get popular, big-name apps you'd expect to be able to get anywhere else; <strong>Flathub has become the preferred app store for a growing number of indie, open source developers</strong>. Developers are increasingly submitting their own new apps and directing their users to Flathub; from <a href="https://circle.gnome.org/#apps" target="_blank" rel="noopener noreferrer" class="">all 50+ GNOME Circle apps</a> to apps like <a href="https://flathub.org/apps/org.endlessos.Key" target="_blank" rel="noopener noreferrer" class="">Endless Key</a>, <a href="https://flathub.org/apps/com.librumreader.librum" target="_blank" rel="noopener noreferrer" class="">Librum</a>, <a href="https://flathub.org/apps/io.github.NickKarpowicz.LightwaveExplorer" target="_blank" rel="noopener noreferrer" class="">Lightwave Explorer</a>, <a href="https://flathub.org/apps/net.sapples.LiveCaptions" target="_blank" rel="noopener noreferrer" class="">Live Captions</a>, and <a href="https://flathub.org/apps/io.github.alainm23.planify" target="_blank" rel="noopener noreferrer" class="">Planify</a>, Flathub is the best way to get apps into the hands of Linux users.</p>
</li>
</ol>
<p>And of course a large part of Flathub's continued growth has been due to the incredible work of the Flathub admins, contributors, and volunteers who have helped ensure Flathub remains the trustworthy and reliable service it has always been known as.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="heres-to-whats-next">Here's to What's Next!<a href="https://docs.flathub.org/blog/over-one-million-active-users-and-growing#heres-to-whats-next" class="hash-link" aria-label="Direct link to Here's to What's Next!" title="Direct link to Here's to What's Next!" translate="no">​</a></h2>
<p>It's easy to pat ourselves on the back for these milestones (and it's well deserved!), but equally important is to look forward. Over the coming months we're excited to continue tackling <a href="https://discourse.flathub.org/t/flathub-in-2023/3808#whats-next-8" target="_blank" rel="noopener noreferrer" class="">the roadmap we laid out last year</a>, including continued work towards payments and the new organizational structure for Flathub.</p>
<p>We're also increasing our engagement with third-party developers and ISVs to share why they should bring their apps to the million-plus Flathub users on Linux, continuing to improve documentation, and working towards <a class="" href="https://docs.flathub.org/blog/quality-moderation#curation">curation and improved presentation of apps</a>. There's a lot more coming and always more to do; if you want to get involved, chat with us in <a href="https://matrix.to/#/#flathub:matrix.org" target="_blank" rel="noopener noreferrer" class="">#flathub on Matrix</a>.</p>
<p>Thank you for reading, and happy downloading!</p>]]></content>
        <author>
            <name>Cassidy James Blaede</name>
        </author>
        <category label="milestone" term="milestone"/>
        <category label="stats" term="stats"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Raising the Bar: Introducing the new App Metadata Guidelines]]></title>
        <id>https://docs.flathub.org/blog/quality-moderation</id>
        <link href="https://docs.flathub.org/blog/quality-moderation"/>
        <updated>2024-01-08T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Flathub has grown massively over the past few years, making it easier than ever to get a ton of apps all from one place—but with that growth comes new problems. We're here with a solution to ensure developers' apps, Flathub, and the entire Linux desktop ecosystem is presented in what we believe is the best light possible.]]></summary>
        <content type="html"><![CDATA[<p>Flathub has grown massively over the past few years, making it easier than ever to get a ton of apps all from one place—but with that growth comes new problems. We're here with a solution to ensure developers' apps, Flathub, and the entire Linux desktop ecosystem is presented in what we believe is the best light possible.</p>
<p>Today, Flathub has over 2,400 apps, including many of the big names you would expect. In the early days our goal was mostly to make it easy to get the latest version of popular apps via Flatpak, and we can safely say this has been achieved: not only can you get pretty much any app on Flathub, they are often directly maintained by the developer—and it's the primary channel many new app developers choose for shipping their apps.</p>
<p><img decoding="async" loading="lazy" alt="App cards with high quality metadata on the homepage" src="https://docs.flathub.org/assets/images/good-metadata-apps-b769542fb67d47350800d81536cf4b92.png" width="1161" height="651" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="more-apps-more-problems">More Apps, More Problems<a href="https://docs.flathub.org/blog/quality-moderation#more-apps-more-problems" class="hash-link" aria-label="Direct link to More Apps, More Problems" title="Direct link to More Apps, More Problems" translate="no">​</a></h2>
<p>However, having lots of apps comes with some new (in this case nice to have) problems. While there are a lot of beautiful modern apps, there are also a lot of apps with low quality metadata, ugly icons, or out of date screenshots. This means that looking at the new and updated lists on the Flathub home page you get the impression that most of the apps on Flathub are low quality.</p>
<p>One of the biggest reasons for the prevalence of low quality app metadata is probably that historically people were not discovering new apps from their repositories very often. Instead, they were mostly installing the same few classics with well-known brands (VLC, Blender, etc.), or relying on word of mouth for discovery. Now that new apps are being released on a weekly basis, app metadata becomes much more important for introducing people to these new apps.</p>
<p>The unfortunate result of the status quo in metadata quality is that many apps don't look inviting for new users, and it's difficult to find truly high quality apps among the rest.</p>
<p>So how can we make Flathub a place for people to discover awesome apps? We've thought about this quite a bit, and landed on a two-pronged approach:</p>
<ol>
<li class="">Raise the bar for metadata for all apps</li>
<li class="">Introduce curation to highlight the best apps</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="raising-the-bar">Raising the Bar<a href="https://docs.flathub.org/blog/quality-moderation#raising-the-bar" class="hash-link" aria-label="Direct link to Raising the Bar" title="Direct link to Raising the Bar" translate="no">​</a></h2>
<p>As a first step towards improving metadata quality across the board we have added new, detailed <a class="" href="https://docs.flathub.org/docs/for-app-authors/metainfo-guidelines/quality-guidelines">documentation for app metadata</a>. This new page goes over all the most important aspects, and which common mistakes to avoid. These include, for example:</p>
<ul>
<li class="">App icons that fill the entire canvas</li>
<li class="">Summaries repeating the app name</li>
<li class="">Screenshots with no window shadow</li>
</ul>
<p>We're also introducing a new review system for app metadata, where editors rate which of the criteria a specific app meets. As an app developer you can see the state of your metadata on the app page on Flathub.</p>
<p><img decoding="async" loading="lazy" alt="Developer-facing UI exposing the metadata ratings" src="https://docs.flathub.org/assets/images/moderation-developer-view-7a055ad665ac915223c4a935377accbe.png" width="1311" height="914" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" alt="Developer-facing UI exposing the metadata ratings" src="https://docs.flathub.org/assets/images/moderation-developer-sidebar-32b01331283e3dd5340182808e7d84ae.png" width="1311" height="914" class="img_ev3q"></p>
<p>If editors flagged issues with your app you can address them in the next release. Once the new release is on Flathub you can request a re-review. The status of your app will be updated accordingly.</p>
<p>If you are not an icon designer, getting your icon to meet the guidelines can be challenging. Luckily there are designers from the community you can ask for help! The <a href="https://matrix.to/#/#appicondesign:gnome.org" target="_blank" rel="noopener noreferrer" class="">GNOME App Icon Design</a> and <a href="https://matrix.to/#/#visualdesigngroup:kde.org" target="_blank" rel="noopener noreferrer" class="">KDE Visual Design Group</a> Matrix rooms are good examples of places to ask.</p>
<p>This does not affect the app review process for apps being published on Flathub. We will continue to accept apps that don't fully meet the new quality guidelines. However, we do want to highlight apps that meet the guidelines, and try to show them in more prominent places on the website.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="curation">Curation<a href="https://docs.flathub.org/blog/quality-moderation#curation" class="hash-link" aria-label="Direct link to Curation" title="Direct link to Curation" translate="no">​</a></h2>
<p>Our hope is that with better documentation and developer outreach we can get to a solid set of apps with high quality metadata: Short descriptions, good icons, correctly sized screenshots with good content, and so on. Once we have that, we have a lot of new possibilities with regard to curation. For example, we've been exploring having app banners with app icons and screenshots on the home page. Other ideas we'd like to experiment with in the future include curated lists of apps, seasonal/topical recommendations, and editorial blog posts.</p>
<p><img decoding="async" loading="lazy" alt="Flathub home page mockup with app banners including screenshots" src="https://docs.flathub.org/assets/images/homepage-banners-34edbc748fcb7b45eeea652ab91738de.png" width="1570" height="1550" class="img_ev3q"></p>
<p>Our current plan is to start off with some simple banners on the homepage and iterate from there. The moderation backend for this already exists, and we're planning on rolling out the frontend soon.</p>
<p>At this stage our focus is on the Flathub website, but of course eventually we want to make this data available to native app store clients as well.</p>
<p>This effort will also help to improve the Flathub-wide search and the discoverability and attractiveness of apps on Flathub from the rest of the internet.</p>
<p><img decoding="async" loading="lazy" alt="Mockup of GNOME Software with banners including screenshots" src="https://docs.flathub.org/assets/images/banner-native-a2cc63060b48faa603a78f3fc18edb6a.png" width="1168" height="1044" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What's Next?<a href="https://docs.flathub.org/blog/quality-moderation#whats-next" class="hash-link" aria-label="Direct link to What's Next?" title="Direct link to What's Next?" translate="no">​</a></h2>
<p>As of today, if you have an app on Flathub you can log in on the website, and see the app metadata ratings for your apps. Please have a look at your apps' ratings and the new documentation and make sure your app's metadata is in shape when we start rolling out banners over the coming weeks :)</p>
<p>If you run into issues or have questions please contact us in <a href="https://matrix.to/#/#flathub:matrix.org" target="_blank" rel="noopener noreferrer" class="">#flathub on Matrix</a>.</p>
<p>It's early days for all of this, but we're excited to continue working in this direction. Watch this space!</p>]]></content>
        <author>
            <name>Kolja Lampe</name>
        </author>
        <author>
            <name>Tobias Bernard</name>
        </author>
        <category label="quality" term="quality"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[New Flathub docs]]></title>
        <id>https://docs.flathub.org/blog/new-flathub-docs</id>
        <link href="https://docs.flathub.org/blog/new-flathub-docs"/>
        <updated>2023-06-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[You can now find our new documentation at docs.flathub.org or well here, if you're reading this.]]></summary>
        <content type="html"><![CDATA[<p>You can now find our new documentation at <a class="" href="https://docs.flathub.org/">docs.flathub.org</a> or well here, if you're reading this.</p>
<p>Please read through it and send us feedback if you find anything missing or unclear. You can also send us a <a href="https://github.com/flathub/documentation" target="_blank" rel="noopener noreferrer" class="">pull request</a> if you want to help us improve it.</p>]]></content>
        <author>
            <name>Kolja Lampe</name>
        </author>
        <category label="docs" term="docs"/>
    </entry>
</feed>