summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 17:57:27 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 17:57:27 +0000
commit6f0f7d1b40a8fa8d46a2d6f4317600001cdbbb18 (patch)
treed423850ae901365e582137bdf2b5cbdffd7ca266
parentInitial commit. (diff)
downloadgnome-software-6f0f7d1b40a8fa8d46a2d6f4317600001cdbbb18.tar.xz
gnome-software-6f0f7d1b40a8fa8d46a2d6f4317600001cdbbb18.zip
Adding upstream version 43.5.upstream/43.5upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
-rw-r--r--.editorconfig10
-rw-r--r--.gitignore19
-rw-r--r--.gitlab-ci.yml105
-rw-r--r--.gitlab-ci/README.md22
-rwxr-xr-x.gitlab-ci/cache-subprojects.sh11
-rw-r--r--.gitlab-ci/debian-stable.Dockerfile94
-rw-r--r--.gitlab-ci/fedora.Dockerfile96
-rwxr-xr-x.gitlab-ci/meson-junit-report.py114
-rwxr-xr-x.gitlab-ci/run-docker.sh132
-rwxr-xr-x.gitlab-ci/run-tests.sh49
-rw-r--r--.gitlab/issue_templates/Default.md15
-rw-r--r--.gitmodules3
-rw-r--r--AUTHORS6
-rw-r--r--COMMITMENT45
-rw-r--r--COPYING339
-rw-r--r--NEWS2004
-rw-r--r--README.md98
-rw-r--r--RELEASE.md114
-rw-r--r--contrib/deployment-featured.ini4
-rw-r--r--contrib/gnome-software.spec.in190
-rw-r--r--contrib/org.gnome.Software.DeploymentFeatured.xml11
-rw-r--r--contrib/org.gnome.SoftwareDevel.json214
-rw-r--r--data/assets/meson.build11
-rw-r--r--data/assets/org.gnome.Software.Curated.xml121
-rw-r--r--data/assets/org.gnome.Software.Featured.xml262
-rw-r--r--data/assets/up-to-date.svg264
-rw-r--r--data/autostart/org.gnome.Software.desktop.in7
-rw-r--r--data/icons/adaptive-symbolic.svg1
-rw-r--r--data/icons/app-installed-symbolic.svg1
-rw-r--r--data/icons/chat-none-symbolic.svg1
-rw-r--r--data/icons/chat-symbolic.svg1
-rw-r--r--data/icons/cigarette-none-symbolic.svg1
-rw-r--r--data/icons/cigarette-symbolic.svg1
-rw-r--r--data/icons/community-none-symbolic.svg8
-rw-r--r--data/icons/community-symbolic.svg1
-rw-r--r--data/icons/desktop-symbolic.svg1
-rw-r--r--data/icons/emblem-synchronizing-symbolic.svg1
-rw-r--r--data/icons/explore-symbolic.svg1
-rw-r--r--data/icons/external-link-symbolic.svg1
-rw-r--r--data/icons/flag-outline-thin-symbolic.svg1
-rw-r--r--data/icons/flatpak-symbolic.svg4
-rw-r--r--data/icons/graveyard-symbolic.svg1
-rw-r--r--data/icons/hand-open-symbolic.svg2
-rw-r--r--data/icons/heart-filled-symbolic.svg1
-rw-r--r--data/icons/help-link-symbolic.svg1
-rw-r--r--data/icons/hicolor/meson.build6
-rw-r--r--data/icons/hicolor/scalable/org.gnome.Software.svg24
-rw-r--r--data/icons/hicolor/scalable/org.gnome.SoftwareDevel.svg69
-rw-r--r--data/icons/hicolor/symbolic/app-remove-symbolic.svg1
-rw-r--r--data/icons/hicolor/symbolic/org.gnome.Software-symbolic.svg5
-rw-r--r--data/icons/meson.build1
-rw-r--r--data/icons/money-none-symbolic.svg1
-rw-r--r--data/icons/money-symbolic.svg1
-rw-r--r--data/icons/nudity-none-symbolic.svg1
-rw-r--r--data/icons/nudity-symbolic.svg1
-rw-r--r--data/icons/org.gnome.Software.Create.svg70
-rw-r--r--data/icons/org.gnome.Software.Develop.svg44
-rw-r--r--data/icons/org.gnome.Software.Learn.svg10
-rw-r--r--data/icons/org.gnome.Software.Play.svg37
-rw-r--r--data/icons/org.gnome.Software.Socialize.svg23
-rw-r--r--data/icons/org.gnome.Software.Work.svg27
-rw-r--r--data/icons/package-x-generic-symbolic.svg8
-rw-r--r--data/icons/padlock-open-symbolic.svg1
-rw-r--r--data/icons/phone-symbolic.svg1
-rw-r--r--data/icons/pub-symbolic.svg1
-rw-r--r--data/icons/review-symbolic.svg8
-rw-r--r--data/icons/safety-symbolic.svg1
-rw-r--r--data/icons/sign-language-symbolic.svg1
-rw-r--r--data/icons/snap-symbolic.svg8
-rw-r--r--data/icons/strong-language-none-symbolic.svg1
-rw-r--r--data/icons/strong-language-symbolic.svg1
-rw-r--r--data/icons/system-component-addon.svg35
-rw-r--r--data/icons/system-component-application.svg25
-rw-r--r--data/icons/system-component-codecs.svg25
-rw-r--r--data/icons/system-component-driver.svg145
-rw-r--r--data/icons/system-component-firmware.svg145
-rw-r--r--data/icons/system-component-input-sources.svg36
-rw-r--r--data/icons/system-component-language.svg28
-rw-r--r--data/icons/system-component-os-updates.svg28
-rw-r--r--data/icons/system-component-runtime.svg25
-rw-r--r--data/icons/test-symbolic.svg8
-rw-r--r--data/icons/violence-none-symbolic.svg1
-rw-r--r--data/icons/violence-symbolic.svg1
-rw-r--r--data/icons/webpage-symbolic.svg1
-rw-r--r--data/meson.build42
-rw-r--r--data/metainfo/meson.build22
-rw-r--r--data/metainfo/org.gnome.Software.metainfo.xml.in2158
-rw-r--r--data/metainfo/ss-details.pngbin0 -> 85786 bytes
-rw-r--r--data/metainfo/ss-details2.pngbin0 -> 76742 bytes
-rw-r--r--data/metainfo/ss-installed.pngbin0 -> 74175 bytes
-rw-r--r--data/metainfo/ss-overview.pngbin0 -> 93300 bytes
-rw-r--r--data/metainfo/ss-up-to-date.pngbin0 -> 50167 bytes
-rw-r--r--data/metainfo/ss-updates-details.pngbin0 -> 72190 bytes
-rw-r--r--data/metainfo/ss-updates.pngbin0 -> 83230 bytes
-rw-r--r--data/org.gnome.software.external-appstream.policy.in.in20
-rw-r--r--data/org.gnome.software.gschema.xml149
-rw-r--r--data/tests/os-release16
-rw-r--r--doc/api/gnome-software-docs.xml778
-rw-r--r--doc/api/gnome-software.types6
-rw-r--r--doc/api/gs-example-details.pngbin0 -> 53714 bytes
-rw-r--r--doc/api/gs-example-installed.pngbin0 -> 106482 bytes
-rw-r--r--doc/api/gs-example-search.pngbin0 -> 24934 bytes
-rw-r--r--doc/api/meson.build11
-rw-r--r--doc/app-developers.md69
-rw-r--r--doc/design.svg448
-rw-r--r--doc/kudos.md70
-rw-r--r--doc/meson.build3
-rw-r--r--doc/privacy-policy.html31
-rwxr-xr-xdoc/update.sh1
-rw-r--r--doc/use-cases.md38
-rw-r--r--doc/vendor-customisation.md214
-rw-r--r--gnome-software.doap54
-rw-r--r--gs-install-appstream/gs-install-appstream.c227
-rw-r--r--gs-install-appstream/meson.build19
-rw-r--r--lib/README.md7
-rw-r--r--lib/gnome-software-private.h24
-rw-r--r--lib/gnome-software.h41
-rw-r--r--lib/gs-app-collation.h21
-rw-r--r--lib/gs-app-list-private.h51
-rw-r--r--lib/gs-app-list.c1025
-rw-r--r--lib/gs-app-list.h89
-rw-r--r--lib/gs-app-permissions.c430
-rw-r--r--lib/gs-app-permissions.h74
-rw-r--r--lib/gs-app-private.h30
-rw-r--r--lib/gs-app-query.c1173
-rw-r--r--lib/gs-app-query.h108
-rw-r--r--lib/gs-app.c6714
-rw-r--r--lib/gs-app.h524
-rw-r--r--lib/gs-appstream.c2165
-rw-r--r--lib/gs-appstream.h95
-rw-r--r--lib/gs-build-ident.h.in32
-rw-r--r--lib/gs-category-manager.c151
-rw-r--r--lib/gs-category-manager.h32
-rw-r--r--lib/gs-category-private.h21
-rw-r--r--lib/gs-category.c724
-rw-r--r--lib/gs-category.h45
-rw-r--r--lib/gs-cmd.c847
-rw-r--r--lib/gs-debug.c295
-rw-r--r--lib/gs-debug.h27
-rw-r--r--lib/gs-desktop-data.c320
-rw-r--r--lib/gs-desktop-data.h43
-rw-r--r--lib/gs-download-utils.c870
-rw-r--r--lib/gs-download-utils.h88
-rw-r--r--lib/gs-external-appstream-utils.c627
-rw-r--r--lib/gs-external-appstream-utils.h50
-rw-r--r--lib/gs-fedora-third-party.c497
-rw-r--r--lib/gs-fedora-third-party.h93
-rw-r--r--lib/gs-icon.c315
-rw-r--r--lib/gs-icon.h32
-rw-r--r--lib/gs-ioprio.c197
-rw-r--r--lib/gs-ioprio.h31
-rw-r--r--lib/gs-key-colors.c334
-rw-r--r--lib/gs-key-colors.h27
-rw-r--r--lib/gs-metered.c312
-rw-r--r--lib/gs-metered.h35
-rw-r--r--lib/gs-odrs-provider.c1998
-rw-r--r--lib/gs-odrs-provider.h125
-rw-r--r--lib/gs-os-release.c347
-rw-r--r--lib/gs-os-release.h33
-rw-r--r--lib/gs-plugin-event.c453
-rw-r--r--lib/gs-plugin-event.h61
-rw-r--r--lib/gs-plugin-helpers.c338
-rw-r--r--lib/gs-plugin-helpers.h96
-rw-r--r--lib/gs-plugin-job-list-apps.c516
-rw-r--r--lib/gs-plugin-job-list-apps.h31
-rw-r--r--lib/gs-plugin-job-list-categories.c347
-rw-r--r--lib/gs-plugin-job-list-categories.h29
-rw-r--r--lib/gs-plugin-job-list-distro-upgrades.c428
-rw-r--r--lib/gs-plugin-job-list-distro-upgrades.h30
-rw-r--r--lib/gs-plugin-job-manage-repository.c365
-rw-r--r--lib/gs-plugin-job-manage-repository.h26
-rw-r--r--lib/gs-plugin-job-private.h40
-rw-r--r--lib/gs-plugin-job-refine.c860
-rw-r--r--lib/gs-plugin-job-refine.h31
-rw-r--r--lib/gs-plugin-job-refresh-metadata.c531
-rw-r--r--lib/gs-plugin-job-refresh-metadata.h28
-rw-r--r--lib/gs-plugin-job.c502
-rw-r--r--lib/gs-plugin-job.h68
-rw-r--r--lib/gs-plugin-loader-sync.c254
-rw-r--r--lib/gs-plugin-loader-sync.h42
-rw-r--r--lib/gs-plugin-loader.c4172
-rw-r--r--lib/gs-plugin-loader.h122
-rw-r--r--lib/gs-plugin-private.h57
-rw-r--r--lib/gs-plugin-types.h319
-rw-r--r--lib/gs-plugin-vfuncs.h429
-rw-r--r--lib/gs-plugin.c2187
-rw-r--r--lib/gs-plugin.h331
-rw-r--r--lib/gs-remote-icon.c375
-rw-r--r--lib/gs-remote-icon.h37
-rw-r--r--lib/gs-self-test.c786
-rw-r--r--lib/gs-test.c147
-rw-r--r--lib/gs-test.h27
-rw-r--r--lib/gs-utils.c1689
-rw-r--r--lib/gs-utils.h155
-rw-r--r--lib/gs-worker-thread.c425
-rw-r--r--lib/gs-worker-thread.h41
-rw-r--r--lib/meson.build205
-rw-r--r--lib/tools/meson.build24
-rw-r--r--lib/tools/profile-key-colors.c175
-rw-r--r--meson.build328
-rw-r--r--meson_options.txt25
-rwxr-xr-xmeson_post_install.sh14
-rw-r--r--plugins/core/gs-plugin-appstream.c1653
-rw-r--r--plugins/core/gs-plugin-appstream.h22
-rw-r--r--plugins/core/gs-plugin-generic-updates.c148
-rw-r--r--plugins/core/gs-plugin-generic-updates.h22
-rw-r--r--plugins/core/gs-plugin-hardcoded-blocklist.c121
-rw-r--r--plugins/core/gs-plugin-hardcoded-blocklist.h22
-rw-r--r--plugins/core/gs-plugin-icons.c249
-rw-r--r--plugins/core/gs-plugin-icons.h22
-rw-r--r--plugins/core/gs-plugin-os-release.c180
-rw-r--r--plugins/core/gs-plugin-os-release.h22
-rw-r--r--plugins/core/gs-plugin-provenance-license.c199
-rw-r--r--plugins/core/gs-plugin-provenance-license.h22
-rw-r--r--plugins/core/gs-plugin-provenance.c292
-rw-r--r--plugins/core/gs-plugin-provenance.h22
-rw-r--r--plugins/core/gs-plugin-rewrite-resource.c252
-rw-r--r--plugins/core/gs-plugin-rewrite-resource.h22
-rw-r--r--plugins/core/gs-self-test.c277
-rw-r--r--plugins/core/meson.build133
l---------plugins/core/tests/os-release1
-rw-r--r--plugins/dpkg/gs-plugin-dpkg.c133
-rw-r--r--plugins/dpkg/gs-plugin-dpkg.h22
-rw-r--r--plugins/dpkg/gs-self-test.c87
-rw-r--r--plugins/dpkg/meson.build35
-rwxr-xr-xplugins/dpkg/tests/build-deb.sh1
-rw-r--r--plugins/dpkg/tests/chiron-1.1-1.debbin0 -> 806 bytes
-rw-r--r--plugins/dpkg/tests/debian/DEBIAN/control13
-rw-r--r--plugins/dpkg/tests/debian/usr/bin/chiron0
-rw-r--r--plugins/dummy/gs-plugin-dummy.c1104
-rw-r--r--plugins/dummy/gs-plugin-dummy.h22
-rw-r--r--plugins/dummy/gs-self-test.c966
-rw-r--r--plugins/dummy/meson.build35
-rw-r--r--plugins/eos-updater/com.endlessm.Updater.xml292
-rw-r--r--plugins/eos-updater/gs-plugin-eos-updater.c1134
-rw-r--r--plugins/eos-updater/gs-plugin-eos-updater.h22
-rw-r--r--plugins/eos-updater/meson.build25
-rw-r--r--plugins/eos-updater/tests/eos_updater.py414
-rwxr-xr-xplugins/eos-updater/tests/manual-test.py434
-rw-r--r--plugins/epiphany/gs-plugin-epiphany.c1183
-rw-r--r--plugins/epiphany/gs-plugin-epiphany.h20
-rw-r--r--plugins/epiphany/gs-self-test.c240
-rw-r--r--plugins/epiphany/meson.build87
-rw-r--r--plugins/epiphany/org.freedesktop.portal.DynamicLauncher.xml332
-rw-r--r--plugins/epiphany/org.gnome.Epiphany.WebAppProvider.xml85
-rw-r--r--plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in11
-rw-r--r--plugins/fedora-langpacks/gs-plugin-fedora-langpacks.c140
-rw-r--r--plugins/fedora-langpacks/gs-plugin-fedora-langpacks.h22
-rw-r--r--plugins/fedora-langpacks/gs-self-test.c88
-rw-r--r--plugins/fedora-langpacks/meson.build34
-rw-r--r--plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c855
-rw-r--r--plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.h22
-rw-r--r--plugins/fedora-pkgdb-collections/meson.build14
-rw-r--r--plugins/flatpak/gs-flatpak-app.c190
-rw-r--r--plugins/flatpak/gs-flatpak-app.h65
-rw-r--r--plugins/flatpak/gs-flatpak-transaction.c761
-rw-r--r--plugins/flatpak/gs-flatpak-transaction.h31
-rw-r--r--plugins/flatpak/gs-flatpak-utils.c271
-rw-r--r--plugins/flatpak/gs-flatpak-utils.h24
-rw-r--r--plugins/flatpak/gs-flatpak.c4624
-rw-r--r--plugins/flatpak/gs-flatpak.h184
-rw-r--r--plugins/flatpak/gs-plugin-flatpak.c2326
-rw-r--r--plugins/flatpak/gs-plugin-flatpak.h22
-rw-r--r--plugins/flatpak/gs-self-test.c2003
-rw-r--r--plugins/flatpak/meson.build63
-rw-r--r--plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in12
-rw-r--r--plugins/flatpak/tests/app-extension-update/.gitignore1
-rw-r--r--plugins/flatpak/tests/app-extension-update/org.test.Chiron.Extension/.gitignore1
-rw-r--r--plugins/flatpak/tests/app-extension-update/org.test.Chiron.Extension/files/.empty0
-rw-r--r--plugins/flatpak/tests/app-extension-update/org.test.Chiron.Extension/files/share/libtest/README1
-rw-r--r--plugins/flatpak/tests/app-extension-update/org.test.Chiron.Extension/files/share/metainfo/org.test.Chiron.Extension.metainfo.xml12
-rw-r--r--plugins/flatpak/tests/app-extension-update/org.test.Chiron.Extension/metadata6
-rw-r--r--plugins/flatpak/tests/app-extension/.gitignore1
-rw-r--r--plugins/flatpak/tests/app-extension/org.test.Chiron.Extension/.gitignore1
-rw-r--r--plugins/flatpak/tests/app-extension/org.test.Chiron.Extension/files/.empty0
-rw-r--r--plugins/flatpak/tests/app-extension/org.test.Chiron.Extension/files/share/libtest/README0
-rw-r--r--plugins/flatpak/tests/app-extension/org.test.Chiron.Extension/files/share/metainfo/org.test.Chiron.Extension.metainfo.xml12
-rw-r--r--plugins/flatpak/tests/app-extension/org.test.Chiron.Extension/metadata6
-rw-r--r--plugins/flatpak/tests/app-extension/org.test.Chiron/.gitignore2
-rwxr-xr-xplugins/flatpak/tests/app-extension/org.test.Chiron/files/bin/chiron.sh2
-rw-r--r--plugins/flatpak/tests/app-extension/org.test.Chiron/files/share/appdata/org.test.Chiron.appdata.xml16
-rw-r--r--plugins/flatpak/tests/app-extension/org.test.Chiron/files/share/applications/org.test.Chiron.desktop6
-rw-r--r--plugins/flatpak/tests/app-extension/org.test.Chiron/files/share/icons/hicolor/128x128/apps/org.test.Chiron.pngbin0 -> 334 bytes
-rw-r--r--plugins/flatpak/tests/app-extension/org.test.Chiron/metadata10
-rw-r--r--plugins/flatpak/tests/app-missing-runtime/.gitignore1
l---------plugins/flatpak/tests/app-missing-runtime/org.test.Chiron1
-rw-r--r--plugins/flatpak/tests/app-update/.gitignore1
-rw-r--r--plugins/flatpak/tests/app-update/org.test.Chiron/.gitignore2
-rw-r--r--plugins/flatpak/tests/app-update/org.test.Chiron/files/bin/chiron.sh2
-rw-r--r--plugins/flatpak/tests/app-update/org.test.Chiron/files/share/appdata/org.test.Chiron.appdata.xml19
l---------plugins/flatpak/tests/app-update/org.test.Chiron/files/share/applications/org.test.Chiron.desktop1
l---------plugins/flatpak/tests/app-update/org.test.Chiron/files/share/icons/hicolor/128x128/apps/org.test.Chiron.png1
-rw-r--r--plugins/flatpak/tests/app-update/org.test.Chiron/metadata4
-rw-r--r--plugins/flatpak/tests/app-with-runtime/.gitignore1
-rw-r--r--plugins/flatpak/tests/app-with-runtime/org.test.Chiron/.gitignore2
-rwxr-xr-xplugins/flatpak/tests/app-with-runtime/org.test.Chiron/files/bin/chiron.sh2
-rw-r--r--plugins/flatpak/tests/app-with-runtime/org.test.Chiron/files/share/appdata/org.test.Chiron.appdata.xml16
-rw-r--r--plugins/flatpak/tests/app-with-runtime/org.test.Chiron/files/share/applications/org.test.Chiron.desktop7
-rw-r--r--plugins/flatpak/tests/app-with-runtime/org.test.Chiron/files/share/icons/hicolor/128x128/apps/org.test.Chiron.pngbin0 -> 334 bytes
-rw-r--r--plugins/flatpak/tests/app-with-runtime/org.test.Chiron/metadata4
-rw-r--r--plugins/flatpak/tests/app-with-runtime/org.test.Runtime/files/.empty0
-rw-r--r--plugins/flatpak/tests/app-with-runtime/org.test.Runtime/metadata3
-rw-r--r--plugins/flatpak/tests/app-with-runtime/org.test.Runtime/usr/.gitignore1
-rw-r--r--plugins/flatpak/tests/app-with-runtime/org.test.Runtime/usr/share/libtest/README0
-rw-r--r--plugins/flatpak/tests/app-with-runtime/org.test.Runtime/usr/share/metainfo/org.test.Runtime.metainfo.xml10
-rwxr-xr-xplugins/flatpak/tests/build.py125
-rw-r--r--plugins/flatpak/tests/chiron.flatpakbin0 -> 5452 bytes
-rw-r--r--plugins/flatpak/tests/flatpakrepos.tar.gzbin0 -> 72252 bytes
-rw-r--r--plugins/flatpak/tests/meson.build34
-rw-r--r--plugins/flatpak/tests/only-runtime/.gitignore1
l---------plugins/flatpak/tests/only-runtime/org.test.Runtime1
-rw-r--r--plugins/fwupd/gs-fwupd-app.c309
-rw-r--r--plugins/fwupd/gs-fwupd-app.h31
-rw-r--r--plugins/fwupd/gs-plugin-fwupd.c1414
-rw-r--r--plugins/fwupd/gs-plugin-fwupd.h22
-rw-r--r--plugins/fwupd/gs-self-test.c111
-rw-r--r--plugins/fwupd/meson.build54
-rw-r--r--plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in12
-rwxr-xr-xplugins/fwupd/tests/build-cab.sh4
-rw-r--r--plugins/fwupd/tests/chiron-0.2.cabbin0 -> 34376 bytes
-rw-r--r--plugins/fwupd/tests/firmware.dfubin0 -> 32784 bytes
-rw-r--r--plugins/fwupd/tests/firmware.dfu.asc11
-rw-r--r--plugins/fwupd/tests/firmware.metainfo.xml30
-rw-r--r--plugins/malcontent/gs-plugin-malcontent.c480
-rw-r--r--plugins/malcontent/gs-plugin-malcontent.h22
-rw-r--r--plugins/malcontent/meson.build14
-rw-r--r--plugins/meson.build43
-rw-r--r--plugins/modalias/gs-plugin-modalias.c199
-rw-r--r--plugins/modalias/gs-plugin-modalias.h22
-rw-r--r--plugins/modalias/gs-self-test.c113
-rw-r--r--plugins/modalias/meson.build36
-rw-r--r--plugins/packagekit/gs-markdown.c856
-rw-r--r--plugins/packagekit/gs-markdown.h41
-rw-r--r--plugins/packagekit/gs-packagekit-helper.c141
-rw-r--r--plugins/packagekit/gs-packagekit-helper.h37
-rw-r--r--plugins/packagekit/gs-packagekit-task.c280
-rw-r--r--plugins/packagekit/gs-packagekit-task.h38
-rw-r--r--plugins/packagekit/gs-plugin-packagekit.c4080
-rw-r--r--plugins/packagekit/gs-plugin-packagekit.h22
-rw-r--r--plugins/packagekit/gs-self-test.c275
-rw-r--r--plugins/packagekit/meson.build50
-rw-r--r--plugins/packagekit/packagekit-common.c585
-rw-r--r--plugins/packagekit/packagekit-common.h41
-rwxr-xr-xplugins/packagekit/tests/build-rpm.sh2
-rw-r--r--plugins/packagekit/tests/chiron-1.1-1.fc24.x86_64.rpmbin0 -> 6414 bytes
-rw-r--r--plugins/packagekit/tests/chiron.spec22
-rw-r--r--plugins/repos/gs-plugin-repos.c422
-rw-r--r--plugins/repos/gs-plugin-repos.h22
-rw-r--r--plugins/repos/gs-self-test.c71
-rw-r--r--plugins/repos/meson.build35
-rw-r--r--plugins/repos/tests/yum.repos.d/utopia.repo5
-rw-r--r--plugins/rpm-ostree/gs-plugin-rpm-ostree.c2878
-rw-r--r--plugins/rpm-ostree/gs-plugin-rpm-ostree.h22
-rw-r--r--plugins/rpm-ostree/meson.build23
-rw-r--r--plugins/rpm-ostree/org.projectatomic.rpmostree1.xml458
-rw-r--r--plugins/snap/gs-plugin-snap.c1924
-rw-r--r--plugins/snap/gs-plugin-snap.h22
-rw-r--r--plugins/snap/gs-self-test.c395
-rw-r--r--plugins/snap/meson.build48
-rw-r--r--plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in12
-rw-r--r--po/LINGUAS69
-rw-r--r--po/POTFILES.in123
-rw-r--r--po/POTFILES.skip1
-rw-r--r--po/ab.po5089
-rw-r--r--po/af.po5120
-rw-r--r--po/ar.po5166
-rw-r--r--po/as.po2007
-rw-r--r--po/be.po5503
-rw-r--r--po/bg.po5318
-rw-r--r--po/bn.po3883
-rw-r--r--po/bs.po2321
-rw-r--r--po/ca.po5458
-rw-r--r--po/ca@valencia.po4789
-rw-r--r--po/ckb.po4174
-rw-r--r--po/cs.po5328
-rw-r--r--po/da.po5962
-rw-r--r--po/de.po6521
-rw-r--r--po/el.po7392
-rw-r--r--po/en_GB.po6776
-rw-r--r--po/eo.po5401
-rw-r--r--po/es.po7528
-rw-r--r--po/eu.po6027
-rw-r--r--po/fa.po6393
-rw-r--r--po/fi.po7208
-rw-r--r--po/fr.po5407
-rw-r--r--po/fur.po7220
-rw-r--r--po/ga.po2331
-rw-r--r--po/gd.po5097
-rw-r--r--po/gl.po6127
-rw-r--r--po/he.po6842
-rw-r--r--po/hi.po3882
-rw-r--r--po/hr.po7404
-rw-r--r--po/hu.po5330
-rw-r--r--po/id.po5323
-rw-r--r--po/ie.po3681
-rw-r--r--po/is.po5751
-rw-r--r--po/it.po5436
-rw-r--r--po/ja.po5434
-rw-r--r--po/ka.po5118
-rw-r--r--po/kab.po4211
-rw-r--r--po/kk.po6956
-rw-r--r--po/km.po1900
-rw-r--r--po/ko.po5318
-rw-r--r--po/lt.po7269
-rw-r--r--po/lv.po6436
-rw-r--r--po/meson.build6
-rw-r--r--po/mjw.po4203
-rw-r--r--po/ml.po3961
-rw-r--r--po/mr.po3881
-rw-r--r--po/ms.po4380
-rw-r--r--po/nb.po5246
-rw-r--r--po/ne.po6302
-rw-r--r--po/nl.po7243
-rw-r--r--po/oc.po7404
-rw-r--r--po/pa.po7495
-rw-r--r--po/pl.po5377
-rw-r--r--po/pt.po6562
-rw-r--r--po/pt_BR.po5558
-rw-r--r--po/ro.po6842
-rw-r--r--po/ru.po5431
-rw-r--r--po/sk.po7076
-rw-r--r--po/sl.po7465
-rw-r--r--po/sr.po7332
-rw-r--r--po/sr@latin.po5220
-rw-r--r--po/sv.po7227
-rw-r--r--po/te.po1812
-rw-r--r--po/th.po2974
-rw-r--r--po/tr.po5258
-rw-r--r--po/uk.po6142
-rw-r--r--po/vi.po6374
-rw-r--r--po/zh_CN.po6996
-rw-r--r--po/zh_HK.po2086
-rw-r--r--po/zh_TW.po7094
-rw-r--r--src/gnome-software-local-file-flatpak.desktop.in11
-rw-r--r--src/gnome-software-local-file-fwupd.desktop.in11
-rw-r--r--src/gnome-software-local-file-packagekit.desktop.in11
-rw-r--r--src/gnome-software-local-file-snap.desktop.in11
-rw-r--r--src/gnome-software.gresource.xml110
-rw-r--r--src/gnome-software.xml74
-rw-r--r--src/gs-age-rating-context-dialog.c1253
-rw-r--r--src/gs-age-rating-context-dialog.h49
-rw-r--r--src/gs-age-rating-context-dialog.ui80
-rw-r--r--src/gs-app-addon-row.c315
-rw-r--r--src/gs-app-addon-row.h29
-rw-r--r--src/gs-app-addon-row.ui78
-rw-r--r--src/gs-app-context-bar.c988
-rw-r--r--src/gs-app-context-bar.h31
-rw-r--r--src/gs-app-context-bar.ui249
-rw-r--r--src/gs-app-details-page.c451
-rw-r--r--src/gs-app-details-page.h29
-rw-r--r--src/gs-app-details-page.ui97
-rw-r--r--src/gs-app-reviews-dialog.c559
-rw-r--r--src/gs-app-reviews-dialog.h38
-rw-r--r--src/gs-app-reviews-dialog.ui65
-rw-r--r--src/gs-app-row.c1240
-rw-r--r--src/gs-app-row.h57
-rw-r--r--src/gs-app-row.ui258
-rw-r--r--src/gs-app-tile.c176
-rw-r--r--src/gs-app-tile.h32
-rw-r--r--src/gs-app-tile.ui129
-rw-r--r--src/gs-app-translation-dialog.c271
-rw-r--r--src/gs-app-translation-dialog.h32
-rw-r--r--src/gs-app-translation-dialog.ui113
-rw-r--r--src/gs-app-version-history-dialog.c93
-rw-r--r--src/gs-app-version-history-dialog.h24
-rw-r--r--src/gs-app-version-history-dialog.ui44
-rw-r--r--src/gs-app-version-history-row.c115
-rw-r--r--src/gs-app-version-history-row.h27
-rw-r--r--src/gs-app-version-history-row.ui55
-rw-r--r--src/gs-application.c1525
-rw-r--r--src/gs-application.h31
-rw-r--r--src/gs-basic-auth-dialog.c131
-rw-r--r--src/gs-basic-auth-dialog.h29
-rw-r--r--src/gs-basic-auth-dialog.ui184
-rw-r--r--src/gs-category-page.c693
-rw-r--r--src/gs-category-page.h25
-rw-r--r--src/gs-category-page.ui155
-rw-r--r--src/gs-category-tile.c219
-rw-r--r--src/gs-category-tile.h26
-rw-r--r--src/gs-category-tile.ui33
-rw-r--r--src/gs-common.c1261
-rw-r--r--src/gs-common.h71
-rw-r--r--src/gs-context-dialog-row.c379
-rw-r--r--src/gs-context-dialog-row.h69
-rw-r--r--src/gs-context-dialog-row.ui20
-rw-r--r--src/gs-css.c308
-rw-r--r--src/gs-css.h36
-rw-r--r--src/gs-dbus-helper.c970
-rw-r--r--src/gs-dbus-helper.h23
-rw-r--r--src/gs-description-box.c358
-rw-r--r--src/gs-description-box.h29
-rw-r--r--src/gs-details-page.c2896
-rw-r--r--src/gs-details-page.h44
-rw-r--r--src/gs-details-page.ui1105
-rw-r--r--src/gs-extras-page.c1361
-rw-r--r--src/gs-extras-page.h41
-rw-r--r--src/gs-extras-page.ui146
-rw-r--r--src/gs-feature-tile.c621
-rw-r--r--src/gs-feature-tile.h21
-rw-r--r--src/gs-feature-tile.ui85
-rw-r--r--src/gs-featured-carousel.c402
-rw-r--r--src/gs-featured-carousel.h31
-rw-r--r--src/gs-featured-carousel.ui86
-rw-r--r--src/gs-hardware-support-context-dialog.c920
-rw-r--r--src/gs-hardware-support-context-dialog.h51
-rw-r--r--src/gs-hardware-support-context-dialog.ui83
-rw-r--r--src/gs-info-bar.c228
-rw-r--r--src/gs-info-bar.h29
-rw-r--r--src/gs-info-bar.ui49
-rw-r--r--src/gs-info-window.c124
-rw-r--r--src/gs-info-window.h33
-rw-r--r--src/gs-info-window.ui33
-rw-r--r--src/gs-installed-page.c974
-rw-r--r--src/gs-installed-page.h26
-rw-r--r--src/gs-installed-page.ui166
-rw-r--r--src/gs-language.c163
-rw-r--r--src/gs-language.h26
-rw-r--r--src/gs-layout-manager.c110
-rw-r--r--src/gs-layout-manager.h29
-rw-r--r--src/gs-license-tile.c334
-rw-r--r--src/gs-license-tile.h31
-rw-r--r--src/gs-license-tile.ui115
-rw-r--r--src/gs-loading-page.c215
-rw-r--r--src/gs-loading-page.h29
-rw-r--r--src/gs-loading-page.ui32
-rw-r--r--src/gs-lozenge.c470
-rw-r--r--src/gs-lozenge.h38
-rw-r--r--src/gs-lozenge.ui33
-rw-r--r--src/gs-main.c51
-rw-r--r--src/gs-metered-data-dialog.c67
-rw-r--r--src/gs-metered-data-dialog.h25
-rw-r--r--src/gs-metered-data-dialog.ui30
-rw-r--r--src/gs-moderate-page.c471
-rw-r--r--src/gs-moderate-page.h26
-rw-r--r--src/gs-moderate-page.ui80
-rw-r--r--src/gs-origin-popover-row.c204
-rw-r--r--src/gs-origin-popover-row.h30
-rw-r--r--src/gs-origin-popover-row.ui166
-rw-r--r--src/gs-os-update-page.c613
-rw-r--r--src/gs-os-update-page.h31
-rw-r--r--src/gs-os-update-page.ui45
-rw-r--r--src/gs-overview-page.c1050
-rw-r--r--src/gs-overview-page.h25
-rw-r--r--src/gs-overview-page.ui230
-rw-r--r--src/gs-page.c857
-rw-r--r--src/gs-page.h74
-rw-r--r--src/gs-prefs-dialog.c94
-rw-r--r--src/gs-prefs-dialog.h25
-rw-r--r--src/gs-prefs-dialog.ui48
-rw-r--r--src/gs-progress-button.c361
-rw-r--r--src/gs-progress-button.h38
-rw-r--r--src/gs-progress-button.ui35
-rw-r--r--src/gs-removal-dialog.c154
-rw-r--r--src/gs-removal-dialog.h25
-rw-r--r--src/gs-removal-dialog.ui93
-rw-r--r--src/gs-repo-row.c463
-rw-r--r--src/gs-repo-row.h35
-rw-r--r--src/gs-repo-row.ui98
-rw-r--r--src/gs-repos-dialog.c766
-rw-r--r--src/gs-repos-dialog.h26
-rw-r--r--src/gs-repos-dialog.ui75
-rw-r--r--src/gs-repos-section.c201
-rw-r--r--src/gs-repos-section.h31
-rw-r--r--src/gs-restarter.c216
-rw-r--r--src/gs-review-bar.c72
-rw-r--r--src/gs-review-bar.h24
-rw-r--r--src/gs-review-dialog.c215
-rw-r--r--src/gs-review-dialog.h26
-rw-r--r--src/gs-review-dialog.ui179
-rw-r--r--src/gs-review-histogram.c135
-rw-r--r--src/gs-review-histogram.h30
-rw-r--r--src/gs-review-histogram.ui410
-rw-r--r--src/gs-review-row.c323
-rw-r--r--src/gs-review-row.h56
-rw-r--r--src/gs-review-row.ui164
-rw-r--r--src/gs-safety-context-dialog.c651
-rw-r--r--src/gs-safety-context-dialog.h32
-rw-r--r--src/gs-safety-context-dialog.ui242
-rw-r--r--src/gs-screenshot-carousel.c365
-rw-r--r--src/gs-screenshot-carousel.h27
-rw-r--r--src/gs-screenshot-carousel.ui139
-rw-r--r--src/gs-screenshot-image.c952
-rw-r--r--src/gs-screenshot-image.h38
-rw-r--r--src/gs-screenshot-image.ui99
-rw-r--r--src/gs-search-page.c566
-rw-r--r--src/gs-search-page.h27
-rw-r--r--src/gs-search-page.ui91
-rw-r--r--src/gs-self-test.c52
-rw-r--r--src/gs-shell-search-provider.c409
-rw-r--r--src/gs-shell-search-provider.h26
-rw-r--r--src/gs-shell.c2725
-rw-r--r--src/gs-shell.h92
-rw-r--r--src/gs-shell.ui521
-rw-r--r--src/gs-star-image.c254
-rw-r--r--src/gs-star-image.h22
-rw-r--r--src/gs-star-widget.c337
-rw-r--r--src/gs-star-widget.h38
-rw-r--r--src/gs-star-widget.ui19
-rw-r--r--src/gs-storage-context-dialog.c412
-rw-r--r--src/gs-storage-context-dialog.h32
-rw-r--r--src/gs-storage-context-dialog.ui87
-rw-r--r--src/gs-summary-tile.c253
-rw-r--r--src/gs-summary-tile.h21
-rw-r--r--src/gs-summary-tile.ui130
-rw-r--r--src/gs-update-dialog.c391
-rw-r--r--src/gs-update-dialog.h27
-rw-r--r--src/gs-update-dialog.ui108
-rw-r--r--src/gs-update-list.c150
-rw-r--r--src/gs-update-list.h32
-rw-r--r--src/gs-update-monitor.c1476
-rw-r--r--src/gs-update-monitor.h29
-rw-r--r--src/gs-updates-page.c1467
-rw-r--r--src/gs-updates-page.h26
-rw-r--r--src/gs-updates-page.ui307
-rw-r--r--src/gs-updates-section.c733
-rw-r--r--src/gs-updates-section.h48
-rw-r--r--src/gs-updates-section.ui109
-rw-r--r--src/gs-upgrade-banner.c374
-rw-r--r--src/gs-upgrade-banner.h35
-rw-r--r--src/gs-upgrade-banner.ui223
-rw-r--r--src/gs-vendor.c127
-rw-r--r--src/gs-vendor.h33
-rw-r--r--src/meson.build312
-rw-r--r--src/org.freedesktop.PackageKit.Modify2.xml560
-rw-r--r--src/org.freedesktop.PackageKit.service.in3
-rw-r--r--src/org.freedesktop.PackageKit.xml506
-rw-r--r--src/org.gnome.Software-search-provider.ini5
-rw-r--r--src/org.gnome.Software.desktop.in17
-rw-r--r--src/org.gnome.Software.service.in3
-rw-r--r--src/shell-search-provider-dbus-interfaces.xml44
-rw-r--r--src/style-dark.css114
-rw-r--r--src/style-hc.css38
-rw-r--r--src/style.css580
-rw-r--r--subprojects/appstream.wrap5
-rw-r--r--subprojects/gnome-pwa-list.wrap6
-rw-r--r--subprojects/gnome-pwa-list/README.md61
-rw-r--r--subprojects/gnome-pwa-list/gnome-pwa-list-foss.csv10
-rw-r--r--subprojects/gnome-pwa-list/gnome-pwa-list-foss.xml310
-rw-r--r--subprojects/gnome-pwa-list/gnome-pwa-list-proprietary.csv2
-rw-r--r--subprojects/gnome-pwa-list/gnome-pwa-list-proprietary.xml62
-rw-r--r--subprojects/gnome-pwa-list/meson.build14
-rwxr-xr-xsubprojects/gnome-pwa-list/pwa-metainfo-generator.py213
-rw-r--r--subprojects/gtk.wrap5
-rw-r--r--subprojects/libadwaita.wrap5
-rw-r--r--subprojects/libglib-testing.wrap5
-rw-r--r--subprojects/libxmlb.wrap5
-rw-r--r--subprojects/malcontent.wrap5
-rw-r--r--subprojects/sysprof.wrap5
-rwxr-xr-xtests/actions.py61
-rwxr-xr-xtests/basic.py151
650 files changed, 515955 insertions, 0 deletions
diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..752ea66
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,10 @@
+# See https://editorconfig.org/
+root = true
+
+[*.{c,h}]
+indent_style = tab
+indent_size = 8
+
+[*.ui]
+indent_style = space
+indent_size = 2
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..f103d5f
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,19 @@
+subprojects/appstream/
+subprojects/gi-docgen.wrap
+subprojects/gi-docgen/
+subprojects/graphene.wrap
+subprojects/graphene/
+subprojects/gtk/
+subprojects/libadwaita/
+subprojects/libglib-testing/
+subprojects/libsass.wrap
+subprojects/libsass/
+subprojects/libxmlb/
+subprojects/malcontent/
+subprojects/mutest.wrap
+subprojects/mutest/
+subprojects/sassc.wrap
+subprojects/sassc/
+subprojects/sysprof/
+subprojects/wayland-protocols.wrap
+subprojects/wayland-protocols/
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000..937cc34
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,105 @@
+include: 'https://gitlab.gnome.org/GNOME/citemplates/raw/HEAD/flatpak/flatpak_ci_initiative.yml'
+
+stages:
+ - build
+ - deploy
+
+cache:
+ paths:
+ - _ccache/
+
+variables:
+ MESON_TEST_TIMEOUT_MULTIPLIER: 4
+ G_MESSAGES_DEBUG: all
+ MESON_COMMON_OPTIONS: "--buildtype debug --wrap-mode=nodownload --prefix /usr -Dsoup2=true -Dwebapps=true -Dhardcoded_foss_webapps=false -Dhardcoded_proprietary_webapps=false"
+ BUNDLE: "gnome-software-dev.flatpak"
+
+.build:
+ before_script:
+ - cp -r $HOME/subprojects/* subprojects/
+
+fedora-x86_64:
+ extends: .build
+ image: registry.gitlab.gnome.org/gnome/gnome-software/fedora:v10
+ stage: build
+ except:
+ - tags
+ script:
+ - meson ${MESON_COMMON_OPTIONS}
+ -Drpm_ostree=true
+ -Dmalcontent=true
+ -Dsysprof=enabled
+ _build
+ - ninja -C _build
+ - .gitlab-ci/run-tests.sh
+ --no-suite packagekit
+ --no-suite fwupd
+ --no-suite libglib-testing
+ --no-suite malcontent
+ artifacts:
+ reports:
+ junit: "_build/${CI_JOB_NAME}-report.xml"
+ name: "gnome-software-${CI_JOB_NAME}-${CI_COMMIT_REF_NAME}"
+ when: always
+ paths:
+ - "_build/config.h"
+ - "_build/meson-logs"
+ - "_build/${CI_JOB_NAME}-report.xml"
+
+debian-stable-x86_64:
+ extends: .build
+ image: registry.gitlab.gnome.org/gnome/gnome-software/debian-stable:v9
+ stage: build
+ except:
+ - tags
+ script:
+ - meson ${MESON_COMMON_OPTIONS}
+ -Drpm_ostree=false
+ -Dmalcontent=false
+ -Dsysprof=disabled
+ _build
+ - ninja -C _build
+ - .gitlab-ci/run-tests.sh
+ --no-suite packagekit
+ --no-suite fwupd
+ --no-suite fedora-langpacks
+ --no-suite libxmlb
+ artifacts:
+ reports:
+ junit: "_build/${CI_JOB_NAME}-report.xml"
+ name: "gnome-software-${CI_JOB_NAME}-${CI_COMMIT_REF_NAME}"
+ when: always
+ paths:
+ - "_build/config.h"
+ - "_build/meson-logs"
+ - "_build/${CI_JOB_NAME}-report.xml"
+
+# Allow building a flatpak on demand to test out the gnome-software UI
+flatpak bundle:
+ extends: '.flatpak'
+ stage: 'build'
+ dependencies: []
+ variables:
+ MANIFEST_PATH: "contrib/org.gnome.SoftwareDevel.json"
+ FLATPAK_MODULE: "gnome-software"
+ RUNTIME_REPO: "https://nightly.gnome.org/gnome-nightly.flatpakrepo"
+ APP_ID: "org.gnome.SoftwareDevel"
+ when: manual
+ allow_failure: true
+ script:
+ # Modified from https://gitlab.gnome.org/GNOME/citemplates/-/blob/HEAD/flatpak/flatpak_ci_initiative.yml
+ # to drop the unit tests, since we don’t need them
+ - rewrite-flatpak-manifest ${MANIFEST_PATH} ${FLATPAK_MODULE} ${CONFIG_OPTS}
+ - flatpak-builder --user --disable-rofiles-fuse flatpak_app --repo=repo ${BRANCH:+--default-branch=$BRANCH} ${MANIFEST_PATH}
+ # Generate a Flatpak bundle
+ - flatpak build-bundle repo ${BUNDLE} --runtime-repo=${RUNTIME_REPO} ${APP_ID} ${BRANCH}
+ - tar cf repo.tar repo/
+
+# Due to the `only` clause in .publish_nightly, this will only publish on-demand
+# builds to nightly.gnome.org if they are built from a commit on `main`
+nightly:
+ extends: '.publish_nightly'
+ dependencies:
+ - 'flatpak bundle'
+ needs: ['flatpak bundle']
+ when: manual
diff --git a/.gitlab-ci/README.md b/.gitlab-ci/README.md
new file mode 100644
index 0000000..4eadf22
--- /dev/null
+++ b/.gitlab-ci/README.md
@@ -0,0 +1,22 @@
+# CI support stuff
+
+## Docker image
+
+GitLab CI jobs run in a Docker image, defined here. To update that image
+(perhaps to install some more packages):
+
+1. Edit `.gitlab-ci/Dockerfile` with the changes you want
+1. Run `.gitlab-ci/run-docker.sh build --base=debian-stable --base-version=1` to
+ build the new image (bump the version from the latest listed for that `base`
+ on https://gitlab.gnome.org/GNOME/gnome-software/container_registry)
+1. Run `.gitlab-ci/run-docker.sh push --base=debian-stable --base-version=1` to
+ upload the new image to the GNOME GitLab Docker registry
+ * If this is the first time you're doing this, you'll need to log into the
+ registry
+ * If you use 2-factor authentication on your GNOME GitLab account, you'll
+ need to [create a personal access token][pat] and use that rather than
+ your normal password
+1. Edit `.gitlab-ci.yml` (in the root of this repository) to use your new
+ image
+
+[pat]: https://gitlab.gnome.org/-/profile/personal_access_tokens
diff --git a/.gitlab-ci/cache-subprojects.sh b/.gitlab-ci/cache-subprojects.sh
new file mode 100755
index 0000000..fb0337c
--- /dev/null
+++ b/.gitlab-ci/cache-subprojects.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+set -e
+
+git clone --depth 1 --no-tags https://gitlab.gnome.org/GNOME/gnome-software.git
+meson subprojects download --sourcedir gnome-software
+rm gnome-software/subprojects/*.wrap
+mv gnome-software/subprojects/ .
+# allow updating this one without a docker rebuild
+rm -rf subprojects/gnome-pwa-list
+rm -rf gnome-software
diff --git a/.gitlab-ci/debian-stable.Dockerfile b/.gitlab-ci/debian-stable.Dockerfile
new file mode 100644
index 0000000..ab31fbb
--- /dev/null
+++ b/.gitlab-ci/debian-stable.Dockerfile
@@ -0,0 +1,94 @@
+FROM debian:bookworm
+
+RUN apt-get update -qq && apt-get install --no-install-recommends -qq -y \
+ appstream \
+ clang \
+ clang-tools \
+ dbus \
+ desktop-file-utils \
+ docbook-xsl \
+ gcc \
+ g++ \
+ gettext \
+ git \
+ gnome-pkg-tools \
+ gobject-introspection \
+ gperf \
+ gsettings-desktop-schemas-dev \
+ gtk-doc-tools \
+ itstool \
+ lcov \
+ libaccountsservice-dev \
+ libappstream-dev \
+ libcairo2-dev \
+ libcairo-gobject2 \
+ libcurl4-gnutls-dev \
+ libepoxy-dev \
+ libflatpak-dev \
+ libfontconfig-dev \
+ libfwupd-dev \
+ libgdk-pixbuf-2.0-dev \
+ libgirepository1.0-dev \
+ libglib2.0-dev \
+ libglib-testing-0-dev \
+ libgoa-1.0-dev \
+ libgraphene-1.0-dev \
+ libgstreamer-plugins-bad1.0-dev \
+ libgudev-1.0-dev \
+ libjpeg62-turbo-dev \
+ libjson-glib-dev \
+ liblmdb-dev \
+ libmalcontent-0-dev \
+ libpackagekit-glib2-dev \
+ libpam0g-dev \
+ libpango1.0-dev \
+ libpolkit-gobject-1-dev \
+ libsoup2.4-dev \
+ libstemmer-dev \
+ libxcursor-dev \
+ libxdamage-dev \
+ libxext-dev \
+ libxfixes-dev \
+ libxi-dev \
+ libxinerama-dev \
+ libxkbcommon-dev \
+ libxmlb-dev \
+ libxml2-utils \
+ libxrandr-dev \
+ libyaml-dev \
+ ninja-build \
+ packagekit \
+ pkg-config \
+ policykit-1 \
+ python3 \
+ python3-pip \
+ python3-setuptools \
+ python3-wheel \
+ sassc \
+ shared-mime-info \
+ sudo \
+ sysprof \
+ unzip \
+ valgrind \
+ wayland-protocols \
+ wget \
+ xsltproc \
+ xz-utils \
+ && rm -rf /usr/share/doc/* /usr/share/man/*
+
+RUN pip3 install meson==0.60.1
+
+# Enable passwordless sudo for sudo users
+RUN sed -i -e '/%sudo/s/ALL$/NOPASSWD: ALL/' /etc/sudoers
+
+ARG HOST_USER_ID=5555
+ENV HOST_USER_ID ${HOST_USER_ID}
+RUN useradd -u $HOST_USER_ID -G sudo -ms /bin/bash user
+
+USER user
+WORKDIR /home/user
+
+COPY cache-subprojects.sh .
+RUN ./cache-subprojects.sh
+
+ENV LANG=C.UTF-8 LANGUAGE=C.UTF-8 LC_ALL=C.UTF-8
diff --git a/.gitlab-ci/fedora.Dockerfile b/.gitlab-ci/fedora.Dockerfile
new file mode 100644
index 0000000..a3bc5f1
--- /dev/null
+++ b/.gitlab-ci/fedora.Dockerfile
@@ -0,0 +1,96 @@
+FROM fedora:35
+
+RUN dnf -y install \
+ appstream \
+ accountsservice-devel \
+ cairo-devel \
+ cairo-gobject-devel \
+ clang \
+ clang-analyzer \
+ dbus-daemon \
+ dbus-devel \
+ desktop-file-utils \
+ docbook-style-xsl \
+ flatpak-devel \
+ fwupd-devel \
+ gcc \
+ gdk-pixbuf2-devel \
+ gettext \
+ git \
+ glib2-devel \
+ gobject-introspection \
+ gobject-introspection-devel \
+ gperf \
+ graphene-devel \
+ gsettings-desktop-schemas-devel \
+ gstreamer1-plugins-bad-free-devel \
+ gtk-doc \
+ json-glib-devel \
+ itstool \
+ lcov \
+ lmdb-devel \
+ appstream-devel \
+ libcurl-devel \
+ libdnf-devel \
+ libepoxy-devel \
+ libglib-testing-devel \
+ libgudev-devel \
+ libjpeg-turbo-devel \
+ liboauth-devel \
+ libsecret-devel \
+ libsoup-devel \
+ libstemmer-devel \
+ libXcursor-devel \
+ libXdamage-devel \
+ libXext-devel \
+ libXfixes-devel \
+ libXi-devel \
+ libXinerama-devel \
+ libxkbcommon-devel \
+ libxmlb-devel \
+ libXrandr-devel \
+ libxslt \
+ libyaml-devel \
+ malcontent-devel \
+ NetworkManager-libnm-devel \
+ ninja-build \
+ ostree-devel \
+ PackageKit \
+ PackageKit-glib-devel \
+ pam-devel \
+ pango-devel \
+ pcre-devel \
+ polkit-devel \
+ python3 \
+ python3-pip \
+ python3-wheel \
+ rpm-devel \
+ rpm-ostree-devel \
+ sassc \
+ shared-mime-info \
+ snapd-glib-devel \
+ sysprof-capture-devel \
+ unzip \
+ valgrind \
+ wayland-protocols-devel \
+ wget \
+ xz \
+ zlib-devel \
+ && dnf clean all
+
+RUN pip3 install meson==0.60.1
+
+# Enable sudo for wheel users
+RUN sed -i -e 's/# %wheel/%wheel/' -e '0,/%wheel/{s/%wheel/# %wheel/}' /etc/sudoers
+
+ARG HOST_USER_ID=5555
+ENV HOST_USER_ID ${HOST_USER_ID}
+RUN useradd -u $HOST_USER_ID -G wheel -ms /bin/bash user
+
+USER user
+WORKDIR /home/user
+
+COPY cache-subprojects.sh .
+RUN ./cache-subprojects.sh
+
+ENV LANG C.UTF-8
diff --git a/.gitlab-ci/meson-junit-report.py b/.gitlab-ci/meson-junit-report.py
new file mode 100755
index 0000000..8bb7667
--- /dev/null
+++ b/.gitlab-ci/meson-junit-report.py
@@ -0,0 +1,114 @@
+#!/usr/bin/env python3
+
+# Turns a Meson testlog.json file into a JUnit XML report
+#
+# Copyright 2019 GNOME Foundation
+#
+# SPDX-License-Identifier: LGPL-2.1-or-later
+#
+# Original author: Emmanuele Bassi
+
+import argparse
+import datetime
+import json
+import os
+import sys
+import xml.etree.ElementTree as ET
+
+aparser = argparse.ArgumentParser(description='Turns a Meson test log into a JUnit report')
+aparser.add_argument('--project-name', metavar='NAME',
+ help='The project name',
+ default='unknown')
+aparser.add_argument('--job-id', metavar='ID',
+ help='The job ID for the report',
+ default='Unknown')
+aparser.add_argument('--branch', metavar='NAME',
+ help='Branch of the project being tested',
+ default='main')
+aparser.add_argument('--output', metavar='FILE',
+ help='The output file, stdout by default',
+ type=argparse.FileType('w', encoding='UTF-8'),
+ default=sys.stdout)
+aparser.add_argument('infile', metavar='FILE',
+ help='The input testlog.json, stdin by default',
+ type=argparse.FileType('r', encoding='UTF-8'),
+ default=sys.stdin)
+
+args = aparser.parse_args()
+
+outfile = args.output
+
+testsuites = ET.Element('testsuites')
+testsuites.set('id', '{}/{}'.format(args.job_id, args.branch))
+testsuites.set('package', args.project_name)
+testsuites.set('timestamp', datetime.datetime.utcnow().isoformat())
+
+suites = {}
+for line in args.infile:
+ data = json.loads(line)
+ (full_suite, unit_name) = data['name'].split(' / ')
+ try:
+ (project_name, suite_name) = full_suite.split(':')
+ except ValueError:
+ (project_name, suite_name) = (args.project_name, full_suite)
+
+ duration = data['duration']
+ return_code = data['returncode']
+ log = data['stdout']
+ log_stderr = data.get('stderr', '')
+
+ unit = {
+ 'suite': suite_name,
+ 'name': unit_name,
+ 'duration': duration,
+ 'returncode': return_code,
+ 'stdout': log,
+ 'stderr': log_stderr,
+ }
+
+ units = suites.setdefault(suite_name, [])
+ units.append(unit)
+
+for name, units in suites.items():
+ print('Processing suite {} (units: {})'.format(name, len(units)))
+
+ def if_failed(unit):
+ if unit['returncode'] != 0:
+ return True
+ return False
+
+ def if_succeded(unit):
+ if unit['returncode'] == 0:
+ return True
+ return False
+
+ successes = list(filter(if_succeded, units))
+ failures = list(filter(if_failed, units))
+ print(' - {}: {} pass, {} fail'.format(name, len(successes), len(failures)))
+
+ testsuite = ET.SubElement(testsuites, 'testsuite')
+ testsuite.set('name', '{}/{}'.format(args.project_name, name))
+ testsuite.set('tests', str(len(units)))
+ testsuite.set('errors', str(len(failures)))
+ testsuite.set('failures', str(len(failures)))
+
+ for unit in successes:
+ testcase = ET.SubElement(testsuite, 'testcase')
+ testcase.set('classname', '{}/{}'.format(args.project_name, unit['suite']))
+ testcase.set('name', unit['name'])
+ testcase.set('time', str(unit['duration']))
+
+ for unit in failures:
+ testcase = ET.SubElement(testsuite, 'testcase')
+ testcase.set('classname', '{}/{}'.format(args.project_name, unit['suite']))
+ testcase.set('name', unit['name'])
+ testcase.set('time', str(unit['duration']))
+
+ failure = ET.SubElement(testcase, 'failure')
+ failure.set('classname', '{}/{}'.format(args.project_name, unit['suite']))
+ failure.set('name', unit['name'])
+ failure.set('type', 'error')
+ failure.text = unit['stdout'] + '\n' + unit['stderr']
+
+output = ET.tostring(testsuites, encoding='unicode')
+outfile.write(output)
diff --git a/.gitlab-ci/run-docker.sh b/.gitlab-ci/run-docker.sh
new file mode 100755
index 0000000..030cade
--- /dev/null
+++ b/.gitlab-ci/run-docker.sh
@@ -0,0 +1,132 @@
+#!/bin/bash
+
+read_arg() {
+ # $1 = arg name
+ # $2 = arg value
+ # $3 = arg parameter
+ local rematch='^[^=]*=(.*)$'
+ if [[ $2 =~ $rematch ]]; then
+ read -r "$1" <<< "${BASH_REMATCH[1]}"
+ else
+ read -r "$1" <<< "$3"
+ # There is no way to shift our callers args, so
+ # return 1 to indicate they should do it instead.
+ return 1
+ fi
+}
+
+SUDO_CMD="sudo"
+if docker -v |& grep -q podman; then
+ # Using podman
+ SUDO_CMD=""
+ # Docker is actually implemented by podman, and its OCI output
+ # is incompatible with some of the dockerd instances on GitLab
+ # CI runners.
+ export BUILDAH_FORMAT=docker
+fi
+
+set -e
+
+base=""
+base_version=""
+build=0
+run=0
+push=0
+list=0
+print_help=0
+no_login=0
+
+while (($# > 0)); do
+ case "${1%%=*}" in
+ build) build=1;;
+ run) run=1;;
+ push) push=1;;
+ list) list=1;;
+ help) print_help=1;;
+ --base|-b) read_arg base "$@" || shift;;
+ --base-version) read_arg base_version "$@" || shift;;
+ --no-login) no_login=1;;
+ *) echo -e "\e[1;31mERROR\e[0m: Unknown option '$1'"; exit 1;;
+ esac
+ shift
+done
+
+if [ $print_help == 1 ]; then
+ echo "$0 - Build and run Docker images"
+ echo ""
+ echo "Usage: $0 <command> [options] [basename]"
+ echo ""
+ echo "Available commands"
+ echo ""
+ echo " build --base=<BASENAME> - Build Docker image <BASENAME>.Dockerfile"
+ echo " run --base=<BASENAME> - Run Docker image <BASENAME>"
+ echo " push --base=<BASENAME> - Push Docker image <BASENAME> to the registry"
+ echo " list - List available images"
+ echo " help - This help message"
+ echo ""
+ exit 0
+fi
+
+cd "$(dirname "$0")"
+
+if [ $list == 1 ]; then
+ echo "Available Docker images:"
+ for f in *.Dockerfile; do
+ filename=$( basename -- "$f" )
+ basename="${filename%.*}"
+
+ echo -e " \e[1;39m$basename\e[0m"
+ done
+ exit 0
+fi
+
+# All commands after this require --base to be set
+if [ -z "${base}" ]; then
+ echo "Usage: $0 <command>"
+ exit 1
+fi
+
+if [ ! -f "$base.Dockerfile" ]; then
+ echo -e "\e[1;31mERROR\e[0m: Dockerfile for '$base' not found"
+ exit 1
+fi
+
+if [ -z "${base_version}" ]; then
+ base_version="latest"
+else
+ base_version="v$base_version"
+fi
+
+TAG="registry.gitlab.gnome.org/gnome/gnome-software/${base}:${base_version}"
+
+if [ $build == 1 ]; then
+ echo -e "\e[1;32mBUILDING\e[0m: ${base} as ${TAG}"
+ $SUDO_CMD docker build \
+ --build-arg HOST_USER_ID="$UID" \
+ --tag "${TAG}" \
+ --file "${base}.Dockerfile" .
+ exit $?
+fi
+
+if [ $push == 1 ]; then
+ echo -e "\e[1;32mPUSHING\e[0m: ${base} as ${TAG}"
+
+ if [ $no_login == 0 ]; then
+ $SUDO_CMD docker login registry.gitlab.gnome.org
+ fi
+
+ $SUDO_CMD docker push $TAG
+ exit $?
+fi
+
+if [ $run == 1 ]; then
+ echo -e "\e[1;32mRUNNING\e[0m: ${base} as ${TAG}"
+ $SUDO_CMD docker run \
+ --rm \
+ --volume "$(pwd)/..:/home/user/app" \
+ --workdir "/home/user/app" \
+ --tty \
+ --interactive "${TAG}" \
+ bash
+ exit $?
+fi
diff --git a/.gitlab-ci/run-tests.sh b/.gitlab-ci/run-tests.sh
new file mode 100755
index 0000000..38e7cb1
--- /dev/null
+++ b/.gitlab-ci/run-tests.sh
@@ -0,0 +1,49 @@
+#!/bin/bash
+
+set +e
+
+case "$1" in
+ --log-file)
+ log_file="$2"
+ shift
+ shift
+ ;;
+ *)
+ log_file="_build/meson-logs/testlog.json"
+esac
+
+# Remove Flatpak triggers, to speed up the tests (specifically on Fedora,
+# they could even break the tests by a deadlock or something like that).
+if [ -d /usr/share/flatpak/triggers ]; then
+ sudo rm -rf /usr/share/flatpak/triggers
+fi
+
+# FIXME: The tests should be isolated and use mock services so they do not
+# require a functioning system bus. This will have to do for now though.
+sudo mkdir -p /run/dbus
+sudo mkdir -p /var
+sudo ln -s /var/run /run
+sudo dbus-daemon --system --fork
+#sudo /usr/lib/polkit-1/polkitd --no-debug &
+#sudo /usr/libexec/fwupd/fwupd --verbose &
+
+# FIXME: Running the flatpak tests as root means the system helper doesn’t
+# need to be used, which makes them run a lot faster.
+sudo \
+dbus-run-session -- \
+meson test \
+ -C _build \
+ --timeout-multiplier ${MESON_TEST_TIMEOUT_MULTIPLIER} \
+ --no-suite flaky \
+ --print-errorlogs \
+ "$@"
+
+exit_code=$?
+
+python3 .gitlab-ci/meson-junit-report.py \
+ --project-name=gnome-software \
+ --job-id "${CI_JOB_NAME}" \
+ --output "_build/${CI_JOB_NAME}-report.xml" \
+ "${log_file}"
+
+exit $exit_code
diff --git a/.gitlab/issue_templates/Default.md b/.gitlab/issue_templates/Default.md
new file mode 100644
index 0000000..f68c523
--- /dev/null
+++ b/.gitlab/issue_templates/Default.md
@@ -0,0 +1,15 @@
+Please describe the issue you’re experiencing:
+…
+
+
+What Linux distribution are you using, and what kind of package (RPM, deb, flatpak, etc.) are you experiencing the problem with?
+
+
+Please attach a log of the issue, by running the following commands, reproducing the issue, and then attaching `gnome-software.log` here:
+```sh
+pkill gnome-software
+gnome-software --verbose &> gnome-software.log
+```
+
+
+If the problem is with the user interface, please attach a screenshot or video of it. Please attach the file directly rather than linking to an external hosting service, as external files are likely to be deleted after a while.
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..634ee64
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "subprojects/gnome-pwa-list"]
+ path = subprojects/gnome-pwa-list
+ url = https://gitlab.gnome.org/mwleeds/gnome-pwa-list.git
diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 0000000..611cba1
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,6 @@
+Richard Hughes <richard@hughsie.com>
+Matthias Clasen <mclasen@redhat.com>
+Kalev Lember <kalevlember@gmail.com>
+
+Backdrop image for Builder featured banner used with permission by
+Adam Wyles -- http://www.flickr.com/photos/the-travelling-bum/6336397663/
diff --git a/COMMITMENT b/COMMITMENT
new file mode 100644
index 0000000..bfa237f
--- /dev/null
+++ b/COMMITMENT
@@ -0,0 +1,45 @@
+Common Cure Rights Commitment, version 1.0
+
+Before filing or continuing to prosecute any legal proceeding or claim
+(other than a Defensive Action) arising from termination of a Covered
+License, we commit to extend to the person or entity ('you') accused
+of violating the Covered License the following provisions regarding
+cure and reinstatement, taken from GPL version 3. As used here, the
+term 'this License' refers to the specific Covered License being
+enforced.
+
+ However, if you cease all violation of this License, then your
+ license from a particular copyright holder is reinstated (a)
+ provisionally, unless and until the copyright holder explicitly
+ and finally terminates your license, and (b) permanently, if the
+ copyright holder fails to notify you of the violation by some
+ reasonable means prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+ reinstated permanently if the copyright holder notifies you of the
+ violation by some reasonable means, this is the first time you
+ have received notice of violation of this License (for any work)
+ from that copyright holder, and you cure the violation prior to 30
+ days after your receipt of the notice.
+
+We intend this Commitment to be irrevocable, and binding and
+enforceable against us and assignees of or successors to our
+copyrights.
+
+Definitions
+
+'Covered License' means the GNU General Public License, version 2
+(GPLv2), the GNU Lesser General Public License, version 2.1
+(LGPLv2.1), or the GNU Library General Public License, version 2
+(LGPLv2), all as published by the Free Software Foundation.
+
+'Defensive Action' means a legal proceeding or claim that We bring
+against you in response to a prior proceeding or claim initiated by
+you or your affiliate.
+
+'We' means each contributor to this repository as of the date of
+inclusion of this file, including subsidiaries of a corporate
+contributor.
+
+This work is available under a Creative Commons Attribution-ShareAlike
+4.0 International license.
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..d159169
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/NEWS b/NEWS
new file mode 100644
index 0000000..535bae9
--- /dev/null
+++ b/NEWS
@@ -0,0 +1,2004 @@
+Version 43.5
+~~~~~~~~~~~~
+Released: 2023-03-03
+
+This is a stable release with the following change:
+ * Fix few memory leaks
+
+Version 43.4
+~~~~~~~~~~~~
+Released: 2023-02-10
+
+This is a stable release with the following changes:
+ * Stop cancelled search in appstream data early
+ * Lookup for appstream-provided icons in more directories
+
+Version 43.3
+~~~~~~~~~~~~
+Released: 2023-01-06
+
+This is a stable release with the following changes:
+ * Periodically expire cached app icons
+ * Stop notifying about unprepared critical updates
+
+This release also updates translations:
+ * Abkhazian (Nart Tlisha)
+ * Georgian (Ekaterine Papava)
+ * Hebrew (Yosef Or Boczko)
+ * Interlingue (Olga Smirnova)
+ * Occitan (post 1500) (Quentin PAGÈS)
+ * Persian (Danial Behzadi)
+
+Version 43.2
+~~~~~~~~~~~~
+Released: 2022-12-02
+
+This is a stable release with the following changes:
+ * Fix show of updatable app in the details page
+ * Fix search for apps providing some feature under rpm-ostree
+ * Fix sending of ODRS data when using libsoup3
+ * Fix occasional crash when installing apps
+
+This release also updates translations:
+ * Abkhazian (Nart Tlisha)
+ * Belarusian (Vasil Pupkin)
+ * Czech (Daniel Rusek)
+ * Georgian (Zurab Kargareteli)
+ * Greek (Kosmas Martakidis)
+ * Hebrew (Yosef Or Boczko)
+ * Hungarian (Balázs Meskó)
+ * Russian (Aleksandr Melman)
+ * Turkish (Sabri Ünal)
+
+Version 43.1
+~~~~~~~~~~~~
+Released: 2022-10-21
+
+This is a stable release with the following changes:
+ * Fix searches not completing if installing or uninstalling an app at the same time
+ * Notify of errors when running a flatpak app whose runtime is missing
+ * Fix installing local RPM packages
+ * Fix distribution upgrades when package conflicts are present
+ * Fix opening web apps from their details page
+ * Improve appearance of app ratings if ratings data cannot be downloaded
+ * Fix crash when showing offline update errors on startup
+ * Highlight priority of firmware updates, making security fixes more obvious
+ * Fix installation of pending apps in some situations
+ * Fix downloading of rpm-ostree app updates from the Updates page
+
+This release also updates translations:
+ * Abkhazian (Nart Tlisha)
+ * Catalan (Jordi Mas)
+ * Chinese (Taiwan) (Cheng-Chia Tseng)
+ * Croatian (Goran Vidović)
+ * French (Claude Paroz)
+ * Friulian (Fabio Tomat)
+ * Georgian (Zurab Kargareteli)
+ * German (Philipp Kiemle, Jürgen Benvenuti)
+ * Icelandic (Sveinn í Felli)
+ * Italian (Gianvito Cavasoli)
+ * Kazakh (Baurzhan Muftakhidinov)
+ * Panjabi (A S Alam)
+ * Slovenian (Matej Urbančič)
+
+Version 43.0
+~~~~~~~~~~~~
+Released: 2022-09-16
+
+This is a stable release with translation updates:
+ * Bulgarian
+ * Catalan
+ * Chinese (Taiwan)
+ * Czech
+ * English (United Kingdom)
+ * Galician
+ * Georgian
+ * German
+ * Hebrew
+ * Hungarian
+ * Icelandic
+ * Latvian
+ * Lithuanian
+ * Nepali
+ * Serbian
+ * Slovenian
+ * Spanish
+ * Swedish
+
+Version 43~rc
+~~~~~~~~~~~~~
+Released: 2022-09-02
+
+This is the third unstable release for GNOME 43.
+ * Supports video as a screenshot
+ * Improvements of source picker in the details page
+ * Fixes a bug when viewing details of a package file
+ * Fixes a bug when reading certain .flatpakref file
+
+This release also updates translations:
+ * Abkhazian
+ * Basque
+ * Catalan
+ * Chinese (China)
+ * Croatian
+ * Danish
+ * Dutch
+ * Finnish
+ * Galician
+ * Georgian
+ * Hebrew
+ * Icelandic
+ * Indonesian
+ * Korean
+ * Lithuanian
+ * Persian
+ * Polish
+ * Portuguese
+ * Portuguese (Brazil)
+ * Russian
+ * Serbian
+ * Spanish
+ * Turkish
+ * Ukrainian
+
+Version 43~beta
+~~~~~~~~~~~~~~~
+Released: 2022-08-05
+
+This is the second unstable release for GNOME 43.
+ * Various fixes related to changed threading model
+ * Various UI parts updated
+ * Sources dropdown had been reworked
+ * Fixes a rare crash when showing app details
+
+This release also updates translations:
+ * Abkhazian
+ * Catalan
+ * Chinese (China)
+ * Dutch
+ * Georgian
+ * Hebrew
+ * Indonesian
+ * Italian
+ * Lithuanian
+ * Persian
+ * Portuguese
+ * Russian
+ * Serbian
+ * Spanish
+ * Turkish
+ * Ukrainian
+ * Vietnamese
+
+Version 43~alpha
+~~~~~~~~~~~~~~~~
+Released: 2022-06-30
+
+This is the first unstable release for GNOME 43.
+ * Various improvements to notifications
+ * Fix several crashes when handling flatpak apps
+ * Add ‘Other Apps by Author’ section in the app details page
+ * Improve styling of app context lozenges
+ * Add ‘Available for Distro’ section to the overview page (if configured by your distribution)
+ * Show more details about file system permissions requested by flatpak apps
+ * Show more types of URI from app metainfo
+ * Fix a few issues when using a dark mode theme
+ * Fix some issues with arrows in right-to-left locales
+ * Fix language pack installation for certain locales
+ * Improve debug output to make user bug reports more useful
+ * Add `--uninstall=ID` command line option
+ * Allow scrolling screenshots by clicking on next and previous screenshots
+ * Add support for webapps
+ * Allow swiping back in the shell using touch gestures
+ * Improved caching of downloaded metadata
+ * Many internal architectural changes to make the code more maintainable
+ * The popular-overrides GSettings key has been removed; distribution vendors wishing to mark
+ their apps as popular should see `doc/vendor-customisation.md` for examples of how to do this
+ now
+ * The hardcoded_popular Meson option has been renamed to hardcoded_curated.
+
+This release also updates translations:
+ * Basque
+ * Bulgarian
+ * Catalan
+ * Chinese (China)
+ * Chinese (Taiwan)
+ * Croatian
+ * Czech
+ * Danish
+ * Dutch
+ * English (United Kingdom)
+ * Finnish
+ * French
+ * Friulian
+ * Galician
+ * Georgian
+ * German
+ * Hebrew
+ * Hungarian
+ * Indonesian
+ * Lithuanian
+ * Nepali
+ * Occitan (post 1500)
+ * Persian
+ * Polish
+ * Portuguese
+ * Portuguese (Brazil)
+ * Russian
+ * Serbian
+ * Slovenian
+ * Spanish
+ * Swedish
+ * Turkish
+ * Ukrainian
+ * Vietnamese
+
+Version 42.0
+~~~~~~~~~~~~
+Released: 2022-03-18
+
+This is a stable release with the following changes:
+ * Various fixes related to changed threading model
+ * Added several appstream-related fixes
+
+This release also updates translations:
+ * Basque
+ * Bokmål, Norwegian
+ * Bulgarian
+ * Catalan
+ * Chinese (China)
+ * Danish
+ * Finnish
+ * French
+ * German
+ * Hebrew
+ * Hungarian
+ * Japanese
+ * Kazakh
+ * Lithuanian
+ * Occitan (post 1500)
+ * Persian
+ * Polish
+ * Russian
+ * Serbian
+ * Slovenian
+ * Swedish
+
+Version 42~rc
+~~~~~~~~~~~~~
+Released: 2022-03-04
+
+This is the third unstable release for GNOME 42.
+ * Cancel ongoing update downloads when system power is low
+ * Numerous small user interface fixes and tweaks
+ * Prioritize full matches in search results
+ * Improvements in dark mode
+ * Fix disabling flatpak remotes from the ‘Software Repositories’ dialog
+ * Threading and performance improvements which should reduce the number of user interface freezes
+ * Update some icons
+ * Check for updates when moving from a metered to a non-metered network connection
+
+This release also updates translations:
+ * Basque
+ * Catalan
+ * Chinese (China)
+ * Croatian
+ * Czech
+ * Danish
+ * Friulian
+ * Galician
+ * Hebrew
+ * Indonesian
+ * Korean
+ * Lithuanian
+ * Persian
+ * Portuguese
+ * Portuguese (Brazil)
+ * Russian
+ * Slovenian
+ * Spanish
+ * Turkish
+ * Ukrainian
+
+Version 42~beta
+~~~~~~~~~~~~~~~
+Released: 2022-02-10
+
+This is the second unstable release for GNOME 42.
+ * Allow --verbose to be enabled at runtime
+ * Condense the rows in the age rating context dialog
+ * Update the UI for ratings and reviews of apps
+ * Improve the appearance of the category page loading screen
+ * Drop the first run dialog
+ * Improvements to dark theming
+ * Support viewing a specific metainfo file using --show-metainfo
+ * Several more threading improvements
+ * Icon updates
+ * Drop the hardcoded-popular plugin in favour of an appstream file
+ * The background image for upgrades is now looked for using several well-known (and
+ distribution-specific) names in ${DATADIR}/gnome-software/backgrounds, and the previous
+ Fedora-specific default background image is no longer distributed. Similarly, the
+ upgrade-background-uri GSettings key has been removed. Distributions may need to update how
+ they ship background images. See doc/vendor-customisation.md.
+
+This release also updates translations:
+ * Chinese (China)
+ * Galician
+ * Hebrew
+ * Icelandic
+ * Indonesian
+ * Japanese
+ * Occitan (post 1500)
+ * Portuguese
+ * Portuguese (Brazil)
+ * Russian
+ * Slovenian
+ * Spanish
+ * Ukrainian
+
+Version 42~alpha
+~~~~~~~~~~~~~~~~
+Released: 2022-01-07
+
+This is the first unstable release for GNOME 42.
+ * Various UI parts updated
+ * Support more markup in the application description
+ * Ask about package signature with PackageKit on signing issue
+ * Show better System Update progress
+ * Remove various cultural sensitivity badges
+ * Fix a crash when processing age ratings
+ * Reload application details only when not installing/removing the application
+ * Do not follow symlinks when calculating disk size usage
+ * Fix addons section, which could show addons for different application
+ * Fix showing a ‘transaction in progress’ error when using the rpm-ostree plugin
+ * Don’t recommend a reboot if firmware updates fail
+ * Fix flathub repo being considered present on Fedora 35 with filtered flathub
+ * Allow searching for extensions
+ * Fix translation of main button on updates page
+ * Fix codec installation process
+ * Add new GNOME Circle apps to the featured carousel
+ * Improve metadata support for snaps
+ * Fix update checks being missed across suspend/hibernation
+ * Ensure application lists are updated when repositories are enabled/installed or
+ disabled/removed
+
+This release also updates translations:
+ * Basque
+ * Belarusian
+ * Bulgarian
+ * Catalan
+ * Chinese (China)
+ * Croatian
+ * Dutch
+ * English (United Kingdom)
+ * Friulian
+ * Galician
+ * German
+ * Hebrew
+ * Icelandic
+ * Indonesian
+ * Latvian
+ * Lithuanian
+ * Occitan (post 1500)
+ * Persian
+ * Portuguese
+ * Portuguese (Brazil)
+ * Russian
+ * Serbian
+ * Slovak
+ * Slovenian
+ * Spanish
+ * Swedish
+ * Turkish
+ * Ukrainian
+ * Vietnamese
+
+Version 41.0
+~~~~~~~~~~~~
+Released: 2021-09-17
+
+This is a stable release with the following changes:
+ * Instead of showing all package-based apps as "potentially unsafe", only use that language for
+ 3rd party ones
+ * Fix a bug where the "Show more" button on an app details page would flicker when the window is
+ resized
+ * Fix a bug where Software sometimes shows an Uninstall button after uninstalling something
+ * Add GNOME Circle apps to the featured carousel
+ * Fix a bug where Software would sometimes fail to execute an install/remove operation for
+ PackageKit software rather than showing a PolicyKit password prompt
+ * Fix a bug where Software would fail to upgrade the distribution via PackageKit
+ * Fix the hiding of rows on the Updates tab after they have been updated
+
+This release also updates translations:
+ * Basque
+ * Catalan
+ * Chinese (China)
+ * Croatian
+ * Czech
+ * Danish
+ * Dutch
+ * Finnish
+ * French
+ * Galician
+ * German
+ * Hungarian
+ * Indonesian
+ * Korean
+ * Lithuanian
+ * Occitan (post 1500)
+ * Polish
+ * Portuguese
+ * Portuguese (Brazil)
+ * Romanian
+ * Russian
+ * Slovenian
+ * Spanish
+ * Swedish
+ * Ukrainian
+
+Version 41~rc
+~~~~~~~~~~~~~
+Released: 2021-09-07
+
+This is the third unstable release for GNOME 41.
+ * Tweaks to the context tiles and dialogs
+ * Fixes to the details page for non-desktop apps
+ * Re-add support for the add-ons categories
+ * Sort new and updated apps by release date on the category page
+
+This release also updates translations:
+ * Basque
+ * Catalan
+ * Chinese (China)
+ * Chinese (Taiwan)
+ * Croatian
+ * English (United Kingdom)
+ * Finnish
+ * Galician
+ * Indonesian
+ * Kazakh
+ * Korean
+ * Lithuanian
+ * Occitan (post 1500)
+ * Persian
+ * Portuguese
+ * Portuguese (Brazil)
+ * Slovenian
+ * Spanish
+ * Swedish
+ * Ukrainian
+
+Version 41~beta
+~~~~~~~~~~~~~~~
+Released: 2021-08-13
+
+This is the second unstable release for GNOME 41.
+ * Many parts of the user interface reworked
+ * Fix when the 'Launch' button is shown after an application install
+ * Fix appstream:// URL handling
+ * Fix application freeze on Flatpak application install/remove/update
+ * Disable automatic update downloads when in power saver mode
+
+This release also updates translations:
+ * Belarusian
+ * Bulgarian
+ * Catalan
+ * Friulian
+ * Galician
+ * German
+ * Greek, Modern (1453-)
+ * Occitan (post 1500)
+ * Persian
+ * Portuguese
+ * Portuguese (Brazil)
+ * Slovenian
+ * Ukrainian
+
+Version 41~alpha
+~~~~~~~~~~~~~~~~
+Released: 2021-07-20
+
+This is the first unstable release for GNOME 41.
+ * Many parts of the user interface reworked
+ * Improve error reporting from flatpak when low on disk space
+ * Fix issues with updating the UI when uninstalling apps with add-ons
+ * Don’t keep rpm-ostreed alive forever
+ * Prevent polkit checks showing up for background operations
+ * Disallow submitting reviews for an app you haven’t installed
+ * Show download size in the Updates page
+ * Notify when restart is needed when uninstalling an app
+ * Fix some issues with searches not running
+ * Allow non-integer average star ratings for apps
+ * Reduce number of categories in the UI
+ * Improve ‘pending updates’ notifications
+ * Refine presentation of download and installed size on details page
+ * Remove left over gnome-online-account dependencies
+
+This release also updates translations:
+ * Basque
+ * Belarusian
+ * Bokmål, Norwegian
+ * Catalan
+ * Chinese (China)
+ * Chinese (Taiwan)
+ * Czech
+ * Dutch
+ * English (United Kingdom)
+ * Finnish
+ * Friulian
+ * German
+ * Greek, Modern (1453-)
+ * Hebrew
+ * Italian
+ * Lithuanian
+ * Nepali
+ * Occitan (post 1500)
+ * Persian
+ * Polish
+ * Portuguese
+ * Portuguese (Brazil)
+ * Romanian
+ * Russian
+ * Serbian
+ * Spanish
+ * Swedish
+ * Ukrainian
+
+Version 40
+~~~~~~~~~~
+Released: 2021-03-19
+
+This is a stable release with the following changes:
+ * Fix handling of invalid or incomplete application icons
+ * Fix the plugin documentation to reflect reality
+ * Fix the Snap plugin to actually load icons
+ * Set download size to 0 after the package is downloaded
+
+Translation updates:
+ * British English
+ * Danish
+ * Greek
+ * Italian
+ * Norwegian Bokmål
+ * Polish
+ * Punjabi
+ * Serbian
+
+Version 40~rc
+~~~~~~~~~~~~~
+Released: 2021-03-12
+
+This is an unstable release with the following changes:
+ * Implement new featured apps carousel.
+ * List of Flatpak repositories is updated when changed using the Flatpak command line tool.
+ * The loading page now shows the full color icon instead of the symbolic one.
+ * Show release date in version history for releases that use the 'date' attribute.
+ * Improved icon handling, including with hiDPI screens.
+ * Fixed a bug in remembering when update notifications were shown.
+ * Build as a dynamic rather than a static library, and rearrange installation paths.
+
+Translation updates:
+ * Basque
+ * Catalan
+ * Croatian
+ * Czech
+ * Dutch
+ * English (United Kingdom)
+ * Finnish
+ * French
+ * Friulian
+ * Galician
+ * German
+ * Hungarian
+ * Indonesian
+ * Kazakh
+ * Korean
+ * Lithuanian
+ * Persian
+ * Portuguese
+ * Portuguese (Brazil)
+ * Romanian
+ * Serbian
+ * Slovenian
+ * Spanish
+ * Swedish
+ * Turkish
+ * Ukrainian
+
+Version 40~beta
+~~~~~~~~~~~~~~~
+Released: 2021-02-16
+
+This is an unstable release with the following changes:
+ * GNOME Software now uses libappstream instead of libappstream-glib to work with appstream data
+ which provides information about apps and other components.
+ * App details pages show version history information when it's available.
+ * The loading page now shows the full color icon instead of the symbolic one.
+ * UI elements for displaying app add-ons have been tweaked to more closely match the designs.
+ * Installed icons and the badge showing the number of updates available were changed back to blue
+ from green.
+ * The dropdown showing the available sources of an application includes the packaging format
+ (e.g. Flatpak vs RPM).
+ * A bug was fixed that prevented installation of .flatpakref files
+
+Translation updates:
+ * Catalan
+ * Czech
+ * Galician
+ * Indonesian
+ * Panjabi
+ * Portuguese
+ * Slovenian
+ * Spanish
+ * Swedish
+
+Version 40~alpha
+~~~~~~~~~~~~~~~~
+Released: 2021-01-27
+
+This is the first unstable release for GNOME 40.
+ * Small updates to how app descriptions and addons are presented on the details page
+ * Fix handling of pending app installations when going online
+ * Better support for dark themes (particularly Adwaita-Dark)
+ * Improvements to how app screenshots are loaded and presented
+ * Hide ‘Launch’ button if an application (for example, Wine) cannot be launched
+ * Make the UI clearer when loading information from flatpakref files
+ * Don’t update app metadata on start when download-updates is disabled
+ * Fix opening the updates list when clicking on an updates notification
+ * Fix state updates when installing flatpak apps or repos which are already installed
+ * Add Ctrl+Q as a keyboard shortcut for closing the window
+ * Rework timing and content of software update notifications
+ * Prevent uninstalled local apps from appearing in the installed apps list
+ * Support installation/uninstallation of addons for flatpak apps
+ * Improve presentation of age ratings for apps
+ * Fix a crash in the updates page
+ * Fix presentation of app permissions for fully sandboxed flatpak apps
+ * Fix deadlock on rpm-ostree systems
+ * Fix presentation of version number changes in right-to-left locales
+ * Error handling improvements for fwupd
+ * Performance improvements for ODRS on startup
+ * Improve presentation of firmware warning messages
+ * XML parsing performance improvements
+ * Automatically remove end-of-life flatpak runtimes
+ * Support updating flatpaks to their new name when they are renamed
+ * Update the GNOME Software icon
+ * Support more search results in the snap store
+ * Drop libgnome-desktop-3 dependency in favour of gsettings-desktop-schemas
+
+This release also updates translations:
+ * Basque
+ * Bokmål, Norwegian
+ * Catalan
+ * Chinese (Taiwan)
+ * Czech
+ * Friulian
+ * Galician
+ * German
+ * Greek, Modern (1453-)
+ * Hebrew
+ * Indonesian
+ * Italian
+ * Kabyle
+ * Kazakh
+ * Latvian
+ * Lithuanian
+ * Persian
+ * Portuguese
+ * Portuguese (Brazil)
+ * Romanian
+ * Slovak
+ * Spanish
+ * Turkish
+ * Ukrainian
+ * Vietnamese
+
+Version 3.37.92
+~~~~~~~~~~~~~~~
+Released: 2020-09-01
+
+This is an unstable stable release with the following changes:
+ * Add sysprof support for profiling jobs
+ * Add webflow and basic auth support to flatpak plugin
+ * Coalesce refresh operations where possible
+ * Correctly mark layered rpm-ostree local packages as removable
+ * Fix flatpak bundle installation
+ * Handle invalid snap auth data
+ * Improve flatpak progress reporting for transactions
+ * Improve the heuristic for detecting old-style AppStream override files
+ * Many performance improvements in many areas of the code
+ * Only delete the firmware archive if we downloaded it to the cache
+ * Show a pulsing progress bar if progress is unknown
+ * Support loading appstream files from custom install prefix
+ * Use the runtime fwupd version for the user agent
+
+This release also updates existing translations.
+
+Version 3.36.0
+~~~~~~~~~~~~~~
+Released: 2020-03-11
+
+This is the first stable release for GNOME 3.36.
+
+Version 3.35.92
+~~~~~~~~~~~~~~~
+Released: 2020-03-04
+
+This is an unstable stable release with the following changes:
+ * Fix crash when viewing application details
+ * Fix “thrice daily” check running every 3 days
+ * Improve the appearance of the front page banners
+ * Show the correct upgrade banner contents when a reboot is requried
+
+This release also updates existing translations.
+
+Version 3.35.91
+~~~~~~~~~~~~~~~
+Released: 2020-02-19
+
+This is an unstable stable release with the following changes:
+ * Add an info bar about automatic updates
+ * Avoid rpm-ostree downgrade error when doing distro upgrade
+ * Click on stars to open review dialog in the details view
+ * Fix loading of icons from AppStream YAML
+ * Fix weird font sizes in the batter
+ * Hide any in-app notifications when closing the main window
+ * Integrate better with snapd
+ * Only ignore flatpak estimated progress if >10%
+ * Remove color stripes on categories in the Explore page
+ * Remove support for Shell extensions
+ * Remove webapp support
+ * Reset star rating when loading an unrated app
+ * Sort applications using locale based algorithms
+ * Stop snaps from being automatically updated
+
+This release also adds and updates existing translations.
+
+Version 3.35.2
+~~~~~~~~~~~~~~
+Released: 2019-11-25
+
+This is an unstable stable release with the following changes:
+ * Add missing OARS content rating descriptions
+ * Add new plugin for restricting access to apps
+ * Avoid a UI crash when switching modes
+ * Build libmalcontent dependency on Fedora CI
+ * Correctly distinguish empty content ratings from missing ones
+ * Correctly set the application state if autoupdate is in progress
+ * Do not show a crazy error when installing packages
+ * Do not show non-applications in the installed panel
+ * Download Flatpak updates in the correct installation
+ * Expose snap channels as app alternates
+ * Fix a crash on 32-bit systems
+ * Fix langpacks autoinstall on Fedora SilverBlue
+ * Fix manual detach when updating removable device firmware
+ * Fix third party repo enabling not working
+ * Hide add/remove shortcut buttons for parentally filtered apps
+ * Improve some front page banners
+ * Invalidate caches when adding or removing remotes
+ * Make flatpak more thread-safe to fix some crashes
+ * Match the exact ID when refining a wildcard
+ * Only set the app row's buttons as destructive when they remove an app
+ * Remove hardcoded-featured plugin
+ * Remove the app folder functionality as this is now built-in to the shell
+ * Remove the banner editor as this is now an app on it's own
+ * Rework age ratings handling to avoid hard-coded list
+ * Set the shell extension origin correctly in all cases
+ * Show the channel for snaps
+ * Speed up the flatpak plugin in some situations
+ * Use plugin API to launch apps from install notification.
+
+This release also adds and updates existing translations.
+
+Version 3.34.0
+~~~~~~~~~~~~~~
+Released: 2019-09-09
+
+This is a stable release with the following changes:
+ * Add a link to the privacy policy in the review dialog
+ * Add and improve many overview banners
+ * Add support for download scheduling using Mogwai
+ * Allow installing locale data automatically
+ * Allow snaps to be shown by AppStream ID
+ * Don't apply drop shadow on stock symbolic icons
+ * Don't install queued apps when the network changes and is metered
+ * Fix the 'localised in my language' kudo
+ * Hide addons that are not available in repos
+ * Localize ESRB content rating strings
+ * Never show the installation progress bar going backwards
+ * Notify the user when an application can escape the sandbox
+ * Refactor screenshots and hide those unavailable when offline
+ * Select the rating systems selected based by territory
+ * Use smaller default size for main window when required
+
+This release also adds and updates existing translations.
+
+Version 3.32.4
+~~~~~~~~~~~~~~
+Released: 2019-07-11
+
+This is a stable release with the following changes:
+ * Fix an issue that led to some packages with multiple appdata files not correctly showing up on
+ the updates page
+ * Fix various problems with flatpak branch handling that were causing issues with freedesktop.org
+ runtime updates
+ * Fix flatpak update versions to correctly show up
+ * Various other minor bug fixes
+
+Version 3.32.3
+~~~~~~~~~~~~~~
+Released: 2019-05-24
+
+This is a stable release with the following changes:
+ * Add missing XbSilo locking, hopefully fixing a large number of reported crashes
+ * Fix a regression that caused the fonts category to go missing
+ * Show a placeholder on the details page when we don't have the actual icon
+ * Plug a large memory leak
+ * Use nicer arrows for version numbers on the updates page
+ * Fix an issue that led to screenshots not being correctly scaled on hidpi
+ * flatpak: Fix several double-uses of GErrors
+ * flatpak: Handle failure of a libflatpak function updating permissions
+ * rpm-ostree: Implement what-provides decompose
+
+Version 3.32.2
+~~~~~~~~~~~~~~
+Released: 2019-05-07
+
+This is a stable release with the following changes:
+ * Avoid showing a review more than once
+ * Correctly update progress bar when downloading packagekit distro upgrades
+ * Fix a crash when closing the updates dialog before the content has loaded
+ * Fix CTRL+F not working right in certains conditions
+ * Set 022 umask to make sure flatpak system helper process can read the files we've written
+ * rpm-ostree: Implement getting the repo list, and enabling and disabling repos
+ * rpm-ostree: Implement provides search
+ * rpm-ostree: Make layered apps not discoverable in the UI
+ * Various other minor bug fixes
+
+This release also updates translations.
+
+Version 3.32.1
+~~~~~~~~~~~~~~
+Released: 2019-04-15
+
+This is a stable release with the following changes:
+ * Add drop shadows to app icons
+ * Various fixes to initial loading screen
+ * Show a generic icon instead of empty space if we failed to load the app icon
+ * Update featured banners for Maps and Blender
+ * Update featured app IDs
+ * Fix a crash due to missing locking
+ * Fix missing back button under certain conditions
+ * Fix loading AppSteam data from .yml.gz files
+ * Fix an issue that caused flatpak repo to not be correctly shown when it matched an existing
+ packagekit repo name
+ * Hide the fwupd Vendor repo in the repos dialog
+
+This release also updates translations.
+
+Version 3.32.0
+~~~~~~~~~~~~~~
+Released: 2019-03-11
+
+This is the first stable release for GNOME 3.32. Notable changes compared to 3.30 include:
+ * Appstream parsing is completely rewritten and now uses the new libxmlb library, instead of
+ appstream-glib
+ * Improved handling for apps that are available from multiple sources, e.g. as a flatpak from
+ Flathub, as a flatpak from Fedora, and as an RPM package
+ * New source selection drop down on the details pages
+ * Flatpak apps now list the permissions they need on the details pages, and also show new
+ permissions when updating
+ * The flatpak backend received a large number of bug fixes
+ * The rpm-ostree backend has grown many new features and bug fixes, including support for
+ installing layered packages and doing distro upgrades
+ * Numerous fixes for error reporting, including making error messages more useful and avoiding
+ showing network errors from background operations
+ * The items in the app menu were all moved to the window menu
+ * New redesigned icon
+
+Version 3.31.92
+~~~~~~~~~~~~~~~
+Released: 2019-03-05
+
+This is an unstable release in the 3.31 development series, marking the end of the development
+cycle. Next release will be 3.32.0!
+ * Add two missing description strings for flatpak permissions
+ * Only show permissions for flatpak apps and not for e.g. fonts
+ * Fix flatpak permissions to correctly show up for available apps
+ * Hide various details page items that don't make sense when showing .flatpakrepo files
+ * Fix an issue that caused descriptions to sometimes not get correctly loaded
+ * Sort the items in the Source drop down
+ * Don't show error notifications for background download and refresh errors
+ * Fix an issue that could cause an explosion of "A restart is required" notifications
+ * Various flatpak plugin fixes to make it correctly match the data when multiple flatpak repos
+ are available
+ * Fix the rpm-ostree plugin to correctly convert remote dbus errors
+
+This release also updates translations.
+
+Version 3.31.90
+~~~~~~~~~~~~~~~
+Released: 2019-02-24
+
+This is an unstable release in the 3.31 development series, with the following improvements:
+ * Fix showing the installed check mark on tiles
+ * Fix crashes in the packagekit plugin due to missing locking
+ * Add back support for appstream data in /var/{cache,lib}/app-info directories that accidentally
+ got left out with the libxmlb rewrite
+ * Update the featured banner for gnome-chess
+ * Fix the details page alignment when only one screenshot is shown
+ * Move the Update button to the right hand side on the details page
+ * Fix enabling repos when installing codecs through the extras page
+ * Remove the Sundry folder and sync the apps in the Utilities folder with gnome-menus 3.31.90
+ * Improve various content rating texts
+ * Drop workarounds for locales with codesets
+ * Use the currently selected icon theme for stock icons
+ * Don't hide compulsory apps in the category views
+ * Use the SPDX-License-Identifier in all source files
+ * Remove various useless error prefixes, making flatpak and packagekit error messages shorter and
+ easier to read
+ * flatpak: Show the installation type (user, system) in the Source dropdown
+ * flatpak: Let apps control the name suffix/prefix they have and don't force (Nightly) suffix for
+ everything on the master branch
+ * flatpak: Various fixes for matching flatpaks to appstream entries
+ * flatpak: Distinguish between the same app coming from multiple remotes
+ * rpm-ostree: Correctly resolve installed appdata files to package names
+ * rpm-ostree: Hook up percentage progress for install and remove
+ * rpm-ostree: Implement layered package install
+ * rpm-ostree: Implement locally downloaded rpm install
+ * rpm-ostree: Show the source of the packages when installing layered packages
+ * rpm-ostree: Various fixes making things more robust
+ * snap: Use new media API
+
+This release also updates translations.
+
+Version 3.31.2
+~~~~~~~~~~~~~~
+Released: 2019-01-16
+
+This is an unstable release in the 3.31 development series, with the following improvements:
+ * Show permissions for installed flatpaks, and new permissions for updates
+ * Use libxmlb to parse AppStream XML, making gnome-software start up faster and use less memory
+ * Update the app icon
+ * Update categories for ESRA rating system
+ * Improve various error messages to have more details
+ * Fix an issue that caused incorrect version numbers to be shown for installed flatpaks
+ * Fix various thread safety related crashes
+ * Fix row unrevealing to not leave behind 2 pixels on the updates page
+ * Make the refresh button to actually refresh packagekit cache
+ * Fix various issues that could lead to cache refresh getting stuck
+ * Show updates available notifications even when automatic updates are disabled
+ * Fix counting apps in the updates applied notification
+ * Improve packagekit update loading code, hopefully making it more robust
+ * Fix an issue that could lead to the packagekit plugin activating on rpm-ostree based systems
+ * Switch flatpak updates to use a single transaction, which lets us share more code (and bugs)
+ with the command line flatpak utility
+ * Fix various issues with transitioning from the "Download" state to "Restart & Update"
+ * Don't error out from update downloads if the ODRS server is unavailable
+ * Fix old updates accumulating in the OS Updates item
+ * Various flatpakref installation fixes
+ * Fix opening the details page when clicking on "Show Details" in GNOME Shell
+ * Fix opening shell extensions details from GNOME Tweaks
+ * Various fixes for initial loading state
+ * Add a separate "Download" step for packagekit offline updates, so that "Restart & Update" is
+ instant
+ * Fix a version comparison issue that led to package updates sometimes showing as downgrades in
+ the OS Updates section (this needs latest appstream-glib)
+ * Show the refresh button when the updates page is in the failed state
+ * Notify about offline updates only after they are fully downloaded
+ * Fix a memory corruption issue on 32-bit arches that made gnome-software very crashy
+ * Fix an issue with stuck back button on the details page after closing and reopening
+ gnome-software
+ * Make distro upgrades to Fedora N+2 release show up correctly
+ * Various flatpak plugin fixes
+ * Allow opening CAB files that include more than one update
+ * Fix critical warnings when quickly switching between category pages
+ * Small memory leak fixes
+
+This release also updates translations.
+
+Version 3.31.1
+~~~~~~~~~~~~~~
+Released: 2018-10-09
+
+This is an unstable release in the 3.31 development series, with the following improvements:
+ * Icon redesign
+ * Switch to using window menus instead of app menu
+ * Add a source selection drop down to details pages
+ * Move the search button to the left side in the header bar
+ * Various other minor UI tweaks
+ * GtkBuilder UI file changes to pave the way for an eventual GTK4 port (please file issues for
+ any UI layout regressions if you notice any!)
+ * Various internal plugin loader fixes and cleanups
+ * Remove the steam plugin
+ * Simplify the details page loading
+ * Fix an issue that caused icons to not get loaded for locally installed flatpaks
+ * Update Fedora distro upgrades text
+ * Avoid a critical warning in the fwupd plugin when the device vendor is not set
+ * Show verified developers for snaps
+
+This release also updates translations.
+
+Version 3.30.2
+~~~~~~~~~~~~~~
+Released: 2018-10-05
+
+This is a stable release with the following changes:
+ * Localize the polkit policy file
+ * Display ongoing app-installation at top of the list
+ * Update apps in display order
+ * Fix autoupdates triggering in a feedback loop
+ * Tweak the prefs dialog layout
+ * Various fixes to the flatpak plugin, making its state keeping more robust
+ * Fix flatpak errors to show up instead of a generic "Aborted" error
+ * Avoid triggering reboots for online updatable apps (flatpak)
+ * Make rpm-ostree updates work again
+ * Fix an issue that caused duplicate lines in 'OS Updates' on rpm-ostree based systems
+ * Compiler warning fixes
+
+This release also updates translations.
+
+Version 3.30.1
+~~~~~~~~~~~~~~
+Released: 2018-09-25
+
+This is a stable release with the following changes:
+ * Fix an issue that caused duplicate lines in 'OS Updates'
+ * Filter the application restart notification to actual desktop apps
+ * Fix an issue that caused automatic updates to fail during download phase
+ * Avoid showing duplicates in the featured apps when an app is available as both flatpak and a
+ package
+ * Fix an issue that caused gnome-software to use 100% of CPU when doing automatic updates
+ * Lower IO priority for gnome-software so that other apps stay responsive during flatpak installs
+ * Various fixes and wording changes to automatic updates notifications
+ * Only show "Examine Disk" button when baobab is available
+ * Leak and correctness fixes in the snap plugin
+
+This release also updates translations.
+
+Version 3.30.0
+~~~~~~~~~~~~~~
+Released: 2018-09-04
+
+This is the first stable release for GNOME 3.30.
+
+Version 3.29.92
+~~~~~~~~~~~~~~~
+Released: 2018-08-28
+
+This is an unstable release in the 3.27 development series, with the following improvements:
+ * Do not go 'back' to a previous application details panel
+ * Don't crash if when getting the fwupd locked status
+ * Download updates automatically when required
+ * Fix dark theme support
+ * Hide screenshot and support widgets when no screenshots
+ * Ignore non-interactive generic errors
+ * Implement distro upgrade downloading when using rpm-ostree
+ * Only update the update check timestamp when it succeeds
+ * Open the WiFi panel when clicking the Network Settings button
+ * Rotate featured apps on the overview page
+ * Simplify the updates panel
+ * Use FlatpakTransaction to install, remove and update
+ * Use new display name for the Snap publisher
+ * Use the full name for the ESRB ratings descripion
+
+This release also updates translations.
+
+Version 3.29.1
+~~~~~~~~~~~~~~
+Released: 2018-03-05
+
+This is an unstable release in the 3.27 development series, with the following improvements:
+ * Show a better notification when a local file or URI is not supported
+ * snap: Use ODRS for reviews
+
+This release also updates translations.
+
+Version 3.28.2
+~~~~~~~~~~~~~~
+Released: 2018-05-09
+
+This is a stable release with the following changes:
+ * Add a warning when enabling the LVFS remote
+ * Show a notification when failing to open an url or a local file
+ * Fix multiple flatpak refreshes with new libflatpak
+ * Build fixes for FreeBSD
+ * Icon loading fixes for snap
+
+This release also updates translations.
+
+Version 3.28.1
+~~~~~~~~~~~~~~
+Released: 2018-04-09
+
+This is a stable release with the following changes:
+ * Fix a regression with opening results from gnome-shell search
+ * Show "Source: " tag in gnome-shell search when we have multiple matches
+ * Improve unknown license tag color scheme on details page
+ * Don't show installed icon on app tiles while still installing
+ * Fix empty items appearing under OS Updates
+ * Fix a regression that caused duplicate results in codec search
+ * Fix an issue with passing username/password to packagekit proxy
+ * Avoid crashing during first run with no network access
+ * A number of rpm-ostree fixes, making it possible to trigger offline updates
+ * Stop searching multiple times on search page
+ * Update Fedora third party repositories "Find out more..." link
+ * Fix an issue with in-app notifications failing with invalid markup errors
+ * Improve purchase failure handling for the snap store
+ * Fix a possible crash in snap plugin when adding screenshots
+ * Various other crash and correctness fixes
+
+This release also updates translations.
+
+Version 3.28.0
+~~~~~~~~~~~~~~
+Released: 2018-03-12
+
+This is the first stable release for GNOME 3.28, with the following improvements:
+ * Fix the build on NixOS
+ * Fix purchasing not working after authentication
+ * Revert a commit that led to flatpak updates failing without any feedback
+ * Make front page featured tile corners round to match other tiles
+ * Fix in-app notification close button alignment
+ * Several fixes to make error notifications more useful
+ * snap: Fix invalid metadata after cancelled refine
+ * snap: Launch command line snaps with 'snap run'
+
+This release also updates translations.
+
+Version 3.27.92
+~~~~~~~~~~~~~~~
+Released: 2018-03-05
+
+This is an unstable release in the 3.27 development series, marking the end of the development
+cycle. Next release will be 3.28.0!
+ * Removal of global plugin cache, simplifying gnome-software internals
+ * Software Repositories dialog got another batch of improvements and UI changes
+ * GNOME Shell Extensions repository and fwupd repositories are now shown in the Software
+ Repositories dialog
+ * Shell extensions handling through PackageKit was improved, fixing a long standing bug where we
+ were unable to remove shell extension packages
+ * Category page rewrite that landed earlier this cycle went through UI review and got a number of
+ fixes
+ * Package version comparison in the updates dialog was fixed and should no longer incorrectly
+ show updates as downgrades
+ * Distro upgrade notifications are now rate limited to once per week
+ * Install buttons in codec install view that got lost in the 3.22 cycle are now back
+ * Various paper cuts with distro upgrades were fixed
+ * Various fixes to installing apps from yum repos that have enabled=0 enabled_metadata=1
+ * Various other correctness and warning fixes
+ * Distros: Minimum supported fwupd version is now 1.0.3
+ * Distros: We've released PackageKit 1.1.9 that has string changes to match gnome-software 3.28
+
+This release also updates translations.
+
+Version 3.27.90
+~~~~~~~~~~~~~~~
+Released: 2018-02-14
+
+This is an unstable release in the 3.27 development series, with the following improvements:
+ * The Software Sources dialog was renamed to Software Repositories and rewritten
+ * Fedora Workstation third party repository handling was rewritten and should be more robust
+ * Improved handling of metered network connections, making sure we cancel any downloads when
+ changing to a metered connection
+ * Limit the number of parallel operations depending on the installed CPU
+ * Improved handling of pending installs when there's no network connection
+ * Unused ostree and rpm plugins were dropped
+ * Switch from GtkSpell to gspell
+ * Improve alignment on the updates page
+ * Do not show missing screenshot error for fonts that have screenshots
+ * Fix various issues on Ubuntu when purchasing apps
+ * Fix an issue that led to duplicate categories appearing on the overview page
+ * Various memory leak and correctness fixes
+
+This release also updates translations.
+
+Version 3.27.4
+~~~~~~~~~~~~~~
+Released: 2018-01-08
+
+This is an unstable release in the 3.27 development series, with the following improvements:
+ * Add missing locking to gs_plugin_cache_remove(), fixing a possible crash
+ * Fix various memory leaks spotted by valgrind
+ * Fix a possible crash triggered by the fwupd plugin
+ * Do not emit critical warnings when reviewing OS Updates
+ * fwupd: Use the custom user-agent when downloading firmware
+ * overview page: Fix a crash when we have no featured apps
+ * packagekit: Implement repository enabling
+ * Fix hover CSS for "unknown" and "nonfree" license buttons
+
+This release also updates translations.
+
+Version 3.27.3
+~~~~~~~~~~~~~~
+Released: 2017-11-13
+
+This is an unstable release in the 3.27 development series, with the following improvements:
+ * Fix crashes in the repos plugin due to missing locking
+ * Add translated strings for the new OARS v1.1 additions
+ * Work around Firefox deleting rpm/deb files downloaded to /tmp when closing
+ * Log errors to console when starting from command line
+ * Do not enable distro-upgrades when updates are disabled
+ * Do not require the user to keep clicking 'More reviews' after each click
+ * Fix a critical when updating (flatpak) packages live
+ * fwupd: Do not crash when trying to list a locked device
+ * fwupd: Prepend the vendor name to the device name if not included
+ * Improve SPDX ID parsing when working out if it is 'free'
+ * packagekit: Do not crash when getting an invalid ID from PackageKit
+ * packagekit: Support apt:// URLs
+ * Various fixes to the snap plugin
+ * Do not crash when closing the source dialog while it is loading
+
+This release also updates translations.
+
+Version 3.27.2
+~~~~~~~~~~~~~~
+Released: 2017-11-13
+
+This is an unstable release in the 3.27 development series, with the following improvements:
+ * Redesigned category view
+ * Better notifications for completed distro upgrades
+ * Number of test suite fixes to pave way for continuous integration tests
+ * Improved support for running on low res displays
+ * Various fixes to internal state handling
+ * Allow linking to specified proprietary licenses
+ * Don't use versioned subdirectories under ~/.cache/gnome-software
+ * Only show in-app notifications for interactive user actions
+ * Various fixes for flatpak, fwupd, and snap support
+
+This release also updates translations.
+
+Version 3.26.2
+~~~~~~~~~~~~~~
+Released: 2017-11-09
+
+This is a stable release with the following changes:
+ * Various fixes to cancellable handling, making it more robust to cancel install/remove
+ operations
+ * Fix a common crash in Fedora distro upgrades plugin
+ * Fix showing N+2 Fedora upgrades
+ * Fix flatpak updates inadvertently triggering a reboot
+ * Revert plugin GType registering changes that broke app "adopting"
+ * Various flatpak plugin fixes
+ * Various snap plugin fixes
+ * Bump fwupd required dep to 0.9.7 and support building with new 1.0.0 API
+ * Avoid erroring out for operations that return more than 500 results (distro upgrades, getting
+ gnome-shell extensions list)
+ * Fix a few memory leaks
+
+This release also updates translations.
+
+Version 3.26.1
+~~~~~~~~~~~~~~
+Released: 2017-10-02
+
+This is a stable release with the following changes:
+ * Fix memory leak in "external appstream" plugin
+ * Don't translate an icon name in the Punjabi translation
+ * Fix critical warning in the fwupd plugin if the update URI isn't set
+ * Fix Addon categories not showing
+ * Fix crash in PackageKit plugin if reporting progress with no current application
+ * Revert a change in the snapd plugin which can cause operations to fail or hang in some
+ situations
+
+This release also updates translations.
+
+Version 3.26.0
+~~~~~~~~~~~~~~
+Released: 2017-09-11
+
+This is the first stable release for GNOME 3.26, with the following improvements:
+ * Use the new fwupd API in 0.9.7 to avoid when a reboot is required
+ * Pass the complete proxy settings to PackageKit
+
+The following bugs are also fixed:
+ * Do not crash when emitting an uncommon error message
+ * Do not show a critical warning with new versions of fwupd
+ * Do not show an error for a remote-less flatpakref application
+ * Don't refine PackageKit packages after we've been cancelled
+ * Fix a possible crash on 32 bit systems
+ * Fix GNOME Shell search results for snap applications
+ * Properly disable shell-extensions when not running GNOME Shell
+
+This release also updates translations.
+
+Version 3.25.91
+~~~~~~~~~~~~~~~
+Released: 2017-08-21
+
+This is an unstable release in the 3.25 development series, with the following improvements:
+ * Add a simple donation button on the details page
+
+The following bugs are also fixed:
+ * Allow plugins to say that installation cannot be cancelled
+ * Fix displaying the info bar for the Shell Extensions category
+ * Use first featured snap as the featured app
+
+This release also updates translations.
+
+Version 3.25.90
+~~~~~~~~~~~~~~~
+Released: 2017-08-07
+
+This is an unstable release in the 3.25 development series, with the following improvements:
+ * Add a simple donation button on the details page
+
+The following bugs are also fixed:
+ * Do not crash if the child schema is invalid
+ * Don't log a warning when clicking the the 'more results' search entry
+ * Fixed subcategory names localization
+ * Ensure flatpak remote names are valid
+ * Fix critical warning with new versions of the fwupd daemon
+
+This release also updates translations.
+
+Version 3.25.4
+~~~~~~~~~~~~~~
+Released: 2017-07-21
+
+This is an unstable release in the 3.25 development series, with the following improvements:
+ * Add new rpm-ostree integration for Fedora Atomic Workstation
+ * Install the Flatpak runtime as part of the application install phase
+ * Split OS updates up into multiple sections and show the target version
+ * Support compatibility IDs when getting reviews from the ODRS
+
+The following bugs are also fixed:
+ * Cancel plugin jobs if they take too much time
+ * Correctly find already installed flatpak runtimes
+ * Do not show an error for a flatpakref when broken remotes exist
+ * Don't show the screenshot section for runtimes
+ * Fix authentication prompt not showing when using snapd
+ * Make license buttons buttons actually look clickable
+ * Make the review moderator panel easier to use
+ * Only show snaps as sandboxed if snapd supports confinement
+ * Respect the per-user or per-system install preferences
+ * Return the correct installed state for user/system flatpak remotes
+
+This release also updates translations.
+
+Version 3.25.3
+~~~~~~~~~~~~~~
+Released: 2017-06-22
+
+This is an unstable release in the 3.25 development series, with the following improvements:
+ * Add a banner designer utility
+ * Add the initial support to support purchasable apps
+ * Automatically install flatpak icon themes and GTK themes
+ * Restyle the updates panel to have a separate sections
+ * Show a notification in the updates page when the OS is end of life
+ * Show recently updated applications on the overview page
+
+The following bugs are also fixed:
+ * Add snap self tests and provide more data to the details panel
+ * Allow compiling with newer versions of meson
+ * Do not crash when sending progress reports while refreshing
+ * Don't trigger systemd for every single offline update
+ * Ensure all related flatpak applications get installed
+ * Ensure we use the gnome-desktop support if enabled
+ * Fix searching for codecs on Ubuntu
+ * Show a better status messages when downloading metadata
+ * Show a pulsing progressbar if plugins do not report progress
+ * Show the PackageKit interactive dialog when required
+ * Support updating metadata from multiple fwupd remotes
+
+This release also updates translations.
+
+Version 3.25.2
+~~~~~~~~~~~~~~
+Released: 2017-05-08
+
+This is an unstable release in the 3.25 development series, with the following improvements:
+ * Allow AppStream to be downloaded out-of-band per-user
+
+The following bugs are also fixed:
+ * Do not initialize plugins in every instance
+ * Fix the 'Show Details' context menu item in GNOME Shell
+ * Use headerbar in toolbar-mode in Unity
+ * Do not allow plugins to set the origin title in the UI
+
+This release also updates translations.
+
+Version 3.25.1
+~~~~~~~~~~~~~~
+Released: 2017-04-28
+
+This is an unstable release in the 3.25 development series, with the following improvements:
+ * Truncate the search results if there are a large number
+ * Use the complete source as a search keyword
+
+The following bugs are also fixed:
+ * Fall back to a stock icon for hardware drivers
+ * Fix a crash when removing an addon
+ * Fix a critical warning in the shell search provider
+ * Fix popular-overrides to show the correct applications
+ * Fix various failures to read from snapd
+ * Make offline updates work when online updates are available
+ * Never include the size of the runtime in the installed size
+ * Respect the install preference when for flatpakref files
+ * Use the developer name in preference to the project group
+
+This release also updates translations.
+
+Version 3.23.92
+~~~~~~~~~~~~~~~
+Released: 2017-03-13
+
+This is an unstable release in the 3.23 development series, with the following bug fixes:
+ * Allow installing broken flatpakref files
+ * Do not reload the updates list when updates are in progress
+ * Reset the headerbar title when switching to the details page
+ * Unconditionally show things that are in progress in the Installed page
+
+This release also updates translations.
+
+Version 3.23.91
+~~~~~~~~~~~~~~~
+Released: 2017-02-27
+
+This is an unstable release in the 3.23 development series, with the following improvements:
+ * Add support for RuntimeRepo in flatpakref files
+ * Allow the user to restart the currently running gnome-software instance
+ * Never show components without AppData files
+
+The following bugs are also fixed:
+ * Initialize progress to zero right before and after processing an action
+ * Animate the removal of live updates
+ * Add YaST as a default folder in gnome-shell overview
+
+This release also updates translations.
+
+Version 3.23.90
+~~~~~~~~~~~~~~~
+Released: 2017-02-13
+
+This is an unstable release in the 3.23 development series, with the following improvements:
+ * Handle apt and snap URLs
+ * Show the updates panel with sections
+ * Sort the apps in the installed panel by kind
+
+The following bugs are also fixed:
+ * Add a more detailed error message when AC power is required
+ * Do not hardcode the gnome-software application name
+ * Ensure firmware is downloaded when not cached
+ * Fix a rather large memory leak when loading Steam data
+ * Fix launching Flatpak apps after updating
+ * Install needed Flatpak runtimes when updating an app
+ * Only show the scary firmware warning for removable devices
+
+This release also updates translations.
+
+Version 3.23.3
+~~~~~~~~~~~~~~
+Released: 2016-12-15
+
+This is an unstable release in the 3.23 development series, with the following improvements:
+ * Add an --install and --interaction CLI options
+ * Add the installed size of the apps in the installed view
+ * Always set a description for each notification
+ * Show an in-app notification when installed plugins are changed
+ * Use a set of stars to show the different star ratings
+
+The following bugs are also fixed:
+ * Add a missing error check to fix a common crash on LiveDVD media
+ * Add thread locking in GsApp to fix some common crashes
+ * Allow upgrading to Fedora EOL releases
+ * Don't allow review actions when offline
+ * Ensure we actually schedule firmware updates for download
+ * Fix the getting of PackageKit and flatpak update details
+ * Hide some notifications when the new app is launched or the window is closed
+ * Hide the screenshot placeholder for input methods and langpacks
+
+This release also updates translations.
+
+Version 3.23.2
+~~~~~~~~~~~~~~
+Released: 2016-11-21
+
+This is an unstable release in the 3.23 development series, with the following improvements:
+ * Add a setting for downloading updates on metered connections
+ * Add content rating interface for games
+ * Add support for pending updates that are applied on demand
+ * Add support for the flatpak DefaultBranch feature
+ * Allow showing an application review without a display name
+ * Convert the modal failure dialogs to in-app notifications
+ * Switch to using the ODRS server hosted by GNOME
+
+The following bugs are also fixed:
+ * Always get the newest screenshot for GNOME Shell extensions
+ * Avoid redownloading the same screenshots for different images
+ * Don't download updates when low on power
+ * Fix the growth in memory usage for every search request
+ * Never show a 'back' button when showing search results
+ * Show the search bar when the user does ctrl+f
+
+This release also updates translations.
+
+Version 3.22.2
+~~~~~~~~~~~~~~
+Released: 2016-11-07
+
+This stable release fixes the following bugs:
+ * Large number of fixes and improvements for flatpak support
+ * Improved handling for flatpak repos with multiple branches
+ * Initial support for installing flatpakrepo files
+ * Fix a crash when searching for codecs
+ * Fix a crash when de-duplicating applications
+ * Speed improvements for loading appstream data
+ * Refactor snapd handling code using snapd-glib
+ * Show the search bar when the user does Ctrl+f
+
+This release also updates translations.
+
+Version 3.22.1
+~~~~~~~~~~~~~~
+Released: 2016-10-12
+
+This stable release fixes the following bugs:
+ * Fix several issues with flatpak bundles
+ * Fix installing local packages
+ * Fix a crash when failing to get an installed flatpak ref
+ * Speed up loading the details and overview pages
+ * Switch to using the ODRS server hosted by GNOME
+
+This release also updates translations.
+
+Version 3.22.0
+~~~~~~~~~~~~~~
+Released: 2016-09-19
+
+This is the first stable release for GNOME 3.22 and updates several translations.
+
+Version 3.21.92
+~~~~~~~~~~~~~~~
+Released: 2016-09-13
+
+This is an unstable release in the 3.21 development series, with the following improvements:
+ * Add a new section name in the Addons category for drivers
+ * Add a plugin to match a hardware modalias
+
+The following bugs are also fixed:
+ * Do not hide the origin when installing or removing an app
+ * Do not show the screenshot fallback image for firmware or drivers
+ * Fix launching app's details from the installed notification
+ * Fix showing the source line in the installed panel
+ * Unbreak the GNOME Shell search provider
+ * Use the same padding as a GtkStackSwitcher
+
+This release also updates translations for many languages.
+
+Version 3.21.91
+~~~~~~~~~~~~~~~
+Released: 2016-08-31
+
+This is an unstable release in the 3.21 development series, with the following improvements:
+ * Add functionality to enable non-free sources
+ * Show the device bootloader screenshot when required
+
+The following bugs are also fixed:
+ * Always return consistent results by allowing plugins to share a cache
+ * Ensure the search text is showing when going back to search results
+ * Only enable the firmware 'Install' button when the device is in the right mode
+ * Remove an app from the installed view when it's uninstalled
+ * Show percentage progress when installing firmware
+
+This release also updates translations for many languages.
+
+Version 3.21.90
+~~~~~~~~~~~~~~~
+Released: 2016-08-15
+
+This is an unstable release in the 3.21 development series, with the following improvements:
+ * Limit the ODRS moderation queue to a specific language
+
+The following bugs are also fixed:
+ * Correctly load .flatpakrepo files
+ * Don't get the download size for installed flatpak packages
+ * Fix showing the progress bar when installing apps
+ * Never try to modify the application name
+ * Only notify about upgrades once per month
+
+This release also updates translations for many languages.
+
+Version 3.21.4
+~~~~~~~~~~~~~~
+Released: 2016-07-18
+
+This is an unstable release in the 3.21 development series, with the following improvements:
+ * Add a cancel button and progress information to the details page
+ * Add a dialog to confirm upgrade removals
+ * Add support for authenticating in plugins
+ * Add support for snaps
+ * Enable gtk-doc generation for documentation
+ * Show a new-style category list on the overview page
+ * Show origin information when applications are available from multiple sources
+ * Show sandboxing information for selected applications
+ * Show the star ratings in more places
+ * Support installing .flatpakrepo files
+ * Support launching applicatins using a appstream:// URL
+
+The following bugs are also fixed:
+ * Allow plugins to be enabled and disabled at runtime
+ * Always show the 'MyLanguage' kudo when in en_US locale
+ * Correctly trigger systemd offline updates when only processing OS updates
+ * Disable app folders feature when run outside GNOME
+ * Do not show buttons on the search results
+ * Do not use deprecated CSS properties
+ * Do not use deprecated fwupd API
+ * Ensure reviews are shown in the correct order
+ * Fix a crash when double clicking files
+ * Fix several UX issues when upgrading
+ * Show the 'More Reviews' button in the details panel
+ * Try really hard to have two rows of important categories
+
+This release also updates translations for many languages.
+
+Version 3.21.2
+~~~~~~~~~~~~~~
+Released: 2016-05-23
+
+This is an unstable release in the 3.21 development series, with the following improvements:
+ * Add a --details-pkg option to the gnome-software binary
+ * Add support for flatpak packages
+ * Add a plugin to auto-add some license information
+ * Add depends, requires and conflicts at initialize time
+ * Add support for application key colors
+ * Export a set of headers to allow external plugins to be built
+
+The following bugs are also fixed:
+ * Do not crash if plugins are badly behaved
+ * Do not directly load pixbufs in the AppStream plugin
+ * Do not unconditionally invalidate the updates list on hardware hotplug
+ * Find the best AppSteam component when matching any prefixes
+ * Fix crash due to network change before app activation
+ * Fix launching various KDE4 applications
+ * Support getting cached content from /var/cache and /usr/share
+
+This release also updates translations for many languages.
+
+Version 3.21.1
+~~~~~~~~~~~~~~
+Released: 2016-04-25
+
+This is an unstable release in the 3.21 development series, with the following improvements:
+ * Add an initial loading panel when there is no metadata
+ * Add an outline ostree plugin that just adds remotes as sources
+ * Add an unreviewable application quirk
+ * Add initial Steam support
+ * Add support for app shortcut addition/removal
+ * Add support for GNOME Shell extensions
+ * Allow free-but-unspecified SPDX tokens
+ * Allow widgets to use custom CSS in a generic way
+ * Do the PackageKit refresh as a background transaction
+ * Hide "Software Sources" menu when its action is disabled
+ * Make the distro upgrades dialog match the new mockup
+ * Split the 'size' property into size-installed and size-download
+ * Use a link instead of a button for history
+ * Use AppStream files for the popular, featured and extra category data
+ * Use dpkg-deb info to create a GsApp when double clicking on a .deb file
+ * Use FwupdClient from fwupd 0.7.0
+ * Use GdkPixbuf to parse icns files
+ * Use gsettings to enable/disable the 'sources' action
+ * Use the Fedora themed image for the upgrade banner
+ * When there are no trusted sources mark everything as non-3rd-party
+
+The following bugs are also fixed:
+ * Actually show the error dialog for an invalid file
+ * Allow all functions called by g_module_symbol() to fail
+ * Allow popular and featured apps to match any prefix
+ * Do not maintain a cache of applications in the plugin loader
+ * Do not make the ODRS plugin depend on xdg-app
+ * Do not re-request the distro-upgrade when switching pages
+ * Do not show ratings and reviews for some component kinds
+ * Do not show the distro-upgrade notification if the window is open
+ * Do not use the header bar on Unity
+ * Fix a crash when double clicking package files
+ * Fix live installing firmware
+ * Get the correct icon size when installing xdg-app bundles on HiDPI
+ * Hide the kudo details panel for non desktop components
+ * Load screenshots directly if their URLs point to local files
+ * Lower the limits for review text
+ * Make all the plugins more threadsafe
+ * Make the provenance plugin non-specific to Fedora
+ * Move header bar button creation into individual pages
+ * Move the Install & Restart button below the upgrade banner
+ * Never show star ratings on the category app tiles
+ * Only show one modal dialog at a time
+ * Only show the session manager restart if there were any non-live updates
+ * Properly support multi-line .deb descriptions
+ * Show a 'Install All' button when all the updates can be installed live
+ * Show a modal dialog when downloading the distro-upgrade failed
+ * Show the upgrades banner even if there are no updates to show
+ * Use a cache file to respect the fedora-distro-upgrades cache-age
+ * Use GFile instead of a filename when converting apps
+
+This release also updates translations for many languages.
+
+Version 3.19.91
+~~~~~~~~~~~~~~~
+Released: 2016-02-29
+
+This is an unstable release in the 3.19 development series, with the following improvements:
+ * Add an 'All' subcategory in the category shell
+ * Add ratings and review functionality for Ubuntu
+ * Install the xdg-app runtime as required automatically
+ * Show a confirmation dialog before reporting a review
+ * Show a guide label for the different star values
+ * Support installing local xdg-app bundles
+
+The following bugs are also fixed:
+ * Correctly identify local packages with sources
+ * Do not add multiple search results for the same app
+ * Do not show xdg-app runtimes in the installed panel
+ * Escape markup before showing modal dialogs
+
+This release also updates translations for many languages.
+
+Version 3.19.90
+~~~~~~~~~~~~~~~
+Released: 2016-02-15
+
+This is an unstable release in the 3.19 development series, with the following improvements:
+ * Add end-user application review functionality
+ * Add support for upgrading the OS from one release to another
+ * Add support for xdg-app and Limba bundles
+ * Add tags to applications, and explain them in the details page
+ * Update the list of featured applications on the front page
+
+The following bugs are also fixed:
+ * Add a missing tag to the software center metadata file
+ * PackageKit support is now optional
+ * Temporarily remove the remove button in the sources dialog
+ * Use versioned user cache directories to pick up new screenshots
+
+This release also updates translations for many languages.
+
+Version 3.19.4
+~~~~~~~~~~~~~~
+Released: 2016-01-15
+
+This is an unstable release in the 3.19 development series, with the following improvements:
+ * Add a link to Wikipedia to explain proprietary and public domain software
+ * Allow administrators to override the default popular applications
+ * Improve the interface for device firmware updates and some can be done live
+ * Make sure Characters and Disks show up in Utilities
+ * Show 3rd party applications in the search results
+ * Show a nicer installation dialog when installing local files
+ * Speed up the application first-start and also speed up switching pages
+ * Try to show if an application is free software
+
+The following bugs are also fixed:
+ * Do not crash on refresh if the fwupd daemon is not available
+ * Fix installing web applications
+ * Rework several windows to fit better on small screens
+ * Use the correct user agent string when downloading firmware
+
+This release also updates translations for many languages.
+
+Version 3.18.3
+~~~~~~~~~~~~~~
+Released: 2015-11-05
+
+This stable release fixes the following bugs:
+ * Use the correct user agent string when downloading firmware
+ * Fix a crash in the limba plugin
+ * Fix installing web applications
+
+This release also updates translations for many languages.
+
+Version 3.18.2
+~~~~~~~~~~~~~~
+Released: 2015-10-15
+
+This stable release fixes the following bugs:
+ * Fix a regression that could lead to never finding any updates
+ * Fix an issue with getting package details for apps without AppData
+
+This release also updates translations for many languages.
+
+Version 3.18.1
+~~~~~~~~~~~~~~
+Released: 2015-10-13
+
+This stable release fixes the following bugs:
+ * Do not force the cache refresh and delete otherwise valid packages
+ * Fix several potential crashes when navigating and when installing
+ * Get the new application icon for local packages after installation
+ * Improve cold start time by only parsing AppStream data once
+ * Make sure Characters and Disks show up in Utilities
+ * Only download the fwupd metadata signature once per day
+ * Show an empty space for no category results
+ * Show applications without AppData in the installed panel
+
+This release also updates translations for many languages.
+
+Version 3.18.0
+~~~~~~~~~~~~~~
+Released: 2015-09-21
+
+This is the first stable release for the GNOME 3.18 desktop!
+
+Version 3.17.92
+~~~~~~~~~~~~~~~
+Released: 2015-09-15
+
+This is an unstable release in the 3.17 development series, with the following improvements:
+ * Fix getting firmware updates by parsing the metadata correctly
+ * Make the application menu path correct in RTL locales
+ * Don't keep the application running forever when run as a search provider
+
+This release also updates translations for many languages.
+
+Version 3.17.91
+~~~~~~~~~~~~~~~
+Released: 2015-09-03
+
+This is an unstable release in the 3.17 development series, with the following improvements:
+ * Better theming for the category sidebar
+ * Use standard size icon in the about dialog
+ * Support mouse back button for going back in dialogs
+ * Fix incorrect alignment on the front page in RTL languages
+ * Misc other minor bugs fixed
+
+This release also updates translations for many languages.
+
+Version 3.17.90
+~~~~~~~~~~~~~~~
+Released: 2015-08-19
+
+This is an unstable release with the following bugs fixed:
+ * Use CSS to style the error message details
+ * Correctly align labels in the Add to Folder dialog
+
+This release also updates translations for many languages.
+
+Version 3.17.3
+~~~~~~~~~~~~~~
+Released: 2015-08-12
+
+This is an unstable release in the 3.17 development series, with the following improvements:
+ * Add basic support for Limba bundles
+ * Automatically download new firmware metadata from LVFS
+ * Hide updates UI on managed systems
+ * Show a new notification when security updates remain unapplied
+ * Show installation progress when installing applications
+ * Use some new applications to the picked category
+
+Bugs fixed in this release:
+ * Do not show applications that are not available when searching by category
+ * Don't crash when launching an app that has no desktop ID
+ * Don't show applications without AppData in the category view
+ * Fix a possible race and crash when loading icons
+ * Fix locking in the AppStream code to fix several crashes
+ * Use better error messages on offline update failure
+ * Withdraw the notification when prepared update gets invalidated
+
+This release also updates translations for many languages.
+
+Version 3.17.2
+~~~~~~~~~~~~~~
+Released: 2015-06-05
+
+This is an unstable release in the 3.17 development series, with the following improvements:
+ * Make fwupd dependency automagic
+
+Bugs fixed in this release:
+ * Fix a regression from the previous unstable release that made it impossible to install updates
+ * Fix a crash in the screenshot loader
+ * Fix a crash in the sources dialog
+ * Fix a crash when installing rpms that lack description
+ * Wrap long descriptions in the update dialog
+
+This release also updates translations for many languages.
+
+Version 3.17.1
+~~~~~~~~~~~~~~
+Released: 2015-05-25
+
+This is the first unstable release in the 3.17 development series, with a number of new features:
+ * Support getting firmware updates through the fwupd daemon
+ * Use a smaller number of tiles on the front page on small monitors
+ * Rework internal modulesets, making it easier to edit the list of featured apps
+ * Revert back to using a hand-picked list of featured apps
+ * Several improvements to the sources dialog
+ * Show better human readable names when searching for font scripts
+ * Show a spinner while loading the data for the update history dialog
+
+This release also updates translations for many languages.
+
+Version 3.16.2
+~~~~~~~~~~~~~~
+Released: 2015-05-11
+
+This release fixes the following bugs:
+ * Remove redundant OK button from the updates installed notification
+ * Display a better human readable title for printer drivers
+ * Show a better UI for offline update failure dialog
+ * Set default actions for the update done notifications
+ * Allow searching for packages via the API without appdata
+ * Fix showing webapps with non-local icons
+
+This release also updates translations for many languages.
+
+Version 3.16.1
+~~~~~~~~~~~~~~
+Released: 2015-04-14
+
+This release fixes the following bugs:
+ * Correctly save HiDPI images to HiDPI directories
+ * Scroll the contents of the error message dialog
+
+This release also updates translations for many languages.
+
+Version 3.16.0
+~~~~~~~~~~~~~~
+Released: 2015-03-23
+
+This stable release marks the release of GNOME 3.16!
+
+Version 3.15.92
+~~~~~~~~~~~~~~~
+Released: 2015-03-16
+
+This unstable release adds the following features:
+ * React to theme changes
+ * Rebase the HighContrast theme
+
+This release fixes the following bug:
+ * Fix HiDPI scale factor calculation
+ * Align section headings in all views
+ * Fix 'installed' overlays when using the HighContrast theme
+ * Fall back to showing the top level category when no sub category exists
+ * Fix a crash when using the pending applications feature
+
+This release also updates translations for many languages.
+
+Version 3.15.91
+~~~~~~~~~~~~~~~
+Released: 2015-03-02
+
+This unstable release adds the following features:
+ * Enable kinetic scrolling in updates dialog
+
+This release fixes the following bug:
+ * Always ensure that the back entry focus widget is valid
+ * Don't show small screenshots on HiDPI hardware
+ * Fix a crash when starting GNOME Software for the first time
+ * Only show compatible projects when getting the featured list
+
+Version 3.15.90
+~~~~~~~~~~~~~~~
+Released: 2015-02-16
+
+This unstable release adds the following features:
+ * Add a new panel for displaying session service results
+ * Add a new version of the Modify interface
+ * Require AppData for all available packages
+
+This release fixes the following bug:
+ * Use the new mockups for the 3rd party source install dialogs
+
+Version 3.15.4
+~~~~~~~~~~~~~~
+Released: 2015-01-19
+
+This unstable release adds the following features:
+ * Fix searching with very small search terms
+
+This release fixes the following bugs:
+ * Do case-insensitive searching of suitable keywords
+ * Fix a crash in the screenshot loader
+ * Fix a crash when clicking the back button
+ * Fix searching for keyworks with special chars
+ * Show an error message when we fail to load details about a local file
+
+Version 3.15.2
+~~~~~~~~~~~~~~
+Released: 2014-11-24
+
+This unstable release adds the following features:
+ * Show a blurred low-resolution screenshot while loading the HiDPI one
+
+This release fixes the following bugs:
+ * Do not show a random white line above the star rating widget
+ * Do not show empty app boxes if no popular results are available
+ * Do not try to download local web-app icons
+ * Use blue stars for the user-ratings rather than gold
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..077b0ab
--- /dev/null
+++ b/README.md
@@ -0,0 +1,98 @@
+[![Build Status](https://gitlab.gnome.org/GNOME/gnome-software/badges/main/pipeline.svg)](https://gitlab.gnome.org/GNOME/gnome-software/pipelines)
+
+# Software
+
+[Software](https://wiki.gnome.org/Apps/Software) allows users to easily find,
+discover and install apps. It also keeps their OS, apps and devices up to date
+without them having to think about it, and gives them confidence that their
+system is up to date. It supports popular distributions, subject to those
+distributions maintaining their own distro-specific integration code.
+
+The specific use cases that Software covers are [documented in more detail](./doc/use-cases.md).
+
+# Features
+
+A plugin system is used to access software from different sources.
+Plugins are provided for:
+ - Traditional package installation via PackageKit (e.g. Debian package, RPM).
+ - Next generation packages: [Flatpak](https://flatpak.org/) and [Snap](https://snapcraft.io/).
+ - Firmware updates.
+ - Ratings and reviews using [ODRS](https://odrs.gnome.org/).
+
+Software supports showing metadata that closely matches the [AppStream](https://www.freedesktop.org/wiki/Distributions/AppStream/) format.
+
+Software runs as a background service to provide update notifications and be a search provider for [GNOME Shell](https://wiki.gnome.org/Projects/GnomeShell).
+
+# Contact
+
+For questions about how to use Software, ask on [Discourse](https://discourse.gnome.org/tag/gnome-software).
+
+Bug reports and merge requests should be filed on [GNOME GitLab](https://gitlab.gnome.org/GNOME/gnome-software).
+
+For development discussion, join us on `#gnome-software` on [irc.gnome.org](https://wiki.gnome.org/Community/GettingInTouch/IRC).
+
+# Documentation for app developers and vendors
+
+Specific documentation is available for application developers who wish to test
+how their applications appear in GNOME Software; and for distribution vendors
+who wish to customise how GNOME Software appears in their distribution:
+ * [Tools in GNOME Software for application developers](./doc/app-developers.md)
+ * [Vendor customisation of GNOME Software](./doc/vendor-customisation.md)
+
+# Running a nightly build
+
+A [flatpak bundle](https://docs.flatpak.org/en/latest/single-file-bundles.html)
+of Software can be built on demand here by running the ‘flatpak bundle’ CI job.
+It is not fully functional, but is useful for development and testing of
+upcoming UI changes to Software. It may become more functional over time. It
+is not an official or supported release.
+
+The CI job saves the bundle in its artifacts list as `gnome-software-dev.flatpak`.
+This can be installed and run locally by downloading it and running:
+```
+$ flatpak install --bundle ./gnome-software-dev.flatpak
+$ flatpak run org.gnome.SoftwareDevel
+```
+
+# Building locally
+
+Software uses a number of plugins and depending on your operating system you
+may want to disable or enable certain ones. For example on Fedora Silverblue
+you'd want to disable the packagekit plugin as it wouldn't work. See the list
+in `meson_options.txt` and use e.g. `-Dpackagekit=false` in the `meson` command
+below.
+
+Build locally with:
+```
+$ meson --prefix $PWD/install build/
+$ ninja -C build/ all install
+$ killall gnome-software
+# On Fedora, RHEL, etc:
+$ XDG_DATA_DIRS=install/share:$XDG_DATA_DIRS LD_LIBRARY_PATH=install/lib64/:$LD_LIBRARY_PATH ./install/bin/gnome-software
+# On Debian, Ubuntu, etc:
+$ XDG_DATA_DIRS=install/share:$XDG_DATA_DIRS LD_LIBRARY_PATH=install/lib/x86_64-linux-gnu/:$LD_LIBRARY_PATH ./install/bin/gnome-software
+```
+
+## Default branch renamed to `main`
+
+The default development branch of gnome-software has been renamed to `main`. To
+update your local checkout, use:
+```sh
+git checkout master
+git branch -m master main
+git fetch
+git branch --unset-upstream
+git branch -u origin/main
+git symbolic-ref refs/remotes/origin/HEAD refs/remotes/origin/main
+```
+
+# Debugging
+
+Running with `--verbose` will give detailed logging information.
+
+# Maintainers
+
+Software is maintained by several co-maintainers, as listed in `gnome-software.doap`.
+All changes to Software need to be reviewed by at least one co-maintainer (who
+can’t review their own changes). Larger decisions need input from at least two
+co-maintainers.
diff --git a/RELEASE.md b/RELEASE.md
new file mode 100644
index 0000000..af711a1
--- /dev/null
+++ b/RELEASE.md
@@ -0,0 +1,114 @@
+GNOME Software Release Notes
+===
+
+Release schedule
+---
+
+GNOME Software releases are done on the timetable set by the [GNOME release schedule](https://wiki.gnome.org/Schedule).
+
+Maintainers take it in turns to make releases so that the load is spread out evenly.
+
+Making a release
+---
+
+Adapted from the [GNOME release process](https://wiki.gnome.org/MaintainersCorner/Releasing).
+
+These instructions use the following variables:
+ - `new_version`: the version number of the release you are making, for example 3.38.1
+ - `previous_version`: the version number of the most-recently released version in the same release series, for example 3.38.0
+ - `branch`: the branch which the release is based on, for example gnome-40 or main
+ - `key_id`: the ID of your GPG key, see the output of `gpg --list-keys` and the note at the end of this file
+
+Make sure your repository is up to date and doesn’t contain local changes:
+```
+git pull
+git status
+```
+
+Check the version in `meson.build` is correct for this release.
+
+Download
+[gitlab-changelog](https://gitlab.gnome.org/pwithnall/gitlab-changelog) and use
+it to write release entries:
+```
+gitlab-changelog.py GNOME/gnome-software ${previous_version}..
+```
+
+Edit this down to just the user visible changes, and list them in
+`data/metainfo/org.gnome.Software.metainfo.xml.in`. User visible changes are ones
+which the average user might be interested to know about, such as a fix for an
+impactful bug, a UI change, or a feature change.
+
+You can get review of your metainfo changes from other co-maintainers if you wish.
+
+Generate `NEWS` file:
+```
+appstreamcli metainfo-to-news ./data/metainfo/org.gnome.Software.metainfo.xml.in ./NEWS
+```
+
+Commit the release:
+```
+git add -p
+git commit -m "Release version ${new_version}"
+```
+
+Build the release tarball:
+```
+# Only execute git clean if you don't have anything not tracked by git that you
+# want to keep
+git clean -dfx
+meson --prefix $PWD/install -Dbuildtype=release -Dsoup2=true build/
+ninja -C build/ dist
+```
+
+Tag, sign and push the release (see below for information about `git evtag`):
+```
+git evtag sign -u ${key_id} ${new_version}
+git push --atomic origin ${branch} ${new_version}
+```
+To use a specific key add an option `-u ${keyid|email}` after the `sign` argument.
+
+Use `Tag ${new_version} release` as the tag message.
+
+Upload the release tarball:
+```
+scp build/meson-dist/gnome-software-${new_version}.tar.xz master.gnome.org:
+ssh master.gnome.org ftpadmin install gnome-software-${new_version}.tar.xz
+```
+
+Add the release notes to GitLab and close the milestone:
+ - Go to https://gitlab.gnome.org/GNOME/gnome-software/-/releases/new?tag_name=${new_version}
+ - set `Release title` to `${new_version}`
+ - set the Milestone of the release, if such exists
+ - copy the Release notes for the new release from the `NEWS` file
+ (replace `~~~~~~~~~~~~` with `===` (only three `=`))
+ - in the Links section add:
+ | URL | Link title | Type |
+ | ------ | ------ | ------ |
+ | `https://download.gnome.org/sources/gnome-software/${new_major_version}/gnome-software-${new_version}.tar.xz` | Release tarball | Other |
+ | `https://download.gnome.org/sources/gnome-software/${new_major_version}/gnome-software-${new_version}.sha256sum` | Release tarball sha256sum | Other |
+ - save the changes with `Create release` button
+ - verify the added links for the release artifacts work
+ - Go to https://gitlab.gnome.org/GNOME/gnome-software/-/milestones/
+ choose the milestone and close it, as all issues and merge requests tagged
+ for this release should now be complete
+
+Post release version bump in `meson.build`:
+```
+# edit meson.build, then
+git commit -a -m "trivial: Post release version bump"
+git push
+```
+
+`git-evtag`
+---
+
+Releases should be done with `git evtag` rather than `git tag`, as it provides
+stronger security guarantees. See
+[its documentation](https://github.com/cgwalters/git-evtag) for more details.
+In particular, it calculates its checksum over all blobs reachable from the tag,
+including submodules; and uses a stronger checksum than SHA-1.
+
+You will need a GPG key for this, ideally which has been signed by others so
+that it can be verified as being yours. However, even if your GPG key is
+unsigned, using `git evtag` is still beneficial over using `git tag`.
diff --git a/contrib/deployment-featured.ini b/contrib/deployment-featured.ini
new file mode 100644
index 0000000..3134130
--- /dev/null
+++ b/contrib/deployment-featured.ini
@@ -0,0 +1,4 @@
+[Deployment Featured Apps]
+Selector=foocorp
+Title=Featured by Foo Corp.
+Title[it]=Presentato da Foo Corp.
diff --git a/contrib/gnome-software.spec.in b/contrib/gnome-software.spec.in
new file mode 100644
index 0000000..6266107
--- /dev/null
+++ b/contrib/gnome-software.spec.in
@@ -0,0 +1,190 @@
+%global glib2_version 2.61.1
+%global gtk3_version 3.22.4
+%global json_glib_version 1.6.0
+%global packagekit_version 1.1.1
+%global appstream_version 0.14.0
+%global libsoup_version 2.52.0
+%global gsettings_desktop_schemas_version 3.12.0
+%global fwupd_version 1.2.10
+%global flatpak_version 1.1.3
+%global libxmlb_version 0.1.7
+
+%define alphatag #ALPHATAG#
+
+Name: gnome-software
+Version: #VERSION#
+Release: 0.#BUILD#%{?alphatag}%{?dist}
+Summary: A software center for GNOME
+
+License: GPLv2+
+URL: https://wiki.gnome.org/Apps/Software
+Source0: https://download.gnome.org/sources/gnome-software/3.34/%{name}-%{version}.tar.xz
+
+BuildRequires: gcc
+BuildRequires: gettext
+BuildRequires: libxslt
+BuildRequires: docbook-style-xsl
+BuildRequires: desktop-file-utils
+BuildRequires: fwupd-devel >= %{fwupd_version}
+BuildRequires: glib2-devel >= %{glib2_version}
+BuildRequires: gsettings-desktop-schemas-devel >= %{gsettings_desktop_schemas_version}
+BuildRequires: gtk3-devel >= %{gtk3_version}
+BuildRequires: gtk-doc
+BuildRequires: json-glib-devel >= %{json_glib_version}
+BuildRequires: libappstream-devel >= %{appstream_version}
+BuildRequires: libdnf-devel
+BuildRequires: libsoup-devel
+BuildRequires: libxmlb-devel >= %{libxmlb_version}
+BuildRequires: meson
+BuildRequires: PackageKit-glib-devel >= %{packagekit_version}
+BuildRequires: polkit-devel
+BuildRequires: flatpak-devel >= %{flatpak_version}
+BuildRequires: ostree-devel
+BuildRequires: rpm-devel
+BuildRequires: rpm-ostree-devel
+BuildRequires: libgudev1-devel
+
+Requires: appstream-data
+Requires: flatpak%{?_isa} >= %{flatpak_version}
+Requires: flatpak-libs%{?_isa} >= %{flatpak_version}
+Requires: fwupd%{?_isa} >= %{fwupd_version}
+Requires: glib2%{?_isa} >= %{glib2_version}
+# gnome-menus is needed for app folder .directory entries
+Requires: gnome-menus%{?_isa}
+Requires: gsettings-desktop-schemas%{?_isa} >= %{gsettings_desktop_schemas_version}
+Requires: gtk3%{?_isa} >= %{gtk3_version}
+Requires: json-glib%{?_isa} >= %{json_glib_version}
+Requires: iso-codes
+Requires: libappstream%{?_isa} >= %{appstream_version}
+# librsvg2 is needed for gdk-pixbuf svg loader
+Requires: librsvg2%{?_isa}
+Requires: libsoup%{?_isa} >= %{libsoup_version}
+Requires: libxmlb%{?_isa} >= %{libxmlb_version}
+
+Recommends: PackageKit%{?_isa} >= %{packagekit_version}
+
+Obsoletes: gnome-software-snap < 3.33.1
+Obsoletes: gnome-software-editor < 3.35.1
+
+# this is not a library version
+%define gs_plugin_version 16
+%define gs_plugin_dir %{_libdir}/gnome-software/plugins-%{gs_plugin_version}
+
+%description
+gnome-software is an application that makes it easy to add, remove
+and update software in the GNOME desktop.
+
+%package devel
+Summary: Headers for building external gnome-software plugins
+Requires: %{name}%{?_isa} = %{version}-%{release}
+
+%description devel
+These development files are for building gnome-software plugins outside
+the source tree. Most users do not need this subpackage installed.
+
+%package rpm-ostree
+Summary: rpm-ostree backend for gnome-software
+Requires: %{name}%{?_isa} = %{version}-%{release}
+Requires: rpm-ostree%{?_isa}
+Supplements: (gnome-software%{?_isa} and rpm-ostree%{?_isa})
+
+%description rpm-ostree
+gnome-software is an application that makes it easy to add, remove
+and update software in the GNOME desktop.
+
+This package includes the rpm-ostree backend.
+
+%prep
+%autosetup -p1
+
+%build
+%meson \
+ -Dsnap=false \
+ -Dgudev=true \
+ -Dpackagekit=true \
+ -Dexternal_appstream=false \
+ -Drpm_ostree=true \
+ -Dtests=false
+%meson_build
+
+%install
+%meson_install
+
+# remove unneeded dpkg plugin
+rm %{buildroot}%{gs_plugin_dir}/libgs_plugin_dpkg.so
+
+# make the software center load faster
+desktop-file-edit %{buildroot}%{_datadir}/applications/org.gnome.Software.desktop \
+ --set-key=X-AppInstall-Package --set-value=%{name}
+
+# set up for Fedora
+cat >> %{buildroot}%{_datadir}/glib-2.0/schemas/org.gnome.software-fedora.gschema.override << FOE
+[org.gnome.software]
+official-repos = [ 'anaconda', 'fedora', 'fedora-debuginfo', 'fedora-source', 'koji-override-0', 'koji-override-1', 'rawhide', 'rawhide-debuginfo', 'rawhide-source', 'updates', 'updates-debuginfo', 'updates-source', 'updates-testing', 'updates-testing-debuginfo', 'updates-testing-source', 'fedora-modular', 'fedora-modular-debuginfo', 'fedora-modular-source', 'rawhide-modular', 'rawhide-modular-debuginfo', 'rawhide-modular-source' ]
+FOE
+
+%find_lang %name --with-gnome
+
+%check
+desktop-file-validate %{buildroot}%{_datadir}/applications/*.desktop
+
+%files -f %{name}.lang
+%doc AUTHORS README.md
+%license COPYING
+%{_bindir}/gnome-software
+%{_datadir}/applications/gnome-software-local-file-flatpak.desktop
+%{_datadir}/applications/gnome-software-local-file-fwupd.desktop
+%{_datadir}/applications/gnome-software-local-file-packagekit.desktop
+%{_datadir}/applications/org.gnome.Software.desktop
+%dir %{_datadir}/gnome-software
+%{_datadir}/gnome-software/*.png
+%{_mandir}/man1/gnome-software.1.gz
+%{_datadir}/icons/hicolor/*/apps/org.gnome.Software.svg
+%{_datadir}/icons/hicolor/symbolic/apps/org.gnome.Software-symbolic.svg
+%{_datadir}/gnome-software/featured-*.svg
+%{_datadir}/gnome-software/featured-*.jpg
+%{_datadir}/metainfo/org.gnome.Software.metainfo.xml
+%{_datadir}/metainfo/org.gnome.Software.Plugin.Epiphany.metainfo.xml
+%{_datadir}/metainfo/org.gnome.Software.Plugin.Flatpak.metainfo.xml
+%{_datadir}/metainfo/org.gnome.Software.Plugin.Fwupd.metainfo.xml
+%dir %{gs_plugin_dir}
+%{gs_plugin_dir}/libgs_plugin_appstream.so
+%{gs_plugin_dir}/libgs_plugin_dummy.so
+%{gs_plugin_dir}/libgs_plugin_epiphany.so
+%{gs_plugin_dir}/libgs_plugin_fedora-langpacks.so
+%{gs_plugin_dir}/libgs_plugin_fedora-pkgdb-collections.so
+%{gs_plugin_dir}/libgs_plugin_flatpak.so
+%{gs_plugin_dir}/libgs_plugin_fwupd.so
+%{gs_plugin_dir}/libgs_plugin_generic-updates.so
+%{gs_plugin_dir}/libgs_plugin_hardcoded-blocklist.so
+%{gs_plugin_dir}/libgs_plugin_icons.so
+%{gs_plugin_dir}/libgs_plugin_modalias.so
+%{gs_plugin_dir}/libgs_plugin_os-release.so
+%{gs_plugin_dir}/libgs_plugin_packagekit.so
+%{gs_plugin_dir}/libgs_plugin_provenance-license.so
+%{gs_plugin_dir}/libgs_plugin_provenance.so
+%{gs_plugin_dir}/libgs_plugin_repos.so
+%{gs_plugin_dir}/libgs_plugin_rewrite-resource.so
+%{_sysconfdir}/xdg/autostart/org.gnome.Software.desktop
+%{_datadir}/app-info/xmls/org.gnome.Software.Featured.xml
+%{_datadir}/dbus-1/services/org.freedesktop.PackageKit.service
+%{_datadir}/dbus-1/services/org.gnome.Software.service
+%{_datadir}/gnome-shell/search-providers/org.gnome.Software-search-provider.ini
+%{_datadir}/glib-2.0/schemas/org.gnome.software.gschema.xml
+%{_datadir}/glib-2.0/schemas/org.gnome.software-fedora.gschema.override
+%{_libexecdir}/gnome-software-cmd
+%{_libexecdir}/gnome-software-restarter
+
+%files rpm-ostree
+%{gs_plugin_dir}/libgs_plugin_rpm-ostree.so
+
+%files devel
+%{_libdir}/pkgconfig/gnome-software.pc
+%dir %{_includedir}/gnome-software
+%{_includedir}/gnome-software/*.h
+%{_datadir}/gtk-doc/html/gnome-software
+
+%changelog
+* #LONGDATE# Richard Hughes <richard@hughsie.com> #VERSION#-0.#BUILD##ALPHATAG#
+- Update from GIT
+
diff --git a/contrib/org.gnome.Software.DeploymentFeatured.xml b/contrib/org.gnome.Software.DeploymentFeatured.xml
new file mode 100644
index 0000000..520f19a
--- /dev/null
+++ b/contrib/org.gnome.Software.DeploymentFeatured.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- This is only an example file, what the deployment-featured file can look like;
+ if used, it should be installed beside the org.gnome.Software.Featured.xml file. -->
+<components>
+ <component merge="append">
+ <id>org.gnome.Software.desktop</id>
+ <custom>
+ <value key="GnomeSoftware::DeploymentFeatured">foocorp</value>
+ </custom>
+ </component>
+</components>
diff --git a/contrib/org.gnome.SoftwareDevel.json b/contrib/org.gnome.SoftwareDevel.json
new file mode 100644
index 0000000..577aef7
--- /dev/null
+++ b/contrib/org.gnome.SoftwareDevel.json
@@ -0,0 +1,214 @@
+{
+ "app-id": "org.gnome.SoftwareDevel",
+ "runtime": "org.gnome.Platform",
+ "runtime-version": "master",
+ "sdk": "org.gnome.Sdk",
+ "command": "gnome-software",
+ "tags": [
+ "devel",
+ "development",
+ "nightly"
+ ],
+ "finish-args": [
+ "--device=dri",
+ "--share=ipc",
+ "--socket=x11",
+ "--socket=wayland",
+ "--socket=session-bus",
+ "--socket=system-bus",
+ "--filesystem=host",
+ "--share=network",
+ "--filesystem=xdg-run/dconf",
+ "--filesystem=~/.config/dconf:ro",
+ "--talk-name=ca.desrt.dconf",
+ "--env=DCONF_USER_CONFIG_DIR=.config/dconf",
+ "--filesystem=/var/lib/flatpak",
+ "--env=FLATPAK_SYSTEM_DIR=/var/lib/flatpak",
+ "--filesystem=xdg-data/flatpak",
+ "--filesystem=/usr/share/metainfo:ro",
+ "--filesystem=/usr/share/swcatalog:ro",
+ "--filesystem=/usr/share/appdata:ro",
+ "--filesystem=/usr/share/app-info:ro",
+ "--filesystem=/var/lib/swcatalog:ro",
+ "--filesystem=/var/lib/app-info:ro",
+ "--filesystem=/var/cache/swcatalog:ro",
+ "--filesystem=/var/cache/app-info:ro"
+ ],
+ "modules": [
+ {
+ "name": "libyaml",
+ "buildsystem": "autotools",
+ "builddir": true,
+ "config-opts": [
+ "--libdir=/app/lib"
+ ],
+ "sources": [
+ {
+ "type": "git",
+ "url": "https://github.com/yaml/libyaml"
+ }
+ ]
+ },
+ {
+ "name": "lmdb",
+ "buildsystem": "simple",
+ "subdir": "libraries/liblmdb",
+ "build-commands": [
+ "make install prefix=/ DESTDIR=/app"
+ ],
+ "sources": [
+ {
+ "type": "git",
+ "url": "https://git.openldap.org/openldap/openldap.git"
+ }
+ ]
+ },
+ {
+ "name": "libxmlb",
+ "buildsystem": "meson",
+ "config-opts": [
+ "-Dgtkdoc=false"
+ ],
+ "sources": [
+ {
+ "type": "git",
+ "url": "https://github.com/hughsie/libxmlb.git",
+ "branch": "main"
+ }
+ ]
+ },
+ {
+ "name": "appstream",
+ "buildsystem": "meson",
+ "config-opts": [
+ "-Dstemming=false",
+ "-Dapidocs=false"
+ ],
+ "sources": [
+ {
+ "type": "git",
+ "url": "https://github.com/ximion/appstream.git",
+ "tag": "v0.15.2",
+ "commit": "d2bfe7c2a4ca692daf33a5cb4d429011269d1cba"
+ }
+ ]
+ },
+ {
+ "name": "intltool",
+ "buildsystem": "autotools",
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://download.gnome.org/sources/intltool/0.40/intltool-0.40.6.tar.bz2",
+ "sha256": "4d1e5f8561f09c958e303d4faa885079a5e173a61d28437d0013ff5efc9e3b64"
+ }
+ ]
+ },
+ {
+ "name": "linux-pam",
+ "buildsystem": "autotools",
+ "config-opts": [
+ "--disable-doc",
+ "--includedir=/app/include/security"
+ ],
+ "sources": [
+ {
+ "type": "git",
+ "url": "https://github.com/linux-pam/linux-pam.git"
+ }
+ ]
+ },
+ {
+ "name": "polkit",
+ "buildsystem": "meson",
+ "config-opts": [
+ "-Djs_engine=mozjs"
+ ],
+ "sources": [
+ {
+ "type": "git",
+ "url": "https://gitlab.freedesktop.org/polkit/polkit.git"
+ }
+ ]
+ },
+ {
+ "name": "libfuse",
+ "buildsystem": "simple",
+ "build-commands": [
+ "./makeconf.sh",
+ "./configure --disable-util --disable-example --prefix=/",
+ "make install DESTDIR=/app"
+ ],
+ "sources": [
+ {
+ "type": "git",
+ "url": "https://github.com/libfuse/libfuse.git",
+ "branch": "fuse_2_9_bugfix"
+ }
+ ]
+ },
+ {
+ "name": "ostree",
+ "buildsystem": "autotools",
+ "config-opts": [
+ "--disable-rofiles-fuse"
+ ],
+ "sources": [
+ {
+ "type": "git",
+ "url": "https://github.com/ostreedev/ostree.git",
+ "branch": "main"
+ }
+ ]
+ },
+ {
+ "name": "pyparsing",
+ "buildsystem": "simple",
+ "build-commands": [
+ "pip3 install --prefix=/app --no-deps ./pyparsing-*.whl"
+ ],
+ "sources": [
+ {
+ "type": "file",
+ "url": "https://files.pythonhosted.org/packages/8a/bb/488841f56197b13700afd5658fc279a2025a39e22449b7cf29864669b15d/pyparsing-2.4.7-py2.py3-none-any.whl",
+ "sha256": "ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"
+ }
+ ]
+ },
+ {
+ "name": "flatpak",
+ "buildsystem": "autotools",
+ "sources": [
+ {
+ "type": "git",
+ "url": "https://github.com/flatpak/flatpak.git",
+ "branch": "main"
+ }
+ ]
+ },
+ {
+ "buildsystem": "meson",
+ "builddir": true,
+ "name": "gnome-software",
+ "config-opts": [
+ "--libdir=/app/lib",
+ "-Dpackagekit=false",
+ "-Dpackagekit_autoremove=false",
+ "-Dsoup2=true",
+ "-Dfwupd=false",
+ "-Dflatpak=true",
+ "-Dmalcontent=false",
+ "-Dgudev=false",
+ "-Dgtk_doc=false",
+ "-Dprofile=Devel"
+ ],
+ "sources": [
+ {
+ "type": "git",
+ "url": "https://gitlab.gnome.org/GNOME/gnome-software.git",
+ "branch": "main"
+ }
+ ]
+ }
+ ]
+}
diff --git a/data/assets/meson.build b/data/assets/meson.build
new file mode 100644
index 0000000..ca2cfa1
--- /dev/null
+++ b/data/assets/meson.build
@@ -0,0 +1,11 @@
+if get_option('default_featured_apps')
+ install_data('org.gnome.Software.Featured.xml',
+ install_dir : join_paths(get_option('datadir'), 'swcatalog', 'xml'),
+ )
+endif
+
+if get_option('hardcoded_curated')
+ install_data('org.gnome.Software.Curated.xml',
+ install_dir : join_paths(get_option('datadir'), 'swcatalog', 'xml'),
+ )
+endif
diff --git a/data/assets/org.gnome.Software.Curated.xml b/data/assets/org.gnome.Software.Curated.xml
new file mode 100644
index 0000000..4dc828c
--- /dev/null
+++ b/data/assets/org.gnome.Software.Curated.xml
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<components>
+ <!-- Arbitrary list of popular GNOME apps. The list should be long enough
+ to show up on the overview page if it’s the only source of curated apps.
+ Distros should not ship this in production releases: they should be
+ providing their own curated list of ‘Editor’s Choice’ apps instead. -->
+ <component merge="append">
+ <id>org.gnome.Aisleriot</id>
+ <kudos>
+ <kudo>GnomeSoftware::popular</kudo>
+ </kudos>
+ </component>
+ <component merge="append">
+ <id>org.gnome.Boxes.desktop</id>
+ <kudos>
+ <kudo>GnomeSoftware::popular</kudo>
+ </kudos>
+ </component>
+ <component merge="append">
+ <id>org.gnome.Builder.desktop</id>
+ <kudos>
+ <kudo>GnomeSoftware::popular</kudo>
+ </kudos>
+ </component>
+ <component merge="append">
+ <id>org.gnome.Calendar.desktop</id>
+ <kudos>
+ <kudo>GnomeSoftware::popular</kudo>
+ </kudos>
+ </component>
+ <component merge="append">
+ <id>org.gnome.clocks.desktop</id>
+ <kudos>
+ <kudo>GnomeSoftware::popular</kudo>
+ </kudos>
+ </component>
+ <component merge="append">
+ <id>org.gnome.Contacts.desktop</id>
+ <kudos>
+ <kudo>GnomeSoftware::popular</kudo>
+ </kudos>
+ </component>
+ <component merge="append">
+ <id>org.gnome.Dictionary</id>
+ <kudos>
+ <kudo>GnomeSoftware::popular</kudo>
+ </kudos>
+ </component>
+ <component merge="append">
+ <id>org.gnome.Evince</id>
+ <kudos>
+ <kudo>GnomeSoftware::popular</kudo>
+ </kudos>
+ </component>
+ <component merge="append">
+ <id>org.gnome.Evolution.desktop</id>
+ <kudos>
+ <kudo>GnomeSoftware::popular</kudo>
+ </kudos>
+ </component>
+ <component merge="append">
+ <id>org.gnome.Geary.desktop</id>
+ <kudos>
+ <kudo>GnomeSoftware::popular</kudo>
+ </kudos>
+ </component>
+ <component merge="append">
+ <id>org.gnome.Maps.desktop</id>
+ <kudos>
+ <kudo>GnomeSoftware::popular</kudo>
+ </kudos>
+ </component>
+ <component merge="append">
+ <id>org.gnome.Nautilus.desktop</id>
+ <kudos>
+ <kudo>GnomeSoftware::popular</kudo>
+ </kudos>
+ </component>
+ <component merge="append">
+ <id>im.bernard.Nostalgia</id>
+ <kudos>
+ <kudo>GnomeSoftware::popular</kudo>
+ </kudos>
+ </component>
+ <component merge="append">
+ <id>org.gnome.Notes.desktop</id>
+ <kudos>
+ <kudo>GnomeSoftware::popular</kudo>
+ </kudos>
+ </component>
+ <component merge="append">
+ <id>org.gnome.Photos.desktop</id>
+ <kudos>
+ <kudo>GnomeSoftware::popular</kudo>
+ </kudos>
+ </component>
+ <component merge="append">
+ <id>org.gnome.Polari.desktop</id>
+ <kudos>
+ <kudo>GnomeSoftware::popular</kudo>
+ </kudos>
+ </component>
+ <component merge="append">
+ <id>org.gnome.Todo</id>
+ <kudos>
+ <kudo>GnomeSoftware::popular</kudo>
+ </kudos>
+ </component>
+ <component merge="append">
+ <id>org.gnome.Totem.desktop</id>
+ <kudos>
+ <kudo>GnomeSoftware::popular</kudo>
+ </kudos>
+ </component>
+ <component merge="append">
+ <id>org.gnome.Weather</id>
+ <kudos>
+ <kudo>GnomeSoftware::popular</kudo>
+ </kudos>
+ </component>
+</components>
diff --git a/data/assets/org.gnome.Software.Featured.xml b/data/assets/org.gnome.Software.Featured.xml
new file mode 100644
index 0000000..1a759a2
--- /dev/null
+++ b/data/assets/org.gnome.Software.Featured.xml
@@ -0,0 +1,262 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<components>
+ <!-- GNOME Circle apps (https://circle.gnome.org) -->
+ <component merge="append">
+ <id>app.drey.Dialect</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>app.drey.Warp</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>com.adrienplazas.Metronome</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>com.belmoussaoui.Authenticator</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>com.belmoussaoui.Decoder</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>com.belmoussaoui.Obfuscate</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>com.bitstower.Markets</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>com.github.alexhuntley.Plots</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>com.github.bleakgrey.tootle</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>com.github.geigi.cozy</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>com.github.hugolabe.Wike</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>com.github.huluti.Curtail</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>com.github.liferooter.textpieces</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>com.github.maoschanz.drawing</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>com.gitlab.newsflash</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>com.rafaelmardojai.Blanket</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>com.rafaelmardojai.SharePreview</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>com.rafaelmardojai.WebfontKitGenerator</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>de.haeckerfelix.AudioSharing</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>de.haeckerfelix.Fragments</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>de.haeckerfelix.Shortwave</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>dev.Cogitri.Health</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>dev.geopjr.Collision</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>fr.romainvigier.MetadataCleaner</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>io.bassi.Amberol</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>io.github.lainsce.Khronos</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>io.github.seadve.Kooha</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>io.github.seadve.Mousai</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>org.gaphor.Gaphor</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>org.gnome.DejaDup</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>org.gnome.gitlab.somas.Apostrophe</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>org.gnome.gitlab.YaLTeR.Identity</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>org.gnome.gitlab.YaLTeR.VideoTrimmer</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>org.gnome.Podcasts</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>org.gnome.Polari</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>org.gnome.Solanum</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>org.gnome.World.Citations</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>org.gnome.World.PikaBackup</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>org.gnome.World.Secrets</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>org.gustavoperedo.FontDownloader</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>re.sonny.Commit</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>re.sonny.Junction</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>re.sonny.Tangram</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+</components>
diff --git a/data/assets/up-to-date.svg b/data/assets/up-to-date.svg
new file mode 100644
index 0000000..99122cd
--- /dev/null
+++ b/data/assets/up-to-date.svg
@@ -0,0 +1,264 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ inkscape:version="1.1 (c68e22c387, 2021-05-23)"
+ id="svg8"
+ version="1.1"
+ viewBox="0 0 320 320"
+ height="320"
+ width="320"
+ sodipodi:docname="up-to-date.svg"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <defs
+ id="defs2">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient14556">
+ <stop
+ style="stop-color:#f9ef69;stop-opacity:1;"
+ offset="0"
+ id="stop14552" />
+ <stop
+ style="stop-color:#f5c211;stop-opacity:1"
+ offset="1"
+ id="stop14554" />
+ </linearGradient>
+ <linearGradient
+ id="a-3"
+ gradientTransform="matrix(0.707107,0.707107,0.707107,-0.707107,2,-170)"
+ gradientUnits="userSpaceOnUse"
+ x1="188.44394"
+ x2="261.09912"
+ y1="-77.78183"
+ y2="-150.43706">
+ <stop
+ offset="0"
+ stop-color="#f6d32d"
+ id="stop2-6" />
+ <stop
+ offset="1"
+ stop-color="#f5c211"
+ id="stop4-7" />
+ </linearGradient>
+ <radialGradient
+ id="b"
+ cx="280.9942"
+ cy="488.84842"
+ gradientTransform="matrix(0.347005,0,0,0.342234,-31.50647,-127.48206)"
+ gradientUnits="userSpaceOnUse"
+ r="224">
+ <stop
+ offset="0"
+ stop-color="#fdfacf"
+ id="stop7" />
+ <stop
+ offset="0.4"
+ stop-color="#f9f06b"
+ id="stop9" />
+ <stop
+ offset="1"
+ stop-color="#f6d32d"
+ id="stop11" />
+ </radialGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient10519"
+ id="linearGradient10521"
+ x1="564.64844"
+ y1="486.45703"
+ x2="723.66016"
+ y2="486.45703"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1724844,0,0,1.1724844,-531.44458,-257.84982)" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient10519">
+ <stop
+ style="stop-color:#26a269;stop-opacity:1;"
+ offset="0"
+ id="stop10515" />
+ <stop
+ style="stop-color:#1eef8f;stop-opacity:1"
+ offset="0.28584763"
+ id="stop10685" />
+ <stop
+ style="stop-color:#165f3d;stop-opacity:1"
+ offset="1"
+ id="stop10517" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8268"
+ id="linearGradient8270"
+ x1="624.69623"
+ y1="401.86096"
+ x2="698.71875"
+ y2="288.45312"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1724844,0,0,1.1724844,-531.44458,-201.41465)" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8268">
+ <stop
+ style="stop-color:#26a269;stop-opacity:1"
+ offset="0"
+ id="stop8264" />
+ <stop
+ style="stop-color:#f9f06b;stop-opacity:1"
+ offset="1"
+ id="stop8266" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient14556"
+ id="linearGradient14558"
+ x1="231.2832"
+ y1="145.98535"
+ x2="231.2832"
+ y2="252.41602"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <sodipodi:namedview
+ units="px"
+ borderlayer="true"
+ inkscape:showpageshadow="false"
+ showgrid="false"
+ inkscape:document-rotation="0"
+ inkscape:current-layer="g960"
+ inkscape:document-units="px"
+ inkscape:cy="166.27648"
+ inkscape:cx="60.187402"
+ inkscape:zoom="2.1349983"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0"
+ borderopacity="1"
+ bordercolor="#383838"
+ pagecolor="#1f1f1f"
+ id="base"
+ inkscape:pagecheckerboard="1"
+ width="400px"
+ objecttolerance="10.0"
+ gridtolerance="10.0"
+ guidetolerance="10.0"
+ inkscape:window-width="1920"
+ inkscape:window-height="1011"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0" />
+ <metadata
+ id="metadata5">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Reproduction" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Distribution" />
+ <cc:requires
+ rdf:resource="http://creativecommons.org/ns#Notice" />
+ <cc:requires
+ rdf:resource="http://creativecommons.org/ns#Attribution" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+ <cc:requires
+ rdf:resource="http://creativecommons.org/ns#ShareAlike" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1"
+ transform="translate(-40,-40)">
+ <g
+ id="g960"
+ transform="translate(-9)">
+ <g
+ style="stroke-width:0.386113"
+ transform="matrix(1.1259125,0,0,1.1259125,224.47071,55.053376)"
+ id="g862">
+ <path
+ d="m 20,20 h 88 v 88 H 20 Z m 0,0"
+ fill="#f5c211"
+ id="path856-5"
+ style="stroke-width:0.298167" />
+ <path
+ style="fill:url(#a-3);stroke-width:0.386113"
+ d="M 2,64 64,126 126,64 64,2 Z m 0,0"
+ fill="url(#a)"
+ id="path858-3" />
+ <path
+ style="fill:url(#b);stroke-width:0.386113"
+ d="M 112,64 C 112,90.507812 90.507812,112 64,112 37.492188,112 16,90.507812 16,64 16,37.492188 37.492188,16 64,16 c 26.507812,0 48,21.492188 48,48 z m 0,0"
+ fill="url(#b)"
+ id="path860-5" />
+ </g>
+ <circle
+ style="fill:url(#linearGradient10521);fill-opacity:1;stroke-width:18.7598;stop-color:#000000"
+ id="circle10463"
+ cx="209.35948"
+ cy="242.87909"
+ r="101.09472" />
+ <circle
+ style="fill:url(#linearGradient14558);fill-opacity:1;stroke-width:18.7598;stop-color:#000000"
+ id="circle11708"
+ cx="209.35948"
+ cy="236.68916"
+ r="101.09472" />
+ <circle
+ style="fill:url(#linearGradient8270);fill-opacity:1;stroke-width:18.7598;stop-color:#000000"
+ id="path2198"
+ cx="209.35948"
+ cy="238.18916"
+ r="101.09472" />
+ <g
+ id="g8228"
+ transform="matrix(0.93457387,0,0,0.93457387,-379.96735,-136.74431)">
+ <path
+ id="path2322"
+ style="display:inline;fill:#99c1f1;fill-opacity:1;stroke:none;stroke-width:32.3735;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.482318;stop-color:#000000"
+ d="m 538.64083,296.63671 a 43.839679,43.839679 0 0 0 -39.2403,24.36235 35.177858,35.177858 0 0 0 -3.3343,-0.16019 35.177858,35.177858 0 0 0 -35.1788,35.17881 35.177858,35.177858 0 0 0 0.9716,8.21352 h 147.2279 a 29.419203,29.419203 0 0 0 -26.7777,-28.00225 43.839679,43.839679 0 0 0 -43.6326,-39.59224 43.839679,43.839679 0 0 0 -0.036,0 z" />
+ <path
+ id="path889"
+ style="display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:32.3735;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.482318;stop-color:#000000"
+ d="m 538.64083,292.63671 a 43.839679,43.839679 0 0 0 -39.2403,24.36235 35.177858,35.177858 0 0 0 -3.3343,-0.16019 35.177858,35.177858 0 0 0 -35.1788,35.17881 35.177858,35.177858 0 0 0 0.9716,8.21352 h 147.2279 a 29.419203,29.419203 0 0 0 -26.7777,-28.00225 43.839679,43.839679 0 0 0 -43.6326,-39.59224 43.839679,43.839679 0 0 0 -0.036,0 z" />
+ </g>
+ <path
+ style="fill:none;stroke:#8ff0a4;stroke-width:27.0574;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 173.95206,242.7111 27.04994,27.04994 55.33318,-55.33316"
+ id="path7128" />
+ <g
+ id="g8232"
+ transform="matrix(0.85677501,0,0,0.85677501,-296.65379,-71.159142)">
+ <path
+ id="path2302"
+ style="display:inline;fill:#99c1f1;fill-opacity:1;stroke:none;stroke-width:48.5793;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.482318;stop-color:#000000"
+ d="m 741.32713,365.18189 c -14.26103,10e-4 -26.92647,9.11418 -31.45954,22.63558 -3.34805,-1.36908 -6.93047,-2.07375 -10.54763,-2.07475 -15.40287,-6.9e-4 -27.88955,12.48596 -27.88889,27.88883 -3.2e-4,4.76721 1.22143,9.45492 3.54859,13.61552 h 82.67972 c 10.41164,-5.88686 16.84961,-16.92128 16.85101,-28.88194 -8e-5,-18.32657 -14.85669,-33.18317 -33.18326,-33.18324 z"
+ sodipodi:nodetypes="cccccccc" />
+ <path
+ id="path903"
+ style="display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:48.5793;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.482318;stop-color:#000000"
+ d="m 739.32713,361.18189 c -14.26103,10e-4 -26.92647,9.11418 -31.45954,22.63558 -3.34805,-1.36908 -6.93047,-2.07375 -10.54763,-2.07475 -15.40287,-6.9e-4 -27.88955,12.48596 -27.88889,27.88883 -3.2e-4,4.76721 1.22143,9.45492 3.54859,13.61552 h 82.67972 c 10.41164,-5.88686 16.84961,-16.92128 16.85101,-28.88194 -8e-5,-18.32657 -14.85669,-33.18317 -33.18326,-33.18324 z"
+ sodipodi:nodetypes="cccccccc" />
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/data/autostart/org.gnome.Software.desktop.in b/data/autostart/org.gnome.Software.desktop.in
new file mode 100644
index 0000000..6c7a77b
--- /dev/null
+++ b/data/autostart/org.gnome.Software.desktop.in
@@ -0,0 +1,7 @@
+[Desktop Entry]
+Type=Application
+Name=GNOME Software
+Exec=@bindir@/gnome-software --gapplication-service
+OnlyShowIn=GNOME;Unity;
+NotShowIn=Budgie
+NoDisplay=true
diff --git a/data/icons/adaptive-symbolic.svg b/data/icons/adaptive-symbolic.svg
new file mode 100644
index 0000000..f1109c8
--- /dev/null
+++ b/data/icons/adaptive-symbolic.svg
@@ -0,0 +1 @@
+<svg width="64" height="64" xmlns="http://www.w3.org/2000/svg"><path d="M44.004 25c-1.662 0-3 1.338-3 3v6c0 1.662 1.338 3 3 3h12c1.662 0 3-1.338 3-3v-6c0-1.662-1.338-3-3-3h-12zm-36.5.002a2.517 2.517 0 0 0-2.5 2.5v10c0 1.368 1.132 2.5 2.5 2.5h5c1.368 0 2.5-1.132 2.5-2.5v-10c0-1.368-1.132-2.5-2.5-2.5h-5zm15 1a2.517 2.517 0 0 0-2.5 2.5V37h2v-8.5c0-.294.206-.5.5-.5h11.004c.295 0 .5.206.5.5V37h2v-8.498c0-1.367-1.132-2.5-2.5-2.5H22.504zm21.5.998h12c.554 0 1 .446 1 1v6c0 .554-.446 1-1 1h-12c-.554 0-1-.446-1-1v-6c0-.554.446-1 1-1zm-36.5.002h.5c0 .554.446 1 1 1h2c.554 0 1-.446 1-1h.5c.294 0 .5.206.5.5v10c0 .294-.206.5-.5.5h-5a.478.478 0 0 1-.5-.5v-10c0-.294.206-.5.5-.5zM18.004 38a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2h-20zm29 0a2 2 0 0 0-2 2h10a2 2 0 0 0-2-2h-6z" style="fill:#3d3846"/></svg> \ No newline at end of file
diff --git a/data/icons/app-installed-symbolic.svg b/data/icons/app-installed-symbolic.svg
new file mode 100644
index 0000000..660cab2
--- /dev/null
+++ b/data/icons/app-installed-symbolic.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path style="color:#000;fill:#2e3436;stroke-linecap:round;stroke-linejoin:round;stroke-dashoffset:26.4;-inkscape-stroke:none" d="M7.883 0a8.04 8.04 0 0 0-.963.074 7.988 7.988 0 0 0-4.604 2.291 8.014 8.014 0 0 0-1.228 9.666 8.008 8.008 0 0 0 9.016 3.686 8.004 8.004 0 0 0 5.892-7.752 1 1 0 1 0-1.998.01 5.987 5.987 0 0 1-4.42 5.812 5.995 5.995 0 0 1-6.764-2.766 5.993 5.993 0 0 1 .922-7.248 5.991 5.991 0 0 1 7.239-.984 1 1 0 1 0 .992-1.736A7.96 7.96 0 0 0 7.883 0zm7.209 2.002a1 1 0 0 0-.844.338L7.951 9.535 5.707 7.291a1 1 0 0 0-1.414 0 1 1 0 0 0 0 1.416l3 3a1 1 0 0 0 1.46-.049l7-8a1 1 0 0 0-.093-1.412 1 1 0 0 0-.568-.244z"/></svg> \ No newline at end of file
diff --git a/data/icons/chat-none-symbolic.svg b/data/icons/chat-none-symbolic.svg
new file mode 100644
index 0000000..ab473b3
--- /dev/null
+++ b/data/icons/chat-none-symbolic.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path style="fill:#2e3436" d="m1.531.469-1.06 1.06.802.803L11.941 13l2.53 2.53 1.06-1.061-1.521-1.522A2.49 2.49 0 0 0 16 10.5v-6A2.495 2.495 0 0 0 13.5 2H3.062L1.532.469zM.246 3.429A2.504 2.504 0 0 0 0 4.5v6C0 11.684 1.402 13 2.5 13H4v3l3.125-3h2.691L.246 3.43z"/></svg> \ No newline at end of file
diff --git a/data/icons/chat-symbolic.svg b/data/icons/chat-symbolic.svg
new file mode 100644
index 0000000..67ffbdf
--- /dev/null
+++ b/data/icons/chat-symbolic.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M13.5 2A2.495 2.495 0 0 1 16 4.5v6c0 1.387-1.113 2.5-2.5 2.5H7.125L4 16v-3H2.5C1 13 0 11.684 0 10.5v-6C0 3.113 1.113 2 2.5 2zm0 0" fill="#2e3436"/></svg> \ No newline at end of file
diff --git a/data/icons/cigarette-none-symbolic.svg b/data/icons/cigarette-none-symbolic.svg
new file mode 100644
index 0000000..c54012f
--- /dev/null
+++ b/data/icons/cigarette-none-symbolic.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M3 0v.5C3 2.98 5.02 5 7.5 5h3c.832 0 1.5.664 1.5 1.5V7h3v-.5C15 4.02 12.98 2 10.5 2h-3C6.664 2 6 1.332 6 .5V0Zm0 0" fill-opacity=".35" style="fill:#2e3436"/><path style="fill:#2e3436" d="m1.531.469-1.06 1.06 14 14 1.06-1.06L13 11.938V8h-1v2.938l-1-1V8H9.062L1.532.469zM0 8v4h8.906l-4-4H0zm14 0v4h1V8h-1z"/></svg> \ No newline at end of file
diff --git a/data/icons/cigarette-symbolic.svg b/data/icons/cigarette-symbolic.svg
new file mode 100644
index 0000000..75c42c7
--- /dev/null
+++ b/data/icons/cigarette-symbolic.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M3 .012v.5c0 2.48 2.02 4.5 4.5 4.5h3c.832 0 1.5.664 1.5 1.5v.5h3v-.5c0-2.48-2.02-4.5-4.5-4.5h-3c-.836 0-1.5-.668-1.5-1.5v-.5zm0 0" fill-opacity=".35" style="fill:#2e3436"/><path style="fill:#2e3436" d="M0 8.012v4h11v-4H0zm12 0v4h1v-4h-1zm2 0v4h1v-4h-1z"/></svg> \ No newline at end of file
diff --git a/data/icons/community-none-symbolic.svg b/data/icons/community-none-symbolic.svg
new file mode 100644
index 0000000..c0c07cb
--- /dev/null
+++ b/data/icons/community-none-symbolic.svg
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16px" height="16px" viewBox="0 0 16 16" version="1.1">
+<g id="surface25330">
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(13.333334%,13.333334%,13.333334%);fill-opacity:0.501961;" d="M 11 0 C 9.621094 0 8.5 1.121094 8.5 2.5 C 8.5 3.878906 9.621094 5 11 5 C 12.378906 5 13.5 3.878906 13.5 2.5 C 13.5 1.121094 12.378906 0 11 0 Z M 9 6 C 8.117188 6 6.933594 6.585938 6.230469 7.277344 L 10.953125 12 L 15 12 C 15.554688 12 16 11.554688 16 11 L 16 9 C 16 7.339844 14.660156 6 13 6 Z M 9 6 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(13.333334%,13.333334%,13.333334%);fill-opacity:1;" d="M 5 4 C 4.425781 4 3.898438 4.195312 3.476562 4.523438 L 6.980469 8.027344 C 7.304688 7.601562 7.5 7.074219 7.5 6.5 C 7.5 5.121094 6.378906 4 5 4 Z M 2.609375 5.78125 C 2.539062 6.007812 2.5 6.25 2.5 6.5 C 2.5 7.878906 3.621094 9 5 9 C 5.25 9 5.492188 8.964844 5.722656 8.894531 Z M 3 10 C 1.339844 10 0 11.339844 0 13 L 0 15 C 0 15.554688 0.445312 16 1 16 L 9 16 C 9.554688 16 10 15.554688 10 15 L 10 13.171875 L 6.828125 10 Z M 3 10 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(13.333334%,13.333334%,13.333334%);fill-opacity:1;" d="M 1.53125 0.457031 L 0.46875 1.519531 L 14.46875 15.519531 L 15.53125 14.457031 Z M 1.53125 0.457031 "/>
+</g>
+</svg>
diff --git a/data/icons/community-symbolic.svg b/data/icons/community-symbolic.svg
new file mode 100644
index 0000000..3716efa
--- /dev/null
+++ b/data/icons/community-symbolic.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M5 2a2 2 0 0 0-2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0-2-2zm6 2a2 2 0 0 0-2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0-2-2zM4 7c-1.662 0-3 1.338-3 3v1c0 .554.446 1 1 1h4c0-1.665 1.056-3.038 2.518-3.625A2.986 2.986 0 0 0 6 7H4zm6 2c-1.662 0-3 1.338-3 3v1c0 .554.446 1 1 1h6c.554 0 1-.446 1-1v-1c0-1.662-1.338-3-3-3h-2z" style="fill:#3d3846"/></svg> \ No newline at end of file
diff --git a/data/icons/desktop-symbolic.svg b/data/icons/desktop-symbolic.svg
new file mode 100644
index 0000000..3a4031a
--- /dev/null
+++ b/data/icons/desktop-symbolic.svg
@@ -0,0 +1 @@
+<svg width="16" height="16" xmlns="http://www.w3.org/2000/svg"><path style="fill:#241f31;fill-opacity:1" d="M3 1C1.338 1 0 2.338 0 4v6c0 1.662 1.338 3 3 3h10c1.662 0 3-1.338 3-3V4c0-1.662-1.338-3-3-3H3zm0 2h10c.554 0 1 .446 1 1v6c0 .554-.446 1-1 1H3c-.554 0-1-.446-1-1V4c0-.554.446-1 1-1zm2 11a2 2 0 0 0-2 2h10a2 2 0 0 0-2-2H5z"/></svg> \ No newline at end of file
diff --git a/data/icons/emblem-synchronizing-symbolic.svg b/data/icons/emblem-synchronizing-symbolic.svg
new file mode 100644
index 0000000..db232ff
--- /dev/null
+++ b/data/icons/emblem-synchronizing-symbolic.svg
@@ -0,0 +1 @@
+<svg width="16" height="16" xmlns="http://www.w3.org/2000/svg"><path d="M7.863 1a7.01 7.01 0 0 0-5.926 3.5 1 1 0 0 0 .368 1.365A1 1 0 0 0 3.67 5.5a4.994 4.994 0 0 1 5.2-2.424A4.99 4.99 0 0 1 12.583 6H11a1 1 0 0 0-1 1 1 1 0 0 0 1 1h4a1 1 0 0 0 1-1V3a1 1 0 0 0-1-1 1 1 0 0 0-1 1v1.398A7.007 7.007 0 0 0 7.863 1ZM1 8a1 1 0 0 0-1 1v4a1 1 0 0 0 1 1 1 1 0 0 0 1-1v-1.396a7.006 7.006 0 0 0 5.39 3.369 7.004 7.004 0 0 0 6.673-3.473 1 1 0 0 0-.366-1.365 1 1 0 0 0-1.367.365 4.994 4.994 0 0 1-4.766 2.48A4.994 4.994 0 0 1 3.418 10H5a1 1 0 0 0 1-1 1 1 0 0 0-1-1Z" style="fill:#2e3436;fill-opacity:1"/></svg> \ No newline at end of file
diff --git a/data/icons/explore-symbolic.svg b/data/icons/explore-symbolic.svg
new file mode 100644
index 0000000..befab30
--- /dev/null
+++ b/data/icons/explore-symbolic.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path style="fill:#3d3846;fill-opacity:.35;stroke-width:1" d="M2.557 2a.59.59 0 0 0-.504.828L3.16 5.32l1.56-.6.6-1.56-2.492-1.107A.583.583 0 0 0 2.557 2Zm10.875.002a.585.585 0 0 0-.26.05L10.68 3.16l.6 1.56 1.56.6 1.107-2.492a.587.587 0 0 0-.515-.826ZM3.16 10.68l-1.107 2.492a.587.587 0 0 0 .775.775L5.32 12.84l-.6-1.56Zm9.68 0-1.56.6-.6 1.56 2.492 1.107a.587.587 0 0 0 .775-.775z"/><path d="M8.002 0a.572.572 0 0 0-.535.367L5.494 5.494.367 7.467a.571.571 0 0 0 0 1.066l5.127 1.973 1.973 5.127a.571.571 0 0 0 1.066 0l1.973-5.127 5.127-1.973a.571.571 0 0 0 0-1.066l-5.127-1.973L8.533.367A.573.573 0 0 0 8.002 0ZM8 7a1 1 0 1 1 0 2 1 1 0 0 1 0-2Z" style="fill:#3d3846"/></svg> \ No newline at end of file
diff --git a/data/icons/external-link-symbolic.svg b/data/icons/external-link-symbolic.svg
new file mode 100644
index 0000000..35b8681
--- /dev/null
+++ b/data/icons/external-link-symbolic.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M10 0a1 1 0 0 0 0 2h2.586L7.293 7.293a1 1 0 0 0 1.414 1.414L14 3.414V6a1 1 0 1 0 2 0V0h-1ZM4 1C2.355 1 1 2.355 1 4v8c0 1.645 1.355 3 3 3h8c1.645 0 3-1.355 3-3V9c0-.554-.446-1-1-1s-1 .446-1 1v3c0 .571-.429 1-1 1H4c-.571 0-1-.429-1-1V4c0-.571.429-1 1-1h3c.554 0 1-.446 1-1s-.446-1-1-1Z" style="fill:#3d3846"/></svg> \ No newline at end of file
diff --git a/data/icons/flag-outline-thin-symbolic.svg b/data/icons/flag-outline-thin-symbolic.svg
new file mode 100644
index 0000000..5a6c384
--- /dev/null
+++ b/data/icons/flag-outline-thin-symbolic.svg
@@ -0,0 +1 @@
+<svg width="16" height="16" xmlns="http://www.w3.org/2000/svg"><path d="M1 0v16h2v-6h3.383l.722 1.447A1 1 0 0 0 8 12h6a1 1 0 0 0 1-1V3a1 1 0 0 0-1-1H9.617L8.895.553A1 1 0 0 0 8 0Zm2 2h4.383l.722 1.447A1 1 0 0 0 9 4h4v6H8.617l-.722-1.447A1 1 0 0 0 7 8H3Z" style="fill:#3d3846"/></svg> \ No newline at end of file
diff --git a/data/icons/flatpak-symbolic.svg b/data/icons/flatpak-symbolic.svg
new file mode 100644
index 0000000..6b34e64
--- /dev/null
+++ b/data/icons/flatpak-symbolic.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg">
+ <path d="m 7.804688 0.0195312 c -0.128907 0.0273438 -0.25 0.0742188 -0.359376 0.1484378 l -6 4 c -0.277343 0.183593 -0.445312 0.496093 -0.445312 0.832031 v 6 c 0 0.335938 0.167969 0.648438 0.445312 0.832031 l 6 4 c 0.335938 0.222657 0.773438 0.222657 1.109376 0 l 6 -4 c 0.277343 -0.183593 0.445312 -0.496093 0.445312 -0.832031 v -6 c 0 -0.335938 -0.167969 -0.648438 -0.445312 -0.832031 l -6 -4 c -0.21875 -0.1484378 -0.488282 -0.199219 -0.75 -0.1484378 z m 0.195312 2.1796878 v 6.800781 l 5 -3.332031 v 4.796875 l -5 3.335937 v -4.800781 l -5 -3.332031 v -0.132813 z m 0 0" fill="#2e3436"/>
+</svg>
diff --git a/data/icons/graveyard-symbolic.svg b/data/icons/graveyard-symbolic.svg
new file mode 100644
index 0000000..fbd5c05
--- /dev/null
+++ b/data/icons/graveyard-symbolic.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m11.125 1.25-.844 2.188-1.844-.75-.75 1.874 1.875.75-2.187 5.75C5.082 11.54 3.832 13.027 3 14H1.469v1.063h13V14h-.719c-.414-.988-1.914-2.605-4.219-3l1.906-4.969 2.25.907.75-1.844-2.28-.907L13 2zm0 0" fill="#2e3436"/></svg> \ No newline at end of file
diff --git a/data/icons/hand-open-symbolic.svg b/data/icons/hand-open-symbolic.svg
new file mode 100644
index 0000000..2e20f74
--- /dev/null
+++ b/data/icons/hand-open-symbolic.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" height="16px" viewBox="0 0 16 16" width="16px"><path d="m 8 0 c 0.554688 0 1 0.445312 1 1 v 6.5 s 0 0.5 0.5 0.5 s 0.5 -0.5 0.5 -0.5 v -4.5 c 0 -0.554688 0.445312 -1 1 -1 s 1 0.445312 1 1 v 8.5 c 0 0.5 0.5 0.5 0.5 0.5 l 1.792969 -1.707031 c 0.1875 -0.195313 0.445312 -0.300781 0.71875 -0.300781 c 1.082031 0.082031 1.144531 1.265624 0.695312 1.714843 l -3 3 c -0.707031 0.792969 -1.757812 1.289063 -2.707031 1.292969 h -6 c -3 0 -3 -3 -3 -3 v -8 c 0 -0.554688 0.445312 -1 1 -1 s 1 0.445312 1 1 v 3.5 s 0 0.5 0.5 0.5 s 0.5 -0.5 0.5 -0.5 v -6.5 c 0 -0.554688 0.445312 -1 1 -1 s 1 0.445312 1 1 v 5.5 s 0 0.5 0.5 0.5 s 0.5 -0.5 0.5 -0.5 v -6.5 c 0 -0.554688 0.445312 -1 1 -1 z m 0 0" fill="#222222"/></svg>
diff --git a/data/icons/heart-filled-symbolic.svg b/data/icons/heart-filled-symbolic.svg
new file mode 100644
index 0000000..bd06edb
--- /dev/null
+++ b/data/icons/heart-filled-symbolic.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M11.395 1.965a3.75 3.75 0 0 0-2.641.984L8 3.625l-.758-.676a3.738 3.738 0 0 0-3.676-.77 3.738 3.738 0 0 0-2.5 2.805 3.76 3.76 0 0 0 1.188 3.567L8 13.668l5.742-5.117a3.75 3.75 0 0 0-2.348-6.586zm0 0" fill="#2e3436"/></svg> \ No newline at end of file
diff --git a/data/icons/help-link-symbolic.svg b/data/icons/help-link-symbolic.svg
new file mode 100644
index 0000000..52f8fe6
--- /dev/null
+++ b/data/icons/help-link-symbolic.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path style="color:#bebebe;fill:#2e3436;-inkscape-stroke:none" d="M8 0C3.585 0 0 3.585 0 8s3.585 8 8 8 8-3.585 8-8-3.585-8-8-8zm0 2c.973 0 1.887.227 2.695.629L9.461 5.14A2.324 2.324 0 0 0 8.662 5H7.338c-.28 0-.55.05-.799.14L5.305 2.63A6.034 6.034 0 0 1 8 2zM2.613 5.338l2.51 1.254A2.32 2.32 0 0 0 5 7.338v1.324c0 .28.05.55.14.799L2.64 10.713A6.032 6.032 0 0 1 2 8c0-.96.222-1.862.613-2.662zm10.774 0C13.778 6.138 14 7.04 14 8c0 .98-.231 1.9-.639 2.713L10.86 9.46c.092-.25.141-.52.141-.799V7.338c0-.26-.044-.512-.123-.746l2.51-1.254zM7.337 6h1.325C9.412 6 10 6.588 10 7.338v1.324C10 9.412 9.412 10 8.662 10H7.338C6.588 10 6 9.412 6 8.662V7.338C6 6.588 6.588 6 7.338 6zm-.77 4.867c.241.085.5.133.77.133h1.325c.27 0 .53-.048.772-.133l1.254 2.508C9.88 13.775 8.97 14 8 14c-.97 0-1.881-.226-2.688-.625l1.254-2.508z"/></svg> \ No newline at end of file
diff --git a/data/icons/hicolor/meson.build b/data/icons/hicolor/meson.build
new file mode 100644
index 0000000..6f92a45
--- /dev/null
+++ b/data/icons/hicolor/meson.build
@@ -0,0 +1,6 @@
+install_data('scalable/' + application_id + '.svg',
+ install_dir : 'share/icons/hicolor/scalable/apps')
+install_data('symbolic/org.gnome.Software-symbolic.svg',
+ install_dir : 'share/icons/hicolor/symbolic/apps')
+install_data('symbolic/app-remove-symbolic.svg',
+ install_dir : 'share/icons/hicolor/scalable/actions')
diff --git a/data/icons/hicolor/scalable/org.gnome.Software.svg b/data/icons/hicolor/scalable/org.gnome.Software.svg
new file mode 100644
index 0000000..fd973d8
--- /dev/null
+++ b/data/icons/hicolor/scalable/org.gnome.Software.svg
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg height="128px" viewBox="0 0 128 128" width="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <linearGradient id="a" gradientUnits="userSpaceOnUse" x1="36" x2="60" y1="68" y2="68">
+ <stop offset="0" stop-color="#ed336c"/>
+ <stop offset="1" stop-color="#ffa348"/>
+ </linearGradient>
+ <linearGradient id="b" gradientTransform="matrix(0 1 -1 0 144 -32)" gradientUnits="userSpaceOnUse" x1="72" x2="96" y1="68" y2="68">
+ <stop offset="0" stop-color="#404ce6"/>
+ <stop offset="1" stop-color="#c061cb"/>
+ </linearGradient>
+ <linearGradient id="c" gradientUnits="userSpaceOnUse" x1="68.84919" x2="95.257637" y1="84" y2="84">
+ <stop offset="0" stop-color="#33d1c6"/>
+ <stop offset="1" stop-color="#1c25d8"/>
+ </linearGradient>
+ <path d="m 44 16 l 8 -8 h 24 l 8 8 z m 0 0" fill="#c0bfbc"/>
+ <path d="m 52 8 l -8 8 v 16 h 8 z m 0 0" fill="#f6f5f4"/>
+ <path d="m 76 8 l 8 8 v 16 h -8 z m 0 0" fill="#f6f5f4"/>
+ <path d="m 16 72 h 96 c 4.417969 0 8 3.582031 8 8 v 28 c 0 4.417969 -3.582031 8 -8 8 h -96 c -4.417969 0 -8 -3.582031 -8 -8 v -28 c 0 -4.417969 3.582031 -8 8 -8 z m 0 0" fill="#deddda"/>
+ <path d="m 8 28 h 112 v 80 h -112 z m 0 0" fill="#e5e5e1"/>
+ <path d="m 8 68 h 112 v 40 h -112 z m 0 0" fill="#f6f5f4"/>
+ <path d="m 44 56 h 8 c 4.417969 0 8 3.582031 8 8 v 8 c 0 4.417969 -3.582031 8 -8 8 h -8 c -4.417969 0 -8 -3.582031 -8 -8 v -8 c 0 -4.417969 3.582031 -8 8 -8 z m 0 0" fill="url(#a)"/>
+ <path d="m 76 64 c -6.628906 0 -12 -5.371094 -12 -12 s 5.371094 -12 12 -12 s 12 5.371094 12 12 s -5.371094 12 -12 12 z m 0 0" fill="url(#b)"/>
+ <path d="m 82.789062 70.976562 l -17.578124 10.046876 c -1.070313 0.609374 -1.730469 1.746093 -1.730469 2.976562 s 0.660156 2.367188 1.730469 2.976562 l 17.578124 10.046876 c 1.078126 0.617187 2.402344 0.609374 3.476563 -0.011719 c 1.074219 -0.625 1.734375 -1.769531 1.734375 -3.011719 v -20 c 0 -1.242188 -0.660156 -2.386719 -1.734375 -3.011719 c -1.074219 -0.621093 -2.398437 -0.628906 -3.476563 -0.011719 z m 0 0" fill="url(#c)"/>
+</svg>
diff --git a/data/icons/hicolor/scalable/org.gnome.SoftwareDevel.svg b/data/icons/hicolor/scalable/org.gnome.SoftwareDevel.svg
new file mode 100644
index 0000000..113e867
--- /dev/null
+++ b/data/icons/hicolor/scalable/org.gnome.SoftwareDevel.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg height="128px" viewBox="0 0 128 128" width="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <linearGradient id="a" gradientUnits="userSpaceOnUse" x1="36" x2="60" y1="68" y2="68">
+ <stop offset="0" stop-color="#ed336c"/>
+ <stop offset="1" stop-color="#ffa348"/>
+ </linearGradient>
+ <linearGradient id="b" gradientTransform="matrix(0 1 -1 0 144 -32)" gradientUnits="userSpaceOnUse" x1="72" x2="96" y1="68" y2="68">
+ <stop offset="0" stop-color="#404ce6"/>
+ <stop offset="1" stop-color="#c061cb"/>
+ </linearGradient>
+ <linearGradient id="c" gradientUnits="userSpaceOnUse" x1="68.84919" x2="95.257637" y1="84" y2="84">
+ <stop offset="0" stop-color="#33d1c6"/>
+ <stop offset="1" stop-color="#1c25d8"/>
+ </linearGradient>
+ <clipPath id="d">
+ <rect height="128" width="128"/>
+ </clipPath>
+ <clipPath id="e">
+ <rect height="128" width="128"/>
+ </clipPath>
+ <filter id="f" height="100%" width="100%" x="0%" y="0%">
+ <feColorMatrix in="SourceGraphic" type="matrix" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"/>
+ </filter>
+ <mask id="g">
+ <g clip-path="url(#e)" filter="url(#f)">
+ <g clip-path="url(#d)">
+ <path d="m 44 16 l 8 -8 h 24 l 8 8 z m 0 0" fill="#c0bfbc"/>
+ <path d="m 52 8 l -8 8 v 16 h 8 z m 0 0" fill="#f6f5f4"/>
+ <path d="m 76 8 l 8 8 v 16 h -8 z m 0 0" fill="#f6f5f4"/>
+ <path d="m 16 72 h 96 c 4.417969 0 8 3.582031 8 8 v 28 c 0 4.417969 -3.582031 8 -8 8 h -96 c -4.417969 0 -8 -3.582031 -8 -8 v -28 c 0 -4.417969 3.582031 -8 8 -8 z m 0 0" fill="#deddda"/>
+ <path d="m 8 28 h 112 v 80 h -112 z m 0 0" fill="#e5e5e1"/>
+ <path d="m 8 68 h 112 v 40 h -112 z m 0 0" fill="#f6f5f4"/>
+ <path d="m 44 56 h 8 c 4.417969 0 8 3.582031 8 8 v 8 c 0 4.417969 -3.582031 8 -8 8 h -8 c -4.417969 0 -8 -3.582031 -8 -8 v -8 c 0 -4.417969 3.582031 -8 8 -8 z m 0 0" fill="url(#a)"/>
+ <path d="m 76 64 c -6.628906 0 -12 -5.371094 -12 -12 s 5.371094 -12 12 -12 s 12 5.371094 12 12 s -5.371094 12 -12 12 z m 0 0" fill="url(#b)"/>
+ <path d="m 82.789062 70.976562 l -17.578124 10.046876 c -1.070313 0.609374 -1.730469 1.746093 -1.730469 2.976562 s 0.660156 2.367188 1.730469 2.976562 l 17.578124 10.046876 c 1.078126 0.617187 2.402344 0.609374 3.476563 -0.011719 c 1.074219 -0.625 1.734375 -1.769531 1.734375 -3.011719 v -20 c 0 -1.242188 -0.660156 -2.386719 -1.734375 -3.011719 c -1.074219 -0.621093 -2.398437 -0.628906 -3.476563 -0.011719 z m 0 0" fill="url(#c)"/>
+ </g>
+ </g>
+ </mask>
+ <mask id="h">
+ <g filter="url(#f)">
+ <rect fill-opacity="0.8" height="128" width="128"/>
+ </g>
+ </mask>
+ <linearGradient id="i" gradientTransform="matrix(0 0.37 -0.98462 0 295.38501 -30.360001)" gradientUnits="userSpaceOnUse" x1="300" x2="428" y1="235" y2="235">
+ <stop offset="0" stop-color="#f9f06b"/>
+ <stop offset="1" stop-color="#f5c211"/>
+ </linearGradient>
+ <clipPath id="j">
+ <rect height="128" width="128"/>
+ </clipPath>
+ <clipPath id="k">
+ <rect height="128" width="128"/>
+ </clipPath>
+ <path d="m 44 16 l 8 -8 h 24 l 8 8 z m 0 0" fill="#c0bfbc"/>
+ <path d="m 52 8 l -8 8 v 16 h 8 z m 0 0" fill="#f6f5f4"/>
+ <path d="m 76 8 l 8 8 v 16 h -8 z m 0 0" fill="#f6f5f4"/>
+ <path d="m 16 72 h 96 c 4.417969 0 8 3.582031 8 8 v 28 c 0 4.417969 -3.582031 8 -8 8 h -96 c -4.417969 0 -8 -3.582031 -8 -8 v -28 c 0 -4.417969 3.582031 -8 8 -8 z m 0 0" fill="#deddda"/>
+ <path d="m 8 28 h 112 v 80 h -112 z m 0 0" fill="#e5e5e1"/>
+ <path d="m 8 68 h 112 v 40 h -112 z m 0 0" fill="#f6f5f4"/>
+ <path d="m 44 56 h 8 c 4.417969 0 8 3.582031 8 8 v 8 c 0 4.417969 -3.582031 8 -8 8 h -8 c -4.417969 0 -8 -3.582031 -8 -8 v -8 c 0 -4.417969 3.582031 -8 8 -8 z m 0 0" fill="url(#a)"/>
+ <path d="m 76 64 c -6.628906 0 -12 -5.371094 -12 -12 s 5.371094 -12 12 -12 s 12 5.371094 12 12 s -5.371094 12 -12 12 z m 0 0" fill="url(#b)"/>
+ <path d="m 82.789062 70.976562 l -17.578124 10.046876 c -1.070313 0.609374 -1.730469 1.746093 -1.730469 2.976562 s 0.660156 2.367188 1.730469 2.976562 l 17.578124 10.046876 c 1.078126 0.617187 2.402344 0.609374 3.476563 -0.011719 c 1.074219 -0.625 1.734375 -1.769531 1.734375 -3.011719 v -20 c 0 -1.242188 -0.660156 -2.386719 -1.734375 -3.011719 c -1.074219 -0.621093 -2.398437 -0.628906 -3.476563 -0.011719 z m 0 0" fill="url(#c)"/>
+ <g clip-path="url(#k)" mask="url(#g)">
+ <g clip-path="url(#j)" mask="url(#h)">
+ <path d="m 128 80.640625 v 47.359375 h -128 v -47.359375 z m 0 0" fill="url(#i)"/>
+ <path d="m 13.308594 80.640625 l 47.355468 47.359375 h 21.214844 l -47.359375 -47.359375 z m 42.421875 0 l 47.363281 47.359375 h 21.214844 l -47.363282 -47.359375 z m 42.429687 0 l 29.839844 29.839844 v -21.210938 l -8.628906 -8.628906 z m -98.160156 7.90625 v 21.214844 l 18.238281 18.238281 h 21.214844 z m 0 0"/>
+ </g>
+ </g>
+</svg>
diff --git a/data/icons/hicolor/symbolic/app-remove-symbolic.svg b/data/icons/hicolor/symbolic/app-remove-symbolic.svg
new file mode 100644
index 0000000..734827e
--- /dev/null
+++ b/data/icons/hicolor/symbolic/app-remove-symbolic.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M13 5v9H4V5H2v9c0 2 2 2 2 2h9c2 0 2-2 2-2V5zM9 6H8v6h1zM7 6H6v6h1zm4 0h-1v6h1zm1-6c2 0 2 2 2 2h2v2H1V2h2c0-2 2-2 2-2zm0 1H5v1h7z" fill="#474747"/></svg> \ No newline at end of file
diff --git a/data/icons/hicolor/symbolic/org.gnome.Software-symbolic.svg b/data/icons/hicolor/symbolic/org.gnome.Software-symbolic.svg
new file mode 100644
index 0000000..8311292
--- /dev/null
+++ b/data/icons/hicolor/symbolic/org.gnome.Software-symbolic.svg
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg">
+ <path d="m 1 4 v 8 c 0 1.109375 0.890625 2 2 2 h 10 c 1.109375 0 2 -0.890625 2 -2 v -8 z m 7 1.75 c 0.691406 0 1.25 0.558594 1.25 1.25 s -0.558594 1.25 -1.25 1.25 s -1.25 -0.558594 -1.25 -1.25 s 0.558594 -1.25 1.25 -1.25 z m -2 3 c 0.691406 0 1.25 0.558594 1.25 1.25 s -0.558594 1.25 -1.25 1.25 s -1.25 -0.558594 -1.25 -1.25 s 0.558594 -1.25 1.25 -1.25 z m 4 0 c 0.691406 0 1.25 0.558594 1.25 1.25 s -0.558594 1.25 -1.25 1.25 s -1.25 -0.558594 -1.25 -1.25 s 0.558594 -1.25 1.25 -1.25 z m 0 0"/>
+ <path d="m 6 1 l -1 1 v 3 h 2 v -3 h 2 v 3 h 2 v -3 l -1 -1 z m 0 0"/>
+</svg>
diff --git a/data/icons/meson.build b/data/icons/meson.build
new file mode 100644
index 0000000..13ca713
--- /dev/null
+++ b/data/icons/meson.build
@@ -0,0 +1 @@
+subdir('hicolor')
diff --git a/data/icons/money-none-symbolic.svg b/data/icons/money-none-symbolic.svg
new file mode 100644
index 0000000..9e74edf
--- /dev/null
+++ b/data/icons/money-none-symbolic.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path style="fill:#2e3436" d="m1.531.469-1.06 1.06L2.85 3.91l1.41 1.418a.985.985 0 0 1 .005-.004L5.94 7h-.003L9 10.063v-.004l.941.941h-.004l1.868 1.867h.004l2.662 2.662 1.06-1.06-2.396-2.397c.53-.537.861-1.268.861-2.076A3.01 3.01 0 0 0 11 7H9V5h4V3H9V1H7v2H5c-.281 0-.557.042-.82.117L1.53.47zM6.063 5H7v.938L6.062 5zm-3.97.277A2.99 2.99 0 0 0 5 8.992v.012h.82L2.094 5.277zM10.064 9H11a.98.98 0 0 1 .996.996.994.994 0 0 1-.26.678L10.062 9zM7 10.184V11H3v2h4v2h2v-2h.82L7 10.184z"/></svg> \ No newline at end of file
diff --git a/data/icons/money-symbolic.svg b/data/icons/money-symbolic.svg
new file mode 100644
index 0000000..0c06a39
--- /dev/null
+++ b/data/icons/money-symbolic.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M7 1v2H5a2.996 2.996 0 0 0 0 5.992v.012h2v2H3v2h4v2h2v-2h2v-.012a3.01 3.01 0 0 0 2.996-2.996A3.01 3.01 0 0 0 11 7H9V5h4V3H9V1zM5.04 5H7v2H5.105a9.66 9.66 0 0 1-.109-.012.992.992 0 0 1-.863-1.492c.18-.309.504-.5.863-.5a.08.08 0 0 0 .043 0zM9 9h2c.563 0 .996.434.996.996s-.434.996-.996.996l-2 .012zm0 0" fill="#2e3436"/></svg> \ No newline at end of file
diff --git a/data/icons/nudity-none-symbolic.svg b/data/icons/nudity-none-symbolic.svg
new file mode 100644
index 0000000..410fbb3
--- /dev/null
+++ b/data/icons/nudity-none-symbolic.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path style="fill:#2e3436" d="m1.531.469-1.06 1.06 2.498 2.498v.004l5.785 5.782.744.744s-.002 0-.002.002l1.473 1.472v-.004l3.502 3.502 1.06-1.06-3.111-3.112c.634-.634 1.049-1.67 1.049-2.845 0-1.933-1.117-3.5-2.5-3.5v-4h-8v.894L1.53.47zM6.97 4.512c.883 0 1.652.504 2.176 1.234.523.73.824 1.703.824 2.766 0 .128-.006.254-.016.379L8.92 7.857c-.091-.602-.304-1.132-.588-1.529-.383-.539-.86-.816-1.363-.816a.501.501 0 0 1 0-1zm-4 1.644v9.856h4v-4.45l.363-.105c.207-.059.415-.172.606-.336l-4.97-4.965zm5.586 5.582a3.042 3.042 0 0 1-.586.387v3.887h3v-1.856l-2.414-2.418z"/></svg> \ No newline at end of file
diff --git a/data/icons/nudity-symbolic.svg b/data/icons/nudity-symbolic.svg
new file mode 100644
index 0000000..6d7865c
--- /dev/null
+++ b/data/icons/nudity-symbolic.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M2.969 1.012v15h4v-4.45l.363-.105c.84-.234 1.637-1.422 1.637-2.945 0-.871-.254-1.649-.637-2.184-.383-.539-.86-.816-1.363-.816a.501.501 0 0 1 0-1c.883 0 1.652.504 2.176 1.234.523.73.824 1.703.824 2.766 0 1.668-.809 3.023-2 3.613v3.887h3v-4c1.383 0 2.5-1.567 2.5-3.5 0-1.934-1.117-3.5-2.5-3.5v-4zm0 0" fill="#2e3436"/></svg> \ No newline at end of file
diff --git a/data/icons/org.gnome.Software.Create.svg b/data/icons/org.gnome.Software.Create.svg
new file mode 100644
index 0000000..234a6f7
--- /dev/null
+++ b/data/icons/org.gnome.Software.Create.svg
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg height="128px" viewBox="0 0 128 128" width="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <linearGradient id="a" gradientTransform="matrix(0.25 0 0 0.244048 -0.499619 50.195877)" gradientUnits="userSpaceOnUse" x1="48" x2="464" y1="44" y2="44">
+ <stop offset="0" stop-color="#babdb6"/>
+ <stop offset="0.0416667" stop-color="#f6f5f4"/>
+ <stop offset="0.0833333" stop-color="#d5d3cf"/>
+ <stop offset="0.916667" stop-color="#deddda"/>
+ <stop offset="0.958333" stop-color="#f6f5f4"/>
+ <stop offset="1" stop-color="#babdb6"/>
+ </linearGradient>
+ <linearGradient id="b" gradientTransform="matrix(-0.471598 0 0 0.471598 569.325439 -130.366928)" gradientUnits="userSpaceOnUse" x1="953.275024" x2="944.207458" y1="350.855988" y2="359.923553">
+ <stop offset="0" stop-color="#e9b96e"/>
+ <stop offset="1" stop-color="#dc9321"/>
+ </linearGradient>
+ <linearGradient id="c" gradientTransform="matrix(-0.358336 0 0 0.358336 230.872086 1.097)" gradientUnits="userSpaceOnUse" x1="418.838409" x2="433.349823" y1="227" y2="212.868271">
+ <stop offset="0" stop-color="#9a9996"/>
+ <stop offset="0.415508" stop-color="#c0bfbc"/>
+ <stop offset="1" stop-color="#deddda"/>
+ </linearGradient>
+ <radialGradient id="d" cx="450.948059" cy="225.394623" gradientTransform="matrix(-0.658592 0 0 0.658592 370.111938 -72.351868)" gradientUnits="userSpaceOnUse" r="39.999989">
+ <stop offset="0" stop-color="#5b5b5b"/>
+ <stop offset="0.634455" stop-color="#262e39"/>
+ <stop offset="1" stop-color="#113f78"/>
+ </radialGradient>
+ <filter id="e" height="100%" width="100%" x="0%" y="0%">
+ <feColorMatrix in="SourceGraphic" type="matrix" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"/>
+ </filter>
+ <mask id="f">
+ <g filter="url(#e)">
+ <rect fill-opacity="0.3" height="128" width="128"/>
+ </g>
+ </mask>
+ <clipPath id="g">
+ <rect height="152" width="192"/>
+ </clipPath>
+ <linearGradient id="h" gradientUnits="userSpaceOnUse" x1="19.25" x2="54.820038" y1="55.999985" y2="91.570023">
+ <stop offset="0" stop-color="#dc8add"/>
+ <stop offset="1" stop-color="#103c72"/>
+ </linearGradient>
+ <radialGradient id="i" cx="67.502945" cy="244.504639" gradientTransform="matrix(1.001091 -0.00000013 0.00000014 0.81247 -0.576645 -108.652573)" gradientUnits="userSpaceOnUse" r="11.077337">
+ <stop offset="0" stop-color="#113f78" stop-opacity="0"/>
+ <stop offset="0.786035" stop-color="#113f78" stop-opacity="0.105882"/>
+ <stop offset="1" stop-color="#103c72"/>
+ </radialGradient>
+ <mask id="j">
+ <g filter="url(#e)">
+ <rect fill-opacity="0.2" height="128" width="128"/>
+ </g>
+ </mask>
+ <clipPath id="k">
+ <rect height="152" width="192"/>
+ </clipPath>
+ <path d="m 24 123 v 1 h 16 v -1 z m 64 0 v 1 h 16 v -1 z m 0 0" fill="#9a9996"/>
+ <path d="m 88 124 v -4 l -24 -96 v 4 z" fill="#77767b" fill-rule="evenodd"/>
+ <path d="m 40 124 v -4 l 24 -96 v 4 z" fill="#77767b" fill-rule="evenodd"/>
+ <path d="m 64 4 c -2.90625 0.003906 -5.417969 2.027344 -6.039062 4.867188 l -0.003907 -0.003907 l -33.957031 114.136719 h 16 l 24 -101 l 24 101 h 16 l -33.992188 -114.285156 l -0.007812 0.011718 c -0.671875 -2.773437 -3.148438 -4.722656 -6 -4.726562 z m 0 5 c 1.65625 0 3 1.34375 3 3 s -1.34375 3 -3 3 s -3 -1.34375 -3 -3 s 1.34375 -3 3 -3 z m 0 0" fill="#c0bfbc"/>
+ <path d="m 20 30 h 88 c 4.417969 0 8 3.582031 8 8 v 66 c 0 4.417969 -3.582031 8 -8 8 h -88 c -4.417969 0 -8 -3.582031 -8 -8 v -66 c 0 -4.417969 3.582031 -8 8 -8 z m 0 0" fill="url(#a)"/>
+ <path d="m 20 20 h 88 c 4.417969 0 8 3.582031 8 8 v 72 c 0 4.417969 -3.582031 8 -8 8 h -88 c -4.417969 0 -8 -3.582031 -8 -8 v -72 c 0 -4.417969 3.582031 -8 8 -8 z m 0 0" fill="#f6f5f4"/>
+ <path d="m 128 36 l -48.90625 48.910156 c -2.199219 2.285156 -5.84375 2.324219 -8.085938 0.082032 c -2.242187 -2.242188 -2.203124 -5.886719 0.082032 -8.085938 l 41.132812 -41.132812 c 4.898438 -4.203126 11.777344 -3.773438 15.777344 0.226562 z m 0 0" fill="url(#b)"/>
+ <path d="m 90.683594 59.585938 c 5.148437 0.003906 7.6875 6.257812 3.996094 9.847656 l -19.066407 21.058594 c -2.785156 2.828124 -7.339843 2.847656 -10.144531 0.039062 c -2.804688 -2.804688 -2.785156 -7.359375 0.042969 -10.140625 l 21.058593 -19.066406 c 1.078126 -1.113281 2.5625 -1.738281 4.113282 -1.738281 z m 0 0" fill="url(#c)"/>
+ <path d="m 72 68 c 8.835938 0 16 7.164062 16 16 s -7.164062 16 -16 16 h -16 v -16 c 0 -8.835938 7.164062 -16 16 -16 z m 0 0" fill="url(#d)"/>
+ <g clip-path="url(#g)" mask="url(#f)" transform="matrix(1 0 0 1 -8 -16)">
+ <path d="m 72.003906 95 c 0 -1.65625 1.339844 -2.996094 2.996094 -2.996094 s 2.996094 1.339844 2.996094 2.996094 s -1.339844 2.996094 -2.996094 2.996094 s -2.996094 -1.339844 -2.996094 -2.996094 z m 0 0" fill="#ffffff"/>
+ </g>
+ <path d="m 12 39.867188 v 24 c 2.003906 -1.125 4.425781 -1.488282 6.671875 -1.003907 s 4.304687 1.8125 5.667969 3.664063 c 1.761718 2.390625 2.3125 5.460937 2.457031 8.429687 c 0.144531 2.964844 -0.066406 5.957031 0.394531 8.894531 c 0.628906 3.996094 2.539063 7.792969 5.410156 10.648438 c 2.867188 2.855469 6.6875 4.753906 10.703126 5.269531 c 2.609374 0.335938 5.253906 0.203125 7.886718 0.210938 l 4.808594 0.019531 c 0 -0.441406 0 -0.886719 0 -1.328125 c 0 -0.222656 0 -0.449219 0 -0.671875 c -2.035156 -0.476562 -4.085938 -0.863281 -6.15625 -1.160156 c -1.339844 -0.191406 -2.695312 -0.34375 -3.996094 -0.734375 c -1.300781 -0.386719 -2.5625 -1.023438 -3.460937 -2.039063 c -0.757813 -0.855468 -1.226563 -1.941406 -1.429688 -3.066406 c -0.207031 -1.121094 -0.152343 -2.28125 0.046875 -3.402344 c 0.40625 -2.246094 1.390625 -4.339844 2.132813 -6.5 c 2.398437 -6.988281 2.167969 -14.796875 -0.375 -21.730468 c -2.804688 -7.644532 -8.546875 -14.3125 -16.011719 -17.5625 c -4.605469 -2.007813 -9.78125 -2.6875 -14.75 -1.9375 z m 0 0" fill="url(#h)"/>
+ <path d="m 46.90625 96.375 l 4.285156 3.605469 l 18.808594 0.019531 l -2 -3 c -3.144531 -4.714844 -9.132812 -9 -12 -9 c 0 6 -5.5625 9.097656 -9.09375 8.375 z m 0 0" fill="url(#i)"/>
+ <g clip-path="url(#k)" mask="url(#j)" transform="matrix(1 0 0 1 -8 -16)">
+ <path d="m 35 128 l -0.621094 2 h 16.054688 l 0.523437 -1.972656 z m 57.988281 0 l 0.5 2 h 16.132813 l -0.621094 -2 z m 0 0"/>
+ </g>
+</svg>
diff --git a/data/icons/org.gnome.Software.Develop.svg b/data/icons/org.gnome.Software.Develop.svg
new file mode 100644
index 0000000..78792bb
--- /dev/null
+++ b/data/icons/org.gnome.Software.Develop.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg height="128px" viewBox="0 0 128 128" width="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <linearGradient id="a" gradientUnits="userSpaceOnUse" x1="12" x2="116" y1="64" y2="64">
+ <stop offset="0" stop-color="#77767b"/>
+ <stop offset="0.05" stop-color="#c0bfbc"/>
+ <stop offset="0.1" stop-color="#9a9996"/>
+ <stop offset="0.899999" stop-color="#9a9996"/>
+ <stop offset="0.95" stop-color="#c0bfbc"/>
+ <stop offset="1" stop-color="#77767b"/>
+ </linearGradient>
+ <filter id="b" height="100%" width="100%" x="0%" y="0%">
+ <feColorMatrix in="SourceGraphic" type="matrix" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"/>
+ </filter>
+ <mask id="c">
+ <g filter="url(#b)">
+ <rect fill-opacity="0.05" height="128" width="128"/>
+ </g>
+ </mask>
+ <radialGradient id="d" cx="63.999996" cy="194.190475" gradientTransform="matrix(4.727273 -0.00000079 0.0000003 1.636364 -230.545471 -205.766182)" gradientUnits="userSpaceOnUse" r="44">
+ <stop offset="0" stop-color="#ffffff"/>
+ <stop offset="1" stop-color="#ffffff" stop-opacity="0.094118"/>
+ </radialGradient>
+ <clipPath id="e">
+ <rect height="152" width="192"/>
+ </clipPath>
+ <path d="m 20 22 h 88 c 4.417969 0 8 3.582031 8 8 v 78 c 0 4.417969 -3.582031 8 -8 8 h -88 c -4.417969 0 -8 -3.582031 -8 -8 v -78 c 0 -4.417969 3.582031 -8 8 -8 z m 0 0" fill="url(#a)"/>
+ <path d="m 20 12 h 88 c 4.417969 0 8 3.582031 8 8 v 80 c 0 4.417969 -3.582031 8 -8 8 h -88 c -4.417969 0 -8 -3.582031 -8 -8 v -80 c 0 -4.417969 3.582031 -8 8 -8 z m 0 0" fill="#deddda"/>
+ <path d="m 20 104 h 88 c 2.210938 0 4 -1.789062 4 -4 v -80 c 0 -2.210938 -1.789062 -4 -4 -4 h -88 c -2.210938 0 -4 1.789062 -4 4 v 80 c 0 2.210938 1.789062 4 4 4 z m 0 0" fill="#241f31"/>
+ <g clip-path="url(#e)" mask="url(#c)" transform="matrix(1 0 0 1 -8 -16)">
+ <path d="m 116 116 h -88 v -78 h 88 z m 0 0" fill="url(#d)"/>
+ </g>
+ <path d="m 24 28 h 28 v 4 h -28 z m 0 0" fill="#ff7800"/>
+ <path d="m 24 36 h 16 v 4 h -16 z m 0 0" fill="#deddda"/>
+ <path d="m 32 44 h 42 v 4 h -42 z m 0 0" fill="#3584e4"/>
+ <path d="m 32 52 h 22 v 4 h -22 z m 0 0" fill="#deddda"/>
+ <path d="m 40 60 h 36 v 4 h -36 z m 0 0" fill="#deddda"/>
+ <path d="m 40 68 h 20 v 4 h -20 z m 0 0" fill="#8ff0a4"/>
+ <path d="m 48 76 h 24 v 4 h -24 z m 0 0" fill="#ff7800"/>
+ <path d="m 24 84 h 32 v 4 h -32 z m 0 0" fill="#deddda"/>
+ <path d="m 24 92 h 18 v 4 h -18 z m 0 0" fill="#3584e4"/>
+ <path d="m 32 76 h 14 v 4 h -14 z m 0 0" fill="#8ff0a4"/>
+ <path d="m 62 68 h 20 v 4 h -20 z m 0 0" fill="#deddda"/>
+ <path d="m 78 60 h 18 v 4 h -18 z m 0 0" fill="#3584e4"/>
+</svg>
diff --git a/data/icons/org.gnome.Software.Learn.svg b/data/icons/org.gnome.Software.Learn.svg
new file mode 100644
index 0000000..7ad3721
--- /dev/null
+++ b/data/icons/org.gnome.Software.Learn.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg height="128px" viewBox="0 0 128 128" width="128px" xmlns="http://www.w3.org/2000/svg">
+ <path d="m 64 4 l 60 100 h -120 z m 0 0" fill="#f6f5f4"/>
+ <path d="m 64 5.503906 v 90.496094 h 8 z m 0 0" fill="#c0bfbc"/>
+ <path d="m 69.878906 72 l -5.878906 12 l 8 20 h 52 l -18.773438 -31.875 z m 0 0" fill="#f6f5f4"/>
+ <path d="m 64 5.503906 v 90.496094 h -8 z m 0 0" fill="#deddda"/>
+ <path d="m 23.199219 72 l -19.199219 32 h 52 l 8 -20 l -5.878906 -12 z m 0 0" fill="#f6f5f4"/>
+ <path d="m 58.121094 72 l 5.878906 12 v 44 l -8 -24 z m 0 0" fill="#deddda"/>
+ <path d="m 69.878906 72 l -5.878906 12 v 44 l 8 -24 z m 0 0" fill="#c0bfbc"/>
+</svg>
diff --git a/data/icons/org.gnome.Software.Play.svg b/data/icons/org.gnome.Software.Play.svg
new file mode 100644
index 0000000..67fe0dd
--- /dev/null
+++ b/data/icons/org.gnome.Software.Play.svg
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg height="128px" viewBox="0 0 128 128" width="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <linearGradient id="a" gradientUnits="userSpaceOnUse">
+ <stop offset="0" stop-color="#9a9996"/>
+ <stop offset="1" stop-color="#9a9996" stop-opacity="0"/>
+ </linearGradient>
+ <linearGradient id="b" gradientTransform="matrix(0 -1.333333 -1.333333 0 414.662385 134.674892)" x1="38" x2="50" xlink:href="#a" y1="248" y2="248"/>
+ <linearGradient id="c" gradientTransform="matrix(0 -1.333333 -1.333333 0 374.778504 134.674892)" x1="38" x2="50" xlink:href="#a" y1="248" y2="248"/>
+ <path d="m 89.175781 41.980469 l 6.082031 7.5625 l 22.648438 -4.671875 l 9.875 47.90625 c 1.488281 7.234375 -2.171875 14.546875 -8.851562 17.695312 c -6.679688 3.148438 -14.648438 1.316406 -19.28125 -4.433594 l -35.40625 -44 z m 0 0" fill="#deddda"/>
+ <path d="m 39.175781 41.980469 l -6.082031 7.5625 l -22.648438 -4.671875 l -9.875 47.90625 c -1.488281 7.234375 2.171876 14.546875 8.851563 17.695312 c 6.679687 3.148438 14.648437 1.316406 19.28125 -4.433594 l 35.40625 -44 z m 0 0" fill="#deddda"/>
+ <path d="m 41.113281 28.007812 h 46 v 32 h -46 z m 0 0" fill="#deddda"/>
+ <path d="m 60.445312 59.289062 l -31.984374 39.75 c -3.859376 4.78125 -10.117188 6.929688 -16.101563 5.527344 s -10.632813 -6.105468 -11.96875 -12.105468 l -0.066406 0.316406 c -1.484375 7.234375 2.171875 14.546875 8.855469 17.695312 c 6.679687 3.148438 14.648437 1.316406 19.28125 -4.433594 l 35.402343 -44 z m 7.101563 0 l -3.421875 2.75 l 35.40625 44 c 4.632812 5.75 12.601562 7.582032 19.28125 4.433594 c 6.683594 -3.148437 10.339844 -10.460937 8.851562 -17.695312 l -0.0625 -0.316406 c -1.335937 6 -5.988281 10.703124 -11.96875 12.105468 c -5.984374 1.402344 -12.242187 -0.746094 -16.101562 -5.527344 z m 0 0" fill="#5e5c64" fill-opacity="0.235294"/>
+ <g fill="#c0bfbc">
+ <path d="m 54.113281 49.007812 c 0 12.152344 -9.851562 22 -22 22 c -12.152343 0 -22 -9.847656 -22 -22 c 0 -12.148437 9.847657 -22 22 -22 c 12.148438 0 22 9.851563 22 22 z m 0 0"/>
+ <path d="m 46.113281 32.007812 h 36 v 52 h -36 z m 0 0"/>
+ <path d="m 118.113281 49.007812 c 0 12.152344 -9.851562 22 -22 22 c -12.152343 0 -22 -9.847656 -22 -22 c 0 -12.148437 9.847657 -22 22 -22 c 12.148438 0 22 9.851563 22 22 z m 0 0"/>
+ <path d="m 57.996094 80.007812 c 0 7.667969 -6.214844 13.882813 -13.882813 13.882813 s -13.886719 -6.214844 -13.886719 -13.882813 c 0 -7.667968 6.21875 -13.882812 13.886719 -13.882812 s 13.882813 6.214844 13.882813 13.882812 z m 0 0"/>
+ <path d="m 97.996094 80.007812 c 0 7.667969 -6.214844 13.882813 -13.882813 13.882813 s -13.886719 -6.214844 -13.886719 -13.882813 c 0 -7.667968 6.21875 -13.882812 13.886719 -13.882812 s 13.882813 6.214844 13.882813 13.882812 z m 0 0"/>
+ </g>
+ <path d="m 46.113281 32.007812 h 36 v 48 h -36 z m 0 0" fill="#f6f5f4"/>
+ <path d="m 57.996094 78.007812 c 0 7.667969 -6.214844 13.882813 -13.882813 13.882813 s -13.886719 -6.214844 -13.886719 -13.882813 c 0 -7.667968 6.21875 -13.882812 13.886719 -13.882812 s 13.882813 6.214844 13.882813 13.882812 z m 0 0" fill="#f6f5f4"/>
+ <path d="m 97.996094 78.007812 c 0 7.667969 -6.214844 13.882813 -13.882813 13.882813 s -13.886719 -6.214844 -13.886719 -13.882813 c 0 -7.667968 6.21875 -13.882812 13.886719 -13.882812 s 13.882813 6.214844 13.882813 13.882812 z m 0 0" fill="#f6f5f4"/>
+ <path d="m 54.113281 47.007812 c 0 12.152344 -9.851562 22 -22 22 c -12.152343 0 -22 -9.847656 -22 -22 c 0 -12.148437 9.847657 -22 22 -22 c 12.148438 0 22 9.851563 22 22 z m 0 0" fill="#f6f5f4"/>
+ <path d="m 118.113281 47.007812 c 0 12.152344 -9.851562 22 -22 22 c -12.152343 0 -22 -9.847656 -22 -22 c 0 -12.148437 9.847657 -22 22 -22 c 12.148438 0 22 9.851563 22 22 z m 0 0" fill="#f6f5f4"/>
+ <path d="m 29.996094 36.007812 c -1.109375 0 -2 0.890626 -2 2 v 6 h -6 c -1.109375 0 -2 0.890626 -2 2 v 4 c 0 1.109376 0.890625 2 2 2 h 6 v 6 c 0 1.109376 0.890625 2 2 2 h 4 c 1.109375 0 2 -0.890624 2 -2 v -6 h 6 c 1.109375 0 2 -0.890624 2 -2 v -4 c 0 -1.109374 -0.890625 -2 -2 -2 h -6 v -6 c 0 -1.109374 -0.890625 -2 -2 -2 z m 0 0" fill="#3d3846"/>
+ <path d="m 29.996094 34.007812 c -1.109375 0 -2 0.890626 -2 2 v 6 h -6 c -1.109375 0 -2 0.890626 -2 2 v 4 c 0 1.109376 0.890625 2 2 2 h 6 v 6 c 0 1.109376 0.890625 2 2 2 h 4 c 1.109375 0 2 -0.890624 2 -2 v -6 h 6 c 1.109375 0 2 -0.890624 2 -2 v -4 c 0 -1.109374 -0.890625 -2 -2 -2 h -6 v -6 c 0 -1.109374 -0.890625 -2 -2 -2 z m 0 0" fill="#5e5c64"/>
+ <path d="m 109.996094 50.007812 v 2 c 0 3.324219 -2.675782 6 -6 6 c -3.324219 0 -6 -2.675781 -6 -6 v -2 z m 0 0" fill="#c01c28"/>
+ <path d="m 97.996094 50.007812 c 0 3.3125 2.6875 6 6 6 s 6 -2.6875 6 -6 s -2.6875 -6 -6 -6 s -6 2.6875 -6 6 z m 0 0" fill="#ed333b"/>
+ <path d="m 93.996094 42.007812 v 2 c 0 3.324219 -2.675782 6 -6 6 c -3.324219 0 -6 -2.675781 -6 -6 v -2 z m 0 0" fill="#1a5fb4"/>
+ <path d="m 81.996094 42.007812 c 0 3.3125 2.6875 6 6 6 s 6 -2.6875 6 -6 s -2.6875 -6 -6 -6 s -6 2.6875 -6 6 z m 0 0" fill="#3584e4"/>
+ <path d="m 54.113281 78.007812 c 0 5.523438 -4.480469 10 -10 10 c -5.523437 0 -10 -4.476562 -10 -10 c 0 -5.523437 4.476563 -10 10 -10 c 5.519531 0 10 4.476563 10 10 z m 0 0" fill="#241f31"/>
+ <path d="m 94.113281 78.007812 c 0 5.523438 -4.480469 10 -10 10 c -5.523437 0 -10 -4.476562 -10 -10 c 0 -5.523437 4.476563 -10 10 -10 c 5.519531 0 10 4.476563 10 10 z m 0 0" fill="#241f31"/>
+ <path d="m 54.113281 76.007812 c 0 5.523438 -4.480469 10 -10 10 c -5.523437 0 -10 -4.476562 -10 -10 c 0 -5.523437 4.476563 -10 10 -10 c 5.519531 0 10 4.476563 10 10 z m 0 0" fill="#3d3846"/>
+ <path d="m 94.113281 76.007812 c 0 5.523438 -4.480469 10 -10 10 c -5.523437 0 -10 -4.476562 -10 -10 c 0 -5.523437 4.476563 -10 10 -10 c 5.519531 0 10 4.476563 10 10 z m 0 0" fill="#3d3846"/>
+ <path d="m 83.996094 68.007812 c -4.417969 0 -8 3.582032 -8 8 c 0 4.417969 3.582031 8 8 8 c 4.417968 0 8 -3.582031 8 -8 c 0 -4.417968 -3.582032 -8 -8 -8 z m 0 0" fill="url(#b)"/>
+ <path d="m 44.113281 68.007812 c -4.417969 0 -8 3.582032 -8 8 c 0 4.417969 3.582031 8 8 8 s 8 -3.582031 8 -8 c 0 -4.417968 -3.582031 -8 -8 -8 z m 0 0" fill="url(#c)"/>
+</svg>
diff --git a/data/icons/org.gnome.Software.Socialize.svg b/data/icons/org.gnome.Software.Socialize.svg
new file mode 100644
index 0000000..7c74f8e
--- /dev/null
+++ b/data/icons/org.gnome.Software.Socialize.svg
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg height="128px" viewBox="0 0 128 128" width="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <radialGradient id="a" cx="64" cy="40" gradientUnits="userSpaceOnUse" r="60">
+ <stop offset="0" stop-color="#f8e45c"/>
+ <stop offset="1" stop-color="#f5c211"/>
+ </radialGradient>
+ <linearGradient id="b" gradientUnits="userSpaceOnUse">
+ <stop offset="0" stop-color="#f66151"/>
+ <stop offset="0.6" stop-color="#e6272f"/>
+ <stop offset="1" stop-color="#e01b24"/>
+ </linearGradient>
+ <radialGradient id="c" cx="52" cy="29.856375" gradientTransform="matrix(0.776974 0 0 0.621716 11.597331 20.590141)" r="16.084499" xlink:href="#b"/>
+ <radialGradient id="d" cx="52" cy="29.856375" gradientTransform="matrix(0.776974 0 0 0.621716 51.597511 20.590141)" r="16.084499" xlink:href="#b"/>
+ <path d="m 124 64 c 0 33.136719 -26.863281 60 -60 60 s -60 -26.863281 -60 -60 s 26.863281 -60 60 -60 s 60 26.863281 60 60 z m 0 0" fill="url(#a)"/>
+ <path d="m 123.824219 59.539062 c -1.871094 31.679688 -28.089844 56.421876 -59.824219 56.460938 c -31.402344 -0.003906 -57.488281 -24.222656 -59.824219 -55.539062 c -0.09375 1.175781 -0.152343 2.359374 -0.175781 3.539062 c 0 33.136719 26.863281 60 60 60 s 60 -26.863281 60 -60 c -0.003906 -1.488281 -0.0625 -2.976562 -0.175781 -4.460938 z m 0 0" fill="#e5a50a"/>
+ <path d="m 71.632812 64.992188 c 0 2.503906 -1.457031 4.816406 -3.816406 6.066406 c -2.363281 1.253906 -5.269531 1.253906 -7.632812 0 c -2.359375 -1.25 -3.816406 -3.5625 -3.816406 -6.066406" fill="none" stroke="#3d3846" stroke-linecap="round" stroke-linejoin="round" stroke-width="4"/>
+ <path d="m 51.910156 31.996094 c -2.082031 0.058594 -4.0625 0.929687 -5.515625 2.425781 l -2.34375 2.34375 l -2.34375 -2.34375 c -1.507812 -1.546875 -3.578125 -2.421875 -5.738281 -2.421875 c -3.257812 0 -6.1875 1.976562 -7.414062 4.992188 c -1.222657 3.019531 -0.496094 6.476562 1.839843 8.746093 l 10.832031 10.832031 v -0.007812 c 1.5625 1.5625 4.09375 1.5625 5.65625 0 l 10.824219 -10.824219 c 2.371094 -2.296875 3.085938 -5.8125 1.804688 -8.855469 c -1.285157 -3.039062 -4.300781 -4.980468 -7.601563 -4.886718 z m 0 0" fill="url(#c)"/>
+ <path d="m 91.914062 31.996094 c -2.085937 0.058594 -4.066406 0.929687 -5.519531 2.425781 l -2.34375 2.34375 l -2.34375 -2.34375 c -1.507812 -1.546875 -3.578125 -2.421875 -5.738281 -2.421875 c -3.257812 0 -6.1875 1.976562 -7.410156 4.992188 c -1.226563 3.019531 -0.5 6.476562 1.835937 8.746093 l 10.832031 10.832031 v -0.007812 c 1.5625 1.5625 4.09375 1.5625 5.65625 0 l 10.824219 -10.824219 c 2.371094 -2.296875 3.085938 -5.8125 1.804688 -8.855469 c -1.285157 -3.039062 -4.300781 -4.980468 -7.597657 -4.886718 z m 0 0" fill="url(#d)"/>
+ <g fill="#c01c28">
+ <path d="m 28.121094 38.492188 c -0.511719 2.644531 0.34375 5.367187 2.273437 7.246093 l 10.832031 10.832031 v -0.007812 c 1.5625 1.5625 4.09375 1.5625 5.65625 0 l 10.824219 -10.824219 c 1.933594 -1.875 2.792969 -4.597656 2.285157 -7.246093 c -0.308594 1.617187 -1.105469 3.101562 -2.285157 4.246093 l -10.824219 10.824219 c -1.5625 1.5625 -4.09375 1.5625 -5.65625 0 v 0.007812 l -10.832031 -10.832031 c -1.175781 -1.148437 -1.972656 -2.628906 -2.273437 -4.246093 z m 0 0"/>
+ <path d="m 68.121094 38.492188 c -0.511719 2.644531 0.34375 5.367187 2.273437 7.246093 l 10.832031 10.832031 v -0.007812 c 1.5625 1.5625 4.09375 1.5625 5.65625 0 l 10.824219 -10.824219 c 1.933594 -1.875 2.792969 -4.597656 2.285157 -7.246093 c -0.308594 1.617187 -1.105469 3.101562 -2.285157 4.246093 l -10.824219 10.824219 c -1.5625 1.5625 -4.09375 1.5625 -5.65625 0 v 0.007812 l -10.832031 -10.832031 c -1.175781 -1.148437 -1.972656 -2.628906 -2.273437 -4.246093 z m 0 0"/>
+ </g>
+</svg>
diff --git a/data/icons/org.gnome.Software.Work.svg b/data/icons/org.gnome.Software.Work.svg
new file mode 100644
index 0000000..46433a4
--- /dev/null
+++ b/data/icons/org.gnome.Software.Work.svg
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg height="128px" viewBox="0 0 128 128" width="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <linearGradient id="a" gradientUnits="userSpaceOnUse" x1="20.00001801213" x2="108.00010899163" y1="88.00001906939" y2="88.00001906939">
+ <stop offset="0" stop-color="#1a5fb4"/>
+ <stop offset="0.0340909" stop-color="#1c71d8"/>
+ <stop offset="0.0681818" stop-color="#3584e4"/>
+ <stop offset="0.931818" stop-color="#3584e4"/>
+ <stop offset="0.965909" stop-color="#1c71d8"/>
+ <stop offset="1" stop-color="#1a5fb4"/>
+ </linearGradient>
+ <linearGradient id="b" gradientTransform="matrix(0.272543 0 0 0.295903 1.85959 50.447067)" gradientUnits="userSpaceOnUse" x1="88.574776" x2="367.430145" y1="1.578945" y2="1.578945">
+ <stop offset="0" stop-color="#1a5fb4"/>
+ <stop offset="0.0263158" stop-color="#3584e4"/>
+ <stop offset="0.973324" stop-color="#3584e4"/>
+ <stop offset="1" stop-color="#1a5fb4"/>
+ </linearGradient>
+ <path d="m 28.722656 44 h 70.554688 c 4.816406 0 8.722656 3.90625 8.722656 8.722656 v 58.554688 c 0 4.816406 -3.90625 8.722656 -8.722656 8.722656 h -70.554688 c -4.816406 0 -8.722656 -3.90625 -8.722656 -8.722656 v -58.554688 c 0 -4.816406 3.90625 -8.722656 8.722656 -8.722656 z m 0 0" fill="url(#a)"/>
+ <path d="m 28.722656 8 h 70.554688 c 4.816406 0 8.722656 3.90625 8.722656 8.722656 v 70.554688 c 0 4.816406 -3.90625 8.722656 -8.722656 8.722656 h -70.554688 c -4.816406 0 -8.722656 -3.90625 -8.722656 -8.722656 v -70.554688 c 0 -4.816406 3.90625 -8.722656 8.722656 -8.722656 z m 0 0" fill="#62a0ea"/>
+ <path d="m 48 80 h 32 c 2.210938 0 4 1.789062 4 4 v 22 c 0 2.210938 -1.789062 4 -4 4 h -32 c -2.210938 0 -4 -1.789062 -4 -4 v -22 c 0 -2.210938 1.789062 -4 4 -4 z m 0 0" fill="#62a0ea"/>
+ <path d="m 30 14 h 68 c 2.210938 0 4 1.789062 4 4 v 68 c 0 2.210938 -1.789062 4 -4 4 h -68 c -2.210938 0 -4 -1.789062 -4 -4 v -68 c 0 -2.210938 1.789062 -4 4 -4 z m 0 0" fill="url(#b)"/>
+ <path d="m 48 84 h 32 c 2.210938 0 4 1.789062 4 4 v 12 c 0 2.210938 -1.789062 4 -4 4 h -32 c -2.210938 0 -4 -1.789062 -4 -4 v -12 c 0 -2.210938 1.789062 -4 4 -4 z m 0 0" fill="#deddda"/>
+ <path d="m 30.203125 20 c -1.203125 0 -2.179687 1.03125 -2.179687 2.304688 l -0.0625 66.773437 s 1.039062 0.582031 2.039062 0.582031 h 14 v 6.339844 h 40 v -6.339844 h 14 c 1 0 2.011719 -0.566406 2.011719 -0.566406 l -0.066407 -66.789062 c 0 -1.273438 -0.976562 -2.304688 -2.179687 -2.304688 z m 0 0" fill="#ffffff"/>
+ <path d="m 40 68 l 6 6 l 10 -10" fill="none" stroke="#3d3846" stroke-width="4"/>
+ <path d="m 64 40 h 24 v 4 h -24 z m 0 0" fill="#c0bfbc"/>
+ <path d="m 64 68 h 24 v 4 h -24 z m 0 0" fill="#c0bfbc"/>
+ <path d="m 40 40 l 6 6 l 10 -10" fill="none" stroke="#3d3846" stroke-width="4"/>
+</svg>
diff --git a/data/icons/package-x-generic-symbolic.svg b/data/icons/package-x-generic-symbolic.svg
new file mode 100644
index 0000000..abe6ec5
--- /dev/null
+++ b/data/icons/package-x-generic-symbolic.svg
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg">
+ <g fill="#2e3434">
+ <path d="m 4.027344 0.996094 c -1.660156 0 -3.027344 1.367187 -3.027344 3.027344 v 7.910156 c 0 1.660156 1.367188 3.027344 3.027344 3.027344 h 7.945312 c 1.660156 0 3.027344 -1.367188 3.027344 -3.027344 v -7.910156 c 0 -1.660157 -1.367188 -3.027344 -3.027344 -3.027344 z m 0 2 h 7.945312 c 0.585938 0 1.027344 0.441406 1.027344 1.027344 v 7.910156 c 0 0.585937 -0.441406 1.027344 -1.027344 1.027344 h -7.945312 c -0.589844 0 -1.027344 -0.441407 -1.027344 -1.027344 v -7.910156 c 0 -0.585938 0.4375 -1.027344 1.027344 -1.027344 z m 0 0"/>
+ <path d="m 4.027344 1 c -1.660156 0 -3.027344 1.367188 -3.027344 3.027344 v 0.945312 s 1.386719 2.03125 3.027344 2.03125 h 7.945312 c 1.46875 0 3.027344 -2.03125 3.027344 -2.03125 v -0.945312 c 0 -1.660156 -1.367188 -3.027344 -3.027344 -3.027344 z m 0 2 h 7.945312 c 0.585938 0 1.027344 0.441406 1.027344 1.027344 v 0.945312 c 0 0.585938 -0.441406 1.027344 -1.027344 1.027344 h -7.945312 c -0.589844 0 -1.027344 -0.441406 -1.027344 -1.027344 v -0.945312 c 0 -0.585938 0.4375 -1.027344 1.027344 -1.027344 z m 0 0"/>
+ <path d="m 7 0.996094 h 2 v 10.03125 l -2 -0.988282 z m 0 0"/>
+ </g>
+</svg>
diff --git a/data/icons/padlock-open-symbolic.svg b/data/icons/padlock-open-symbolic.svg
new file mode 100644
index 0000000..31efb43
--- /dev/null
+++ b/data/icons/padlock-open-symbolic.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M8 0C5.801 0 4 1.801 4 4v1a1 1 0 0 0 1 1 1 1 0 0 0 1-1V4c0-1.125.875-2 2-2s2 .875 2 2v4H4c-1.108 0-2 .892-2 2v5c0 .554.446 1 1 1h10c.554 0 1-.446 1-1v-5c0-1.108-.892-2-2-2V4c0-2.199-1.801-4-4-4Z" style="fill:#241f31"/></svg> \ No newline at end of file
diff --git a/data/icons/phone-symbolic.svg b/data/icons/phone-symbolic.svg
new file mode 100644
index 0000000..f73dab6
--- /dev/null
+++ b/data/icons/phone-symbolic.svg
@@ -0,0 +1 @@
+<svg width="16" height="16" xmlns="http://www.w3.org/2000/svg"><path style="fill:#2e3436" d="M5 0C3.355 0 2 1.355 2 3v10c0 1.645 1.355 3 3 3h6c1.645 0 3-1.355 3-3V3c0-1.645-1.355-3-3-3zm0 2h1c0 .554.446 1 1 1h2c.554 0 1-.446 1-1h1c.571 0 1 .429 1 1v9c0 .554-.446 1-1 1H5c-.554 0-1-.446-1-1V3c0-.571.429-1 1-1z"/></svg> \ No newline at end of file
diff --git a/data/icons/pub-symbolic.svg b/data/icons/pub-symbolic.svg
new file mode 100644
index 0000000..e6ba35c
--- /dev/null
+++ b/data/icons/pub-symbolic.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path style="fill:#2e3436" d="M7.262.996a1.982 1.982 0 0 0-1.465.692A1.99 1.99 0 0 0 4.297 1c-1.11 0-2 .89-2 2H5v4.5a.499.499 0 1 0 1 0V3h6.02c-.344-.598-.98-1-1.723-1-.414 0-.8.125-1.121.34A1.982 1.982 0 0 0 7.262.996zM3 4v7.52A2.474 2.474 0 0 0 5.48 14h4.04a2.47 2.47 0 0 0 2.43-2h.257A2.808 2.808 0 0 0 15 9.207V6.793A2.808 2.808 0 0 0 12.207 4H7v3.5C7 8.332 6.332 9 5.5 9S4 8.332 4 7.5V4H3zm9 2h.207a.77.77 0 0 1 .793.793v2.414a.77.77 0 0 1-.793.793H12V6zM1 15v1h14v-1H1z"/></svg> \ No newline at end of file
diff --git a/data/icons/review-symbolic.svg b/data/icons/review-symbolic.svg
new file mode 100644
index 0000000..3c7529b
--- /dev/null
+++ b/data/icons/review-symbolic.svg
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg">
+ <g fill="#2e3436">
+ <path d="m 2.5 0 c -1.382812 0 -2.50390625 1.117188 -2.5 2.5 v 8 c 0 1.386719 1.113281 2.5 2.5 2.5 h 8.375 l 3.125 3 v -3.0625 c 1.164062 -0.230469 2 -1.253906 2 -2.4375 v -8 c 0 -1.386719 -1.113281 -2.5 -2.5 -2.5 z m 0 2 h 11 c 0.277344 0 0.5 0.222656 0.5 0.5 v 8 c 0 0.277344 -0.222656 0.5 -0.5 0.5 h -11 c -0.277344 0 -0.5 -0.222656 -0.5 -0.5 v -8 c 0 -0.277344 0.222656 -0.5 0.5 -0.5 z m 0 0"/>
+ <path d="m 4 7 h 6 v 2 h -6 z m 0 0"/>
+ <path d="m 4 4 h 8 v 2 h -8 z m 0 0"/>
+ </g>
+</svg>
diff --git a/data/icons/safety-symbolic.svg b/data/icons/safety-symbolic.svg
new file mode 100644
index 0000000..a01e586
--- /dev/null
+++ b/data/icons/safety-symbolic.svg
@@ -0,0 +1 @@
+<svg width="16" height="16" xmlns="http://www.w3.org/2000/svg"><path d="M2 1v7c0 2.072 1.498 3.695 2.832 4.889a18.66 18.66 0 0 0 2.66 1.972l.516.305.512-.31s1.32-.8 2.65-2.002C12.5 11.65 14 10.044 14 8V1H2zm2 2h8v.586l-4 4-1.793-1.793-1.414 1.414L8 10.414l4-4V8c0 .92-1 2.312-2.17 3.37-.913.824-1.477 1.154-1.836 1.386-.358-.226-.918-.543-1.828-1.358C5 10.355 4 8.98 4 8V3z" style="fill:#3d3846"/></svg> \ No newline at end of file
diff --git a/data/icons/sign-language-symbolic.svg b/data/icons/sign-language-symbolic.svg
new file mode 100644
index 0000000..f1721ab
--- /dev/null
+++ b/data/icons/sign-language-symbolic.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M9 7v.5s0 .5.5.5.5-.5.5-.5V2c0-.555.445-1 1-1s1 .445 1 1v9.5c0 .5.5.5.5.5l1.793-1.707a.992.992 0 0 1 .719-.305c1.082.086 1.144 1.27.695 1.719l-3 3C12 15.5 10.949 15.997 10 16H4c-3 0-3-3-3-3V3c0-.555.445-1 1-1s1 .445 1 1v4.5s0 .5.5.5.5-.5.5-.5V7c0-.555.445-1 1-1s1 .445 1 1v.5s0 .5.5.5.5-.5.5-.5V7c0-.555.453-.992 1-1 .586-.012 1 .445 1 1zm0 0" fill="#2e3436"/></svg> \ No newline at end of file
diff --git a/data/icons/snap-symbolic.svg b/data/icons/snap-symbolic.svg
new file mode 100644
index 0000000..f5f93f3
--- /dev/null
+++ b/data/icons/snap-symbolic.svg
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg">
+ <g fill="#2e3434">
+ <path d="m 1 0.996094 l 7.136719 10.847656 l 4.898437 -3.507812 z m 0 0"/>
+ <path d="m 5.507812 5.328125 c -0.339843 0.058594 -0.625 0.285156 -0.753906 0.597656 l -3.617187 8.652344 c -0.175781 0.414063 -0.050781 0.890625 0.296875 1.167969 c 0.351562 0.28125 0.847656 0.292968 1.210937 0.027344 l 6.929688 -4.984376 c 0.230469 -0.164062 0.382812 -0.421874 0.410156 -0.703124 c 0.03125 -0.285157 -0.058594 -0.566407 -0.25 -0.78125 l -3.316406 -3.664063 c -0.230469 -0.25 -0.574219 -0.371094 -0.910157 -0.3125 z m 0.480469 2.820313 l 1.511719 1.667968 l -3.15625 2.269532 z m 0 0"/>
+ <path d="m 6.042969 2.914062 l 9.957031 6.15625 l -0.039062 -5.066406 z m 0 0"/>
+ </g>
+</svg>
diff --git a/data/icons/strong-language-none-symbolic.svg b/data/icons/strong-language-none-symbolic.svg
new file mode 100644
index 0000000..0d62d57
--- /dev/null
+++ b/data/icons/strong-language-none-symbolic.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path style="fill:#2e3436" d="m1.531.469-1.06 1.06 14 14 1.06-1.06-1.035-1.035a1.5 1.5 0 0 0-1.426-1.426L12.062 11H14V2h-2v8.938l-1-1V9h-.938L9 7.937V7h2V5H9V2H7v3h-.938L5 3.937V2H3.062L1.532.469zM1 5v2h2v2H1v2h2v3h2v-3h2v3h2v-1.879L5.879 9H5v-.879L1.879 5H1z"/></svg> \ No newline at end of file
diff --git a/data/icons/strong-language-symbolic.svg b/data/icons/strong-language-symbolic.svg
new file mode 100644
index 0000000..5b22d2f
--- /dev/null
+++ b/data/icons/strong-language-symbolic.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path style="fill:#2e3436" d="M3 2v3H1v2h2v2H1v2h2v3h2v-3h2v3h2v-3h2V9H9V7h2V5H9V2H7v3H5V2H3zm9 0v9h2V2h-2zM5 7h2v2H5V7zm8 5a1.5 1.5 0 0 0-1.5 1.5 1.5 1.5 0 0 0 3 0A1.5 1.5 0 0 0 13 12z"/></svg> \ No newline at end of file
diff --git a/data/icons/system-component-addon.svg b/data/icons/system-component-addon.svg
new file mode 100644
index 0000000..83c1b34
--- /dev/null
+++ b/data/icons/system-component-addon.svg
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg height="128px" viewBox="0 0 128 128" width="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <linearGradient id="a" gradientUnits="userSpaceOnUse" x1="8.157114" x2="122.745697" y1="77.241079" y2="77.241079">
+ <stop offset="0" stop-color="#99c1f1"/>
+ <stop offset="0.0575141" stop-color="#1a5fb4"/>
+ <stop offset="0.388232" stop-color="#1a5fb4"/>
+ <stop offset="0.473021" stop-color="#2b7be0"/>
+ <stop offset="0.618795" stop-color="#154d91"/>
+ <stop offset="0.953538" stop-color="#1a5fb4"/>
+ <stop offset="1" stop-color="#2f7fe1"/>
+ </linearGradient>
+ <clipPath id="b">
+ <path d="m 6 1 h 117 v 118 h -117 z m 0 0"/>
+ </clipPath>
+ <clipPath id="c">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <clipPath id="d">
+ <path d="m 40 30 h 56 v 56 h -56 z m 0 0"/>
+ </clipPath>
+ <clipPath id="e">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <path d="m 70.40625 119.546875 l 50.207031 -50.207031 c 1.660157 -1.660156 2.574219 -3.839844 2.453125 -6.003906 l -0.140625 -3.058594 l -52.519531 -52.953125 c -3.257812 -3.289063 -8.394531 -3.121094 -11.8125 0 l -52.550781 52.996093 l -0.042969 3.144532 c -0.027344 2.125 0.761719 4.246094 2.390625 5.875 l 50.203125 50.207031 c 3.273438 3.269531 8.542969 3.269531 11.8125 0 z m 0 0" fill="url(#a)"/>
+ <g clip-path="url(#b)">
+ <g clip-path="url(#c)">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0" fill="#62a0ea"/>
+ </g>
+ </g>
+ <g clip-path="url(#d)">
+ <g clip-path="url(#e)">
+ <path d="m 62 30 c -3.324219 0 -6 2.675781 -6 6 v 6 h -12 c -2.214844 0 -4 1.785156 -4 4 v 12 h 6 c 3.324219 0 6 2.675781 6 6 s -2.675781 6 -6 6 h -6 v 12 c 0 2.214844 1.785156 4 4 4 h 12 v -6 c 0 -3.324219 2.675781 -6 6 -6 s 6 2.675781 6 6 v 6 h 12 c 2.214844 0 4 -1.785156 4 -4 v -12 h 6 c 3.324219 0 6 -2.675781 6 -6 s -2.675781 -6 -6 -6 h -6 v -12 c 0 -2.214844 -1.785156 -4 -4 -4 h -12 v -6 c 0 -3.324219 -2.675781 -6 -6 -6 z m 0 0" fill="#99c1f1"/>
+ </g>
+ </g>
+</svg>
diff --git a/data/icons/system-component-application.svg b/data/icons/system-component-application.svg
new file mode 100644
index 0000000..32d3195
--- /dev/null
+++ b/data/icons/system-component-application.svg
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg height="128px" viewBox="0 0 128 128" width="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <linearGradient id="a" gradientUnits="userSpaceOnUse" x1="8.157114" x2="122.745697" y1="77.241079" y2="77.241079">
+ <stop offset="0" stop-color="#99c1f1"/>
+ <stop offset="0.0575141" stop-color="#1a5fb4"/>
+ <stop offset="0.388232" stop-color="#1a5fb4"/>
+ <stop offset="0.473021" stop-color="#2b7be0"/>
+ <stop offset="0.618795" stop-color="#154d91"/>
+ <stop offset="0.953538" stop-color="#1a5fb4"/>
+ <stop offset="1" stop-color="#2f7fe1"/>
+ </linearGradient>
+ <clipPath id="b">
+ <path d="m 6 1 h 117 v 118 h -117 z m 0 0"/>
+ </clipPath>
+ <clipPath id="c">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <path d="m 70.40625 119.546875 l 50.207031 -50.207031 c 1.660157 -1.660156 2.574219 -3.839844 2.453125 -6.003906 l -0.140625 -3.058594 l -52.519531 -52.953125 c -3.257812 -3.289063 -8.394531 -3.121094 -11.8125 0 l -52.550781 52.996093 l -0.042969 3.144532 c -0.027344 2.125 0.761719 4.246094 2.390625 5.875 l 50.203125 50.207031 c 3.273438 3.269531 8.542969 3.269531 11.8125 0 z m 0 0" fill="url(#a)"/>
+ <g clip-path="url(#b)">
+ <g clip-path="url(#c)">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0" fill="#62a0ea"/>
+ </g>
+ </g>
+ <path d="m 64.90625 30.5625 c -0.9375 0 -1.875 0.046875 -2.789062 0.132812 l -1.726563 8.898438 c -1.421875 0.3125 -2.816406 0.746094 -4.117187 1.328125 l -6.507813 -6.242187 c -1.652344 0.976562 -3.089844 2.183593 -4.515625 3.453124 l 3.851562 8.101563 c -0.945312 1.058594 -1.804687 2.21875 -2.523437 3.453125 l -8.898437 -1.195312 c -0.753907 1.738281 -1.3125 3.554687 -1.726563 5.445312 l 7.835937 4.25 c -0.074218 0.714844 -0.132812 1.390625 -0.132812 2.125 s 0.0625 1.410156 0.132812 2.125 l -7.835937 4.25 c 0.414063 1.890625 0.972656 3.707031 1.726563 5.445312 l 8.898437 -1.195312 c 0.71875 1.230469 1.578125 2.394531 2.523437 3.453125 l -3.851562 8.101563 c 1.425781 1.269531 2.863281 2.476562 4.515625 3.453124 l 6.507813 -6.242187 c 1.300781 0.582031 2.695312 1.015625 4.117187 1.328125 l 1.726563 8.898438 c 0.914062 0.085937 1.851562 0.132812 2.789062 0.132812 s 1.875 -0.046875 2.789062 -0.132812 l 1.726563 -8.898438 c 1.421875 -0.3125 2.816406 -0.746094 4.117187 -1.328125 l 6.507813 6.242187 c 1.652344 -0.976562 3.089844 -2.183593 4.515625 -3.453124 l -3.851562 -8.101563 c 0.945312 -1.058594 1.804687 -2.222656 2.523437 -3.453125 l 8.898437 1.195312 c 0.753907 -1.738281 1.3125 -3.554687 1.726563 -5.445312 l -7.835937 -4.25 c 0.074218 -0.714844 0.132812 -1.390625 0.132812 -2.125 s -0.058594 -1.410156 -0.132812 -2.125 l 7.835937 -4.25 c -0.414063 -1.890625 -0.972656 -3.707031 -1.726563 -5.445312 l -8.898437 1.195312 c -0.71875 -1.234375 -1.578125 -2.394531 -2.523437 -3.453125 l 3.851562 -8.101563 c -1.425781 -1.269531 -2.863281 -2.476562 -4.515625 -3.453124 l -6.507813 6.242187 c -1.300781 -0.582031 -2.695312 -1.015625 -4.117187 -1.328125 l -1.726563 -8.898438 c -0.914062 -0.085937 -1.851562 -0.132812 -2.789062 -0.132812 z m 0 17 c 7.042969 0 12.75 5.707031 12.75 12.75 s -5.707031 12.75 -12.75 12.75 s -12.75 -5.707031 -12.75 -12.75 s 5.707031 -12.75 12.75 -12.75 z m 0 0" fill="#99c1f1"/>
+</svg>
diff --git a/data/icons/system-component-codecs.svg b/data/icons/system-component-codecs.svg
new file mode 100644
index 0000000..87ca2a2
--- /dev/null
+++ b/data/icons/system-component-codecs.svg
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg height="128px" viewBox="0 0 128 128" width="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <linearGradient id="a" gradientUnits="userSpaceOnUse" x1="8.157114" x2="122.745697" y1="77.241079" y2="77.241079">
+ <stop offset="0" stop-color="#99c1f1"/>
+ <stop offset="0.0575141" stop-color="#1a5fb4"/>
+ <stop offset="0.388232" stop-color="#1a5fb4"/>
+ <stop offset="0.473021" stop-color="#2b7be0"/>
+ <stop offset="0.618795" stop-color="#154d91"/>
+ <stop offset="0.953538" stop-color="#1a5fb4"/>
+ <stop offset="1" stop-color="#2f7fe1"/>
+ </linearGradient>
+ <clipPath id="b">
+ <path d="m 6 1 h 117 v 118 h -117 z m 0 0"/>
+ </clipPath>
+ <clipPath id="c">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <path d="m 70.40625 119.546875 l 50.207031 -50.207031 c 1.660157 -1.660156 2.574219 -3.839844 2.453125 -6.003906 l -0.140625 -3.058594 l -52.519531 -52.953125 c -3.257812 -3.289063 -8.394531 -3.121094 -11.8125 0 l -52.550781 52.996093 l -0.042969 3.144532 c -0.027344 2.125 0.761719 4.246094 2.390625 5.875 l 50.203125 50.207031 c 3.273438 3.269531 8.542969 3.269531 11.8125 0 z m 0 0" fill="url(#a)"/>
+ <g clip-path="url(#b)">
+ <g clip-path="url(#c)">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0" fill="#62a0ea"/>
+ </g>
+ </g>
+ <path d="m 52.1875 42 v 40 h 4 c 0.699219 0.003906 1.390625 -0.15625 2 -0.5 l 28 -16 c 1.242188 -0.6875 1.875 -2.09375 1.875 -3.5 s -0.632812 -2.8125 -1.875 -3.5 l -28 -16 c -0.609375 -0.34375 -1.300781 -0.503906 -2 -0.5 z m 0 0" fill="#99c1f1"/>
+</svg>
diff --git a/data/icons/system-component-driver.svg b/data/icons/system-component-driver.svg
new file mode 100644
index 0000000..957277a
--- /dev/null
+++ b/data/icons/system-component-driver.svg
@@ -0,0 +1,145 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg height="128px" viewBox="0 0 128 128" width="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <linearGradient id="a" gradientUnits="userSpaceOnUse" x1="8.157114" x2="122.745697" y1="77.241079" y2="77.241079">
+ <stop offset="0" stop-color="#99c1f1"/>
+ <stop offset="0.0575141" stop-color="#1a5fb4"/>
+ <stop offset="0.388232" stop-color="#1a5fb4"/>
+ <stop offset="0.473021" stop-color="#2b7be0"/>
+ <stop offset="0.618795" stop-color="#154d91"/>
+ <stop offset="0.953538" stop-color="#1a5fb4"/>
+ <stop offset="1" stop-color="#2f7fe1"/>
+ </linearGradient>
+ <clipPath id="b">
+ <path d="m 6 1 h 117 v 118 h -117 z m 0 0"/>
+ </clipPath>
+ <clipPath id="c">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <clipPath id="d">
+ <path d="m 18 41 h 57 v 57 h -57 z m 0 0"/>
+ </clipPath>
+ <clipPath id="e">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <clipPath id="f">
+ <path d="m 36 59 h 56 v 56 h -56 z m 0 0"/>
+ </clipPath>
+ <clipPath id="g">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <clipPath id="h">
+ <path d="m 48 47 h 56 v 56 h -56 z m 0 0"/>
+ </clipPath>
+ <clipPath id="i">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <clipPath id="j">
+ <path d="m 17 48 h 68 v 69 h -68 z m 0 0"/>
+ </clipPath>
+ <clipPath id="k">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <clipPath id="l">
+ <path d="m 68 27 h 55 v 56 h -55 z m 0 0"/>
+ </clipPath>
+ <clipPath id="m">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <clipPath id="n">
+ <path d="m 48 28 h 34 v 34 h -34 z m 0 0"/>
+ </clipPath>
+ <clipPath id="o">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <clipPath id="p">
+ <path d="m 45 44 h 21 v 21 h -21 z m 0 0"/>
+ </clipPath>
+ <clipPath id="q">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <clipPath id="r">
+ <path d="m 65 24 h 21 v 21 h -21 z m 0 0"/>
+ </clipPath>
+ <clipPath id="s">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <clipPath id="t">
+ <path d="m 51 24 h 35 v 35 h -35 z m 0 0"/>
+ </clipPath>
+ <clipPath id="u">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <clipPath id="v">
+ <path d="m 64 28 h 15 v 15 h -15 z m 0 0"/>
+ </clipPath>
+ <clipPath id="w">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <clipPath id="x">
+ <path d="m 58 34 h 10 v 9 h -10 z m 0 0"/>
+ </clipPath>
+ <clipPath id="y">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <path d="m 70.40625 119.546875 l 50.207031 -50.207031 c 1.660157 -1.660156 2.574219 -3.839844 2.453125 -6.003906 l -0.140625 -3.058594 l -52.519531 -52.953125 c -3.257812 -3.289063 -8.394531 -3.121094 -11.8125 0 l -52.550781 52.996093 l -0.042969 3.144532 c -0.027344 2.125 0.761719 4.246094 2.390625 5.875 l 50.203125 50.207031 c 3.273438 3.269531 8.542969 3.269531 11.8125 0 z m 0 0" fill="url(#a)"/>
+ <g clip-path="url(#b)">
+ <g clip-path="url(#c)">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0" fill="#62a0ea"/>
+ </g>
+ </g>
+ <g clip-path="url(#d)">
+ <g clip-path="url(#e)">
+ <path d="m 200.630501 130.781609 c 0 2.292573 -1.86168 4.154252 -4.154253 4.154252 c -2.295335 -0.002762 -4.154252 -1.861679 -4.157014 -4.157014 c 0 -2.292573 1.861679 -4.154253 4.154252 -4.154253 c 2.295335 0.002763 4.154252 1.86168 4.157015 4.157015 z m 0 0" fill="none" stroke="#99c1f1" stroke-width="4.15432" transform="matrix(0.707107 0.707107 -0.707107 0.707107 0 -162)"/>
+ </g>
+ </g>
+ <g clip-path="url(#f)">
+ <g clip-path="url(#g)">
+ <path d="m 225.556015 130.781609 c 0 2.292573 -1.86168 4.154252 -4.154253 4.154252 c -2.295335 -0.002762 -4.154252 -1.861679 -4.154252 -4.154252 c -0.002762 -2.295335 1.858917 -4.157015 4.154252 -4.154252 c 2.292573 0 4.151491 1.858917 4.154253 4.154252 z m 0 0" fill="none" stroke="#99c1f1" stroke-width="4.15432" transform="matrix(0.707107 0.707107 -0.707107 0.707107 0 -162)"/>
+ </g>
+ </g>
+ <g clip-path="url(#h)">
+ <g clip-path="url(#i)">
+ <path d="m 225.556015 114.1646 c 0 2.292572 -1.86168 4.154252 -4.154253 4.154252 c -2.295335 -0.002762 -4.154252 -1.86168 -4.154252 -4.154252 c -0.002762 -2.295335 1.858917 -4.157015 4.154252 -4.154253 c 2.292573 0 4.151491 1.858918 4.154253 4.154253 z m 0 0" fill="none" stroke="#99c1f1" stroke-width="4.15432" transform="matrix(0.707107 0.707107 -0.707107 0.707107 0 -162)"/>
+ </g>
+ </g>
+ <g clip-path="url(#j)">
+ <g clip-path="url(#k)">
+ <path d="m 43.515625 234.34375 l -2.9375 2.9375 v 5.875 l 11.75 11.75 h 5.875 l 2.9375 -2.9375" fill="none" stroke="#99c1f1" stroke-width="4.15432" transform="matrix(1 0 0 1 0 -162)"/>
+ </g>
+ </g>
+ <g clip-path="url(#l)">
+ <g clip-path="url(#m)">
+ <path d="m -80.919532 221.401762 c 0 2.292573 -1.858918 4.151491 -4.154253 4.154253 c -2.292572 0 -4.154252 -1.86168 -4.154252 -4.154253 c 0.002762 -2.295335 1.86168 -4.154252 4.154252 -4.154252 c 2.295335 -0.002762 4.157015 1.858917 4.154253 4.154252 z m 0 0" fill="none" stroke="#99c1f1" stroke-width="4.15432" transform="matrix(0.707107 -0.707107 0.707107 0.707107 0 -162)"/>
+ </g>
+ </g>
+ <g clip-path="url(#n)">
+ <g clip-path="url(#o)">
+ <path d="m 65.546875 29.746094 l 14.6875 14.6875 c 1.621094 1.625 1.621094 4.253906 0 5.875 l -10.28125 10.28125 c -1.621094 1.625 -4.253906 1.625 -5.875 0 l -14.6875 -14.6875 c -1.621094 -1.621094 -1.621094 -4.25 0 -5.875 l 10.28125 -10.28125 c 1.621094 -1.621094 4.253906 -1.621094 5.875 0 z m 0 0" fill="#1a5fb4"/>
+ </g>
+ </g>
+ <g clip-path="url(#p)">
+ <g clip-path="url(#q)">
+ <path d="m 50.859375 44.433594 l -4.40625 4.40625 c -0.8125 0.816406 -0.8125 2.125 0 2.9375 c 0.8125 0.816406 2.125 0.816406 2.9375 0 l 4.40625 -4.40625 z m 5.875 5.875 l -4.40625 4.40625 c -0.8125 0.816406 -0.8125 2.125 0 2.9375 c 0.8125 0.816406 2.125 0.816406 2.9375 0 l 4.40625 -4.40625 z m 5.875 5.875 l -4.40625 4.40625 c -0.8125 0.816406 -0.8125 2.125 0 2.9375 c 0.8125 0.816406 2.125 0.816406 2.9375 0 l 4.40625 -4.40625 z m 0 0" fill="#99c1f1"/>
+ </g>
+ </g>
+ <g clip-path="url(#r)">
+ <g clip-path="url(#s)">
+ <path d="m 65.546875 29.746094 l 4.40625 -4.40625 c 0.8125 -0.8125 2.125 -0.8125 2.9375 0 c 0.8125 0.816406 0.8125 2.125 0 2.9375 l -4.40625 4.40625 z m 5.875 5.875 l 4.40625 -4.40625 c 0.8125 -0.8125 2.125 -0.8125 2.9375 0 c 0.8125 0.816406 0.8125 2.125 0 2.9375 l -4.40625 4.40625 z m 5.875 5.875 l 4.40625 -4.40625 c 0.8125 -0.8125 2.125 -0.8125 2.9375 0 c 0.8125 0.816406 0.8125 2.125 0 2.9375 l -4.40625 4.40625 z m 0 0" fill="#99c1f1"/>
+ </g>
+ </g>
+ <g clip-path="url(#t)">
+ <g clip-path="url(#u)">
+ <path d="m 69.953125 25.339844 l 14.6875 14.6875 c 1.621094 1.625 1.621094 4.253906 0 5.875 l -11.75 11.75 c -1.621094 1.625 -4.253906 1.625 -5.875 0 l -14.6875 -14.6875 c -1.621094 -1.621094 -1.621094 -4.25 0 -5.875 l 11.75 -11.75 c 1.621094 -1.621094 4.253906 -1.621094 5.875 0 z m 0 0" fill="#1c71d8"/>
+ </g>
+ </g>
+ <g clip-path="url(#v)">
+ <g clip-path="url(#w)">
+ <path d="m 67.015625 28.277344 l 11.75 11.75 l -2.9375 2.9375 l -11.75 -11.75 z m 0 0" fill="#62a0ea"/>
+ </g>
+ </g>
+ <g clip-path="url(#x)">
+ <g clip-path="url(#y)">
+ <path d="m 61.140625 34.152344 l 5.875 5.875 l -2.9375 2.9375 l -5.875 -5.875 z m 0 0" fill="#62a0ea"/>
+ </g>
+ </g>
+</svg>
diff --git a/data/icons/system-component-firmware.svg b/data/icons/system-component-firmware.svg
new file mode 100644
index 0000000..957277a
--- /dev/null
+++ b/data/icons/system-component-firmware.svg
@@ -0,0 +1,145 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg height="128px" viewBox="0 0 128 128" width="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <linearGradient id="a" gradientUnits="userSpaceOnUse" x1="8.157114" x2="122.745697" y1="77.241079" y2="77.241079">
+ <stop offset="0" stop-color="#99c1f1"/>
+ <stop offset="0.0575141" stop-color="#1a5fb4"/>
+ <stop offset="0.388232" stop-color="#1a5fb4"/>
+ <stop offset="0.473021" stop-color="#2b7be0"/>
+ <stop offset="0.618795" stop-color="#154d91"/>
+ <stop offset="0.953538" stop-color="#1a5fb4"/>
+ <stop offset="1" stop-color="#2f7fe1"/>
+ </linearGradient>
+ <clipPath id="b">
+ <path d="m 6 1 h 117 v 118 h -117 z m 0 0"/>
+ </clipPath>
+ <clipPath id="c">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <clipPath id="d">
+ <path d="m 18 41 h 57 v 57 h -57 z m 0 0"/>
+ </clipPath>
+ <clipPath id="e">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <clipPath id="f">
+ <path d="m 36 59 h 56 v 56 h -56 z m 0 0"/>
+ </clipPath>
+ <clipPath id="g">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <clipPath id="h">
+ <path d="m 48 47 h 56 v 56 h -56 z m 0 0"/>
+ </clipPath>
+ <clipPath id="i">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <clipPath id="j">
+ <path d="m 17 48 h 68 v 69 h -68 z m 0 0"/>
+ </clipPath>
+ <clipPath id="k">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <clipPath id="l">
+ <path d="m 68 27 h 55 v 56 h -55 z m 0 0"/>
+ </clipPath>
+ <clipPath id="m">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <clipPath id="n">
+ <path d="m 48 28 h 34 v 34 h -34 z m 0 0"/>
+ </clipPath>
+ <clipPath id="o">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <clipPath id="p">
+ <path d="m 45 44 h 21 v 21 h -21 z m 0 0"/>
+ </clipPath>
+ <clipPath id="q">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <clipPath id="r">
+ <path d="m 65 24 h 21 v 21 h -21 z m 0 0"/>
+ </clipPath>
+ <clipPath id="s">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <clipPath id="t">
+ <path d="m 51 24 h 35 v 35 h -35 z m 0 0"/>
+ </clipPath>
+ <clipPath id="u">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <clipPath id="v">
+ <path d="m 64 28 h 15 v 15 h -15 z m 0 0"/>
+ </clipPath>
+ <clipPath id="w">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <clipPath id="x">
+ <path d="m 58 34 h 10 v 9 h -10 z m 0 0"/>
+ </clipPath>
+ <clipPath id="y">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <path d="m 70.40625 119.546875 l 50.207031 -50.207031 c 1.660157 -1.660156 2.574219 -3.839844 2.453125 -6.003906 l -0.140625 -3.058594 l -52.519531 -52.953125 c -3.257812 -3.289063 -8.394531 -3.121094 -11.8125 0 l -52.550781 52.996093 l -0.042969 3.144532 c -0.027344 2.125 0.761719 4.246094 2.390625 5.875 l 50.203125 50.207031 c 3.273438 3.269531 8.542969 3.269531 11.8125 0 z m 0 0" fill="url(#a)"/>
+ <g clip-path="url(#b)">
+ <g clip-path="url(#c)">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0" fill="#62a0ea"/>
+ </g>
+ </g>
+ <g clip-path="url(#d)">
+ <g clip-path="url(#e)">
+ <path d="m 200.630501 130.781609 c 0 2.292573 -1.86168 4.154252 -4.154253 4.154252 c -2.295335 -0.002762 -4.154252 -1.861679 -4.157014 -4.157014 c 0 -2.292573 1.861679 -4.154253 4.154252 -4.154253 c 2.295335 0.002763 4.154252 1.86168 4.157015 4.157015 z m 0 0" fill="none" stroke="#99c1f1" stroke-width="4.15432" transform="matrix(0.707107 0.707107 -0.707107 0.707107 0 -162)"/>
+ </g>
+ </g>
+ <g clip-path="url(#f)">
+ <g clip-path="url(#g)">
+ <path d="m 225.556015 130.781609 c 0 2.292573 -1.86168 4.154252 -4.154253 4.154252 c -2.295335 -0.002762 -4.154252 -1.861679 -4.154252 -4.154252 c -0.002762 -2.295335 1.858917 -4.157015 4.154252 -4.154252 c 2.292573 0 4.151491 1.858917 4.154253 4.154252 z m 0 0" fill="none" stroke="#99c1f1" stroke-width="4.15432" transform="matrix(0.707107 0.707107 -0.707107 0.707107 0 -162)"/>
+ </g>
+ </g>
+ <g clip-path="url(#h)">
+ <g clip-path="url(#i)">
+ <path d="m 225.556015 114.1646 c 0 2.292572 -1.86168 4.154252 -4.154253 4.154252 c -2.295335 -0.002762 -4.154252 -1.86168 -4.154252 -4.154252 c -0.002762 -2.295335 1.858917 -4.157015 4.154252 -4.154253 c 2.292573 0 4.151491 1.858918 4.154253 4.154253 z m 0 0" fill="none" stroke="#99c1f1" stroke-width="4.15432" transform="matrix(0.707107 0.707107 -0.707107 0.707107 0 -162)"/>
+ </g>
+ </g>
+ <g clip-path="url(#j)">
+ <g clip-path="url(#k)">
+ <path d="m 43.515625 234.34375 l -2.9375 2.9375 v 5.875 l 11.75 11.75 h 5.875 l 2.9375 -2.9375" fill="none" stroke="#99c1f1" stroke-width="4.15432" transform="matrix(1 0 0 1 0 -162)"/>
+ </g>
+ </g>
+ <g clip-path="url(#l)">
+ <g clip-path="url(#m)">
+ <path d="m -80.919532 221.401762 c 0 2.292573 -1.858918 4.151491 -4.154253 4.154253 c -2.292572 0 -4.154252 -1.86168 -4.154252 -4.154253 c 0.002762 -2.295335 1.86168 -4.154252 4.154252 -4.154252 c 2.295335 -0.002762 4.157015 1.858917 4.154253 4.154252 z m 0 0" fill="none" stroke="#99c1f1" stroke-width="4.15432" transform="matrix(0.707107 -0.707107 0.707107 0.707107 0 -162)"/>
+ </g>
+ </g>
+ <g clip-path="url(#n)">
+ <g clip-path="url(#o)">
+ <path d="m 65.546875 29.746094 l 14.6875 14.6875 c 1.621094 1.625 1.621094 4.253906 0 5.875 l -10.28125 10.28125 c -1.621094 1.625 -4.253906 1.625 -5.875 0 l -14.6875 -14.6875 c -1.621094 -1.621094 -1.621094 -4.25 0 -5.875 l 10.28125 -10.28125 c 1.621094 -1.621094 4.253906 -1.621094 5.875 0 z m 0 0" fill="#1a5fb4"/>
+ </g>
+ </g>
+ <g clip-path="url(#p)">
+ <g clip-path="url(#q)">
+ <path d="m 50.859375 44.433594 l -4.40625 4.40625 c -0.8125 0.816406 -0.8125 2.125 0 2.9375 c 0.8125 0.816406 2.125 0.816406 2.9375 0 l 4.40625 -4.40625 z m 5.875 5.875 l -4.40625 4.40625 c -0.8125 0.816406 -0.8125 2.125 0 2.9375 c 0.8125 0.816406 2.125 0.816406 2.9375 0 l 4.40625 -4.40625 z m 5.875 5.875 l -4.40625 4.40625 c -0.8125 0.816406 -0.8125 2.125 0 2.9375 c 0.8125 0.816406 2.125 0.816406 2.9375 0 l 4.40625 -4.40625 z m 0 0" fill="#99c1f1"/>
+ </g>
+ </g>
+ <g clip-path="url(#r)">
+ <g clip-path="url(#s)">
+ <path d="m 65.546875 29.746094 l 4.40625 -4.40625 c 0.8125 -0.8125 2.125 -0.8125 2.9375 0 c 0.8125 0.816406 0.8125 2.125 0 2.9375 l -4.40625 4.40625 z m 5.875 5.875 l 4.40625 -4.40625 c 0.8125 -0.8125 2.125 -0.8125 2.9375 0 c 0.8125 0.816406 0.8125 2.125 0 2.9375 l -4.40625 4.40625 z m 5.875 5.875 l 4.40625 -4.40625 c 0.8125 -0.8125 2.125 -0.8125 2.9375 0 c 0.8125 0.816406 0.8125 2.125 0 2.9375 l -4.40625 4.40625 z m 0 0" fill="#99c1f1"/>
+ </g>
+ </g>
+ <g clip-path="url(#t)">
+ <g clip-path="url(#u)">
+ <path d="m 69.953125 25.339844 l 14.6875 14.6875 c 1.621094 1.625 1.621094 4.253906 0 5.875 l -11.75 11.75 c -1.621094 1.625 -4.253906 1.625 -5.875 0 l -14.6875 -14.6875 c -1.621094 -1.621094 -1.621094 -4.25 0 -5.875 l 11.75 -11.75 c 1.621094 -1.621094 4.253906 -1.621094 5.875 0 z m 0 0" fill="#1c71d8"/>
+ </g>
+ </g>
+ <g clip-path="url(#v)">
+ <g clip-path="url(#w)">
+ <path d="m 67.015625 28.277344 l 11.75 11.75 l -2.9375 2.9375 l -11.75 -11.75 z m 0 0" fill="#62a0ea"/>
+ </g>
+ </g>
+ <g clip-path="url(#x)">
+ <g clip-path="url(#y)">
+ <path d="m 61.140625 34.152344 l 5.875 5.875 l -2.9375 2.9375 l -5.875 -5.875 z m 0 0" fill="#62a0ea"/>
+ </g>
+ </g>
+</svg>
diff --git a/data/icons/system-component-input-sources.svg b/data/icons/system-component-input-sources.svg
new file mode 100644
index 0000000..071034c
--- /dev/null
+++ b/data/icons/system-component-input-sources.svg
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg height="128px" viewBox="0 0 128 128" width="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <linearGradient id="a" gradientUnits="userSpaceOnUse" x1="8.157114" x2="122.745697" y1="77.241079" y2="77.241079">
+ <stop offset="0" stop-color="#99c1f1"/>
+ <stop offset="0.0575141" stop-color="#1a5fb4"/>
+ <stop offset="0.388232" stop-color="#1a5fb4"/>
+ <stop offset="0.473021" stop-color="#2b7be0"/>
+ <stop offset="0.618795" stop-color="#154d91"/>
+ <stop offset="0.953538" stop-color="#1a5fb4"/>
+ <stop offset="1" stop-color="#2f7fe1"/>
+ </linearGradient>
+ <clipPath id="b">
+ <path d="m 6 1 h 117 v 118 h -117 z m 0 0"/>
+ </clipPath>
+ <clipPath id="c">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <path d="m 70.40625 119.546875 l 50.207031 -50.207031 c 1.660157 -1.660156 2.574219 -3.839844 2.453125 -6.003906 l -0.140625 -3.058594 l -52.519531 -52.953125 c -3.257812 -3.289063 -8.394531 -3.121094 -11.8125 0 l -52.550781 52.996093 l -0.042969 3.144532 c -0.027344 2.125 0.761719 4.246094 2.390625 5.875 l 50.203125 50.207031 c 3.273438 3.269531 8.542969 3.269531 11.8125 0 z m 0 0" fill="url(#a)"/>
+ <g clip-path="url(#b)">
+ <g clip-path="url(#c)">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0" fill="#62a0ea"/>
+ </g>
+ </g>
+ <g fill="#99c1f1">
+ <path d="m 48 82 h 32 v 8 h -32 z m 0 0"/>
+ <path d="m 52 66 h 8 v 8 h -8 z m 0 0"/>
+ <path d="m 68 66 h 8 v 8 h -8 z m 0 0"/>
+ <path d="m 84 66 h 8 v 8 h -8 z m 0 0"/>
+ <path d="m 36 66 h 8 v 8 h -8 z m 0 0"/>
+ <path d="m 44 50 h 8 v 8 h -8 z m 0 0"/>
+ <path d="m 60 50 h 8 v 8 h -8 z m 0 0"/>
+ <path d="m 76 50 h 8 v 8 h -8 z m 0 0"/>
+ <path d="m 28 50 h 8 v 8 h -8 z m 0 0"/>
+ <path d="m 92 50 h 8 v 8 h -8 z m 0 0"/>
+ </g>
+</svg>
diff --git a/data/icons/system-component-language.svg b/data/icons/system-component-language.svg
new file mode 100644
index 0000000..2c28ad7
--- /dev/null
+++ b/data/icons/system-component-language.svg
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg height="128px" viewBox="0 0 128 128" width="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <linearGradient id="a" gradientUnits="userSpaceOnUse" x1="8.157114" x2="122.745697" y1="77.241079" y2="77.241079">
+ <stop offset="0" stop-color="#99c1f1"/>
+ <stop offset="0.0575141" stop-color="#1a5fb4"/>
+ <stop offset="0.388232" stop-color="#1a5fb4"/>
+ <stop offset="0.473021" stop-color="#2b7be0"/>
+ <stop offset="0.618795" stop-color="#154d91"/>
+ <stop offset="0.953538" stop-color="#1a5fb4"/>
+ <stop offset="1" stop-color="#2f7fe1"/>
+ </linearGradient>
+ <clipPath id="b">
+ <path d="m 6 1 h 117 v 118 h -117 z m 0 0"/>
+ </clipPath>
+ <clipPath id="c">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <path d="m 70.40625 119.546875 l 50.207031 -50.207031 c 1.660157 -1.660156 2.574219 -3.839844 2.453125 -6.003906 l -0.140625 -3.058594 l -52.519531 -52.953125 c -3.257812 -3.289063 -8.394531 -3.121094 -11.8125 0 l -52.550781 52.996093 l -0.042969 3.144532 c -0.027344 2.125 0.761719 4.246094 2.390625 5.875 l 50.203125 50.207031 c 3.273438 3.269531 8.542969 3.269531 11.8125 0 z m 0 0" fill="url(#a)"/>
+ <g clip-path="url(#b)">
+ <g clip-path="url(#c)">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0" fill="#62a0ea"/>
+ </g>
+ </g>
+ <g fill="#99c1f1" fill-rule="evenodd">
+ <path d="m 46 34 v 56 h 8 v -56 z m 0 0"/>
+ <path d="m 50 34 c -2.210938 0 -4 1.789062 -4 4 v 24 c 0 2.210938 1.789062 4 4 4 h 13.53125 l 2.890625 5.789062 c 0.679687 1.355469 2.0625 2.210938 3.578125 2.210938 h 20 c 2.210938 0 4 -1.789062 4 -4 v -24 c 0 -2.210938 -1.789062 -4 -4 -4 h -13.523438 l -2.898437 -5.789062 c -0.679687 -1.355469 -2.0625 -2.210938 -3.578125 -2.210938 z m 0 0"/>
+ </g>
+</svg>
diff --git a/data/icons/system-component-os-updates.svg b/data/icons/system-component-os-updates.svg
new file mode 100644
index 0000000..18ec3fd
--- /dev/null
+++ b/data/icons/system-component-os-updates.svg
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg height="128px" viewBox="0 0 128 128" width="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <linearGradient id="a" gradientUnits="userSpaceOnUse" x1="8.157114" x2="122.745697" y1="77.241079" y2="77.241079">
+ <stop offset="0" stop-color="#99c1f1"/>
+ <stop offset="0.0575141" stop-color="#1a5fb4"/>
+ <stop offset="0.388232" stop-color="#1a5fb4"/>
+ <stop offset="0.473021" stop-color="#2b7be0"/>
+ <stop offset="0.618795" stop-color="#154d91"/>
+ <stop offset="0.953538" stop-color="#1a5fb4"/>
+ <stop offset="1" stop-color="#2f7fe1"/>
+ </linearGradient>
+ <clipPath id="b">
+ <path d="m 6 1 h 117 v 118 h -117 z m 0 0"/>
+ </clipPath>
+ <clipPath id="c">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <path d="m 70.40625 119.546875 l 50.207031 -50.207031 c 1.660157 -1.660156 2.574219 -3.839844 2.453125 -6.003906 l -0.140625 -3.058594 l -52.519531 -52.953125 c -3.257812 -3.289063 -8.394531 -3.121094 -11.8125 0 l -52.550781 52.996093 l -0.042969 3.144532 c -0.027344 2.125 0.761719 4.246094 2.390625 5.875 l 50.203125 50.207031 c 3.273438 3.269531 8.542969 3.269531 11.8125 0 z m 0 0" fill="url(#a)"/>
+ <g clip-path="url(#b)">
+ <g clip-path="url(#c)">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0" fill="#62a0ea"/>
+ </g>
+ </g>
+ <g fill="#99c1f1">
+ <path d="m 56 50 h 16 v 32 h -16 z m 0 0"/>
+ <path d="m 64 35.371094 l 22.628906 22.628906 h -45.257812 z m 0 0"/>
+ </g>
+</svg>
diff --git a/data/icons/system-component-runtime.svg b/data/icons/system-component-runtime.svg
new file mode 100644
index 0000000..32d3195
--- /dev/null
+++ b/data/icons/system-component-runtime.svg
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg height="128px" viewBox="0 0 128 128" width="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <linearGradient id="a" gradientUnits="userSpaceOnUse" x1="8.157114" x2="122.745697" y1="77.241079" y2="77.241079">
+ <stop offset="0" stop-color="#99c1f1"/>
+ <stop offset="0.0575141" stop-color="#1a5fb4"/>
+ <stop offset="0.388232" stop-color="#1a5fb4"/>
+ <stop offset="0.473021" stop-color="#2b7be0"/>
+ <stop offset="0.618795" stop-color="#154d91"/>
+ <stop offset="0.953538" stop-color="#1a5fb4"/>
+ <stop offset="1" stop-color="#2f7fe1"/>
+ </linearGradient>
+ <clipPath id="b">
+ <path d="m 6 1 h 117 v 118 h -117 z m 0 0"/>
+ </clipPath>
+ <clipPath id="c">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <path d="m 70.40625 119.546875 l 50.207031 -50.207031 c 1.660157 -1.660156 2.574219 -3.839844 2.453125 -6.003906 l -0.140625 -3.058594 l -52.519531 -52.953125 c -3.257812 -3.289063 -8.394531 -3.121094 -11.8125 0 l -52.550781 52.996093 l -0.042969 3.144532 c -0.027344 2.125 0.761719 4.246094 2.390625 5.875 l 50.203125 50.207031 c 3.273438 3.269531 8.542969 3.269531 11.8125 0 z m 0 0" fill="url(#a)"/>
+ <g clip-path="url(#b)">
+ <g clip-path="url(#c)">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0" fill="#62a0ea"/>
+ </g>
+ </g>
+ <path d="m 64.90625 30.5625 c -0.9375 0 -1.875 0.046875 -2.789062 0.132812 l -1.726563 8.898438 c -1.421875 0.3125 -2.816406 0.746094 -4.117187 1.328125 l -6.507813 -6.242187 c -1.652344 0.976562 -3.089844 2.183593 -4.515625 3.453124 l 3.851562 8.101563 c -0.945312 1.058594 -1.804687 2.21875 -2.523437 3.453125 l -8.898437 -1.195312 c -0.753907 1.738281 -1.3125 3.554687 -1.726563 5.445312 l 7.835937 4.25 c -0.074218 0.714844 -0.132812 1.390625 -0.132812 2.125 s 0.0625 1.410156 0.132812 2.125 l -7.835937 4.25 c 0.414063 1.890625 0.972656 3.707031 1.726563 5.445312 l 8.898437 -1.195312 c 0.71875 1.230469 1.578125 2.394531 2.523437 3.453125 l -3.851562 8.101563 c 1.425781 1.269531 2.863281 2.476562 4.515625 3.453124 l 6.507813 -6.242187 c 1.300781 0.582031 2.695312 1.015625 4.117187 1.328125 l 1.726563 8.898438 c 0.914062 0.085937 1.851562 0.132812 2.789062 0.132812 s 1.875 -0.046875 2.789062 -0.132812 l 1.726563 -8.898438 c 1.421875 -0.3125 2.816406 -0.746094 4.117187 -1.328125 l 6.507813 6.242187 c 1.652344 -0.976562 3.089844 -2.183593 4.515625 -3.453124 l -3.851562 -8.101563 c 0.945312 -1.058594 1.804687 -2.222656 2.523437 -3.453125 l 8.898437 1.195312 c 0.753907 -1.738281 1.3125 -3.554687 1.726563 -5.445312 l -7.835937 -4.25 c 0.074218 -0.714844 0.132812 -1.390625 0.132812 -2.125 s -0.058594 -1.410156 -0.132812 -2.125 l 7.835937 -4.25 c -0.414063 -1.890625 -0.972656 -3.707031 -1.726563 -5.445312 l -8.898437 1.195312 c -0.71875 -1.234375 -1.578125 -2.394531 -2.523437 -3.453125 l 3.851562 -8.101563 c -1.425781 -1.269531 -2.863281 -2.476562 -4.515625 -3.453124 l -6.507813 6.242187 c -1.300781 -0.582031 -2.695312 -1.015625 -4.117187 -1.328125 l -1.726563 -8.898438 c -0.914062 -0.085937 -1.851562 -0.132812 -2.789062 -0.132812 z m 0 17 c 7.042969 0 12.75 5.707031 12.75 12.75 s -5.707031 12.75 -12.75 12.75 s -12.75 -5.707031 -12.75 -12.75 s 5.707031 -12.75 12.75 -12.75 z m 0 0" fill="#99c1f1"/>
+</svg>
diff --git a/data/icons/test-symbolic.svg b/data/icons/test-symbolic.svg
new file mode 100644
index 0000000..063260d
--- /dev/null
+++ b/data/icons/test-symbolic.svg
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg">
+ <g fill="#222222">
+ <path d="m 8 0 c -4.40625 0 -8 3.59375 -8 8 s 3.59375 8 8 8 s 8 -3.59375 8 -8 s -3.59375 -8 -8 -8 z m 0 1.941406 c 3.359375 0 6.058594 2.699219 6.058594 6.058594 s -2.699219 6.058594 -6.058594 6.058594 s -6.058594 -2.699219 -6.058594 -6.058594 s 2.699219 -6.058594 6.058594 -6.058594 z m 0 0"/>
+ <path d="m 13 8 c 0 2.761719 -2.238281 5 -5 5 v -5 z m 0 0"/>
+ <path d="m 3 8 c 0 -2.761719 2.238281 -5 5 -5 v 5 z m 0 0"/>
+ </g>
+</svg>
diff --git a/data/icons/violence-none-symbolic.svg b/data/icons/violence-none-symbolic.svg
new file mode 100644
index 0000000..c25c981
--- /dev/null
+++ b/data/icons/violence-none-symbolic.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path style="fill:#2e3436" d="m1.531.469-1.06 1.06 6.154 6.155L10 11.062a25.453 25.453 0 0 0 .002-.001l4.469 4.468 1.06-1.06-4.363-4.364a25.453 25.453 0 0 0 1.395-1.293L9.027 5.277 7.686 6.623 1.53.469zm12.754.125a1.504 1.504 0 0 0-1.015.441L9.734 4.57l1.414 1.414 2.536-2.535a1.501 1.501 0 1 0 .601-2.855zM5.562 8.746l-5.019 5.02c.559.554 3.766 1.096 8.219-1.82l-3.2-3.2z"/></svg> \ No newline at end of file
diff --git a/data/icons/violence-symbolic.svg b/data/icons/violence-symbolic.svg
new file mode 100644
index 0000000..2a6d392
--- /dev/null
+++ b/data/icons/violence-symbolic.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M14.285.594a1.504 1.504 0 0 0-1.015.441L9.734 4.57l1.414 1.414 2.536-2.535a1.501 1.501 0 1 0 .601-2.855zM9.027 5.277.543 13.766c.707.703 5.656 1.41 12.02-4.954zm0 0" fill="#2e3436"/></svg> \ No newline at end of file
diff --git a/data/icons/webpage-symbolic.svg b/data/icons/webpage-symbolic.svg
new file mode 100644
index 0000000..8415de5
--- /dev/null
+++ b/data/icons/webpage-symbolic.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M7.5 0C3.37 0 0 3.37 0 7.5S3.37 15 7.5 15 15 11.63 15 7.5 11.63 0 7.5 0zm0 2c.183 0 .382.084.617.322.235.239.48.626.69 1.127.373.897.632 2.151.683 3.551H5.51c.05-1.4.31-2.654.683-3.55.21-.502.455-.889.69-1.128C7.118 2.084 7.317 2 7.5 2zm-1.857.318a5.85 5.85 0 0 0-.372.746c-.439 1.054-.71 2.422-.76 3.936H2.024a5.481 5.481 0 0 1 3.62-4.682zm3.714 0A5.481 5.481 0 0 1 12.977 7h-2.489c-.05-1.514-.32-2.882-.76-3.936a5.85 5.85 0 0 0-.37-.746zM2.023 8h2.489c.05 1.514.32 2.882.76 3.936.112.27.235.519.37.746A5.481 5.481 0 0 1 2.024 8zM5.51 8h3.98c-.05 1.4-.31 2.654-.683 3.55-.21.502-.455.889-.69 1.128-.235.238-.434.322-.617.322s-.382-.084-.617-.322c-.235-.239-.48-.626-.69-1.127C5.82 10.654 5.561 9.4 5.51 8zm4.978 0h2.489a5.481 5.481 0 0 1-3.62 4.682 5.85 5.85 0 0 0 .372-.746c.439-1.054.71-2.422.76-3.936z" style="fill:#3d3846"/></svg> \ No newline at end of file
diff --git a/data/meson.build b/data/meson.build
new file mode 100644
index 0000000..7d0aa6d
--- /dev/null
+++ b/data/meson.build
@@ -0,0 +1,42 @@
+subdir('metainfo')
+subdir('icons')
+subdir('assets')
+
+cdata = configuration_data()
+cdata.set('bindir', join_paths(get_option('prefix'),
+ get_option('bindir')))
+
+# note: the main .desktop file is in src/
+# this one is for the background service
+# replace @bindir@
+configure_file(
+ input : 'autostart/org.gnome.Software.desktop.in',
+ output : 'org.gnome.Software.desktop',
+ install_dir: join_paths(get_option('sysconfdir'), 'xdg/autostart'),
+ configuration : cdata
+)
+
+compiled_schemas = gnome.compile_schemas(
+ depend_files: 'org.gnome.software.gschema.xml')
+install_data('org.gnome.software.gschema.xml',
+ install_dir : join_paths(get_option('datadir'), 'glib-2.0', 'schemas'))
+
+if get_option('external_appstream')
+ # replace @libexecdir@
+ conf_data = configuration_data()
+ conf_data.set('libexecdir', join_paths(get_option('prefix'),
+ get_option('libexecdir')))
+ out = configure_file(
+ input : 'org.gnome.software.external-appstream.policy.in.in',
+ output : 'org.gnome.software.external-appstream.policy.in',
+ install: false,
+ configuration : conf_data,
+ )
+ i18n.merge_file(
+ input : out,
+ output : 'org.gnome.software.external-appstream.policy',
+ po_dir: join_paths(meson.project_source_root(), 'po'),
+ install: true,
+ install_dir: join_paths(get_option('datadir'), 'polkit-1', 'actions'),
+ )
+endif
diff --git a/data/metainfo/meson.build b/data/metainfo/meson.build
new file mode 100644
index 0000000..2d056ff
--- /dev/null
+++ b/data/metainfo/meson.build
@@ -0,0 +1,22 @@
+i18n.merge_file(
+ input: 'org.gnome.Software.metainfo.xml.in',
+ output: 'org.gnome.Software.metainfo.xml',
+ type: 'xml',
+ po_dir: join_paths(meson.project_source_root(), 'po'),
+ install: true,
+ install_dir: join_paths(get_option('datadir'), 'metainfo')
+)
+
+if get_option('tests') and appstream.version().version_compare('>=0.15.5')
+ ascli_exe = find_program('appstreamcli')
+ test('gs-validate-metainfo',
+ ascli_exe,
+ args: ['validate',
+ '--pedantic',
+ '--no-net',
+ '--explain',
+ 'org.gnome.Software.metainfo.xml.in'],
+ workdir : meson.current_source_dir(),
+ suite: ['lib'],
+ )
+endif
diff --git a/data/metainfo/org.gnome.Software.metainfo.xml.in b/data/metainfo/org.gnome.Software.metainfo.xml.in
new file mode 100644
index 0000000..a43e442
--- /dev/null
+++ b/data/metainfo/org.gnome.Software.metainfo.xml.in
@@ -0,0 +1,2158 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright 2013-2016 Richard Hughes <richard@hughsie.com> -->
+<component type="desktop-application">
+ <id>org.gnome.Software.desktop</id>
+ <metadata_license>CC0-1.0</metadata_license>
+ <project_license>GPL-2.0+</project_license>
+ <name>Software</name>
+ <summary>Install and update apps</summary>
+ <description>
+ <p>
+ Software allows you to find and install new applications and system
+ extensions and remove existing installed applications.
+ </p>
+ <p>
+ Software showcases featured and popular applications with useful
+ descriptions and multiple screenshots per application.
+ Applications can be found either through browsing the list of categories
+ or by searching.
+ It also allows you to update your system using an offline update.
+ </p>
+ </description>
+ <screenshots>
+ <screenshot type="default">
+ <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-overview.png</image>
+ <caption>Overview panel</caption>
+ </screenshot>
+ <screenshot>
+ <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-details.png</image>
+ <caption>Details panel</caption>
+ </screenshot>
+ <screenshot>
+ <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-details2.png</image>
+ <caption>Details panel</caption>
+ </screenshot>
+ <screenshot>
+ <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-installed.png</image>
+ <caption>Installed panel</caption>
+ </screenshot>
+ <screenshot>
+ <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-up-to-date.png</image>
+ <caption>Updates panel</caption>
+ </screenshot>
+ <screenshot>
+ <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-updates.png</image>
+ <caption>Updates panel</caption>
+ </screenshot>
+ <screenshot>
+ <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-updates-details.png</image>
+ <caption>The update details</caption>
+ </screenshot>
+ </screenshots>
+
+ <recommends>
+ <!-- Works on desktops or touchscreen devices -->
+ <control>pointing</control>
+ <control>keyboard</control>
+ <control>touch</control>
+ </recommends>
+
+ <requires>
+ <!-- Adaptive -->
+ <display_length compare="ge">360</display_length>
+ </requires>
+
+ <!--
+ Validate with `appstreamcli validate *.metainfo.xml`
+ -->
+ <releases>
+ <release date="2023-03-03" version="43.5" type="stable">
+ <description>
+ <p>This is a stable release with the following change:</p>
+ <ul>
+ <li>Fix few memory leaks</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2023-02-10" version="43.4" type="stable">
+ <description>
+ <p>This is a stable release with the following changes:</p>
+ <ul>
+ <li>Stop cancelled search in appstream data early</li>
+ <li>Lookup for appstream-provided icons in more directories</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2023-01-06" version="43.3" type="stable">
+ <description>
+ <p>This is a stable release with the following changes:</p>
+ <ul>
+ <li>Periodically expire cached app icons</li>
+ <li>Stop notifying about unprepared critical updates</li>
+ </ul>
+ <p>This release also updates translations:</p>
+ <ul>
+ <li>Abkhazian (Nart Tlisha)</li>
+ <li>Georgian (Ekaterine Papava)</li>
+ <li>Hebrew (Yosef Or Boczko)</li>
+ <li>Interlingue (Olga Smirnova)</li>
+ <li>Occitan (post 1500) (Quentin PAGÈS)</li>
+ <li>Persian (Danial Behzadi)</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2022-12-02" version="43.2" type="stable">
+ <description>
+ <p>This is a stable release with the following changes:</p>
+ <ul>
+ <li>Fix show of updatable app in the details page</li>
+ <li>Fix search for apps providing some feature under rpm-ostree</li>
+ <li>Fix sending of ODRS data when using libsoup3</li>
+ <li>Fix occasional crash when installing apps</li>
+ </ul>
+ <p>This release also updates translations:</p>
+ <ul>
+ <li>Abkhazian (Nart Tlisha)</li>
+ <li>Belarusian (Vasil Pupkin)</li>
+ <li>Czech (Daniel Rusek)</li>
+ <li>Georgian (Zurab Kargareteli)</li>
+ <li>Greek (Kosmas Martakidis)</li>
+ <li>Hebrew (Yosef Or Boczko)</li>
+ <li>Hungarian (Balázs Meskó)</li>
+ <li>Russian (Aleksandr Melman)</li>
+ <li>Turkish (Sabri Ünal)</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2022-10-21" version="43.1" type="stable">
+ <description>
+ <p>This is a stable release with the following changes:</p>
+ <ul>
+ <li>Fix searches not completing if installing or uninstalling an app at the same time</li>
+ <li>Notify of errors when running a flatpak app whose runtime is missing</li>
+ <li>Fix installing local RPM packages</li>
+ <li>Fix distribution upgrades when package conflicts are present</li>
+ <li>Fix opening web apps from their details page</li>
+ <li>Improve appearance of app ratings if ratings data cannot be downloaded</li>
+ <li>Fix crash when showing offline update errors on startup</li>
+ <li>Highlight priority of firmware updates, making security fixes more obvious</li>
+ <li>Fix installation of pending apps in some situations</li>
+ <li>Fix downloading of rpm-ostree app updates from the Updates page</li>
+ </ul>
+ <p>This release also updates translations:</p>
+ <ul>
+ <li>Abkhazian (Nart Tlisha)</li>
+ <li>Catalan (Jordi Mas)</li>
+ <li>Chinese (Taiwan) (Cheng-Chia Tseng)</li>
+ <li>Croatian (Goran Vidović)</li>
+ <li>French (Claude Paroz)</li>
+ <li>Friulian (Fabio Tomat)</li>
+ <li>Georgian (Zurab Kargareteli)</li>
+ <li>German (Philipp Kiemle, Jürgen Benvenuti)</li>
+ <li>Icelandic (Sveinn í Felli)</li>
+ <li>Italian (Gianvito Cavasoli)</li>
+ <li>Kazakh (Baurzhan Muftakhidinov)</li>
+ <li>Panjabi (A S Alam)</li>
+ <li>Slovenian (Matej Urbančič)</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2022-09-16" version="43.0" type="stable">
+ <description>
+ <p>This is a stable release with translation updates:</p>
+ <ul>
+ <li>Bulgarian</li>
+ <li>Catalan</li>
+ <li>Chinese (Taiwan)</li>
+ <li>Czech</li>
+ <li>English (United Kingdom)</li>
+ <li>Galician</li>
+ <li>Georgian</li>
+ <li>German</li>
+ <li>Hebrew</li>
+ <li>Hungarian</li>
+ <li>Icelandic</li>
+ <li>Latvian</li>
+ <li>Lithuanian</li>
+ <li>Nepali</li>
+ <li>Serbian</li>
+ <li>Slovenian</li>
+ <li>Spanish</li>
+ <li>Swedish</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2022-09-02" version="43~rc" type="development">
+ <description>
+ <p>This is the third unstable release for GNOME 43.</p>
+ <ul>
+ <li>Supports video as a screenshot</li>
+ <li>Improvements of source picker in the details page</li>
+ <li>Fixes a bug when viewing details of a package file</li>
+ <li>Fixes a bug when reading certain .flatpakref file</li>
+ </ul>
+ <p>This release also updates translations:</p>
+ <ul>
+ <li>Abkhazian</li>
+ <li>Basque</li>
+ <li>Catalan</li>
+ <li>Chinese (China)</li>
+ <li>Croatian</li>
+ <li>Danish</li>
+ <li>Dutch</li>
+ <li>Finnish</li>
+ <li>Galician</li>
+ <li>Georgian</li>
+ <li>Hebrew</li>
+ <li>Icelandic</li>
+ <li>Indonesian</li>
+ <li>Korean</li>
+ <li>Lithuanian</li>
+ <li>Persian</li>
+ <li>Polish</li>
+ <li>Portuguese</li>
+ <li>Portuguese (Brazil)</li>
+ <li>Russian</li>
+ <li>Serbian</li>
+ <li>Spanish</li>
+ <li>Turkish</li>
+ <li>Ukrainian</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2022-08-05" version="43~beta" type="development">
+ <description>
+ <p>This is the second unstable release for GNOME 43.</p>
+ <ul>
+ <li>Various fixes related to changed threading model</li>
+ <li>Various UI parts updated</li>
+ <li>Sources dropdown had been reworked</li>
+ <li>Fixes a rare crash when showing app details</li>
+ </ul>
+ <p>This release also updates translations:</p>
+ <ul>
+ <li>Abkhazian</li>
+ <li>Catalan</li>
+ <li>Chinese (China)</li>
+ <li>Dutch</li>
+ <li>Georgian</li>
+ <li>Hebrew</li>
+ <li>Indonesian</li>
+ <li>Italian</li>
+ <li>Lithuanian</li>
+ <li>Persian</li>
+ <li>Portuguese</li>
+ <li>Russian</li>
+ <li>Serbian</li>
+ <li>Spanish</li>
+ <li>Turkish</li>
+ <li>Ukrainian</li>
+ <li>Vietnamese</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2022-06-30" version="43~alpha" type="development">
+ <description>
+ <p>This is the first unstable release for GNOME 43.</p>
+ <ul>
+ <li>Various improvements to notifications</li>
+ <li>Fix several crashes when handling flatpak apps</li>
+ <li>Add ‘Other Apps by Author’ section in the app details page</li>
+ <li>Improve styling of app context lozenges</li>
+ <li>Add ‘Available for Distro’ section to the overview page (if configured by your distribution)</li>
+ <li>Show more details about file system permissions requested by flatpak apps</li>
+ <li>Show more types of URI from app metainfo</li>
+ <li>Fix a few issues when using a dark mode theme</li>
+ <li>Fix some issues with arrows in right-to-left locales</li>
+ <li>Fix language pack installation for certain locales</li>
+ <li>Improve debug output to make user bug reports more useful</li>
+ <li>Add `--uninstall=ID` command line option</li>
+ <li>Allow scrolling screenshots by clicking on next and previous screenshots</li>
+ <li>Add support for webapps</li>
+ <li>Allow swiping back in the shell using touch gestures</li>
+ <li>Improved caching of downloaded metadata</li>
+ <li>Many internal architectural changes to make the code more maintainable</li>
+ <li>
+ The <code>popular-overrides</code> GSettings key has been removed;
+ distribution vendors wishing to mark their apps as popular should
+ see `doc/vendor-customisation.md` for examples of how to do this now
+ </li>
+ <li>
+ The <code>hardcoded_popular</code> Meson option has been renamed to
+ <code>hardcoded_curated</code>.
+ </li>
+ </ul>
+ <p>This release also updates translations:</p>
+ <ul>
+ <li>Basque</li>
+ <li>Bulgarian</li>
+ <li>Catalan</li>
+ <li>Chinese (China)</li>
+ <li>Chinese (Taiwan)</li>
+ <li>Croatian</li>
+ <li>Czech</li>
+ <li>Danish</li>
+ <li>Dutch</li>
+ <li>English (United Kingdom)</li>
+ <li>Finnish</li>
+ <li>French</li>
+ <li>Friulian</li>
+ <li>Galician</li>
+ <li>Georgian</li>
+ <li>German</li>
+ <li>Hebrew</li>
+ <li>Hungarian</li>
+ <li>Indonesian</li>
+ <li>Lithuanian</li>
+ <li>Nepali</li>
+ <li>Occitan (post 1500)</li>
+ <li>Persian</li>
+ <li>Polish</li>
+ <li>Portuguese</li>
+ <li>Portuguese (Brazil)</li>
+ <li>Russian</li>
+ <li>Serbian</li>
+ <li>Slovenian</li>
+ <li>Spanish</li>
+ <li>Swedish</li>
+ <li>Turkish</li>
+ <li>Ukrainian</li>
+ <li>Vietnamese</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2022-03-18" version="42.0" type="stable">
+ <description>
+ <p>This is a stable release with the following changes:</p>
+ <ul>
+ <li>Various fixes related to changed threading model</li>
+ <li>Added several appstream-related fixes</li>
+ </ul>
+ <p>This release also updates translations:</p>
+ <ul>
+ <li>Basque</li>
+ <li>Bokmål, Norwegian</li>
+ <li>Bulgarian</li>
+ <li>Catalan</li>
+ <li>Chinese (China)</li>
+ <li>Danish</li>
+ <li>Finnish</li>
+ <li>French</li>
+ <li>German</li>
+ <li>Hebrew</li>
+ <li>Hungarian</li>
+ <li>Japanese</li>
+ <li>Kazakh</li>
+ <li>Lithuanian</li>
+ <li>Occitan (post 1500)</li>
+ <li>Persian</li>
+ <li>Polish</li>
+ <li>Russian</li>
+ <li>Serbian</li>
+ <li>Slovenian</li>
+ <li>Swedish</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2022-03-04" version="42~rc" type="development">
+ <description>
+ <p>This is the third unstable release for GNOME 42.</p>
+ <ul>
+ <li>Cancel ongoing update downloads when system power is low</li>
+ <li>Numerous small user interface fixes and tweaks</li>
+ <li>Prioritize full matches in search results</li>
+ <li>Improvements in dark mode</li>
+ <li>Fix disabling flatpak remotes from the ‘Software Repositories’ dialog</li>
+ <li>Threading and performance improvements which should reduce the number of user interface freezes</li>
+ <li>Update some icons</li>
+ <li>Check for updates when moving from a metered to a non-metered network connection</li>
+ </ul>
+ <p>This release also updates translations:</p>
+ <ul>
+ <li>Basque</li>
+ <li>Catalan</li>
+ <li>Chinese (China)</li>
+ <li>Croatian</li>
+ <li>Czech</li>
+ <li>Danish</li>
+ <li>Friulian</li>
+ <li>Galician</li>
+ <li>Hebrew</li>
+ <li>Indonesian</li>
+ <li>Korean</li>
+ <li>Lithuanian</li>
+ <li>Persian</li>
+ <li>Portuguese</li>
+ <li>Portuguese (Brazil)</li>
+ <li>Russian</li>
+ <li>Slovenian</li>
+ <li>Spanish</li>
+ <li>Turkish</li>
+ <li>Ukrainian</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2022-02-10" version="42~beta" type="development">
+ <description>
+ <p>This is the second unstable release for GNOME 42.</p>
+ <ul>
+ <li>Allow <code>--verbose</code> to be enabled at runtime</li>
+ <li>Condense the rows in the age rating context dialog</li>
+ <li>Update the UI for ratings and reviews of apps</li>
+ <li>Improve the appearance of the category page loading screen</li>
+ <li>Drop the first run dialog</li>
+ <li>Improvements to dark theming</li>
+ <li>Support viewing a specific metainfo file using <code>--show-metainfo</code></li>
+ <li>Several more threading improvements</li>
+ <li>Icon updates</li>
+ <li>Drop the hardcoded-popular plugin in favour of an appstream file</li>
+ <li>The background image for upgrades is now looked for using several
+ well-known (and distribution-specific) names in
+ <code>${DATADIR}/gnome-software/backgrounds</code>,
+ and the previous Fedora-specific default background image is
+ no longer distributed. Similarly, the <code>upgrade-background-uri</code>
+ GSettings key has been removed. Distributions may need to
+ update how they ship background images.
+ See <em>doc/vendor-customisation.md</em>.</li>
+ </ul>
+ <p>This release also updates translations:</p>
+ <ul>
+ <li>Chinese (China)</li>
+ <li>Galician</li>
+ <li>Hebrew</li>
+ <li>Icelandic</li>
+ <li>Indonesian</li>
+ <li>Japanese</li>
+ <li>Occitan (post 1500)</li>
+ <li>Portuguese</li>
+ <li>Portuguese (Brazil)</li>
+ <li>Russian</li>
+ <li>Slovenian</li>
+ <li>Spanish</li>
+ <li>Ukrainian</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2022-01-07" version="42~alpha" type="development">
+ <description>
+ <p>This is the first unstable release for GNOME 42.</p>
+ <ul>
+ <li>Various UI parts updated</li>
+ <li>Support more markup in the application description</li>
+ <li>Ask about package signature with PackageKit on signing issue</li>
+ <li>Show better System Update progress</li>
+ <li>Remove various cultural sensitivity badges</li>
+ <li>Fix a crash when processing age ratings</li>
+ <li>Reload application details only when not installing/removing the application</li>
+ <li>Do not follow symlinks when calculating disk size usage</li>
+ <li>Fix addons section, which could show addons for different application</li>
+ <li>Fix showing a ‘transaction in progress’ error when using the rpm-ostree plugin</li>
+ <li>Don’t recommend a reboot if firmware updates fail</li>
+ <li>Fix flathub repo being considered present on Fedora 35 with filtered flathub</li>
+ <li>Allow searching for extensions</li>
+ <li>Fix translation of main button on updates page</li>
+ <li>Fix codec installation process</li>
+ <li>Add new GNOME Circle apps to the featured carousel</li>
+ <li>Improve metadata support for snaps</li>
+ <li>Fix update checks being missed across suspend/hibernation</li>
+ <li>Ensure application lists are updated when repositories are enabled/installed or disabled/removed</li>
+ </ul>
+ <p>This release also updates translations:</p>
+ <ul>
+ <li>Basque</li>
+ <li>Belarusian</li>
+ <li>Bulgarian</li>
+ <li>Catalan</li>
+ <li>Chinese (China)</li>
+ <li>Croatian</li>
+ <li>Dutch</li>
+ <li>English (United Kingdom)</li>
+ <li>Friulian</li>
+ <li>Galician</li>
+ <li>German</li>
+ <li>Hebrew</li>
+ <li>Icelandic</li>
+ <li>Indonesian</li>
+ <li>Latvian</li>
+ <li>Lithuanian</li>
+ <li>Occitan (post 1500)</li>
+ <li>Persian</li>
+ <li>Portuguese</li>
+ <li>Portuguese (Brazil)</li>
+ <li>Russian</li>
+ <li>Serbian</li>
+ <li>Slovak</li>
+ <li>Slovenian</li>
+ <li>Spanish</li>
+ <li>Swedish</li>
+ <li>Turkish</li>
+ <li>Ukrainian</li>
+ <li>Vietnamese</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2021-09-17" version="41.0" type="stable">
+ <description>
+ <p>This is a stable release with the following changes:</p>
+ <ul>
+ <li>Instead of showing all package-based apps as "potentially unsafe", only use that language for 3rd party ones</li>
+ <li>Fix a bug where the "Show more" button on an app details page would flicker when the window is resized</li>
+ <li>Fix a bug where Software sometimes shows an Uninstall button after uninstalling something</li>
+ <li>Add GNOME Circle apps to the featured carousel</li>
+ <li>Fix a bug where Software would sometimes fail to execute an install/remove operation for PackageKit software rather than showing a PolicyKit password prompt</li>
+ <li>Fix a bug where Software would fail to upgrade the distribution via PackageKit</li>
+ <li>Fix the hiding of rows on the Updates tab after they have been updated</li>
+ </ul>
+ <p>This release also updates translations:</p>
+ <ul>
+ <li>Basque</li>
+ <li>Catalan</li>
+ <li>Chinese (China)</li>
+ <li>Croatian</li>
+ <li>Czech</li>
+ <li>Danish</li>
+ <li>Dutch</li>
+ <li>Finnish</li>
+ <li>French</li>
+ <li>Galician</li>
+ <li>German</li>
+ <li>Hungarian</li>
+ <li>Indonesian</li>
+ <li>Korean</li>
+ <li>Lithuanian</li>
+ <li>Occitan (post 1500)</li>
+ <li>Polish</li>
+ <li>Portuguese</li>
+ <li>Portuguese (Brazil)</li>
+ <li>Romanian</li>
+ <li>Russian</li>
+ <li>Slovenian</li>
+ <li>Spanish</li>
+ <li>Swedish</li>
+ <li>Ukrainian</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2021-09-07" version="41~rc" type="development">
+ <description>
+ <p>This is the third unstable release for GNOME 41.</p>
+ <ul>
+ <li>Tweaks to the context tiles and dialogs</li>
+ <li>Fixes to the details page for non-desktop apps</li>
+ <li>Re-add support for the add-ons categories</li>
+ <li>Sort new and updated apps by release date on the category page</li>
+ </ul>
+ <p>This release also updates translations:</p>
+ <ul>
+ <li>Basque</li>
+ <li>Catalan</li>
+ <li>Chinese (China)</li>
+ <li>Chinese (Taiwan)</li>
+ <li>Croatian</li>
+ <li>English (United Kingdom)</li>
+ <li>Finnish</li>
+ <li>Galician</li>
+ <li>Indonesian</li>
+ <li>Kazakh</li>
+ <li>Korean</li>
+ <li>Lithuanian</li>
+ <li>Occitan (post 1500)</li>
+ <li>Persian</li>
+ <li>Portuguese</li>
+ <li>Portuguese (Brazil)</li>
+ <li>Slovenian</li>
+ <li>Spanish</li>
+ <li>Swedish</li>
+ <li>Ukrainian</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2021-08-13" version="41~beta" type="development">
+ <description>
+ <p>This is the second unstable release for GNOME 41.</p>
+ <ul>
+ <li>Many parts of the user interface reworked</li>
+ <li>Fix when the 'Launch' button is shown after an application install</li>
+ <li>Fix appstream:// URL handling</li>
+ <li>Fix application freeze on Flatpak application install/remove/update</li>
+ <li>Disable automatic update downloads when in power saver mode</li>
+ </ul>
+ <p>This release also updates translations:</p>
+ <ul>
+ <li>Belarusian</li>
+ <li>Bulgarian</li>
+ <li>Catalan</li>
+ <li>Friulian</li>
+ <li>Galician</li>
+ <li>German</li>
+ <li>Greek, Modern (1453-)</li>
+ <li>Occitan (post 1500)</li>
+ <li>Persian</li>
+ <li>Portuguese</li>
+ <li>Portuguese (Brazil)</li>
+ <li>Slovenian</li>
+ <li>Ukrainian</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2021-07-20" version="41~alpha" type="development">
+ <description>
+ <p>This is the first unstable release for GNOME 41.</p>
+ <ul>
+ <li>Many parts of the user interface reworked</li>
+ <li>Improve error reporting from flatpak when low on disk space</li>
+ <li>Fix issues with updating the UI when uninstalling apps with add-ons</li>
+ <li>Don’t keep rpm-ostreed alive forever</li>
+ <li>Prevent polkit checks showing up for background operations</li>
+ <li>Disallow submitting reviews for an app you haven’t installed</li>
+ <li>Show download size in the Updates page</li>
+ <li>Notify when restart is needed when uninstalling an app</li>
+ <li>Fix some issues with searches not running</li>
+ <li>Allow non-integer average star ratings for apps</li>
+ <li>Reduce number of categories in the UI</li>
+ <li>Improve ‘pending updates’ notifications</li>
+ <li>Refine presentation of download and installed size on details page</li>
+ <li>Remove left over gnome-online-account dependencies</li>
+ </ul>
+ <p>This release also updates translations:</p>
+ <ul>
+ <li>Basque</li>
+ <li>Belarusian</li>
+ <li>Bokmål, Norwegian</li>
+ <li>Catalan</li>
+ <li>Chinese (China)</li>
+ <li>Chinese (Taiwan)</li>
+ <li>Czech</li>
+ <li>Dutch</li>
+ <li>English (United Kingdom)</li>
+ <li>Finnish</li>
+ <li>Friulian</li>
+ <li>German</li>
+ <li>Greek, Modern (1453-)</li>
+ <li>Hebrew</li>
+ <li>Italian</li>
+ <li>Lithuanian</li>
+ <li>Nepali</li>
+ <li>Occitan (post 1500)</li>
+ <li>Persian</li>
+ <li>Polish</li>
+ <li>Portuguese</li>
+ <li>Portuguese (Brazil)</li>
+ <li>Romanian</li>
+ <li>Russian</li>
+ <li>Serbian</li>
+ <li>Spanish</li>
+ <li>Swedish</li>
+ <li>Ukrainian</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2021-03-19" version="40" type="stable">
+ <description>
+ <p>This is a stable release with the following changes:</p>
+ <ul>
+ <li>Fix handling of invalid or incomplete application icons</li>
+ <li>Fix the plugin documentation to reflect reality</li>
+ <li>Fix the Snap plugin to actually load icons</li>
+ <li>Set download size to 0 after the package is downloaded</li>
+ </ul>
+ <p>Translation updates:</p>
+ <ul>
+ <li>British English</li>
+ <li>Danish</li>
+ <li>Greek</li>
+ <li>Italian</li>
+ <li>Norwegian Bokmål</li>
+ <li>Polish</li>
+ <li>Punjabi</li>
+ <li>Serbian</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2021-03-12" version="40~rc" type="development">
+ <description>
+ <p>This is an unstable release with the following changes:</p>
+ <ul>
+ <li>Implement new featured apps carousel.</li>
+ <li>List of Flatpak repositories is updated when changed using the Flatpak command line tool.</li>
+ <li>The loading page now shows the full color icon instead of the symbolic one.</li>
+ <li>Show release date in version history for releases that use the 'date' attribute.</li>
+ <li>Improved icon handling, including with hiDPI screens.</li>
+ <li>Fixed a bug in remembering when update notifications were shown.</li>
+ <li>Build as a dynamic rather than a static library, and rearrange installation paths.</li>
+ </ul>
+ <p>Translation updates:</p>
+ <ul>
+ <li>Basque</li>
+ <li>Catalan</li>
+ <li>Croatian</li>
+ <li>Czech</li>
+ <li>Dutch</li>
+ <li>English (United Kingdom)</li>
+ <li>Finnish</li>
+ <li>French</li>
+ <li>Friulian</li>
+ <li>Galician</li>
+ <li>German</li>
+ <li>Hungarian</li>
+ <li>Indonesian</li>
+ <li>Kazakh</li>
+ <li>Korean</li>
+ <li>Lithuanian</li>
+ <li>Persian</li>
+ <li>Portuguese</li>
+ <li>Portuguese (Brazil)</li>
+ <li>Romanian</li>
+ <li>Serbian</li>
+ <li>Slovenian</li>
+ <li>Spanish</li>
+ <li>Swedish</li>
+ <li>Turkish</li>
+ <li>Ukrainian</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2021-02-16" version="40~beta" type="development">
+ <description>
+ <p>This is an unstable release with the following changes:</p>
+ <ul>
+ <li>GNOME Software now uses libappstream instead of libappstream-glib to work with appstream data which provides information about apps and other components.</li>
+ <li>App details pages show version history information when it's available.</li>
+ <li>The loading page now shows the full color icon instead of the symbolic one.</li>
+ <li>UI elements for displaying app add-ons have been tweaked to more closely match the designs.</li>
+ <li>Installed icons and the badge showing the number of updates available were changed back to blue from green.</li>
+ <li>The dropdown showing the available sources of an application includes the packaging format (e.g. Flatpak vs RPM).</li>
+ <li>A bug was fixed that prevented installation of .flatpakref files</li>
+ </ul>
+ <p>Translation updates:</p>
+ <ul>
+ <li>Catalan</li>
+ <li>Czech</li>
+ <li>Galician</li>
+ <li>Indonesian</li>
+ <li>Panjabi</li>
+ <li>Portuguese</li>
+ <li>Slovenian</li>
+ <li>Spanish</li>
+ <li>Swedish</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2021-01-27" version="40~alpha" type="development">
+ <description>
+ <p>This is the first unstable release for GNOME 40.</p>
+ <ul>
+ <li>Small updates to how app descriptions and addons are presented on the details page</li>
+ <li>Fix handling of pending app installations when going online</li>
+ <li>Better support for dark themes (particularly Adwaita-Dark)</li>
+ <li>Improvements to how app screenshots are loaded and presented</li>
+ <li>Hide ‘Launch’ button if an application (for example, Wine) cannot be launched</li>
+ <li>Make the UI clearer when loading information from flatpakref files</li>
+ <li>Don’t update app metadata on start when download-updates is disabled</li>
+ <li>Fix opening the updates list when clicking on an updates notification</li>
+ <li>Fix state updates when installing flatpak apps or repos which are already installed</li>
+ <li>Add Ctrl+Q as a keyboard shortcut for closing the window</li>
+ <li>Rework timing and content of software update notifications</li>
+ <li>Prevent uninstalled local apps from appearing in the installed apps list</li>
+ <li>Support installation/uninstallation of addons for flatpak apps</li>
+ <li>Improve presentation of age ratings for apps</li>
+ <li>Fix a crash in the updates page</li>
+ <li>Fix presentation of app permissions for fully sandboxed flatpak apps</li>
+ <li>Fix deadlock on rpm-ostree systems</li>
+ <li>Fix presentation of version number changes in right-to-left locales</li>
+ <li>Error handling improvements for fwupd</li>
+ <li>Performance improvements for ODRS on startup</li>
+ <li>Improve presentation of firmware warning messages</li>
+ <li>XML parsing performance improvements</li>
+ <li>Automatically remove end-of-life flatpak runtimes</li>
+ <li>Support updating flatpaks to their new name when they are renamed</li>
+ <li>Update the GNOME Software icon</li>
+ <li>Support more search results in the snap store</li>
+ <li>Drop libgnome-desktop-3 dependency in favour of gsettings-desktop-schemas</li>
+ </ul>
+ <p>This release also updates translations:</p>
+ <ul>
+ <li>Basque</li>
+ <li>Bokmål, Norwegian</li>
+ <li>Catalan</li>
+ <li>Chinese (Taiwan)</li>
+ <li>Czech</li>
+ <li>Friulian</li>
+ <li>Galician</li>
+ <li>German</li>
+ <li>Greek, Modern (1453-)</li>
+ <li>Hebrew</li>
+ <li>Indonesian</li>
+ <li>Italian</li>
+ <li>Kabyle</li>
+ <li>Kazakh</li>
+ <li>Latvian</li>
+ <li>Lithuanian</li>
+ <li>Persian</li>
+ <li>Portuguese</li>
+ <li>Portuguese (Brazil)</li>
+ <li>Romanian</li>
+ <li>Slovak</li>
+ <li>Spanish</li>
+ <li>Turkish</li>
+ <li>Ukrainian</li>
+ <li>Vietnamese</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2020-09-01" version="3.37.92" type="development">
+ <description translatable="no">
+ <p>This is an unstable stable release with the following changes:</p>
+ <ul>
+ <li>Add sysprof support for profiling jobs</li>
+ <li>Add webflow and basic auth support to flatpak plugin</li>
+ <li>Coalesce refresh operations where possible</li>
+ <li>Correctly mark layered rpm-ostree local packages as removable</li>
+ <li>Fix flatpak bundle installation</li>
+ <li>Handle invalid snap auth data</li>
+ <li>Improve flatpak progress reporting for transactions</li>
+ <li>Improve the heuristic for detecting old-style AppStream override files</li>
+ <li>Many performance improvements in many areas of the code</li>
+ <li>Only delete the firmware archive if we downloaded it to the cache</li>
+ <li>Show a pulsing progress bar if progress is unknown</li>
+ <li>Support loading appstream files from custom install prefix</li>
+ <li>Use the runtime fwupd version for the user agent</li>
+ </ul>
+ <p>This release also updates existing translations.</p>
+ </description>
+ </release>
+ <release date="2020-03-11" version="3.36.0" type="stable">
+ <description translatable="no">
+ <p>This is the first stable release for GNOME 3.36.</p>
+ </description>
+ </release>
+ <release date="2020-03-04" version="3.35.92" type="development">
+ <description translatable="no">
+ <p>This is an unstable stable release with the following changes:</p>
+ <ul>
+ <li>Fix crash when viewing application details</li>
+ <li>Fix “thrice daily” check running every 3 days</li>
+ <li>Improve the appearance of the front page banners</li>
+ <li>Show the correct upgrade banner contents when a reboot is requried</li>
+ </ul>
+ <p>This release also updates existing translations.</p>
+ </description>
+ </release>
+ <release date="2020-02-19" version="3.35.91" type="development">
+ <description translatable="no">
+ <p>This is an unstable stable release with the following changes:</p>
+ <ul>
+ <li>Add an info bar about automatic updates</li>
+ <li>Avoid rpm-ostree downgrade error when doing distro upgrade</li>
+ <li>Click on stars to open review dialog in the details view</li>
+ <li>Fix loading of icons from AppStream YAML</li>
+ <li>Fix weird font sizes in the batter</li>
+ <li>Hide any in-app notifications when closing the main window</li>
+ <li>Integrate better with snapd</li>
+ <li>Only ignore flatpak estimated progress if >10%</li>
+ <li>Remove color stripes on categories in the Explore page</li>
+ <li>Remove support for Shell extensions</li>
+ <li>Remove webapp support</li>
+ <li>Reset star rating when loading an unrated app</li>
+ <li>Sort applications using locale based algorithms</li>
+ <li>Stop snaps from being automatically updated</li>
+ </ul>
+ <p>This release also adds and updates existing translations.</p>
+ </description>
+ </release>
+ <release date="2019-11-25" version="3.35.2" type="development">
+ <description translatable="no">
+ <p>This is an unstable stable release with the following changes:</p>
+ <ul>
+ <li>Add missing OARS content rating descriptions</li>
+ <li>Add new plugin for restricting access to apps</li>
+ <li>Avoid a UI crash when switching modes</li>
+ <li>Build libmalcontent dependency on Fedora CI</li>
+ <li>Correctly distinguish empty content ratings from missing ones</li>
+ <li>Correctly set the application state if autoupdate is in progress</li>
+ <li>Do not show a crazy error when installing packages</li>
+ <li>Do not show non-applications in the installed panel</li>
+ <li>Download Flatpak updates in the correct installation</li>
+ <li>Expose snap channels as app alternates</li>
+ <li>Fix a crash on 32-bit systems</li>
+ <li>Fix langpacks autoinstall on Fedora SilverBlue</li>
+ <li>Fix manual detach when updating removable device firmware</li>
+ <li>Fix third party repo enabling not working</li>
+ <li>Hide add/remove shortcut buttons for parentally filtered apps</li>
+ <li>Improve some front page banners</li>
+ <li>Invalidate caches when adding or removing remotes</li>
+ <li>Make flatpak more thread-safe to fix some crashes</li>
+ <li>Match the exact ID when refining a wildcard</li>
+ <li>Only set the app row's buttons as destructive when they remove an app</li>
+ <li>Remove hardcoded-featured plugin</li>
+ <li>Remove the app folder functionality as this is now built-in to the shell</li>
+ <li>Remove the banner editor as this is now an app on it's own</li>
+ <li>Rework age ratings handling to avoid hard-coded list</li>
+ <li>Set the shell extension origin correctly in all cases</li>
+ <li>Show the channel for snaps</li>
+ <li>Speed up the flatpak plugin in some situations</li>
+ <li>Use plugin API to launch apps from install notification.</li>
+ </ul>
+ <p>This release also adds and updates existing translations.</p>
+ </description>
+ </release>
+ <release date="2019-09-09" version="3.34.0" type="stable">
+ <description translatable="no">
+ <p>This is a stable release with the following changes:</p>
+ <ul>
+ <li>Add a link to the privacy policy in the review dialog</li>
+ <li>Add and improve many overview banners</li>
+ <li>Add support for download scheduling using Mogwai</li>
+ <li>Allow installing locale data automatically</li>
+ <li>Allow snaps to be shown by AppStream ID</li>
+ <li>Don't apply drop shadow on stock symbolic icons</li>
+ <li>Don't install queued apps when the network changes and is metered</li>
+ <li>Fix the 'localised in my language' kudo</li>
+ <li>Hide addons that are not available in repos</li>
+ <li>Localize ESRB content rating strings</li>
+ <li>Never show the installation progress bar going backwards</li>
+ <li>Notify the user when an application can escape the sandbox</li>
+ <li>Refactor screenshots and hide those unavailable when offline</li>
+ <li>Select the rating systems selected based by territory</li>
+ <li>Use smaller default size for main window when required</li>
+ </ul>
+ <p>This release also adds and updates existing translations.</p>
+ </description>
+ </release>
+ <release date="2019-07-11" version="3.32.4" type="stable">
+ <description translatable="no">
+ <p>This is a stable release with the following changes:</p>
+ <ul>
+ <li>Fix an issue that led to some packages with multiple appdata files not correctly showing up on the updates page</li>
+ <li>Fix various problems with flatpak branch handling that were causing issues with freedesktop.org runtime updates</li>
+ <li>Fix flatpak update versions to correctly show up</li>
+ <li>Various other minor bug fixes</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2019-05-24" version="3.32.3" type="stable">
+ <description translatable="no">
+ <p>This is a stable release with the following changes:</p>
+ <ul>
+ <li>Add missing XbSilo locking, hopefully fixing a large number of reported crashes</li>
+ <li>Fix a regression that caused the fonts category to go missing</li>
+ <li>Show a placeholder on the details page when we don't have the actual icon</li>
+ <li>Plug a large memory leak</li>
+ <li>Use nicer arrows for version numbers on the updates page</li>
+ <li>Fix an issue that led to screenshots not being correctly scaled on hidpi</li>
+ <li>flatpak: Fix several double-uses of GErrors</li>
+ <li>flatpak: Handle failure of a libflatpak function updating permissions</li>
+ <li>rpm-ostree: Implement what-provides decompose</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2019-05-07" version="3.32.2" type="stable">
+ <description translatable="no">
+ <p>This is a stable release with the following changes:</p>
+ <ul>
+ <li>Avoid showing a review more than once</li>
+ <li>Correctly update progress bar when downloading packagekit distro upgrades</li>
+ <li>Fix a crash when closing the updates dialog before the content has loaded</li>
+ <li>Fix CTRL+F not working right in certains conditions</li>
+ <li>Set 022 umask to make sure flatpak system helper process can read the files we've written</li>
+ <li>rpm-ostree: Implement getting the repo list, and enabling and disabling repos</li>
+ <li>rpm-ostree: Implement provides search</li>
+ <li>rpm-ostree: Make layered apps not discoverable in the UI</li>
+ <li>Various other minor bug fixes</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2019-04-15" version="3.32.1" type="stable">
+ <description translatable="no">
+ <p>This is a stable release with the following changes:</p>
+ <ul>
+ <li>Add drop shadows to app icons</li>
+ <li>Various fixes to initial loading screen</li>
+ <li>Show a generic icon instead of empty space if we failed to load the app icon</li>
+ <li>Update featured banners for Maps and Blender</li>
+ <li>Update featured app IDs</li>
+ <li>Fix a crash due to missing locking</li>
+ <li>Fix missing back button under certain conditions</li>
+ <li>Fix loading AppSteam data from .yml.gz files</li>
+ <li>Fix an issue that caused flatpak repo to not be correctly shown when it matched an existing packagekit repo name</li>
+ <li>Hide the fwupd Vendor repo in the repos dialog</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2019-03-11" version="3.32.0" type="stable">
+ <description translatable="no">
+ <p>This is the first stable release for GNOME 3.32. Notable changes compared to 3.30 include:</p>
+ <ul>
+ <li>Appstream parsing is completely rewritten and now uses the new libxmlb library, instead of appstream-glib</li>
+ <li>Improved handling for apps that are available from multiple sources, e.g. as a flatpak from Flathub, as a flatpak from Fedora, and as an RPM package</li>
+ <li>New source selection drop down on the details pages</li>
+ <li>Flatpak apps now list the permissions they need on the details pages, and also show new permissions when updating</li>
+ <li>The flatpak backend received a large number of bug fixes</li>
+ <li>The rpm-ostree backend has grown many new features and bug fixes, including support for installing layered packages and doing distro upgrades</li>
+ <li>Numerous fixes for error reporting, including making error messages more useful and avoiding showing network errors from background operations</li>
+ <li>The items in the app menu were all moved to the window menu</li>
+ <li>New redesigned icon</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2019-03-05" version="3.31.92" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.31 development series, marking the end of the development cycle. Next release will be 3.32.0!</p>
+ <ul>
+ <li>Add two missing description strings for flatpak permissions</li>
+ <li>Only show permissions for flatpak apps and not for e.g. fonts</li>
+ <li>Fix flatpak permissions to correctly show up for available apps</li>
+ <li>Hide various details page items that don't make sense when showing .flatpakrepo files</li>
+ <li>Fix an issue that caused descriptions to sometimes not get correctly loaded</li>
+ <li>Sort the items in the Source drop down</li>
+ <li>Don't show error notifications for background download and refresh errors</li>
+ <li>Fix an issue that could cause an explosion of "A restart is required" notifications</li>
+ <li>Various flatpak plugin fixes to make it correctly match the data when multiple flatpak repos are available</li>
+ <li>Fix the rpm-ostree plugin to correctly convert remote dbus errors</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2019-02-24" version="3.31.90" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.31 development series, with the following improvements:</p>
+ <ul>
+ <li>Fix showing the installed check mark on tiles</li>
+ <li>Fix crashes in the packagekit plugin due to missing locking</li>
+ <li>Add back support for appstream data in /var/{cache,lib}/app-info directories that accidentally got left out with the libxmlb rewrite</li>
+ <li>Update the featured banner for gnome-chess</li>
+ <li>Fix the details page alignment when only one screenshot is shown</li>
+ <li>Move the Update button to the right hand side on the details page</li>
+ <li>Fix enabling repos when installing codecs through the extras page</li>
+ <li>Remove the Sundry folder and sync the apps in the Utilities folder with gnome-menus 3.31.90</li>
+ <li>Improve various content rating texts</li>
+ <li>Drop workarounds for locales with codesets</li>
+ <li>Use the currently selected icon theme for stock icons</li>
+ <li>Don't hide compulsory apps in the category views</li>
+ <li>Use the SPDX-License-Identifier in all source files</li>
+ <li>Remove various useless error prefixes, making flatpak and packagekit error messages shorter and easier to read</li>
+ <li>flatpak: Show the installation type (user, system) in the Source dropdown</li>
+ <li>flatpak: Let apps control the name suffix/prefix they have and don't force (Nightly) suffix for everything on the master branch</li>
+ <li>flatpak: Various fixes for matching flatpaks to appstream entries</li>
+ <li>flatpak: Distinguish between the same app coming from multiple remotes</li>
+ <li>rpm-ostree: Correctly resolve installed appdata files to package names</li>
+ <li>rpm-ostree: Hook up percentage progress for install and remove</li>
+ <li>rpm-ostree: Implement layered package install</li>
+ <li>rpm-ostree: Implement locally downloaded rpm install</li>
+ <li>rpm-ostree: Show the source of the packages when installing layered packages</li>
+ <li>rpm-ostree: Various fixes making things more robust</li>
+ <li>snap: Use new media API</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2019-01-16" version="3.31.2" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.31 development series, with the following improvements:</p>
+ <ul>
+ <li>Show permissions for installed flatpaks, and new permissions for updates</li>
+ <li>Use libxmlb to parse AppStream XML, making gnome-software start up faster and use less memory</li>
+ <li>Update the app icon</li>
+ <li>Update categories for ESRA rating system</li>
+ <li>Improve various error messages to have more details</li>
+ <li>Fix an issue that caused incorrect version numbers to be shown for installed flatpaks</li>
+ <li>Fix various thread safety related crashes</li>
+ <li>Fix row unrevealing to not leave behind 2 pixels on the updates page</li>
+ <li>Make the refresh button to actually refresh packagekit cache</li>
+ <li>Fix various issues that could lead to cache refresh getting stuck</li>
+ <li>Show updates available notifications even when automatic updates are disabled</li>
+ <li>Fix counting apps in the updates applied notification</li>
+ <li>Improve packagekit update loading code, hopefully making it more robust</li>
+ <li>Fix an issue that could lead to the packagekit plugin activating on rpm-ostree based systems</li>
+ <li>Switch flatpak updates to use a single transaction, which lets us share more code (and bugs) with the command line flatpak utility</li>
+ <li>Fix various issues with transitioning from the "Download" state to "Restart &amp; Update"</li>
+ <li>Don't error out from update downloads if the ODRS server is unavailable</li>
+ <li>Fix old updates accumulating in the OS Updates item</li>
+ <li>Various flatpakref installation fixes</li>
+ <li>Fix opening the details page when clicking on "Show Details" in GNOME Shell</li>
+ <li>Fix opening shell extensions details from GNOME Tweaks</li>
+ <li>Various fixes for initial loading state</li>
+ <li>Add a separate "Download" step for packagekit offline updates, so that "Restart &amp; Update" is instant</li>
+ <li>Fix a version comparison issue that led to package updates sometimes showing as downgrades in the OS Updates section (this needs latest appstream-glib)</li>
+ <li>Show the refresh button when the updates page is in the failed state</li>
+ <li>Notify about offline updates only after they are fully downloaded</li>
+ <li>Fix a memory corruption issue on 32-bit arches that made gnome-software very crashy</li>
+ <li>Fix an issue with stuck back button on the details page after closing and reopening gnome-software</li>
+ <li>Make distro upgrades to Fedora N+2 release show up correctly</li>
+ <li>Various flatpak plugin fixes</li>
+ <li>Allow opening CAB files that include more than one update</li>
+ <li>Fix critical warnings when quickly switching between category pages</li>
+ <li>Small memory leak fixes</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2018-10-09" version="3.31.1" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.31 development series, with the following improvements:</p>
+ <ul>
+ <li>Icon redesign</li>
+ <li>Switch to using window menus instead of app menu</li>
+ <li>Add a source selection drop down to details pages</li>
+ <li>Move the search button to the left side in the header bar</li>
+ <li>Various other minor UI tweaks</li>
+ <li>GtkBuilder UI file changes to pave the way for an eventual GTK4 port (please file issues for any UI layout regressions if you notice any!)</li>
+ <li>Various internal plugin loader fixes and cleanups</li>
+ <li>Remove the steam plugin</li>
+ <li>Simplify the details page loading</li>
+ <li>Fix an issue that caused icons to not get loaded for locally installed flatpaks</li>
+ <li>Update Fedora distro upgrades text</li>
+ <li>Avoid a critical warning in the fwupd plugin when the device vendor is not set</li>
+ <li>Show verified developers for snaps</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2018-10-05" version="3.30.2" type="stable">
+ <description translatable="no">
+ <p>This is a stable release with the following changes:</p>
+ <ul>
+ <li>Localize the polkit policy file</li>
+ <li>Display ongoing app-installation at top of the list</li>
+ <li>Update apps in display order</li>
+ <li>Fix autoupdates triggering in a feedback loop</li>
+ <li>Tweak the prefs dialog layout</li>
+ <li>Various fixes to the flatpak plugin, making its state keeping more robust</li>
+ <li>Fix flatpak errors to show up instead of a generic "Aborted" error</li>
+ <li>Avoid triggering reboots for online updatable apps (flatpak)</li>
+ <li>Make rpm-ostree updates work again</li>
+ <li>Fix an issue that caused duplicate lines in 'OS Updates' on rpm-ostree based systems</li>
+ <li>Compiler warning fixes</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2018-09-25" version="3.30.1" type="stable">
+ <description translatable="no">
+ <p>This is a stable release with the following changes:</p>
+ <ul>
+ <li>Fix an issue that caused duplicate lines in 'OS Updates'</li>
+ <li>Filter the application restart notification to actual desktop apps</li>
+ <li>Fix an issue that caused automatic updates to fail during download phase</li>
+ <li>Avoid showing duplicates in the featured apps when an app is available as both flatpak and a package</li>
+ <li>Fix an issue that caused gnome-software to use 100% of CPU when doing automatic updates</li>
+ <li>Lower IO priority for gnome-software so that other apps stay responsive during flatpak installs</li>
+ <li>Various fixes and wording changes to automatic updates notifications</li>
+ <li>Only show "Examine Disk" button when baobab is available</li>
+ <li>Leak and correctness fixes in the snap plugin</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2018-09-04" version="3.30.0" type="stable">
+ <description translatable="no">
+ <p>This is the first stable release for GNOME 3.30.</p>
+ </description>
+ </release>
+ <release date="2018-08-28" version="3.29.92" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.27 development series, with the following improvements:</p>
+ <ul>
+ <li>Do not go 'back' to a previous application details panel</li>
+ <li>Don't crash if when getting the fwupd locked status</li>
+ <li>Download updates automatically when required</li>
+ <li>Fix dark theme support</li>
+ <li>Hide screenshot and support widgets when no screenshots</li>
+ <li>Ignore non-interactive generic errors</li>
+ <li>Implement distro upgrade downloading when using rpm-ostree</li>
+ <li>Only update the update check timestamp when it succeeds</li>
+ <li>Open the WiFi panel when clicking the Network Settings button</li>
+ <li>Rotate featured apps on the overview page</li>
+ <li>Simplify the updates panel</li>
+ <li>Use FlatpakTransaction to install, remove and update</li>
+ <li>Use new display name for the Snap publisher</li>
+ <li>Use the full name for the ESRB ratings descripion</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2018-03-05" version="3.29.1" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.27 development series, with the following improvements:</p>
+ <ul>
+ <li>Show a better notification when a local file or URI is not supported</li>
+ <li>snap: Use ODRS for reviews</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2018-05-09" version="3.28.2" type="stable">
+ <description translatable="no">
+ <p>This is a stable release with the following changes:</p>
+ <ul>
+ <li>Add a warning when enabling the LVFS remote</li>
+ <li>Show a notification when failing to open an url or a local file</li>
+ <li>Fix multiple flatpak refreshes with new libflatpak</li>
+ <li>Build fixes for FreeBSD</li>
+ <li>Icon loading fixes for snap</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2018-04-09" version="3.28.1" type="stable">
+ <description translatable="no">
+ <p>This is a stable release with the following changes:</p>
+ <ul>
+ <li>Fix a regression with opening results from gnome-shell search</li>
+ <li>Show "Source: " tag in gnome-shell search when we have multiple matches</li>
+ <li>Improve unknown license tag color scheme on details page</li>
+ <li>Don't show installed icon on app tiles while still installing</li>
+ <li>Fix empty items appearing under OS Updates</li>
+ <li>Fix a regression that caused duplicate results in codec search</li>
+ <li>Fix an issue with passing username/password to packagekit proxy</li>
+ <li>Avoid crashing during first run with no network access</li>
+ <li>A number of rpm-ostree fixes, making it possible to trigger offline updates</li>
+ <li>Stop searching multiple times on search page</li>
+ <li>Update Fedora third party repositories "Find out more..." link</li>
+ <li>Fix an issue with in-app notifications failing with invalid markup errors</li>
+ <li>Improve purchase failure handling for the snap store</li>
+ <li>Fix a possible crash in snap plugin when adding screenshots</li>
+ <li>Various other crash and correctness fixes</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2018-03-12" version="3.28.0" type="stable">
+ <description translatable="no">
+ <p>This is the first stable release for GNOME 3.28, with the following improvements:</p>
+ <ul>
+ <li>Fix the build on NixOS</li>
+ <li>Fix purchasing not working after authentication</li>
+ <li>Revert a commit that led to flatpak updates failing without any feedback</li>
+ <li>Make front page featured tile corners round to match other tiles</li>
+ <li>Fix in-app notification close button alignment</li>
+ <li>Several fixes to make error notifications more useful</li>
+ <li>snap: Fix invalid metadata after cancelled refine</li>
+ <li>snap: Launch command line snaps with 'snap run'</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2018-03-05" version="3.27.92" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.27 development series, marking the end of the development cycle. Next release will be 3.28.0!</p>
+ <ul>
+ <li>Removal of global plugin cache, simplifying gnome-software internals</li>
+ <li>Software Repositories dialog got another batch of improvements and UI changes</li>
+ <li>GNOME Shell Extensions repository and fwupd repositories are now shown in the Software Repositories dialog</li>
+ <li>Shell extensions handling through PackageKit was improved, fixing a long standing bug where we were unable to remove shell extension packages</li>
+ <li>Category page rewrite that landed earlier this cycle went through UI review and got a number of fixes</li>
+ <li>Package version comparison in the updates dialog was fixed and should no longer incorrectly show updates as downgrades</li>
+ <li>Distro upgrade notifications are now rate limited to once per week</li>
+ <li>Install buttons in codec install view that got lost in the 3.22 cycle are now back</li>
+ <li>Various paper cuts with distro upgrades were fixed</li>
+ <li>Various fixes to installing apps from yum repos that have enabled=0 enabled_metadata=1</li>
+ <li>Various other correctness and warning fixes</li>
+ <li>Distros: Minimum supported fwupd version is now 1.0.3</li>
+ <li>Distros: We've released PackageKit 1.1.9 that has string changes to match gnome-software 3.28</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2018-02-14" version="3.27.90" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.27 development series, with the following improvements:</p>
+ <ul>
+ <li>The Software Sources dialog was renamed to Software Repositories and rewritten</li>
+ <li>Fedora Workstation third party repository handling was rewritten and should be more robust</li>
+ <li>Improved handling of metered network connections, making sure we cancel any downloads when changing to a metered connection</li>
+ <li>Limit the number of parallel operations depending on the installed CPU</li>
+ <li>Improved handling of pending installs when there's no network connection</li>
+ <li>Unused ostree and rpm plugins were dropped</li>
+ <li>Switch from GtkSpell to gspell</li>
+ <li>Improve alignment on the updates page</li>
+ <li>Do not show missing screenshot error for fonts that have screenshots</li>
+ <li>Fix various issues on Ubuntu when purchasing apps</li>
+ <li>Fix an issue that led to duplicate categories appearing on the overview page</li>
+ <li>Various memory leak and correctness fixes</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2018-01-08" version="3.27.4" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.27 development series, with the following improvements:</p>
+ <ul>
+ <li>Add missing locking to gs_plugin_cache_remove(), fixing a possible crash</li>
+ <li>Fix various memory leaks spotted by valgrind</li>
+ <li>Fix a possible crash triggered by the fwupd plugin</li>
+ <li>Do not emit critical warnings when reviewing OS Updates</li>
+ <li>fwupd: Use the custom user-agent when downloading firmware</li>
+ <li>overview page: Fix a crash when we have no featured apps</li>
+ <li>packagekit: Implement repository enabling</li>
+ <li>Fix hover CSS for "unknown" and "nonfree" license buttons</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2017-11-13" version="3.27.3" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.27 development series, with the following improvements:</p>
+ <ul>
+ <li>Fix crashes in the repos plugin due to missing locking</li>
+ <li>Add translated strings for the new OARS v1.1 additions</li>
+ <li>Work around Firefox deleting rpm/deb files downloaded to /tmp when closing</li>
+ <li>Log errors to console when starting from command line</li>
+ <li>Do not enable distro-upgrades when updates are disabled</li>
+ <li>Do not require the user to keep clicking 'More reviews' after each click</li>
+ <li>Fix a critical when updating (flatpak) packages live</li>
+ <li>fwupd: Do not crash when trying to list a locked device</li>
+ <li>fwupd: Prepend the vendor name to the device name if not included</li>
+ <li>Improve SPDX ID parsing when working out if it is 'free'</li>
+ <li>packagekit: Do not crash when getting an invalid ID from PackageKit</li>
+ <li>packagekit: Support apt:// URLs</li>
+ <li>Various fixes to the snap plugin</li>
+ <li>Do not crash when closing the source dialog while it is loading</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2017-11-13" version="3.27.2" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.27 development series, with the following improvements:</p>
+ <ul>
+ <li>Redesigned category view</li>
+ <li>Better notifications for completed distro upgrades</li>
+ <li>Number of test suite fixes to pave way for continuous integration tests</li>
+ <li>Improved support for running on low res displays</li>
+ <li>Various fixes to internal state handling</li>
+ <li>Allow linking to specified proprietary licenses</li>
+ <li>Don't use versioned subdirectories under ~/.cache/gnome-software</li>
+ <li>Only show in-app notifications for interactive user actions</li>
+ <li>Various fixes for flatpak, fwupd, and snap support</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2017-11-09" version="3.26.2" type="stable">
+ <description translatable="no">
+ <p>This is a stable release with the following changes:</p>
+ <ul>
+ <li>Various fixes to cancellable handling, making it more robust to cancel install/remove operations</li>
+ <li>Fix a common crash in Fedora distro upgrades plugin</li>
+ <li>Fix showing N+2 Fedora upgrades</li>
+ <li>Fix flatpak updates inadvertently triggering a reboot</li>
+ <li>Revert plugin GType registering changes that broke app "adopting"</li>
+ <li>Various flatpak plugin fixes</li>
+ <li>Various snap plugin fixes</li>
+ <li>Bump fwupd required dep to 0.9.7 and support building with new 1.0.0 API</li>
+ <li>Avoid erroring out for operations that return more than 500 results (distro upgrades, getting gnome-shell extensions list)</li>
+ <li>Fix a few memory leaks</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2017-10-02" version="3.26.1" type="stable">
+ <description translatable="no">
+ <p>This is a stable release with the following changes:</p>
+ <ul>
+ <li>Fix memory leak in "external appstream" plugin</li>
+ <li>Don't translate an icon name in the Punjabi translation</li>
+ <li>Fix critical warning in the fwupd plugin if the update URI isn't set</li>
+ <li>Fix Addon categories not showing</li>
+ <li>Fix crash in PackageKit plugin if reporting progress with no current application</li>
+ <li>Revert a change in the snapd plugin which can cause operations to fail or hang in some situations</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2017-09-11" version="3.26.0" type="stable">
+ <description translatable="no">
+ <p>This is the first stable release for GNOME 3.26, with the following improvements:</p>
+ <ul>
+ <li>Use the new fwupd API in 0.9.7 to avoid when a reboot is required</li>
+ <li>Pass the complete proxy settings to PackageKit</li>
+ </ul>
+ <p>The following bugs are also fixed:</p>
+ <ul>
+ <li>Do not crash when emitting an uncommon error message</li>
+ <li>Do not show a critical warning with new versions of fwupd</li>
+ <li>Do not show an error for a remote-less flatpakref application</li>
+ <li>Don't refine PackageKit packages after we've been cancelled</li>
+ <li>Fix a possible crash on 32 bit systems</li>
+ <li>Fix GNOME Shell search results for snap applications</li>
+ <li>Properly disable shell-extensions when not running GNOME Shell</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2017-08-21" version="3.25.91" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.25 development series, with the following improvements:</p>
+ <ul>
+ <li>Add a simple donation button on the details page</li>
+ </ul>
+ <p>The following bugs are also fixed:</p>
+ <ul>
+ <li>Allow plugins to say that installation cannot be cancelled</li>
+ <li>Fix displaying the info bar for the Shell Extensions category</li>
+ <li>Use first featured snap as the featured app</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2017-08-07" version="3.25.90" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.25 development series, with the following improvements:</p>
+ <ul>
+ <li>Add a simple donation button on the details page</li>
+ </ul>
+ <p>The following bugs are also fixed:</p>
+ <ul>
+ <li>Do not crash if the child schema is invalid</li>
+ <li>Don't log a warning when clicking the the 'more results' search entry</li>
+ <li>Fixed subcategory names localization</li>
+ <li>Ensure flatpak remote names are valid</li>
+ <li>Fix critical warning with new versions of the fwupd daemon</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2017-07-21" version="3.25.4" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.25 development series, with the following improvements:</p>
+ <ul>
+ <li>Add new rpm-ostree integration for Fedora Atomic Workstation</li>
+ <li>Install the Flatpak runtime as part of the application install phase</li>
+ <li>Split OS updates up into multiple sections and show the target version</li>
+ <li>Support compatibility IDs when getting reviews from the ODRS</li>
+ </ul>
+ <p>The following bugs are also fixed:</p>
+ <ul>
+ <li>Cancel plugin jobs if they take too much time</li>
+ <li>Correctly find already installed flatpak runtimes</li>
+ <li>Do not show an error for a flatpakref when broken remotes exist</li>
+ <li>Don't show the screenshot section for runtimes</li>
+ <li>Fix authentication prompt not showing when using snapd</li>
+ <li>Make license buttons buttons actually look clickable</li>
+ <li>Make the review moderator panel easier to use</li>
+ <li>Only show snaps as sandboxed if snapd supports confinement</li>
+ <li>Respect the per-user or per-system install preferences</li>
+ <li>Return the correct installed state for user/system flatpak remotes</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2017-06-22" version="3.25.3" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.25 development series, with the following improvements:</p>
+ <ul>
+ <li>Add a banner designer utility</li>
+ <li>Add the initial support to support purchasable apps</li>
+ <li>Automatically install flatpak icon themes and GTK themes</li>
+ <li>Restyle the updates panel to have a separate sections</li>
+ <li>Show a notification in the updates page when the OS is end of life</li>
+ <li>Show recently updated applications on the overview page</li>
+ </ul>
+ <p>The following bugs are also fixed:</p>
+ <ul>
+ <li>Add snap self tests and provide more data to the details panel</li>
+ <li>Allow compiling with newer versions of meson</li>
+ <li>Do not crash when sending progress reports while refreshing</li>
+ <li>Don't trigger systemd for every single offline update</li>
+ <li>Ensure all related flatpak applications get installed</li>
+ <li>Ensure we use the gnome-desktop support if enabled</li>
+ <li>Fix searching for codecs on Ubuntu</li>
+ <li>Show a better status messages when downloading metadata</li>
+ <li>Show a pulsing progressbar if plugins do not report progress</li>
+ <li>Show the PackageKit interactive dialog when required</li>
+ <li>Support updating metadata from multiple fwupd remotes</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2017-05-08" version="3.25.2" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.25 development series, with the following improvements:</p>
+ <ul>
+ <li>Allow AppStream to be downloaded out-of-band per-user</li>
+ </ul>
+ <p>The following bugs are also fixed:</p>
+ <ul>
+ <li>Do not initialize plugins in every instance</li>
+ <li>Fix the 'Show Details' context menu item in GNOME Shell</li>
+ <li>Use headerbar in toolbar-mode in Unity</li>
+ <li>Do not allow plugins to set the origin title in the UI</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2017-04-28" version="3.25.1" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.25 development series, with the following improvements:</p>
+ <ul>
+ <li>Truncate the search results if there are a large number</li>
+ <li>Use the complete source as a search keyword</li>
+ </ul>
+ <p>The following bugs are also fixed:</p>
+ <ul>
+ <li>Fall back to a stock icon for hardware drivers</li>
+ <li>Fix a crash when removing an addon</li>
+ <li>Fix a critical warning in the shell search provider</li>
+ <li>Fix popular-overrides to show the correct applications</li>
+ <li>Fix various failures to read from snapd</li>
+ <li>Make offline updates work when online updates are available</li>
+ <li>Never include the size of the runtime in the installed size</li>
+ <li>Respect the install preference when for flatpakref files</li>
+ <li>Use the developer name in preference to the project group</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2017-03-13" version="3.23.92" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.23 development series, with the following bug fixes:</p>
+ <ul>
+ <li>Allow installing broken flatpakref files</li>
+ <li>Do not reload the updates list when updates are in progress</li>
+ <li>Reset the headerbar title when switching to the details page</li>
+ <li>Unconditionally show things that are in progress in the Installed page</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2017-02-27" version="3.23.91" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.23 development series, with the following improvements:</p>
+ <ul>
+ <li>Add support for RuntimeRepo in flatpakref files</li>
+ <li>Allow the user to restart the currently running gnome-software instance</li>
+ <li>Never show components without AppData files</li>
+ </ul>
+ <p>The following bugs are also fixed:</p>
+ <ul>
+ <li>Initialize progress to zero right before and after processing an action</li>
+ <li>Animate the removal of live updates</li>
+ <li>Add YaST as a default folder in gnome-shell overview</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2017-02-13" version="3.23.90" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.23 development series, with the following improvements:</p>
+ <ul>
+ <li>Handle apt and snap URLs</li>
+ <li>Show the updates panel with sections</li>
+ <li>Sort the apps in the installed panel by kind</li>
+ </ul>
+ <p>The following bugs are also fixed:</p>
+ <ul>
+ <li>Add a more detailed error message when AC power is required</li>
+ <li>Do not hardcode the gnome-software application name</li>
+ <li>Ensure firmware is downloaded when not cached</li>
+ <li>Fix a rather large memory leak when loading Steam data</li>
+ <li>Fix launching Flatpak apps after updating</li>
+ <li>Install needed Flatpak runtimes when updating an app</li>
+ <li>Only show the scary firmware warning for removable devices</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2016-12-15" version="3.23.3" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.23 development series, with the following improvements:</p>
+ <ul>
+ <li>Add an --install and --interaction CLI options</li>
+ <li>Add the installed size of the apps in the installed view</li>
+ <li>Always set a description for each notification</li>
+ <li>Show an in-app notification when installed plugins are changed</li>
+ <li>Use a set of stars to show the different star ratings</li>
+ </ul>
+ <p>The following bugs are also fixed:</p>
+ <ul>
+ <li>Add a missing error check to fix a common crash on LiveDVD media</li>
+ <li>Add thread locking in GsApp to fix some common crashes</li>
+ <li>Allow upgrading to Fedora EOL releases</li>
+ <li>Don't allow review actions when offline</li>
+ <li>Ensure we actually schedule firmware updates for download</li>
+ <li>Fix the getting of PackageKit and flatpak update details</li>
+ <li>Hide some notifications when the new app is launched or the window is closed</li>
+ <li>Hide the screenshot placeholder for input methods and langpacks</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2016-11-21" version="3.23.2" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.23 development series, with the following improvements:</p>
+ <ul>
+ <li>Add a setting for downloading updates on metered connections</li>
+ <li>Add content rating interface for games</li>
+ <li>Add support for pending updates that are applied on demand</li>
+ <li>Add support for the flatpak DefaultBranch feature</li>
+ <li>Allow showing an application review without a display name</li>
+ <li>Convert the modal failure dialogs to in-app notifications</li>
+ <li>Switch to using the ODRS server hosted by GNOME</li>
+ </ul>
+ <p>The following bugs are also fixed:</p>
+ <ul>
+ <li>Always get the newest screenshot for GNOME Shell extensions</li>
+ <li>Avoid redownloading the same screenshots for different images</li>
+ <li>Don't download updates when low on power</li>
+ <li>Fix the growth in memory usage for every search request</li>
+ <li>Never show a 'back' button when showing search results</li>
+ <li>Show the search bar when the user does ctrl+f</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2016-11-07" version="3.22.2" type="stable">
+ <description translatable="no">
+ <p>This stable release fixes the following bugs:</p>
+ <ul>
+ <li>Large number of fixes and improvements for flatpak support</li>
+ <li>Improved handling for flatpak repos with multiple branches</li>
+ <li>Initial support for installing flatpakrepo files</li>
+ <li>Fix a crash when searching for codecs</li>
+ <li>Fix a crash when de-duplicating applications</li>
+ <li>Speed improvements for loading appstream data</li>
+ <li>Refactor snapd handling code using snapd-glib</li>
+ <li>Show the search bar when the user does Ctrl+f</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2016-10-12" version="3.22.1" type="stable">
+ <description translatable="no">
+ <p>This stable release fixes the following bugs:</p>
+ <ul>
+ <li>Fix several issues with flatpak bundles</li>
+ <li>Fix installing local packages</li>
+ <li>Fix a crash when failing to get an installed flatpak ref</li>
+ <li>Speed up loading the details and overview pages</li>
+ <li>Switch to using the ODRS server hosted by GNOME</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2016-09-19" version="3.22.0" type="stable">
+ <description translatable="no">
+ <p>This is the first stable release for GNOME 3.22 and updates several translations.</p>
+ </description>
+ </release>
+ <release date="2016-09-13" version="3.21.92" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.21 development series, with the following improvements:</p>
+ <ul>
+ <li>Add a new section name in the Addons category for drivers</li>
+ <li>Add a plugin to match a hardware modalias</li>
+ </ul>
+ <p>The following bugs are also fixed:</p>
+ <ul>
+ <li>Do not hide the origin when installing or removing an app</li>
+ <li>Do not show the screenshot fallback image for firmware or drivers</li>
+ <li>Fix launching app's details from the installed notification</li>
+ <li>Fix showing the source line in the installed panel</li>
+ <li>Unbreak the GNOME Shell search provider</li>
+ <li>Use the same padding as a GtkStackSwitcher</li>
+ </ul>
+ <p>This release also updates translations for many languages.</p>
+ </description>
+ </release>
+ <release date="2016-08-31" version="3.21.91" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.21 development series, with the following improvements:</p>
+ <ul>
+ <li>Add functionality to enable non-free sources</li>
+ <li>Show the device bootloader screenshot when required</li>
+ </ul>
+ <p>The following bugs are also fixed:</p>
+ <ul>
+ <li>Always return consistent results by allowing plugins to share a cache</li>
+ <li>Ensure the search text is showing when going back to search results</li>
+ <li>Only enable the firmware 'Install' button when the device is in the right mode</li>
+ <li>Remove an app from the installed view when it's uninstalled</li>
+ <li>Show percentage progress when installing firmware</li>
+ </ul>
+ <p>This release also updates translations for many languages.</p>
+ </description>
+ </release>
+ <release date="2016-08-15" version="3.21.90" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.21 development series, with the following improvements:</p>
+ <ul>
+ <li>Limit the ODRS moderation queue to a specific language</li>
+ </ul>
+ <p>The following bugs are also fixed:</p>
+ <ul>
+ <li>Correctly load .flatpakrepo files</li>
+ <li>Don't get the download size for installed flatpak packages</li>
+ <li>Fix showing the progress bar when installing apps</li>
+ <li>Never try to modify the application name</li>
+ <li>Only notify about upgrades once per month</li>
+ </ul>
+ <p>This release also updates translations for many languages.</p>
+ </description>
+ </release>
+ <release date="2016-07-18" version="3.21.4" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.21 development series, with the following improvements:</p>
+ <ul>
+ <li>Add a cancel button and progress information to the details page</li>
+ <li>Add a dialog to confirm upgrade removals</li>
+ <li>Add support for authenticating in plugins</li>
+ <li>Add support for snaps</li>
+ <li>Enable gtk-doc generation for documentation</li>
+ <li>Show a new-style category list on the overview page</li>
+ <li>Show origin information when applications are available from multiple sources</li>
+ <li>Show sandboxing information for selected applications</li>
+ <li>Show the star ratings in more places</li>
+ <li>Support installing .flatpakrepo files</li>
+ <li>Support launching applicatins using a appstream:// URL</li>
+ </ul>
+ <p>The following bugs are also fixed:</p>
+ <ul>
+ <li>Allow plugins to be enabled and disabled at runtime</li>
+ <li>Always show the 'MyLanguage' kudo when in en_US locale</li>
+ <li>Correctly trigger systemd offline updates when only processing OS updates</li>
+ <li>Disable app folders feature when run outside GNOME</li>
+ <li>Do not show buttons on the search results</li>
+ <li>Do not use deprecated CSS properties</li>
+ <li>Do not use deprecated fwupd API</li>
+ <li>Ensure reviews are shown in the correct order</li>
+ <li>Fix a crash when double clicking files</li>
+ <li>Fix several UX issues when upgrading</li>
+ <li>Show the 'More Reviews' button in the details panel</li>
+ <li>Try really hard to have two rows of important categories</li>
+ </ul>
+ <p>This release also updates translations for many languages.</p>
+ </description>
+ </release>
+ <release date="2016-05-23" version="3.21.2" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.21 development series, with the following improvements:</p>
+ <ul>
+ <li>Add a --details-pkg option to the gnome-software binary</li>
+ <li>Add support for flatpak packages</li>
+ <li>Add a plugin to auto-add some license information</li>
+ <li>Add depends, requires and conflicts at initialize time</li>
+ <li>Add support for application key colors</li>
+ <li>Export a set of headers to allow external plugins to be built</li>
+ </ul>
+ <p>The following bugs are also fixed:</p>
+ <ul>
+ <li>Do not crash if plugins are badly behaved</li>
+ <li>Do not directly load pixbufs in the AppStream plugin</li>
+ <li>Do not unconditionally invalidate the updates list on hardware hotplug</li>
+ <li>Find the best AppSteam component when matching any prefixes</li>
+ <li>Fix crash due to network change before app activation</li>
+ <li>Fix launching various KDE4 applications</li>
+ <li>Support getting cached content from /var/cache and /usr/share</li>
+ </ul>
+ <p>This release also updates translations for many languages.</p>
+ </description>
+ </release>
+ <release date="2016-04-25" version="3.21.1" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.21 development series, with the following improvements:</p>
+ <ul>
+ <li>Add an initial loading panel when there is no metadata</li>
+ <li>Add an outline ostree plugin that just adds remotes as sources</li>
+ <li>Add an unreviewable application quirk</li>
+ <li>Add initial Steam support</li>
+ <li>Add support for app shortcut addition/removal</li>
+ <li>Add support for GNOME Shell extensions</li>
+ <li>Allow free-but-unspecified SPDX tokens</li>
+ <li>Allow widgets to use custom CSS in a generic way</li>
+ <li>Do the PackageKit refresh as a background transaction</li>
+ <li>Hide "Software Sources" menu when its action is disabled</li>
+ <li>Make the distro upgrades dialog match the new mockup</li>
+ <li>Split the 'size' property into size-installed and size-download</li>
+ <li>Use a link instead of a button for history</li>
+ <li>Use AppStream files for the popular, featured and extra category data</li>
+ <li>Use dpkg-deb info to create a GsApp when double clicking on a .deb file</li>
+ <li>Use FwupdClient from fwupd 0.7.0</li>
+ <li>Use GdkPixbuf to parse icns files</li>
+ <li>Use gsettings to enable/disable the 'sources' action</li>
+ <li>Use the Fedora themed image for the upgrade banner</li>
+ <li>When there are no trusted sources mark everything as non-3rd-party</li>
+ </ul>
+ <p>The following bugs are also fixed:</p>
+ <ul>
+ <li>Actually show the error dialog for an invalid file</li>
+ <li>Allow all functions called by g_module_symbol() to fail</li>
+ <li>Allow popular and featured apps to match any prefix</li>
+ <li>Do not maintain a cache of applications in the plugin loader</li>
+ <li>Do not make the ODRS plugin depend on xdg-app</li>
+ <li>Do not re-request the distro-upgrade when switching pages</li>
+ <li>Do not show ratings and reviews for some component kinds</li>
+ <li>Do not show the distro-upgrade notification if the window is open</li>
+ <li>Do not use the header bar on Unity</li>
+ <li>Fix a crash when double clicking package files</li>
+ <li>Fix live installing firmware</li>
+ <li>Get the correct icon size when installing xdg-app bundles on HiDPI</li>
+ <li>Hide the kudo details panel for non desktop components</li>
+ <li>Load screenshots directly if their URLs point to local files</li>
+ <li>Lower the limits for review text</li>
+ <li>Make all the plugins more threadsafe</li>
+ <li>Make the provenance plugin non-specific to Fedora</li>
+ <li>Move header bar button creation into individual pages</li>
+ <li>Move the Install &amp; Restart button below the upgrade banner</li>
+ <li>Never show star ratings on the category app tiles</li>
+ <li>Only show one modal dialog at a time</li>
+ <li>Only show the session manager restart if there were any non-live updates</li>
+ <li>Properly support multi-line .deb descriptions</li>
+ <li>Show a 'Install All' button when all the updates can be installed live</li>
+ <li>Show a modal dialog when downloading the distro-upgrade failed</li>
+ <li>Show the upgrades banner even if there are no updates to show</li>
+ <li>Use a cache file to respect the fedora-distro-upgrades cache-age</li>
+ <li>Use GFile instead of a filename when converting apps</li>
+ </ul>
+ <p>This release also updates translations for many languages.</p>
+ </description>
+ </release>
+ <release date="2016-02-29" version="3.19.91" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.19 development series, with the following improvements:</p>
+ <ul>
+ <li>Add an 'All' subcategory in the category shell</li>
+ <li>Add ratings and review functionality for Ubuntu</li>
+ <li>Install the xdg-app runtime as required automatically</li>
+ <li>Show a confirmation dialog before reporting a review</li>
+ <li>Show a guide label for the different star values</li>
+ <li>Support installing local xdg-app bundles</li>
+ </ul>
+ <p>The following bugs are also fixed:</p>
+ <ul>
+ <li>Correctly identify local packages with sources</li>
+ <li>Do not add multiple search results for the same app</li>
+ <li>Do not show xdg-app runtimes in the installed panel</li>
+ <li>Escape markup before showing modal dialogs</li>
+ </ul>
+ <p>This release also updates translations for many languages.</p>
+ </description>
+ </release>
+ <release date="2016-02-15" version="3.19.90" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.19 development series, with the following improvements:</p>
+ <ul>
+ <li>Add end-user application review functionality</li>
+ <li>Add support for upgrading the OS from one release to another</li>
+ <li>Add support for xdg-app and Limba bundles</li>
+ <li>Add tags to applications, and explain them in the details page</li>
+ <li>Update the list of featured applications on the front page</li>
+ </ul>
+ <p>The following bugs are also fixed:</p>
+ <ul>
+ <li>Add a missing tag to the software center metadata file</li>
+ <li>PackageKit support is now optional</li>
+ <li>Temporarily remove the remove button in the sources dialog</li>
+ <li>Use versioned user cache directories to pick up new screenshots</li>
+ </ul>
+ <p>This release also updates translations for many languages.</p>
+ </description>
+ </release>
+ <release date="2016-01-15" version="3.19.4" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.19 development series, with the following improvements:</p>
+ <ul>
+ <li>Add a link to Wikipedia to explain proprietary and public domain software</li>
+ <li>Allow administrators to override the default popular applications</li>
+ <li>Improve the interface for device firmware updates and some can be done live</li>
+ <li>Make sure Characters and Disks show up in Utilities</li>
+ <li>Show 3rd party applications in the search results</li>
+ <li>Show a nicer installation dialog when installing local files</li>
+ <li>Speed up the application first-start and also speed up switching pages</li>
+ <li>Try to show if an application is free software</li>
+ </ul>
+ <p>The following bugs are also fixed:</p>
+ <ul>
+ <li>Do not crash on refresh if the fwupd daemon is not available</li>
+ <li>Fix installing web applications</li>
+ <li>Rework several windows to fit better on small screens</li>
+ <li>Use the correct user agent string when downloading firmware</li>
+ </ul>
+ <p>This release also updates translations for many languages.</p>
+ </description>
+ </release>
+ <release date="2015-11-05" version="3.18.3" type="stable">
+ <description translatable="no">
+ <p>This stable release fixes the following bugs:</p>
+ <ul>
+ <li>Use the correct user agent string when downloading firmware</li>
+ <li>Fix a crash in the limba plugin</li>
+ <li>Fix installing web applications</li>
+ </ul>
+ <p>This release also updates translations for many languages.</p>
+ </description>
+ </release>
+ <release date="2015-10-15" version="3.18.2" type="stable">
+ <description translatable="no">
+ <p>This stable release fixes the following bugs:</p>
+ <ul>
+ <li>Fix a regression that could lead to never finding any updates</li>
+ <li>Fix an issue with getting package details for apps without AppData</li>
+ </ul>
+ <p>This release also updates translations for many languages.</p>
+ </description>
+ </release>
+ <release date="2015-10-13" version="3.18.1" type="stable">
+ <description translatable="no">
+ <p>This stable release fixes the following bugs:</p>
+ <ul>
+ <li>Do not force the cache refresh and delete otherwise valid packages</li>
+ <li>Fix several potential crashes when navigating and when installing</li>
+ <li>Get the new application icon for local packages after installation</li>
+ <li>Improve cold start time by only parsing AppStream data once</li>
+ <li>Make sure Characters and Disks show up in Utilities</li>
+ <li>Only download the fwupd metadata signature once per day</li>
+ <li>Show an empty space for no category results</li>
+ <li>Show applications without AppData in the installed panel</li>
+ </ul>
+ <p>This release also updates translations for many languages.</p>
+ </description>
+ </release>
+ <release date="2015-09-21" version="3.18.0" type="stable">
+ <description translatable="no">
+ <p>This is the first stable release for the GNOME 3.18 desktop!</p>
+ </description>
+ </release>
+ <release date="2015-09-15" version="3.17.92" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.17 development series, with the following improvements:</p>
+ <ul>
+ <li>Fix getting firmware updates by parsing the metadata correctly</li>
+ <li>Make the application menu path correct in RTL locales</li>
+ <li>Don't keep the application running forever when run as a search provider</li>
+ </ul>
+ <p>This release also updates translations for many languages.</p>
+ </description>
+ </release>
+ <release date="2015-09-03" version="3.17.91" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.17 development series, with the following improvements:</p>
+ <ul>
+ <li>Better theming for the category sidebar</li>
+ <li>Use standard size icon in the about dialog</li>
+ <li>Support mouse back button for going back in dialogs</li>
+ <li>Fix incorrect alignment on the front page in RTL languages</li>
+ <li>Misc other minor bugs fixed</li>
+ </ul>
+ <p>This release also updates translations for many languages.</p>
+ </description>
+ </release>
+ <release date="2015-08-19" version="3.17.90" type="development">
+ <description translatable="no">
+ <p>This is an unstable release with the following bugs fixed:</p>
+ <ul>
+ <li>Use CSS to style the error message details</li>
+ <li>Correctly align labels in the Add to Folder dialog</li>
+ </ul>
+ <p>This release also updates translations for many languages.</p>
+ </description>
+ </release>
+ <release date="2015-08-12" version="3.17.3" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.17 development series, with the following improvements:</p>
+ <ul>
+ <li>Add basic support for Limba bundles</li>
+ <li>Automatically download new firmware metadata from LVFS</li>
+ <li>Hide updates UI on managed systems</li>
+ <li>Show a new notification when security updates remain unapplied</li>
+ <li>Show installation progress when installing applications</li>
+ <li>Use some new applications to the picked category</li>
+ </ul>
+ <p>Bugs fixed in this release:</p>
+ <ul>
+ <li>Do not show applications that are not available when searching by category</li>
+ <li>Don't crash when launching an app that has no desktop ID</li>
+ <li>Don't show applications without AppData in the category view</li>
+ <li>Fix a possible race and crash when loading icons</li>
+ <li>Fix locking in the AppStream code to fix several crashes</li>
+ <li>Use better error messages on offline update failure</li>
+ <li>Withdraw the notification when prepared update gets invalidated</li>
+ </ul>
+ <p>This release also updates translations for many languages.</p>
+ </description>
+ </release>
+ <release date="2015-06-05" version="3.17.2" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.17 development series, with the following improvements:</p>
+ <ul>
+ <li>Make fwupd dependency automagic</li>
+ </ul>
+ <p>Bugs fixed in this release:</p>
+ <ul>
+ <li>Fix a regression from the previous unstable release that made it impossible to install updates</li>
+ <li>Fix a crash in the screenshot loader</li>
+ <li>Fix a crash in the sources dialog</li>
+ <li>Fix a crash when installing rpms that lack description</li>
+ <li>Wrap long descriptions in the update dialog</li>
+ </ul>
+ <p>This release also updates translations for many languages.</p>
+ </description>
+ </release>
+ <release date="2015-05-25" version="3.17.1" type="development">
+ <description translatable="no">
+ <p>This is the first unstable release in the 3.17 development series, with a number of new features:</p>
+ <ul>
+ <li>Support getting firmware updates through the fwupd daemon</li>
+ <li>Use a smaller number of tiles on the front page on small monitors</li>
+ <li>Rework internal modulesets, making it easier to edit the list of featured apps</li>
+ <li>Revert back to using a hand-picked list of featured apps</li>
+ <li>Several improvements to the sources dialog</li>
+ <li>Show better human readable names when searching for font scripts</li>
+ <li>Show a spinner while loading the data for the update history dialog</li>
+ </ul>
+ <p>This release also updates translations for many languages.</p>
+ </description>
+ </release>
+ <release date="2015-05-11" version="3.16.2" type="stable">
+ <description translatable="no">
+ <p>This release fixes the following bugs:</p>
+ <ul>
+ <li>Remove redundant OK button from the updates installed notification</li>
+ <li>Display a better human readable title for printer drivers</li>
+ <li>Show a better UI for offline update failure dialog</li>
+ <li>Set default actions for the update done notifications</li>
+ <li>Allow searching for packages via the API without appdata</li>
+ <li>Fix showing webapps with non-local icons</li>
+ </ul>
+ <p>This release also updates translations for many languages.</p>
+ </description>
+ </release>
+ <release date="2015-04-14" version="3.16.1" type="stable">
+ <description translatable="no">
+ <p>This release fixes the following bugs:</p>
+ <ul>
+ <li>Correctly save HiDPI images to HiDPI directories</li>
+ <li>Scroll the contents of the error message dialog</li>
+ </ul>
+ <p>This release also updates translations for many languages.</p>
+ </description>
+ </release>
+ <release date="2015-03-23" version="3.16.0" type="stable">
+ <description translatable="no">
+ <p>This stable release marks the release of GNOME 3.16!</p>
+ </description>
+ </release>
+ <release date="2015-03-16" version="3.15.92" type="development">
+ <description translatable="no">
+ <p>This unstable release adds the following features:</p>
+ <ul>
+ <li>React to theme changes</li>
+ <li>Rebase the HighContrast theme</li>
+ </ul>
+ <p>This release fixes the following bug:</p>
+ <ul>
+ <li>Fix HiDPI scale factor calculation</li>
+ <li>Align section headings in all views</li>
+ <li>Fix 'installed' overlays when using the HighContrast theme</li>
+ <li>Fall back to showing the top level category when no sub category exists</li>
+ <li>Fix a crash when using the pending applications feature</li>
+ </ul>
+ <p>This release also updates translations for many languages.</p>
+ </description>
+ </release>
+ <release date="2015-03-02" version="3.15.91" type="development">
+ <description translatable="no">
+ <p>This unstable release adds the following features:</p>
+ <ul>
+ <li>Enable kinetic scrolling in updates dialog</li>
+ </ul>
+ <p>This release fixes the following bug:</p>
+ <ul>
+ <li>Always ensure that the back entry focus widget is valid</li>
+ <li>Don't show small screenshots on HiDPI hardware</li>
+ <li>Fix a crash when starting GNOME Software for the first time</li>
+ <li>Only show compatible projects when getting the featured list</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2015-02-16" version="3.15.90" type="development">
+ <description translatable="no">
+ <p>This unstable release adds the following features:</p>
+ <ul>
+ <li>Add a new panel for displaying session service results</li>
+ <li>Add a new version of the Modify interface</li>
+ <li>Require AppData for all available packages</li>
+ </ul>
+ <p>This release fixes the following bug:</p>
+ <ul>
+ <li>Use the new mockups for the 3rd party source install dialogs</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2015-01-19" version="3.15.4" type="development">
+ <description translatable="no">
+ <p>This unstable release adds the following features:</p>
+ <ul>
+ <li>Fix searching with very small search terms</li>
+ </ul>
+ <p>This release fixes the following bugs:</p>
+ <ul>
+ <li>Do case-insensitive searching of suitable keywords</li>
+ <li>Fix a crash in the screenshot loader</li>
+ <li>Fix a crash when clicking the back button</li>
+ <li>Fix searching for keyworks with special chars</li>
+ <li>Show an error message when we fail to load details about a local file</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2014-11-24" version="3.15.2" type="development">
+ <description translatable="no">
+ <p>This unstable release adds the following features:</p>
+ <ul>
+ <li>Show a blurred low-resolution screenshot while loading the HiDPI one</li>
+ </ul>
+ <p>This release fixes the following bugs:</p>
+ <ul>
+ <li>Do not show a random white line above the star rating widget</li>
+ <li>Do not show empty app boxes if no popular results are available</li>
+ <li>Do not try to download local web-app icons</li>
+ <li>Use blue stars for the user-ratings rather than gold</li>
+ </ul>
+ </description>
+ </release>
+ </releases>
+ <provides>
+ <id>gnome-software.desktop</id>
+ </provides>
+ <kudos>
+ <kudo>HiDpiIcon</kudo>
+ <kudo>ModernToolkit</kudo>
+ <kudo>Notifications</kudo>
+ <kudo>SearchProvider</kudo>
+ </kudos>
+ <url type="bugtracker">https://gitlab.gnome.org/GNOME/gnome-software/-/issues/new</url>
+ <url type="donation">https://www.gnome.org/donate/</url>
+ <url type="homepage">https://wiki.gnome.org/Design/Apps/Software</url>
+ <url type="translate">https://wiki.gnome.org/TranslationProject</url>
+ <url type="vcs-browser">https://gitlab.gnome.org/GNOME/gnome-software/</url>
+ <update_contact>richard_at_hughsie.com</update_contact>
+ <compulsory_for_desktop>GNOME</compulsory_for_desktop>
+ <project_group>GNOME</project_group>
+ <translation type="gettext">gnome-software</translation>
+ <developer_name>The GNOME Project</developer_name>
+ <content_rating type="oars-1.0">
+ <content_attribute id="violence-cartoon">none</content_attribute>
+ <content_attribute id="violence-fantasy">none</content_attribute>
+ <content_attribute id="violence-realistic">none</content_attribute>
+ <content_attribute id="violence-bloodshed">none</content_attribute>
+ <content_attribute id="violence-sexual">none</content_attribute>
+ <content_attribute id="drugs-alcohol">none</content_attribute>
+ <content_attribute id="drugs-narcotics">none</content_attribute>
+ <content_attribute id="drugs-tobacco">none</content_attribute>
+ <content_attribute id="sex-nudity">none</content_attribute>
+ <content_attribute id="sex-themes">none</content_attribute>
+ <content_attribute id="language-profanity">none</content_attribute>
+ <content_attribute id="language-humor">none</content_attribute>
+ <content_attribute id="language-discrimination">none</content_attribute>
+ <content_attribute id="social-chat">moderate</content_attribute>
+ <content_attribute id="social-info">mild</content_attribute>
+ <content_attribute id="social-audio">none</content_attribute>
+ <content_attribute id="social-location">none</content_attribute>
+ <content_attribute id="social-contacts">none</content_attribute>
+ <content_attribute id="money-purchasing">none</content_attribute>
+ <content_attribute id="money-gambling">none</content_attribute>
+ </content_rating>
+ <launchable type="desktop-id">org.gnome.Software.desktop</launchable>
+</component>
diff --git a/data/metainfo/ss-details.png b/data/metainfo/ss-details.png
new file mode 100644
index 0000000..4d9ee04
--- /dev/null
+++ b/data/metainfo/ss-details.png
Binary files differ
diff --git a/data/metainfo/ss-details2.png b/data/metainfo/ss-details2.png
new file mode 100644
index 0000000..b51795c
--- /dev/null
+++ b/data/metainfo/ss-details2.png
Binary files differ
diff --git a/data/metainfo/ss-installed.png b/data/metainfo/ss-installed.png
new file mode 100644
index 0000000..05283af
--- /dev/null
+++ b/data/metainfo/ss-installed.png
Binary files differ
diff --git a/data/metainfo/ss-overview.png b/data/metainfo/ss-overview.png
new file mode 100644
index 0000000..c8f6091
--- /dev/null
+++ b/data/metainfo/ss-overview.png
Binary files differ
diff --git a/data/metainfo/ss-up-to-date.png b/data/metainfo/ss-up-to-date.png
new file mode 100644
index 0000000..8ebe00d
--- /dev/null
+++ b/data/metainfo/ss-up-to-date.png
Binary files differ
diff --git a/data/metainfo/ss-updates-details.png b/data/metainfo/ss-updates-details.png
new file mode 100644
index 0000000..9582490
--- /dev/null
+++ b/data/metainfo/ss-updates-details.png
Binary files differ
diff --git a/data/metainfo/ss-updates.png b/data/metainfo/ss-updates.png
new file mode 100644
index 0000000..62bb4d5
--- /dev/null
+++ b/data/metainfo/ss-updates.png
Binary files differ
diff --git a/data/org.gnome.software.external-appstream.policy.in.in b/data/org.gnome.software.external-appstream.policy.in.in
new file mode 100644
index 0000000..69af72a
--- /dev/null
+++ b/data/org.gnome.software.external-appstream.policy.in.in
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!DOCTYPE policyconfig PUBLIC
+ "-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
+ "http://www.freedesktop.org/standards/PolicyKit/1.0/policyconfig.dtd">
+<policyconfig>
+ <vendor>GNOME</vendor>
+ <vendor_url>https://www.gnome.org/</vendor_url>
+
+ <action id="org.gnome.software.install-appstream">
+ <description>Install an appstream file into a system location</description>
+ <message>Installing an appstream file into a system location</message>
+ <defaults>
+ <allow_any>yes</allow_any>
+ <allow_active>yes</allow_active>
+ <allow_inactive>no</allow_inactive>
+ </defaults>
+ <annotate key="org.freedesktop.policykit.exec.path">@libexecdir@/gnome-software-install-appstream</annotate>
+ </action>
+</policyconfig>
diff --git a/data/org.gnome.software.gschema.xml b/data/org.gnome.software.gschema.xml
new file mode 100644
index 0000000..aa074f1
--- /dev/null
+++ b/data/org.gnome.software.gschema.xml
@@ -0,0 +1,149 @@
+<schemalist>
+ <schema id="org.gnome.software" path="/org/gnome/software/" gettext-domain="gnome-software">
+ <key name="compatible-projects" type="as">
+ <default>['GNOME', 'KDE', 'XFCE']</default>
+ <summary>A list of compatible projects</summary>
+ <description>This is a list of compatible projects we should show such as GNOME, KDE and XFCE.</description>
+ </key>
+ <key name="allow-updates" type="b">
+ <default>true</default>
+ <summary>Whether to manage updates and upgrades in GNOME Software</summary>
+ <description>If disabled, GNOME Software will hide the updates panel, not perform any automatic updates actions or prompt for upgrades.</description>
+ </key>
+ <key name="download-updates" type="b">
+ <default>true</default>
+ <summary>Automatically download and install updates</summary>
+ <description>If enabled, GNOME Software automatically downloads software updates in the background, also installing ones that do not require a reboot.</description>
+ </key>
+ <key name="download-updates-notify" type="b">
+ <default>true</default>
+ <summary>Notify the user about software updated in the background</summary>
+ <description>If enabled, GNOME Software notifies the user about updates that happened whilst the user was idle.</description>
+ </key>
+ <key name="refresh-when-metered" type="b">
+ <default>false</default>
+ <summary>Whether to automatically refresh when on a metered connection</summary>
+ <description>If enabled, GNOME Software automatically refreshes in the background even when using a metered connection (eventually downloading some metadata, checking for updates, etc., which may incur in costs for the user).</description>
+ </key>
+ <key name="first-run" type="b">
+ <default>true</default>
+ <summary>Whether it’s the very first run of GNOME Software</summary>
+ </key>
+ <key name="show-ratings" type="b">
+ <default>false</default>
+ <summary>Show star ratings next to applications</summary>
+ </key>
+ <key name="filter-default-branch" type="b">
+ <default>true</default>
+ <summary>Filter applications based on the default branch set for the remote</summary>
+ </key>
+ <key name="prompt-for-nonfree" type="b">
+ <default>true</default>
+ <summary>Non-free applications show a warning dialog before install</summary>
+ <description>When non-free applications are installed a warning dialog can be shown. This controls if that dialog is suppressed.</description>
+ </key>
+ <key name="check-timestamp" type="x">
+ <default>0</default>
+ <summary>The last update check timestamp</summary>
+ </key>
+ <key name="upgrade-notification-timestamp" type="x">
+ <default>0</default>
+ <summary>The last upgrade notification timestamp</summary>
+ </key>
+ <key name="update-notification-timestamp" type="x">
+ <default>0</default>
+ <summary>The last update notification timestamp</summary>
+ </key>
+ <key name="security-timestamp" type="x">
+ <default>0</default>
+ <summary>The timestamp of the first security update, cleared after update</summary>
+ </key>
+ <key name="install-timestamp" type="x">
+ <default>0</default>
+ <summary>The last update timestamp</summary>
+ </key>
+ <key name="online-updates-timestamp" type="x">
+ <default>0</default>
+ <summary>The last timestamp when the system was online and got any updates</summary>
+ </key>
+ <key name="screenshot-cache-age-maximum" type="u">
+ <default>2592000</default>
+ <summary>The age in seconds to verify the upstream screenshot is still valid</summary>
+ <description>
+ Choosing a larger value will mean less round-trips to the remote server
+ but updates to the screenshots may take longer to show to the user.
+ A value of 0 means to never check the server if the image already exists
+ in the cache.
+ </description>
+ </key>
+ <key name="review-server" type="s">
+ <default>'https://odrs.gnome.org/1.0/reviews/api'</default>
+ <summary>The server to use for application reviews</summary>
+ </key>
+ <key name="review-karma-required" type="i">
+ <default>0</default>
+ <summary>The minimum karma score for reviews</summary>
+ <description>Reviews with karma less than this number will not be shown.</description>
+ </key>
+ <key name="official-repos" type="as">
+ <default>[]</default>
+ <summary>A list of official repositories that should not be considered 3rd party</summary>
+ </key>
+ <key name="required-repos" type="as">
+ <default>[]</default>
+ <summary>A list of required repositories that cannot be disabled or removed</summary>
+ </key>
+ <key name="free-repos" type="as">
+ <default>[]</default>
+ <summary>A list of official repositories that should be considered free software</summary>
+ </key>
+ <key name="free-repos-url" type="s">
+ <default>''</default>
+ <summary>The licence URL to use when an application should be considered free software</summary>
+ </key>
+ <key name="install-bundles-system-wide" type="b">
+ <default>true</default>
+ <summary>Install bundled applications for all users on the system where possible</summary>
+ </key>
+ <key name="enable-repos-dialog" type="b">
+ <default>true</default>
+ <summary>Allow access to the Software Repositories dialog</summary>
+ </key>
+ <key name="show-upgrade-prerelease" type="b">
+ <default>false</default>
+ <summary>Offer upgrades for pre-releases</summary>
+ </key>
+ <key name="show-nonfree-ui" type="b">
+ <default>true</default>
+ <summary>Show some UI elements informing the user that an app is non-free</summary>
+ </key>
+ <key name="installed-page-show-size" type="b">
+ <default>true</default>
+ <summary>Show the installed size for apps in the list of installed applications</summary>
+ </key>
+ <key name="nonfree-software-uri" type="s">
+ <!-- Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. -->
+ <default l10n="messages">'https://en.wikipedia.org/wiki/Proprietary_software'</default>
+ <summary>The URI that explains nonfree and proprietary software</summary>
+ </key>
+ <key name="external-appstream-urls" type="as">
+ <default>[]</default>
+ <summary>A list of URLs pointing to appstream files that will be downloaded into an swcatalog folder</summary>
+ </key>
+ <key name="external-appstream-system-wide" type="b">
+ <default>false</default>
+ <summary>Install the AppStream files to a system-wide location for all users. If false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml directory</summary>
+ </key>
+ <key name="packaging-format-preference" type="as">
+ <default>['']</default>
+ <summary>Priority order of packaging formats to prefer, with more important formats listed first. An empty array means the default order. Omitted formats are assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, snap.</summary>
+ </key>
+ <child name="auth" schema="org.gnome.software.auth"/>
+ </schema>
+ <schema id="org.gnome.software.auth" gettext-domain="gnome-software">
+ <key name="account-id" type="s">
+ <default>''</default>
+ <summary>A string storing the gnome-online-account id used to login</summary>
+ </key>
+ </schema>
+</schemalist>
diff --git a/data/tests/os-release b/data/tests/os-release
new file mode 100644
index 0000000..79df6af
--- /dev/null
+++ b/data/tests/os-release
@@ -0,0 +1,16 @@
+NAME=Fedora
+VERSION="25 (Workstation Edition)"
+ID=fedora
+VERSION_ID=25
+PRETTY_NAME="Fedora 25 (Workstation Edition)"
+ANSI_COLOR="0;34"
+CPE_NAME="cpe:/o:fedoraproject:fedora:25"
+HOME_URL="https://fedoraproject.org/"
+BUG_REPORT_URL="https://bugzilla.redhat.com/"
+REDHAT_BUGZILLA_PRODUCT="Fedora"
+REDHAT_BUGZILLA_PRODUCT_VERSION=25
+REDHAT_SUPPORT_PRODUCT="Fedora"
+REDHAT_SUPPORT_PRODUCT_VERSION=25
+PRIVACY_POLICY_URL=https://fedoraproject.org/wiki/Legal:PrivacyPolicy
+VARIANT="Workstation Edition"
+VARIANT_ID=workstation
diff --git a/doc/api/gnome-software-docs.xml b/doc/api/gnome-software-docs.xml
new file mode 100644
index 0000000..aa16279
--- /dev/null
+++ b/doc/api/gnome-software-docs.xml
@@ -0,0 +1,778 @@
+<?xml version="1.0"?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
+ "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd"
+[
+ <!ENTITY % local.common.attrib "xmlns:xi CDATA #FIXED 'http://www.w3.org/2003/XInclude'">
+]>
+<book id="index">
+ <bookinfo>
+ <title>GNOME Software Reference Manual</title>
+ </bookinfo>
+
+ <reference id="tutorial">
+ <title>GNOME Software Plugin Tutorial</title>
+ <partintro>
+ <para>
+ GNOME Software is a software installer designed to be easy to use.
+ </para>
+
+ <section>
+ <title>Introduction</title>
+ <para>
+ At the heart of gnome software the application is just a plugin loader
+ that has some GTK UI that gets created for various result types.
+ The idea is we have lots of small plugins that each do one thing and
+ then pass the result onto the other plugins.
+ These are ordered by dependencies against each other at runtime and
+ each one can do things like editing an existing application or adding a
+ new application to the result set.
+ This is how we can add support for things like firmware updating,
+ GNOME Shell web-apps and flatpak bundles without making big
+ changes all over the source tree.
+ </para>
+ <para>
+ There are broadly 3 types of plugin methods:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para><emphasis role="strong">Actions</emphasis>: Do something on a specific GsApp</para>
+ </listitem>
+ <listitem>
+ <para><emphasis role="strong">Refine</emphasis>: Get details about a specific GsApp</para>
+ </listitem>
+ <listitem>
+ <para><emphasis role="strong">Adopt</emphasis>: Can this plugin handle this GsApp</para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ In general, building things out-of-tree isn't something that I think is
+ a very good idea; the API and ABI inside gnome-software is still
+ changing and there's a huge benefit to getting plugins upstream where
+ they can undergo review and be ported as the API adapts.
+ I'm also super keen to provide configurability in GSettings for doing
+ obviously-useful things, the sort of thing Fleet Commander can set for
+ groups of users.
+ </para>
+ <para>
+ However, now we're shipping gnome-software in enterprise-class distros
+ we might want to allow customers to ship their own plugins to make
+ various business-specific changes that don't make sense upstream.
+ This might involve querying a custom LDAP server and changing the
+ suggested apps to reflect what groups the user is in, or might involve
+ showing a whole new class of applications that does not conform to the
+ Linux-specific <emphasis>application is a desktop-file</emphasis> paradigm.
+ This is where a plugin makes sense.
+ </para>
+
+ <para>
+ The plugin needs to create a class derived from <type>GsPlugin</type>,
+ and define the vfuncs that it needs. The
+ plugin name is taken automatically from the suffix of the
+ <filename>.so</filename> file. The type of the plugin is exposed to
+ gnome-software using <function>gs_plugin_query_type()</function>, which
+ must be exported from the module.
+ </para>
+ <example>
+ <title>A sample plugin</title>
+ <programlisting>
+/*
+ * Copyright (C) 2016 Richard Hughes
+ */
+
+#include &lt;glib.h&gt;
+#include &lt;gnome-software.h&gt;
+
+struct _GsPluginSample {
+ GsPlugin parent;
+
+ /* private data here */
+};
+
+G_DEFINE_TYPE (GsPluginSample, gs_plugin_sample, GS_TYPE_PLUGIN)
+
+static void
+gs_plugin_sample_init (GsPluginSample *self)
+{
+ GsPlugin *plugin = GS_PLUGIN (self);
+
+ gs_plugin_add_rule (plugin, GS_PLUGIN_RULE_RUN_BEFORE, "appstream");
+}
+
+static void
+gs_plugin_sample_list_apps_async (GsPlugin *plugin,
+ GsAppQuery *query,
+ GsPluginListAppsFlags flags,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ GsPluginSample *self = GS_PLUGIN_SAMPLE (plugin);
+ g_autoptr(GTask) task = NULL;
+ const gchar * const *keywords;
+ g_autoptr(GsAppList) list = gs_app_list_new ();
+
+ task = gs_plugin_list_apps_data_new_task (plugin, query, flags,
+ cancellable, callback, user_data);
+ g_task_set_source_tag (task, gs_plugin_sample_list_apps_async);
+
+ if (query == NULL ||
+ gs_app_query_get_keywords (query) == NULL ||
+ gs_app_query_get_n_properties_set (query) != 1) {
+ g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
+ "Unsupported query");
+ return;
+ }
+
+ keywords = gs_app_query_get_keywords (query);
+
+ for (gsize i = 0; keywords[i] != NULL; i++) {
+ if (g_str_equal (keywords[i], "fotoshop")) {
+ g_autoptr(GsApp) app = gs_app_new ("gimp.desktop");
+ gs_app_add_quirk (app, GS_APP_QUIRK_IS_WILDCARD);
+ gs_app_list_add (list, app);
+ }
+ }
+
+ g_task_return_pointer (task, g_steal_pointer (&amp;list), g_object_unref);
+}
+
+static GsAppList *
+gs_plugin_sample_list_apps_finish (GsPlugin *plugin,
+ GAsyncResult *result,
+ GError **error)
+{
+ return g_task_propagate_pointer (G_TASK (result), error);
+}
+
+static void
+gs_plugin_sample_class_init (GsPluginSampleClass *klass)
+{
+ GsPluginClass *plugin_class = GS_PLUGIN_CLASS (klass);
+
+ plugin_class->list_apps_async = gs_plugin_sample_list_apps_async;
+ plugin_class->list_apps_finish = gs_plugin_sample_list_apps_finish;
+}
+
+GType
+gs_plugin_query_type (void)
+{
+ return GS_TYPE_PLUGIN_SAMPLE;
+}
+ </programlisting>
+ </example>
+
+ <para>
+ We have to define when our plugin is run in reference to other plugins,
+ in this case, making sure we run before <code>appstream</code>.
+ As we're such a simple plugin we're relying on another plugin to run
+ after us to actually make the GsApp <emphasis>complete</emphasis>,
+ i.e. loading icons and setting a localised long description.
+ </para>
+ <para>
+ In this example we want to show GIMP as a result (from any provider,
+ e.g. flatpak or a distro package) when the user searches exactly for
+ <code>fotoshop</code>.
+ </para>
+ <para>
+ We can then build and install the plugin using:
+ </para>
+ <informalexample>
+ <programlisting>
+gcc -shared -o libgs_plugin_example.so gs-plugin-example.c -fPIC \
+ $(pkg-config --libs --cflags gnome-software) \
+ -DI_KNOW_THE_GNOME_SOFTWARE_API_IS_SUBJECT_TO_CHANGE &amp;&amp; \
+cp libgs_plugin_example.so $(pkg-config gnome-software --variable=plugindir)
+ </programlisting>
+ </informalexample>
+
+ <mediaobject id="gs-example-search">
+ <imageobject>
+ <imagedata format="PNG" fileref="gs-example-search.png" align="center"/>
+ </imageobject>
+ </mediaobject>
+
+ </section>
+
+ <section>
+ <title>Distribution Specific Functionality</title>
+ <para>
+ Some plugins should only run on specific distributions, for instance
+ the <code>fedora-pkgdb-collections</code> plugin should only be used on
+ Fedora systems.
+ This can be achieved with a simple runtime check using the helper
+ <code>gs_plugin_check_distro_id()</code> method or the <code>GsOsRelease</code>
+ object where more complicated rules are required.
+ </para>
+ <example>
+ <title>Self disabling on other distributions</title>
+ <programlisting>
+static void
+gs_plugin_sample_init (GsPluginSample *self)
+{
+ GsPlugin *plugin = GS_PLUGIN (self);
+
+ if (!gs_plugin_check_distro_id (plugin, "ubuntu")) {
+ gs_plugin_set_enabled (plugin, FALSE);
+ return;
+ }
+ /* set up private data etc. */
+}
+ </programlisting>
+ </example>
+
+ </section>
+
+ <section>
+ <title>Custom Applications in the Installed List</title>
+ <para>
+ Next is returning custom applications in the installed list.
+ The use case here is a proprietary software distribution method that
+ installs custom files into your home directory, but you can use your
+ imagination for how this could be useful.
+ The example here is all hardcoded, and a true plugin would have to
+ derive the details about the GsApp, for example reading in an XML
+ file or YAML config file somewhere.
+ </para>
+ <example>
+ <title>Example showing a custom installed application</title>
+ <programlisting>
+static void
+gs_plugin_sample_init (GsPluginSample *self)
+{
+ GsPlugin *plugin = GS_PLUGIN (self);
+
+ gs_plugin_add_rule (plugin, GS_PLUGIN_RULE_RUN_BEFORE, "icons");
+}
+
+static void
+gs_plugin_custom_list_apps_async (GsPlugin *plugin,
+ GsAppQuery *query,
+ GsPluginListAppsFlags flags,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ g_autofree gchar *fn = NULL;
+ g_autoptr(GsApp) app = NULL;
+ g_autoptr(GIcon) icon = NULL;
+ g_autoptr(GsAppList) list = gs_app_list_new ();
+ g_autoptr(GTask) task = NULL;
+
+ task = g_task_new (plugin, cancellable, callback, user_data);
+ g_task_set_source_tag (task, gs_plugin_custom_list_apps_async);
+
+ /* We’re only listing installed apps in this example. */
+ if (query == NULL ||
+ gs_app_query_get_is_installed (query) != GS_APP_QUERY_TRISTATE_TRUE ||
+ gs_app_query_get_n_properties_set (query) != 1) {
+ g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
+ "Unsupported query");
+ return;
+ }
+
+ /* check if the app exists */
+ fn = g_build_filename (g_get_home_dir (), "chiron", NULL);
+ if (!g_file_test (fn, G_FILE_TEST_EXISTS)) {
+ g_task_return_pointer (task, g_steal_pointer (&amp;list), g_object_unref);
+ return;
+ }
+
+ /* the trigger exists, so create a fake app */
+ app = gs_app_new ("chiron.desktop");
+ gs_app_set_management_plugin (app, plugin);
+ gs_app_set_kind (app, AS_COMPONENT_KIND_DESKTOP_APP);
+ gs_app_set_state (app, GS_APP_STATE_INSTALLED);
+ gs_app_set_name (app, GS_APP_QUALITY_NORMAL, "Chiron");
+ gs_app_set_summary (app, GS_APP_QUALITY_NORMAL, "A teaching application");
+ gs_app_set_description (app, GS_APP_QUALITY_NORMAL,
+ "Chiron is the name of an application.\n\n"
+ "It can be used to demo some of our features");
+
+ /* these are all optional, but make details page looks better */
+ gs_app_set_version (app, "1.2.3");
+ gs_app_set_size_installed (app, GS_SIZE_TYPE_VALID, 2 * 1024 * 1024);
+ gs_app_set_size_download (app, GS_SIZE_TYPE_VALID, 3 * 1024 * 1024);
+ gs_app_set_origin_hostname (app, "http://www.teaching-example.org/");
+ gs_app_add_category (app, "Game");
+ gs_app_add_category (app, "ActionGame");
+ gs_app_add_kudo (app, GS_APP_KUDO_INSTALLS_USER_DOCS);
+ gs_app_set_license (app, GS_APP_QUALITY_NORMAL, "GPL-2.0+ and LGPL-2.1+");
+
+ /* use a stock icon */
+ icon = g_themed_icon_new ("input-gaming");
+ gs_app_add_icon (app, icon);
+
+ /* return new app */
+ gs_app_list_add (list, app);
+
+ g_task_return_pointer (task, g_steal_pointer (&amp;list), g_object_unref);
+}
+
+static GsAppList *
+gs_plugin_custom_list_apps_finish (GsPlugin *plugin,
+ GAsyncResult *result,
+ GError **error)
+{
+ return g_task_propagate_pointer (G_TASK (result), error);
+}
+ </programlisting>
+ </example>
+ <para>
+ This shows a lot of the plugin architecture in action. Some notable points:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Setting the management plugin means we can check for this string
+ when working out if we can handle the install or remove action.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Most applications want a kind of <code>AS_COMPONENT_KIND_DESKTOP_APP</code>
+ to be visible as an application.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The origin is where the application originated from — usually
+ this will be something like <emphasis>Fedora Updates</emphasis>.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The <code>GS_APP_KUDO_INSTALLS_USER_DOCS</code> means we get the
+ blue "Documentation" award in the details page; there are many
+ kudos to award to deserving apps.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Setting the license means we don't get the non-free warning —
+ removing the 3rd party warning can be done using
+ <code>GS_APP_QUIRK_PROVENANCE</code>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The icon will be loaded into a pixbuf of the correct size when
+ needed by the UI. You must ensure that icons are available at
+ common sizes. For icons of type <code>GsRemoteIcon</code>, the
+ <code>icons</code> plugin will download and cache the icon
+ locally.
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ To show this fake application just compile and install the plugin,
+ <code>touch ~/chiron</code> and then restart gnome-software.
+ To avoid restarting <filename>gnome-software</filename> each time a
+ proper plugin would create a <code>GFileMonitor</code> object to
+ monitor files.
+ </para>
+
+ <mediaobject id="gs-example-installed">
+ <imageobject>
+ <imagedata format="PNG" fileref="gs-example-installed.png" align="center"/>
+ </imageobject>
+ </mediaobject>
+
+ <para>
+ By filling in the optional details (which can also be filled in using
+ <code>refine_async()</code> you can also make the details
+ page a much more exciting place.
+ Adding a set of screenshots is left as an exercise to the reader.
+ </para>
+
+ <mediaobject id="gs-example-details">
+ <imageobject>
+ <imagedata format="PNG" fileref="gs-example-details.png" align="center"/>
+ </imageobject>
+ </mediaobject>
+
+ </section>
+
+ <section>
+ <title>Downloading Metadata and Updates</title>
+
+ <para>
+ The plugin loader supports a <code>refresh_metadata_async()</code> vfunc that
+ is called in various situations.
+ To ensure plugins have the minimum required metadata on disk it is
+ called at startup, but with a cache age of <emphasis>infinite</emphasis>.
+ This basically means the plugin must just ensure that
+ <emphasis role="strong">any</emphasis> data exists no matter what the age.
+ </para>
+ <para>
+ Usually once per hour, we'll call <code>refresh_metadata_async()</code> but
+ with the correct cache age set (typically a little over 24 hours) which
+ allows the plugin to download new metadata or payload files from remote
+ servers.
+ The <code>gs_utils_get_file_age()</code> utility helper can help you
+ work out the cache age of a file, or the plugin can handle it some other
+ way.
+ </para>
+ <para>
+ For the Flatpak plugin we just make sure the AppStream metadata exists
+ at startup, which allows us to show search results in the UI.
+ If the metadata did not exist (e.g. if the user had added a remote
+ using the command-line without gnome-software running) then we would
+ show a loading screen with a progress bar before showing the main UI.
+ On fast connections we should only show that for a couple of seconds,
+ but it's a good idea to try any avoid that if at all possible in the
+ plugin.
+ Once per day the <code>gs_plugin_get_updates()</code> method is called,
+ and then <code>gs_plugin_download_app()</code> may be called if the
+ user has configured automatic updates.
+ This is where the Flatpak plugin would download any ostree trees (but
+ not doing the deploy step) so that the applications can be updated live
+ in the details panel without having to wait for the download to complete.
+ In a similar way, the fwupd plugin downloads the tiny LVFS metadata with
+ <code>refresh_metadata_async()</code> and then downloads the large firmware
+ files themselves when <code>gs_plugin_download()</code> or
+ <code>gs_plugin_download_app()</code> is called.
+ </para>
+ <para>
+ Note, if the downloading fails it's okay to return <code>FALSE</code>;
+ the plugin loader continues to run all plugins and just logs an error
+ to the console. We'll be calling into <code>refresh_metadata_async()</code>
+ again in only another hour, so there's no need to bother the user.
+ For actions like <code>gs_plugin_app_install</code> we also do the same
+ thing, but we also save the error on the GsApp itself so that the UI is
+ free to handle that how it wants, for instance showing a GtkDialog
+ window for example.
+ </para>
+ <example>
+ <title>Refresh example</title>
+ <programlisting>
+static void progress_cb (gsize bytes_downloaded,
+ gsize total_download_size,
+ gpointer user_data);
+static void download_file_cb (GObject *source_object,
+ GAsyncResult *result,
+ gpointer user_data);
+
+static void
+gs_plugin_example_refresh_metadata_async (GsPlugin *plugin,
+ guint64 cache_age_secs,
+ GsPluginRefreshMetadataFlags flags,
+ GCancellable *cancellable,
+ GError **error)
+{
+ const gchar *metadata_filename = "/var/cache/example/metadata.xml";
+ const gchar *metadata_url = "https://www.example.com/new.xml";
+ g_autoptr(GFile) file = g_file_new_for_path (metadata_filename);
+ g_autoptr(GTask) task = NULL;
+ g_autoptr(SoupSession) soup_session = NULL;
+
+ task = g_task_new (plugin, cancellable, callback, user_data);
+ g_task_set_source_tag (task, gs_plugin_example_refresh_metadata_async);
+
+ soup_session = gs_build_soup_session ();
+
+ /* is the metadata missing or too old? */
+ if (gs_utils_get_file_age (file) &gt; cache_age_secs) {
+ gs_download_file_async (soup_session,
+ metadata_url,
+ file,
+ G_PRIORITY_LOW,
+ progress_cb,
+ plugin,
+ cancellable,
+ download_file_cb,
+ g_steal_pointer (&amp;task));
+ return;
+ }
+
+ g_task_return_boolean (task, TRUE);
+}
+
+static void
+progress_cb (gsize bytes_downloaded,
+ gsize total_download_size,
+ gpointer user_data)
+{
+ g_debug ("Downloaded %zu of %zu bytes", bytes_downloaded, total_download_size);
+}
+
+static void
+download_file_cb (GObject *source_object,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ GsPlugin *plugin = GS_PLUGIN (source_object);
+ g_autoptr(GTask) task = g_steal_pointer (&amp;user_data);
+
+ if (!gs_download_file_finish (result, &amp;local_error)) {
+ g_task_return_error (task, g_steal_pointer (&amp;local_error));
+ } else {
+ g_debug ("successfully downloaded new metadata");
+ g_task_return_boolean (task, TRUE);
+ }
+}
+
+static gboolean
+gs_plugin_example_refresh_metadata_finish (GsPlugin *plugin,
+ GAsyncResult *result,
+ GError **error)
+{
+ return g_task_propagate_boolean (G_TASK (result), error);
+}
+ </programlisting>
+ </example>
+ </section>
+
+ <section>
+ <title>Adding Application Information Using Refine</title>
+
+ <para>
+ As previous examples have shown it's very easy to add a new
+ application to the search results, updates list or installed list.
+ Some plugins don't want to add more applications, but want to modify
+ existing applications to add more information depending on what is
+ required by the UI code.
+ The reason we don't just add everything at once is that for
+ search-as-you-type to work effectively we need to return results in
+ less than about 50ms and querying some data can take a long time.
+ For example, it might take a few hundred ms to work out the download
+ size for an application when a plugin has to also look at what
+ dependencies are already installed.
+ We only need this information once the user has clicked the search
+ results and when the user is in the details panel, so we can save a
+ ton of time not working out properties that are not useful.
+ </para>
+ <example>
+ <title>Refine example</title>
+ <programlisting>
+static void
+gs_plugin_example_refine_async (GsPlugin *plugin,
+ GsAppList *list,
+ GsPluginRefineFlags flags,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ g_autoptr(GTask) task = NULL;
+
+ task = g_task_new (plugin, cancellable, callback, user_data);
+ g_task_set_source_tag (task, gs_plugin_example_refine_async);
+
+ /* not required */
+ if ((flags &amp; GS_PLUGIN_REFINE_FLAGS_REQUIRE_LICENSE) == 0) {
+ g_task_return_boolean (task, TRUE);
+ return;
+ }
+
+ for (guint i = 0; i &lt; gs_app_list_length (list); i++) {
+ GsApp *app = gs_app_list_index (list, i);
+
+ /* already set */
+ if (gs_app_get_license (app) != NULL) {
+ g_task_return_boolean (task, TRUE);
+ return;
+ }
+
+ /* FIXME, not just hardcoded! */
+ if (g_strcmp0 (gs_app_get_id (app, "chiron.desktop") == 0))
+ gs_app_set_license (app, "GPL-2.0 and LGPL-2.0+");
+ }
+
+ g_task_return_boolean (task, TRUE);
+}
+
+static gboolean
+gs_plugin_example_refine_finish (GsPlugin *plugin,
+ GAsyncResult *result,
+ GError **error)
+{
+ return g_task_propagate_boolean (G_TASK (result), error);
+}
+ </programlisting>
+ </example>
+ <para>
+ This is a simple example, but shows what a plugin needs to do.
+ It first checks if the action is required, in this case
+ <code>GS_PLUGIN_REFINE_FLAGS_REQUIRE_LICENSE</code>.
+ This request is more common than you might expect as even the search
+ results shows a non-free label if the license is unspecified or
+ non-free.
+ It then checks if the license is already set, returning with success
+ if so.
+ If not, it checks the application ID and hardcodes a license; in the
+ real world this would be querying a database or parsing an additional
+ config file.
+ As mentioned before, if the license value is freely available without
+ any extra work then it's best just to set this at the same time as
+ when adding the app with <code>gs_app_list_add()</code>.
+ Think of refine as <emphasis>adding things that cost time to
+ calculate only when really required</emphasis>.
+ </para>
+ <para>
+ The UI in gnome-software is quite forgiving for missing data, hiding
+ sections or labels as required.
+ Some things are required however, and forgetting to assign an icon or
+ short description will get the application vetoed so that it's not
+ displayed at all.
+ Helpfully, running <code>gnome-software --verbose</code> on the
+ command line will tell you why an application isn't shown along with
+ any extra data.
+ </para>
+
+ </section>
+
+ <section>
+ <title>Adopting AppStream Applications</title>
+
+ <para>
+ There's a lot of flexibility in the gnome-software plugin structure;
+ a plugin can add custom applications and handle things like search and
+ icon loading in a totally custom way.
+ Most of the time you don't care about how search is implemented or how
+ icons are going to be loaded, and you can re-use a lot of the existing
+ code in the <code>appstream</code> plugin.
+ To do this you just save an AppStream-format XML file in either
+ <filename>/usr/share/swcatalog/xml/</filename>,
+ <filename>/var/cache/swcatalog/xml/</filename> or
+ <filename>~/.local/share/swcatalog/xml/</filename>.
+ GNOME Software will immediately notice any new files, or changes to
+ existing files as it has set up the various inotify watches.
+ </para>
+ <para>
+ This allows plugins to care a lot less about how applications are
+ going to be shown.
+ For example, the <code>flatpak</code> plugin downloads AppStream data
+ for configured remotes during <code>refresh_metadata_async()</code>.
+ </para>
+ <para>
+ The only extra step a plugin providing its own apps needs to do
+ is to implement the <code>gs_plugin_adopt_app()</code> function.
+ This is called when an application does not have a management plugin
+ set, and allows the plugin to <emphasis>claim</emphasis> the
+ application for itself so it can handle installation, removal and
+ updating.
+ </para>
+ <para>
+ Another good example is the <code>fwupd</code> that wants to handle
+ any firmware we've discovered in the AppStream XML.
+ This might be shipped by the vendor in a package using Satellite,
+ or downloaded from the LVFS. It wouldn't be kind to set a management
+ plugin explicitly in case XFCE or KDE want to handle this in a
+ different way. This adoption function in this case is trivial:
+ </para>
+
+ <informalexample>
+ <programlisting>
+void
+gs_plugin_adopt_app (GsPlugin *plugin, GsApp *app)
+{
+ if (gs_app_get_kind (app) == AS_COMPONENT_KIND_FIRMWARE)
+ gs_app_set_management_plugin (app, plugin);
+}
+ </programlisting>
+ </informalexample>
+ </section>
+
+ <section>
+ <title>Using The Plugin Cache</title>
+
+ <para>
+ GNOME Software used to provide a per-process plugin cache,
+ automatically de-duplicating applications and trying to be smarter
+ than the plugins themselves.
+ This involved merging applications created by different plugins and
+ really didn't work very well.
+ For versions 3.20 and later we moved to a per-plugin cache which
+ allows the plugin to control getting and adding applications to the
+ cache and invalidating it when it made sense.
+ This seems to work a lot better and is an order of magnitude less
+ complicated.
+ Plugins can trivially be ported to using the cache using something
+ like this:
+ </para>
+ <informalexample>
+ <programlisting>
+ /* create new object */
+ id = gs_plugin_flatpak_build_id (inst, xref);
+- app = gs_app_new (id);
++ app = gs_plugin_cache_lookup (plugin, id);
++ if (app == NULL) {
++ app = gs_app_new (id);
++ gs_plugin_cache_add (plugin, id, app);
++ }
+ </programlisting>
+ </informalexample>
+ <para>
+ Using the cache has two main benefits for plugins.
+ The first is that we avoid creating duplicate GsApp objects for the
+ same logical thing.
+ This means we can query the installed list, start installing an
+ application, then query it again before the install has finished.
+ The GsApp returned from the second <code>list_apps()</code>
+ request will be the same GObject, and thus all the signals connecting
+ up to the UI will still be correct.
+ This means we don't have to care about <emphasis>migrating</emphasis>
+ the UI widgets as the object changes and things like progress bars just
+ magically work.
+ </para>
+ <para>
+ The other benefit is more obvious.
+ If we know the application state from a previous request we don't have
+ to query a daemon or do another blocking library call to get it.
+ This does of course imply that the plugin is properly invalidating
+ the cache using <code>gs_plugin_cache_invalidate()</code> which it
+ should do whenever a change is detected.
+ Whether a plugin uses the cache for this reason is up to the plugin,
+ but if it does it is up to the plugin to make sure the cache doesn't
+ get out of sync.
+ </para>
+ </section>
+
+ </partintro>
+ </reference>
+
+ <reference id="api">
+ <partintro>
+ <para>
+ This documentation is auto-generated.
+ If you see any issues, please file bugs.
+ </para>
+ </partintro>
+ <title>GNOME Software Plugin API</title>
+ <xi:include href="xml/gs-app.xml"/>
+ <xi:include href="xml/gs-app-collation.xml"/>
+ <xi:include href="xml/gs-app-list.xml"/>
+ <xi:include href="xml/gs-app-query.xml"/>
+ <xi:include href="xml/gs-appstream.xml"/>
+ <xi:include href="xml/gs-category.xml"/>
+ <xi:include href="xml/gs-category-manager.xml"/>
+ <xi:include href="xml/gs-debug.xml"/>
+ <xi:include href="xml/gs-desktop-data.xml"/>
+ <xi:include href="xml/gs-download-utils.xml"/>
+ <xi:include href="xml/gs-external-appstream-utils.xml"/>
+ <xi:include href="xml/gs-fedora-third-party.xml"/>
+ <xi:include href="xml/gs-icon.xml"/>
+ <xi:include href="xml/gs-ioprio.xml"/>
+ <xi:include href="xml/gs-key-colors.xml"/>
+ <xi:include href="xml/gs-metered.xml"/>
+ <xi:include href="xml/gs-odrs-provider.xml"/>
+ <xi:include href="xml/gs-os-release.xml"/>
+ <xi:include href="xml/gs-plugin.xml"/>
+ <xi:include href="xml/gs-plugin-event.xml"/>
+ <xi:include href="xml/gs-plugin-helpers.xml"/>
+ <xi:include href="xml/gs-plugin-job-list-apps.xml"/>
+ <xi:include href="xml/gs-plugin-job-list-categories.xml"/>
+ <xi:include href="xml/gs-plugin-job-list-distro-upgrades.xml"/>
+ <xi:include href="xml/gs-plugin-job-refine.xml"/>
+ <xi:include href="xml/gs-plugin-job-refresh-metadata.xml"/>
+ <xi:include href="xml/gs-plugin-job.xml"/>
+ <xi:include href="xml/gs-plugin-loader-sync.xml"/>
+ <xi:include href="xml/gs-plugin-loader.xml"/>
+ <xi:include href="xml/gs-plugin-types.xml"/>
+ <xi:include href="xml/gs-plugin-vfuncs.xml"/>
+ <xi:include href="xml/gs-remote-icon.xml"/>
+ <xi:include href="xml/gs-test.xml"/>
+ <xi:include href="xml/gs-worker-thread.xml"/>
+ <xi:include href="xml/gs-utils.xml"/>
+ </reference>
+
+</book>
diff --git a/doc/api/gnome-software.types b/doc/api/gnome-software.types
new file mode 100644
index 0000000..5f0a7b0
--- /dev/null
+++ b/doc/api/gnome-software.types
@@ -0,0 +1,6 @@
+gs_app_get_type
+gs_app_list_get_type
+gs_category_get_type
+gs_os_release_get_type
+gs_plugin_event_get_type
+gs_plugin_get_type
diff --git a/doc/api/gs-example-details.png b/doc/api/gs-example-details.png
new file mode 100644
index 0000000..88c29e4
--- /dev/null
+++ b/doc/api/gs-example-details.png
Binary files differ
diff --git a/doc/api/gs-example-installed.png b/doc/api/gs-example-installed.png
new file mode 100644
index 0000000..0cd424a
--- /dev/null
+++ b/doc/api/gs-example-installed.png
Binary files differ
diff --git a/doc/api/gs-example-search.png b/doc/api/gs-example-search.png
new file mode 100644
index 0000000..77611bd
--- /dev/null
+++ b/doc/api/gs-example-search.png
Binary files differ
diff --git a/doc/api/meson.build b/doc/api/meson.build
new file mode 100644
index 0000000..2ccab7b
--- /dev/null
+++ b/doc/api/meson.build
@@ -0,0 +1,11 @@
+gnome.gtkdoc(
+ 'gnome-software',
+ src_dir : join_paths(meson.project_source_root(), 'lib'),
+ main_xml : 'gnome-software-docs.xml',
+ html_assets : [
+ 'gs-example-details.png',
+ 'gs-example-installed.png',
+ 'gs-example-search.png'
+ ],
+ install : true
+)
diff --git a/doc/app-developers.md b/doc/app-developers.md
new file mode 100644
index 0000000..dad5da7
--- /dev/null
+++ b/doc/app-developers.md
@@ -0,0 +1,69 @@
+Tools in GNOME Software for application developers
+==================================================
+
+GNOME Software is often where users will first come into contact with an
+application which they might later install, so the impression the user gets of
+that application is important. Application developers want to see how their
+application will appear in GNOME Software, and to have some control over it.
+
+GNOME Software provides some tools to help with this.
+
+If there is a supported tool which is not in this document, please
+[submit a merge request](https://gitlab.gnome.org/GNOME/gnome-software/-/merge_requests/new)
+to document it.
+
+Metainfo/Appstream
+------------------
+
+The information about an application comes from its metainfo (or, as it was
+previously known: appdata) file. Metainfo files for multiple applications are
+concatenated into ‘appstream’ files. Almost all of the customisation which GNOME
+Software provides for applications comes from information in metainfo or
+appstream files.
+
+So the first thing to check for your application is that its metainfo file is
+complete and valid. See the
+[metainfo file specification](https://www.freedesktop.org/software/appstream/docs/).
+
+To validate your metainfo file, run
+```
+appstreamcli validate /path/to/app.metainfo.xml
+```
+
+You can add this as a unit test to your application by adding the following to
+the appropriate `meson.build` in your application:
+```
+metainfo_file = files('com.example.MyApp.metainfo.xml')
+appstreamcli = find_program('appstreamcli', required: false)
+if appstreamcli.found()
+ test (
+ 'Validate metainfo file',
+ appstreamcli,
+ args: ['validate', '--no-net', metainfo_file],
+ )
+endif
+```
+
+Context tiles
+-------------
+
+The context tiles which are shown on an application’s details page in GNOME
+Software are derived from the application’s metainfo.
+
+There’s more detailed information about them, and the information they are built
+from, [on the GNOME Software wiki](https://gitlab.gnome.org/GNOME/gnome-software/-/wikis/Software-metadata).
+
+Previewing the details page for an application
+----------------------------------------------
+
+GNOME Software allows previewing how an application will appear, by loading its
+metainfo file directly. This allows previewing in-progress changes to an
+application without publishing it to a repository.
+
+Do this with the `--show-metainfo` argument:
+```
+gnome-software --show-metainfo=/path/to/app.metainfo.xml,icon=/path/to/icon.png
+```
+
+This will show the application in the details page of GNOME Software, and will
+also display it in the featured carousel on the overview page.
diff --git a/doc/design.svg b/doc/design.svg
new file mode 100644
index 0000000..4f9a181
--- /dev/null
+++ b/doc/design.svg
@@ -0,0 +1,448 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="744.09448819"
+ height="1052.3622047"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="design.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.9899495"
+ inkscape:cx="290.74866"
+ inkscape:cy="1216.6706"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:window-width="1200"
+ inkscape:window-height="1881"
+ inkscape:window-x="1600"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ showguides="true"
+ inkscape:guide-bbox="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2985"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <rect
+ style="opacity:0.97154475;fill:#c3cdee;fill-opacity:1;stroke:#000000;stroke-width:0.51179862;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect2987-5"
+ width="115.2915"
+ height="34.988201"
+ x="179.70259"
+ y="127.36808"
+ ry="1.8272164"
+ inkscape:export-filename="/home/hughsie/Code/gnome3/gnome-software/design.png"
+ inkscape:export-xdpi="120.03957"
+ inkscape:export-ydpi="120.03957" />
+ <rect
+ style="opacity:0.97154475;fill:#cef1d7;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect2987-5-5-5-3"
+ width="110"
+ height="210"
+ x="75"
+ y="127.36218"
+ ry="4.6491089"
+ inkscape:export-filename="/home/hughsie/Code/gnome3/gnome-software/design.png"
+ inkscape:export-xdpi="120.03957"
+ inkscape:export-ydpi="120.03957" />
+ <path
+ style="fill:#000000;fill-opacity:0.97695851;stroke:none"
+ d="m 295,145.69551 0,3.33334 65,0 0,3.33333 20,-5 -20,-5 0,3.33333 z"
+ id="path3757-0"
+ inkscape:connector-curvature="0"
+ inkscape:export-filename="/home/hughsie/Code/gnome3/gnome-software/design.png"
+ inkscape:export-xdpi="120.03957"
+ inkscape:export-ydpi="120.03957" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+ x="240"
+ y="152.36218"
+ id="text3801-0"
+ sodipodi:linespacing="125%"
+ inkscape:export-filename="/home/hughsie/Code/gnome3/gnome-software/design.png"
+ inkscape:export-xdpi="120.03957"
+ inkscape:export-ydpi="120.03957"><tspan
+ sodipodi:role="line"
+ id="tspan3803-8"
+ x="240"
+ y="152.36218"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans">Plugins</tspan></text>
+ <rect
+ style="opacity:0.97154474999999996;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3900"
+ width="75"
+ height="75"
+ x="380"
+ y="92.362183"
+ ry="11.155499"
+ inkscape:export-filename="/home/hughsie/Code/gnome3/gnome-software/design.png"
+ inkscape:export-xdpi="120.03957"
+ inkscape:export-ydpi="120.03957" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+ x="130"
+ y="152.36218"
+ id="text3801-0-7"
+ sodipodi:linespacing="125%"
+ inkscape:export-filename="/home/hughsie/Code/gnome3/gnome-software/design.png"
+ inkscape:export-xdpi="120.03957"
+ inkscape:export-ydpi="120.03957"><tspan
+ sodipodi:role="line"
+ id="tspan3803-8-6"
+ x="130"
+ y="152.36218"
+ style="font-size:18px;text-align:center;text-anchor:middle;-inkscape-font-specification:Liberation Sans;font-family:Liberation Sans;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal">PackageKit</tspan></text>
+ <rect
+ style="opacity:0.97154475;fill:#cef1d7;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect2987-5-5-5"
+ width="110"
+ height="35"
+ x="75"
+ y="162.36218"
+ ry="0"
+ inkscape:export-filename="/home/hughsie/Code/gnome3/gnome-software/design.png"
+ inkscape:export-xdpi="120.03957"
+ inkscape:export-ydpi="120.03957" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+ x="130"
+ y="187.36218"
+ id="text3801-0-7-9"
+ sodipodi:linespacing="125%"
+ inkscape:export-filename="/home/hughsie/Code/gnome3/gnome-software/design.png"
+ inkscape:export-xdpi="120.03957"
+ inkscape:export-ydpi="120.03957"><tspan
+ sodipodi:role="line"
+ id="tspan3803-8-6-7"
+ x="130"
+ y="187.36218"
+ style="font-size:18px;text-align:center;text-anchor:middle;-inkscape-font-specification:Liberation Sans;font-family:Liberation Sans;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal">AppStream</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+ x="130"
+ y="222.36218"
+ id="text3801-0-7-4"
+ sodipodi:linespacing="125%"
+ inkscape:export-filename="/home/hughsie/Code/gnome3/gnome-software/design.png"
+ inkscape:export-xdpi="120.03957"
+ inkscape:export-ydpi="120.03957"><tspan
+ sodipodi:role="line"
+ id="tspan3803-8-6-3"
+ x="130"
+ y="222.36218"
+ style="font-size:18px;text-align:center;text-anchor:middle;-inkscape-font-specification:Liberation Sans;font-family:Liberation Sans;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal">glick2</tspan></text>
+ <rect
+ style="opacity:0.97154475;fill:#cef1d7;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect2987-5-5-5-4"
+ width="110"
+ height="35"
+ x="75"
+ y="232.36218"
+ ry="0"
+ inkscape:export-filename="/home/hughsie/Code/gnome3/gnome-software/design.png"
+ inkscape:export-xdpi="120.03957"
+ inkscape:export-ydpi="120.03957" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+ x="130"
+ y="257.36218"
+ id="text3801-0-7-9-9"
+ sodipodi:linespacing="125%"
+ inkscape:export-filename="/home/hughsie/Code/gnome3/gnome-software/design.png"
+ inkscape:export-xdpi="120.03957"
+ inkscape:export-ydpi="120.03957"><tspan
+ sodipodi:role="line"
+ id="tspan3803-8-6-7-3"
+ x="130"
+ y="257.36218"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans">epiphany</tspan></text>
+ <rect
+ style="opacity:0.97154475;fill:#cef1d7;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect2987-5-5-2"
+ width="110"
+ height="35"
+ x="75"
+ y="267.36218"
+ ry="0"
+ inkscape:export-filename="/home/hughsie/Code/gnome3/gnome-software/design.png"
+ inkscape:export-xdpi="120.03957"
+ inkscape:export-ydpi="120.03957" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+ x="130"
+ y="292.36218"
+ id="text3801-0-7-1"
+ sodipodi:linespacing="125%"
+ inkscape:export-filename="/home/hughsie/Code/gnome3/gnome-software/design.png"
+ inkscape:export-xdpi="120.03957"
+ inkscape:export-ydpi="120.03957"><tspan
+ sodipodi:role="line"
+ id="tspan3803-8-6-8"
+ x="130"
+ y="292.36218"
+ style="font-size:18px;text-align:center;text-anchor:middle;-inkscape-font-specification:Liberation Sans;font-family:Liberation Sans;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal">listaller</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+ x="130"
+ y="327.36218"
+ id="text3801-0-7-9-7"
+ sodipodi:linespacing="125%"
+ inkscape:export-filename="/home/hughsie/Code/gnome3/gnome-software/design.png"
+ inkscape:export-xdpi="120.03957"
+ inkscape:export-ydpi="120.03957"><tspan
+ sodipodi:role="line"
+ id="tspan3803-8-6-7-2"
+ x="130"
+ y="327.36218"
+ style="font-size:18px;text-align:center;text-anchor:middle;font-weight:normal;-inkscape-font-specification:Liberation Sans;font-family:Liberation Sans;font-style:normal;font-stretch:normal;font-variant:normal">ostree</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+ x="190"
+ y="172.36218"
+ id="text3801-0-7-9-5"
+ sodipodi:linespacing="125%"
+ inkscape:export-filename="/home/hughsie/Code/gnome3/gnome-software/design.png"
+ inkscape:export-xdpi="120.03957"
+ inkscape:export-ydpi="120.03957"><tspan
+ sodipodi:role="line"
+ x="190"
+ y="172.36218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan3913">list = Search(text)</tspan><tspan
+ sodipodi:role="line"
+ x="190"
+ y="186.11218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan3951">list = AddInstalled()</tspan><tspan
+ sodipodi:role="line"
+ x="190"
+ y="199.86218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan3917">list = AddUpdates()</tspan><tspan
+ sodipodi:role="line"
+ x="190"
+ y="213.61218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan4121">list = AddPopular()</tspan><tspan
+ sodipodi:role="line"
+ x="190"
+ y="227.36218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan3947">bool = AppInstall(app)</tspan><tspan
+ sodipodi:role="line"
+ x="190"
+ y="241.11218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan3928">bool = AppUpdate(app)</tspan><tspan
+ sodipodi:role="line"
+ x="190"
+ y="254.86218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan3930">bool = AppRemove(app)</tspan><tspan
+ sodipodi:role="line"
+ x="190"
+ y="268.61218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan3934">bool = Refine(app)</tspan><tspan
+ sodipodi:role="line"
+ x="190"
+ y="282.36218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan3941">bool = SetRating(app)</tspan><tspan
+ sodipodi:role="line"
+ x="190"
+ y="296.11218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan3943">list = AddCategories()</tspan><tspan
+ sodipodi:role="line"
+ x="190"
+ y="309.86218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan4050">:str name</tspan><tspan
+ sodipodi:role="line"
+ x="190"
+ y="323.61218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan3044">:list deps</tspan><tspan
+ sodipodi:role="line"
+ x="190"
+ y="337.36218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan3914">:bool enabled</tspan></text>
+ <rect
+ style="opacity:0.97154475;fill:#c3cdee;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect2987-5-6-0"
+ width="110"
+ height="35"
+ x="365"
+ y="197.36218"
+ ry="1.8278326"
+ inkscape:export-filename="/home/hughsie/Code/gnome3/gnome-software/design.png"
+ inkscape:export-xdpi="120.03957"
+ inkscape:export-ydpi="120.03957" />
+ <rect
+ style="opacity:0.97154475;fill:#c3cdee;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect2987-5-6"
+ width="110"
+ height="35"
+ x="360"
+ y="202.36218"
+ ry="1.8278326"
+ inkscape:export-filename="/home/hughsie/Code/gnome3/gnome-software/design.png"
+ inkscape:export-xdpi="120.03957"
+ inkscape:export-ydpi="120.03957" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+ x="415"
+ y="225.36218"
+ id="text3801-0-3"
+ sodipodi:linespacing="125%"
+ inkscape:export-filename="/home/hughsie/Code/gnome3/gnome-software/design.png"
+ inkscape:export-xdpi="120.03957"
+ inkscape:export-ydpi="120.03957"><tspan
+ sodipodi:role="line"
+ id="tspan3803-8-7"
+ x="415"
+ y="225.36218"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:PakType Naqsh;-inkscape-font-specification:PakType Naqsh">Applications</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+ x="360"
+ y="247.36218"
+ id="text3801-0-7-9-5-7"
+ sodipodi:linespacing="125%"
+ inkscape:export-filename="/home/hughsie/Code/gnome3/gnome-software/design.png"
+ inkscape:export-xdpi="120.03957"
+ inkscape:export-ydpi="120.03957"><tspan
+ sodipodi:role="line"
+ x="360"
+ y="247.36218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan4073">:str app-id (e.g. foo.desktop)</tspan><tspan
+ sodipodi:role="line"
+ x="360"
+ y="261.11218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan4046">:ptr source (e.g. pkgname)</tspan><tspan
+ sodipodi:role="line"
+ x="360"
+ y="274.86218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan4048">:str management_plugin</tspan><tspan
+ sodipodi:role="line"
+ x="360"
+ y="288.61218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan4052">:str title (localized)</tspan><tspan
+ sodipodi:role="line"
+ x="360"
+ y="302.36218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan4054">:str description (localized)</tspan><tspan
+ sodipodi:role="line"
+ x="360"
+ y="316.11218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan4056">:str screenshots</tspan><tspan
+ sodipodi:role="line"
+ x="360"
+ y="329.86218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan4058">:str icon_uri</tspan><tspan
+ sodipodi:role="line"
+ x="360"
+ y="343.61218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan4093">:int rating</tspan><tspan
+ sodipodi:role="line"
+ x="360"
+ y="357.36218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan4064">:int state (e.g. installed)</tspan><tspan
+ sodipodi:role="line"
+ x="360"
+ y="371.11218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan3037">:int app-kind (e.g. codec)</tspan><tspan
+ sodipodi:role="line"
+ x="360"
+ y="384.86218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan3959">:int install_date</tspan></text>
+ <path
+ style="fill:#000000;fill-opacity:0.97695851;stroke:none"
+ d="m 405,167.36218 -5,0 0.37902,15.83248 -3.33333,0 5,20 5,-20 -3.33333,0 z"
+ id="path3757-0-1"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccc"
+ inkscape:export-filename="/home/hughsie/Code/gnome3/gnome-software/design.png"
+ inkscape:export-xdpi="120.03957"
+ inkscape:export-ydpi="120.03957" />
+ <image
+ y="96.362183"
+ x="385"
+ id="image3134"
+ xlink:href="file:///home/hughsie/Code/gnome3/gnome-software/data/icons/256x256/gnome-software.png"
+ height="66"
+ width="66" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot3137"
+ style="fill:black;stroke:none;stroke-opacity:1;stroke-width:1px;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;font-family:Abyssinica SIL;font-style:normal;font-weight:normal;font-size:8px;line-height:125%;letter-spacing:0px;word-spacing:0px;-inkscape-font-specification:Abyssinica SIL;font-stretch:normal;font-variant:normal"><flowRegion
+ id="flowRegion3139"><rect
+ id="rect3141"
+ width="118.69292"
+ height="96.469566"
+ x="349.00769"
+ y="375.0549" /></flowRegion><flowPara
+ id="flowPara3143"></flowPara></flowRoot> </g>
+</svg>
diff --git a/doc/kudos.md b/doc/kudos.md
new file mode 100644
index 0000000..f43aa51
--- /dev/null
+++ b/doc/kudos.md
@@ -0,0 +1,70 @@
+Kudos used in Software
+======================
+
+As part of the AppStream generation process we explode various parts of the
+distro binary package and try to build metadata by merging various sources
+together, for example AppData, desktop files and icons.
+
+As part of this we also have access to the finished binary and libraries, and
+so can also run tools on them to get a metric of awesomeness. So far, the
+metrics of awesomeness (here-on known as "kudos") are:
+
+ * `HiDpiIcon` — installs a 128x128 or larger application icon
+ * `HighContrast` — uses hicontrast or scalable icons for visually impaired users
+ * `ModernToolkit` — uses a modern toolkit like Gtk-3 or QT-5
+ * `Notifications` — registers desktop notifications
+ * `SearchProvider` — provides a search provider for GNOME Shell or KDE Plasma
+ * `UserDocs` — provides user documentation
+
+These attempt to define how tightly the application is integrated with the
+platform, which is usually a pretty good metric of awesomeness. Of course,
+some applications like Blender are an island in terms of integration, but of
+course are awesome.
+
+There are some other "run-time" kudos used as well. These are not encoded by
+the builder as they require some user information or are too specific to
+GNOME Software. These include:
+
+ * `FeaturedRecommended` — One of the design team chose to feature this
+ * `HasKeywords` — there are keywords in the desktop file used for searching
+ * `HasScreenshots` — more than one screenshot is supplied
+ * `MyLanguage` — has a populated translation in my locale, or a locale fallback
+ * `PerfectScreenshots` — screenshots are perfectly sized, in 16:9 aspect
+ * `Popular` — lots of people have downloaded this (only available on Fedora)
+ * `RecentRelease` — there been an upstream release in the last year
+
+You can verify the kudos your application is getting by doing something like:
+
+ killall gnome-software
+ gnome-software --verbose
+
+and then navigating to the details for an application you'll see on the console:
+
+ id-kind: desktop
+ state: available
+ id: blender.desktop
+ kudo: recent-release
+ kudo: featured-recommended
+ kudo: has-screenshots
+ kudo: popular
+
+Manually Adding Kudos
+---------------------
+
+If the AppStream generator fails to detect a specific kudo then you can add them
+manually in the AppData file and they will be used in the AppStream metadata.
+To do this, just add something like:
+
+ <kudos>
+ <kudo>ModernToolkit</kudo>
+ <kudo>UserDocs</kudo>
+ </kudos>
+
+Although, please bear in mind any application that is found cheating, i.e.
+adding kudos artificially will have **all** the kudos manually removed
+with a blocklist rule in the AppStream builder.
+
+If you are a vendor, or a system distributor and just want to increase the
+number of kudos for your pet proprietary application that's essential to
+business function, a good kudo to manually add would be `FeaturedRecommended`,
+or `GnomeSoftware::popular`.
diff --git a/doc/meson.build b/doc/meson.build
new file mode 100644
index 0000000..1a1d9bf
--- /dev/null
+++ b/doc/meson.build
@@ -0,0 +1,3 @@
+if get_option('gtk_doc')
+ subdir('api')
+endif
diff --git a/doc/privacy-policy.html b/doc/privacy-policy.html
new file mode 100644
index 0000000..ad97cac
--- /dev/null
+++ b/doc/privacy-policy.html
@@ -0,0 +1,31 @@
+<html>
+<head>
+ <title>GNOME Software Privacy Policy</title>
+</head>
+<body>
+ <h1>Policy</h1>
+ <p>
+ GNOME Software can optionally use a ratings and reviews service offered by
+ your distribution.
+ If enabled, GNOME Software will notify a web service that a specific
+ application has been installed or removed.
+ This information about which software you use helps us provide other users
+ with more accurate recommendations and helps us to choose applications to
+ feature on the overview page.
+ </p>
+ <p>
+ When submitting ratings your IP address is sent along with the usage information.
+ This is exactly the same information submitted viewing this web page.
+ A one-way hash of this address is also stored in a database to prevent
+ duplicate entries being added by the same user, but this can not be used to
+ identify specific users or network addresses.
+ </p>
+ <p>
+ We will never share the list of applications or your IP address with third
+ parties other than the original distribution web-service used by GNOME Software.
+ </p>
+ <h1>History of Changes</h1>
+ <p>
+ Modified 2014-02-04 by Richard Hughes
+ </p>
+</html>
diff --git a/doc/update.sh b/doc/update.sh
new file mode 100755
index 0000000..5abf679
--- /dev/null
+++ b/doc/update.sh
@@ -0,0 +1 @@
+scp api/html/* hughsient@people.freedesktop.org:~/public_html/gnome-software
diff --git a/doc/use-cases.md b/doc/use-cases.md
new file mode 100644
index 0000000..c60eb4c
--- /dev/null
+++ b/doc/use-cases.md
@@ -0,0 +1,38 @@
+This document will evolve over time to indicate what goals and use cases
+gnome-software targets at the moment.
+
+Primary goals
+=============
+
+ * Allow people to find apps by browsing or search:
+ - a specific app that they're looking for, or
+ - apps in a particular category, or with particular functionality that they require
+ * Allow people to effectively inspect and appraise apps before they install them (screenshots, descriptions, ratings, comments, metadata)
+ * Allow people to view which apps are installed and remove them
+ * Present a positive view of the app ecosystem
+ - Reinforce the sense that there are lots of high quality apps
+ - Encourage people to engage with that ecosystem, both as users and as contributors
+ - When browsing, present and promote the best apps that are available
+ - Facilitate accidental discovery of great apps
+ * Handle software updates. Make software updates as little work for users as possible. To include: apps, OS updates (PackageKit, eos, rpm-ostree), firmware
+ * Support multiple software repositories, defined by both the distributor and users.
+ - Show which repos are configured. Allow them to be added/removed.
+ - Handle cases where the same app can be installed from multiple sources.
+
+Secondary goals
+===============
+
+ * OS upgrades
+ * Hardware driver installation
+ * Input method installation
+ * Respond to application queries for software (apps, codecs, languages)
+ * Offline and metered connections
+ * OS updates end of life
+ * App end of life
+
+Non-goals
+=========
+
+ * Not a package manager front-end
+ * Not all repos are equal
+ * Not all apps are equal
diff --git a/doc/vendor-customisation.md b/doc/vendor-customisation.md
new file mode 100644
index 0000000..8866910
--- /dev/null
+++ b/doc/vendor-customisation.md
@@ -0,0 +1,214 @@
+Vendor customisation of GNOME Software
+======================================
+
+GNOME Software is in an unusual position in a distribution, as it lies at the
+interface of the GNOME project and the distribution’s packaging and release
+infrastructure. GNOME Software is the user interface which a lot of users will
+use to see updates and new releases from their distribution. Distributions
+understandably want to be able to put some of their own branding on this
+interface, both to publicise their distribution and to confer some level of
+official authority on the updates being provided.
+
+For this reason, GNOME Software has a few ways which vendors can use to
+customise its appearance.
+
+A variety of different customisations have been implemented in the past, some of
+which have been removed and others are still present. This document aims to
+document the ones which are still present and supported. This document is *not
+necessarily complete*. It will be added to over time as different customisations
+are refreshed and updated.
+
+If there is a supported customisation method which is not in this document,
+please [submit a merge request](https://gitlab.gnome.org/GNOME/gnome-software/-/merge_requests/new)
+to document it.
+
+Likewise, if your distribution would like to customise gnome-software in a way
+which isn’t currently supported, please
+[open a new issue](https://gitlab.gnome.org/GNOME/gnome-software/-/issues/new?issue%5Bmilestone_id%5D=)
+to discuss it. We don’t guarantee to implement anything, and customisations are
+limited to adding branding in specific areas.
+
+Principles
+----------
+
+The principles which guide vendor customisation features in GNOME Software are:
+ * Avoid requiring vendor specific code.
+ - Otherwise vendors have to maintain and test GNOME Software plugins, which
+ is a lot of work.
+ * Don’t use GSettings unless customisations really should be per-user.
+ - While GSettings overrides are convenient, they are designed for user
+ preferences, not packaging customisation.
+ * Don’t require downstream patching of GNOME Software, although configure-time
+ arguments are OK.
+ - Many distributions are derived from other ones and would not like to have
+ to maintain a packaging fork in order to make small customisations.
+ * Be mindful of release cadences.
+ - If customisations related to a new OS version were tied to the release
+ cycle of GNOME Software, a new GNOME Software packaging release would have
+ to be done by a distribution in advance of making their new OS release,
+ which is a burden.
+ - It’s easier to allow distributions to put customisations specific to a new
+ OS version into a separate package.
+
+Upgrade background image
+------------------------
+
+The background image which is shown when a new OS upgrade is available is
+customisable in several ways. It’s displayed by the `GsUpgradeBanner` widget,
+and shown on the updates page.
+
+If your distribution has a specific GNOME Software plugin providing its upgrade
+information, that plugin can provide CSS for rendering the background. See the
+`fedora-pkgdb-collections` plugin for an example of this.
+
+Otherwise, the background image is looked up from several well-known locations,
+in order:
+ * `${DATADIR}/gnome-software/backgrounds/${os_id}-${version}.png`
+ * `${DATADIR}/gnome-software/backgrounds/${os_id}.png`
+
+`${DATADIR}` is the configured data directory (typically `/usr/share`).
+`${os_id}` is the `ID=` value from `/etc/os-release`, and `${version}` is the
+version string being upgraded to.
+
+Featured apps and Editor’s Choice
+---------------------------------
+
+There are several ways to promote and highlight specific applications in GNOME
+Software. On the overview page, there’s a carousel of featured applications
+(`featured_carousel`), and an “Editor’s Choice” section (`box_curated`). Both of
+them highlight curated sets of applications. The same is true on each category
+page: a carousel (`top_carousel`) and an “Editor’s Choice” section
+(`featured_flow_box`) are present.
+
+Both pages also have a “New & Updated” section (`box_recent` or
+`recently_updated_flow_box`) presented below “Editor’s Choice”. The applications
+listed in the new and updated section are not curated: they are chosen as the
+applications which have had a recent release, according to the
+`component/releases/release[@timestamp]` attribute in their metainfo.
+Technically these are the results of a `GsPlugin.list_apps_async()` query with
+`GsAppQuery:released-since` set.
+
+Applications are included in any of the curated sets through having special
+metadata in their metainfo. The required metadata is different for the different
+sections:
+ * Carousel on the overview page: Applications are included if they have
+ `component/custom/value[@key='GnomeSoftware::FeatureTile]` or
+ `component/custom/value[@key='GnomeSoftware::FeatureTile-css]` set in their
+ metainfo. They are also required to have a high-resolution icon, and the set
+ of applications shown in the carousel is randomised and limited to (for
+ example) 5. Technically these are the results of a
+ `GsPlugin.list_apps_async()` query with `GsAppQuery:is-featured` set.
+ * “Editor’s Choice” on the overview page: Applications are included if they
+ have `component/kudos/kudo[text()='GnomeSoftware::popular']` set in their
+ metainfo. Technically these are the results of a `GsPlugin.list_apps_async()`
+ query with `GsAppQuery:is-curated` set.
+ * Carousel on the category page: Applications are included if they are in the
+ `Featured` subcategory of the displayed category. They are also required to
+ have a high-resolution icon, and the set of applications shown in the carousel
+ is randomised and limited to (for example) 5.
+ * “Editor’s Choice” on the category page: Applications are included if they
+ meet the requirements for being in the carousel, but weren’t chosen as part
+ of the randomisation process.
+
+Example:
+```xml
+<?xml version="1.0" encoding="UTF-8"?>
+<components>
+ <component merge="append">
+ <!-- The ID must always be present to allow merging -->
+ <id>org.gnome.Podcasts</id>
+
+ <!-- Make the app a candidate for inclusion in the carousel on the
+ overview page (if it has a hi-res icon). -->
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+
+ <!-- Include the app in the “Editor’s Choice” section on the overview page. -->
+ <kudos>
+ <kudo>GnomeSoftware::popular</kudo>
+ </kudos>
+
+ <!-- Make the app a candidate for inclusion in the carousel or
+ “Editor’s Choice” section on category pages (if it has a hi-res icon). -->
+ <categories>
+ <!-- Note that, due to a bug (https://gitlab.gnome.org/GNOME/gnome-software/-/issues/1649),
+ currently all the other categories for the app must also be listed
+ here, as well as the additional ‘Featured’ category. -->
+ <category>AudioVideo</category>
+ <category>Player</category>
+ <!-- This category has been added: -->
+ <category>Featured</category>
+ </categories>
+ </component>
+ <!-- more components -->
+</components>
+```
+
+There are several ways to modify the metainfo for applications so that they are
+highlighted as required, all of which involve providing an additional appstream
+file which sets the additional metainfo for those applications.
+
+The main approach is to ship an additional distro-specific appstream file in
+`${DATADIR}/swcatalog/xml`, providing and updating it via normal distribution
+channels. For example, by packaging it in its own package which is updated
+regularly.
+
+For distributions which can’t do regular updates of individual files – such as
+image-based distributions – GNOME Software can download distro-specific
+appstream files from the internet. List them in the `external-appstream-urls`
+GSetting in `/org/gnome/software`, typically via a distribution-provided
+GSettings override. Each URL must be HTTPS, and must point to a valid appstream
+file. GNOME Software must be configured with `-Dexternal_appstream=true` for
+this to work.
+
+GNOME Software will periodically check and download any updates to these
+files, and will cache them locally. Ensure the `If-Modified-Since` HTTP header
+functions correctly on your server, or GNOME Software’s caching will be
+ineffective.
+
+The `external-appstream-urls` mechanism may change in future.
+
+GNOME Software ships a default list of featured applications, chosen to match
+the [GNOME Circle](https://circle.gnome.org/). See
+`data/assets/org.gnome.Software.Featured.xml` for this list, and for an example
+of the metainfo XML needed to feature or highlight applications. See
+`data/assets/org.gnome.Software.Curated.xml` for a default hard-coded list of
+curated high quality applications, which is displayed in the “Editor’s Choice”
+section of the overview page.
+
+Pass `-Ddefault_featured_apps=false` when configuring GNOME Software to disable
+the default list of featured applications. Pass `-Dhardcoded_curated=false` to
+disable the default list of “Editor’s Choice” applications.
+
+Deployment Featured Apps
+------------------------
+
+Deployments can feature their own applications, which will be shown in the Explore
+page in its own section. To have the section shown, two files need to be provided.
+The number of deployment-featured apps is limited in the UI, and if not enough
+deployment-featured apps are found, then the section will not be shown at all.
+
+The first file is `org.gnome.Software.DeploymentFeatured.xml`, which works similarly
+to `org.gnome.Software.Featured.xml` and should be saved beside it in an appstream
+directory. It sets the `GnomeSoftware::DeploymentFeatured` key on apps which should
+be featured for this distribution or deployment. The value of this key is a string
+containing the deployment name as an identifier.
+
+The second file is `deployment-featured.ini`, which contains a human-readable title and
+the selector for the section. The title is a localized key, and is used to set the heading
+for the section on the Explore page. The selector defines which apps should be picked.
+It is a semicolon-separated list of `GnomeSoftware::DeploymentFeatured` key values, thus
+the deployment can feature apps from zero or more vendors.
+
+The `deployment-featured.ini` file should be saved in one of the `sysconfdir`, system
+config dirs or system data dirs. They are checked, in that order, for existence of
+the `gnome-software/deployment-featured.ini` file. The first directory containing
+it will be used. The relevant file names are `/etc/xdg/gnome-software/deployment-featured.ini`,
+`/usr/local/share/gnome-software/deployment-featured.ini` and
+`/usr/share/gnome-software/deployment-featured.ini`.
+
+Any changes to these files, including adding or removing them, will only be noticed
+when gnome-software is restarted.
+
+Example files can be found in the `contrib/` directory.
diff --git a/gnome-software.doap b/gnome-software.doap
new file mode 100644
index 0000000..a277963
--- /dev/null
+++ b/gnome-software.doap
@@ -0,0 +1,54 @@
+<Project xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
+ xmlns:foaf="http://xmlns.com/foaf/0.1/"
+ xmlns:gnome="http://api.gnome.org/doap-extensions#"
+ xmlns="http://usefulinc.com/ns/doap#">
+
+ <name xml:lang="en">gnome-software</name>
+ <shortdesc xml:lang="en">GNOME Software Tools</shortdesc>
+ <category rdf:resource="http://api.gnome.org/doap-extensions#apps" />
+ <programming-language>C</programming-language>
+ <description xml:lang="en">
+ GNOME Software is for installing, removing and updating software.
+ </description>
+
+ <homepage rdf:resource="https://wiki.gnome.org/Apps/Software" />
+ <download-page rdf:resource="https://download.gnome.org/sources/gnome-software/" />
+ <bug-database rdf:resource="https://gitlab.gnome.org/GNOME/gnome-software/issues" />
+
+ <maintainer>
+ <foaf:Person>
+ <foaf:name>Milan Crha</foaf:name>
+ <foaf:mbox rdf:resource="mailto:mcrha@redhat.com" />
+ <gnome:userid>mcrha</gnome:userid>
+ </foaf:Person>
+ </maintainer>
+
+ <maintainer>
+ <foaf:Person>
+ <foaf:name>Phaedrus Leeds</foaf:name>
+ <foaf:mbox rdf:resource="mailto:mwleeds@endlessos.org" />
+ <gnome:userid>mwleeds</gnome:userid>
+ </foaf:Person>
+ </maintainer>
+
+ <maintainer>
+ <foaf:Person>
+ <foaf:name>Philip Withnall</foaf:name>
+ <foaf:mbox rdf:resource="mailto:pwithnall@endlessos.org" />
+ <gnome:userid>pwithnall</gnome:userid>
+ </foaf:Person>
+ </maintainer>
+
+ <maintainer>
+ <foaf:Person>
+ <foaf:name>Richard Hughes</foaf:name>
+ <foaf:mbox rdf:resource="mailto:richard@hughsie.com" />
+ <foaf:homepage rdf:resource="http://www.hughsie.com/" />
+ <gnome:userid>rhughes</gnome:userid>
+ </foaf:Person>
+ </maintainer>
+
+ <license rdf:resource="http://www.gnu.org/licenses/gpl-2.0.txt" />
+
+</Project>
diff --git a/gs-install-appstream/gs-install-appstream.c b/gs-install-appstream/gs-install-appstream.c
new file mode 100644
index 0000000..fd17584
--- /dev/null
+++ b/gs-install-appstream/gs-install-appstream.c
@@ -0,0 +1,227 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ * vi:set noexpandtab tabstop=8 shiftwidth=8:
+ *
+ * Copyright (C) 2009-2016 Richard Hughes <richard@hughsie.com>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include <errno.h>
+#include <locale.h>
+#include <pwd.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include <xmlb.h>
+#include <glib/gi18n.h>
+#include <glib/gstdio.h>
+
+#include "gs-external-appstream-utils.h"
+
+static gboolean
+gs_install_appstream_move_file (GFile *file, GError **error)
+{
+ g_autofree gchar *basename = g_file_get_basename (file);
+ g_autofree gchar *legacy_cachefn = gs_external_appstream_utils_get_legacy_file_cache_path (basename);
+ g_autofree gchar *cachefn = gs_external_appstream_utils_get_file_cache_path (basename);
+ g_autoptr(GFile) cachefn_file = g_file_new_for_path (cachefn);
+ g_autoptr(GFile) cachedir_file = g_file_get_parent (cachefn_file);
+ GStatBuf stat_buf = { 0 };
+
+ /* Try to cleanup the old cache directory, but do not panic, when it fails */
+ if (g_unlink (legacy_cachefn) == -1) {
+ int errn = errno;
+ if (errn != ENOENT)
+ g_debug ("Failed to unlink '%s': %s", legacy_cachefn, g_strerror (errn));
+ }
+
+ /* make sure the parent directory exists, but if not then create with
+ * the ownership and permissions of the current process */
+ if (!g_file_query_exists (cachedir_file, NULL)) {
+ if (!g_file_make_directory_with_parents (cachedir_file, NULL, error))
+ return FALSE;
+ }
+
+ /* do the move, overwriting existing files and setting the permissions
+ * of the current process (so that should be -rw-r--r--) */
+ if (!g_file_move (file, cachefn_file,
+ G_FILE_COPY_OVERWRITE |
+ G_FILE_COPY_NOFOLLOW_SYMLINKS |
+ G_FILE_COPY_TARGET_DEFAULT_PERMS,
+ NULL, NULL, NULL, error))
+ return FALSE;
+
+ /* verify it is "-rw-r--r--" and the root owns the file */
+ if (g_stat (cachefn, &stat_buf) == 0) {
+ struct passwd *pwd;
+ mode_t expected_mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
+ if ((stat_buf.st_mode & expected_mode) != expected_mode &&
+ g_chmod (cachefn, expected_mode) == -1) {
+ int errn = errno;
+ g_debug ("Failed to chmod '%s': %s", cachefn, g_strerror (errn));
+ }
+
+ /* the file should be owned by the root */
+ pwd = getpwnam ("root");
+ if (pwd != NULL) {
+ if (chown (cachefn, pwd->pw_uid, pwd->pw_gid) == -1) {
+ int errn = errno;
+ g_debug ("Failed to chown on '%s': %s", cachefn, g_strerror (errn));
+ }
+ } else {
+ int errn = errno;
+ g_debug ("Failed to get root info: %s", g_strerror (errn));
+ }
+ } else {
+ int errn = errno;
+ g_debug ("Failed to stat '%s': %s", cachefn, g_strerror (errn));
+ }
+
+ return TRUE;
+}
+
+static gboolean
+gs_install_appstream_check_content_type (GFile *file, GError **error)
+{
+ const gchar *type;
+ g_autoptr(GError) error_local = NULL;
+ g_autoptr(GFileInfo) info = NULL;
+ g_autoptr(GPtrArray) components = NULL;
+ g_autoptr(XbBuilder) builder = xb_builder_new ();
+ g_autoptr(XbBuilderSource) source = xb_builder_source_new ();
+ g_autoptr(XbSilo) silo = NULL;
+
+ /* check is correct type */
+ info = g_file_query_info (file,
+ G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
+ G_FILE_QUERY_INFO_NONE,
+ NULL, error);
+ if (info == NULL)
+ return FALSE;
+ type = g_file_info_get_attribute_string (info, G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE);
+ if (g_strcmp0 (type, "application/gzip") != 0 &&
+ g_strcmp0 (type, "application/xml") != 0) {
+ g_set_error (error,
+ G_IO_ERROR,
+ G_IO_ERROR_INVALID_DATA,
+ "Invalid type %s: ", type);
+ return FALSE;
+ }
+
+ /* check is an AppStream file */
+ if (!xb_builder_source_load_file (source, file,
+ XB_BUILDER_SOURCE_FLAG_NONE,
+ NULL, &error_local)) {
+ g_set_error (error,
+ G_IO_ERROR,
+ G_IO_ERROR_INVALID_DATA,
+ "Failed to import XML: %s", error_local->message);
+ return FALSE;
+ }
+ xb_builder_import_source (builder, source);
+ /* No need to change the thread-default main context because the silo
+ * doesn’t live beyond this function. */
+ silo = xb_builder_compile (builder,
+ XB_BUILDER_COMPILE_FLAG_NONE,
+ NULL, &error_local);
+ if (silo == NULL) {
+ g_set_error (error,
+ G_IO_ERROR,
+ G_IO_ERROR_INVALID_DATA,
+ "Failed to parse XML: %s", error_local->message);
+ return FALSE;
+ }
+ components = xb_silo_query (silo, "components/component", 0, &error_local);
+ if (components == NULL) {
+ if (g_error_matches (error_local, G_IO_ERROR, G_IO_ERROR_NOT_FOUND)) {
+ g_set_error_literal (error,
+ G_IO_ERROR,
+ G_IO_ERROR_INVALID_DATA,
+ "No applications found in the AppStream XML");
+ return FALSE;
+ }
+ g_set_error (error,
+ G_IO_ERROR,
+ G_IO_ERROR_INVALID_DATA,
+ "Failed to query XML: %s", error_local->message);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+int
+main (int argc, char *argv[])
+{
+ g_autoptr(GError) error = NULL;
+ g_autoptr(GFile) file = NULL;
+ g_autoptr(GOptionContext) context = NULL;
+
+ /* setup translations */
+ setlocale (LC_ALL, "");
+ bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
+ bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+ textdomain (GETTEXT_PACKAGE);
+
+ context = g_option_context_new (NULL);
+ /* TRANSLATORS: tool that is used when moving profiles system-wide */
+ g_option_context_set_summary (context, _("GNOME Software AppStream system-wide installer"));
+ if (!g_option_context_parse (context, &argc, &argv, &error)) {
+ g_print ("%s\n", _("Failed to parse command line arguments"));
+ return EXIT_FAILURE;
+ }
+
+ /* check input */
+ if (g_strv_length (argv) != 2) {
+ /* TRANSLATORS: user did not specify a valid filename */
+ g_print ("%s\n", _("You need to specify exactly one filename"));
+ return EXIT_FAILURE;
+ }
+
+ /* check calling process */
+ if (getuid () != 0 || geteuid () != 0) {
+ /* TRANSLATORS: only able to install files as root */
+ g_print ("%s\n", _("This program can only be used by the root user"));
+ return EXIT_FAILURE;
+ }
+
+ /* check content type for file */
+ file = g_file_new_for_path (argv[1]);
+ if (!gs_install_appstream_check_content_type (file, &error)) {
+ /* TRANSLATORS: error details */
+ g_print (_("Failed to validate content type: %s"), error->message);
+ g_print ("\n");
+ return EXIT_FAILURE;
+ }
+
+ /* Set the umask to ensure it is read-only to all users except root. */
+ umask (022);
+
+ /* do the move */
+ if (!gs_install_appstream_move_file (file, &error)) {
+ /* TRANSLATORS: error details */
+ g_print (_("Failed to move: %s"), error->message);
+ g_print ("\n");
+ return EXIT_FAILURE;
+ }
+
+ /* success */