about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--.editorconfig4
-rw-r--r--.github/CODEOWNERS17
-rw-r--r--doc/packages/darwin-builder.section.md12
-rw-r--r--lib/attrsets.nix15
-rw-r--r--lib/lists.nix31
-rw-r--r--lib/strings.nix3
-rw-r--r--lib/trivial.nix19
-rw-r--r--lib/versions.nix2
-rw-r--r--lib/zip-int-bits.nix39
-rw-r--r--maintainers/maintainer-list.nix6
-rw-r--r--maintainers/scripts/bootstrap-files/README.md2
-rwxr-xr-xmaintainers/scripts/kde/collect-licenses.sh31
-rwxr-xr-xmaintainers/scripts/kde/collect-logs.nu11
-rwxr-xr-xmaintainers/scripts/kde/collect-metadata.py36
-rwxr-xr-xmaintainers/scripts/kde/collect-missing-deps.py127
-rwxr-xr-xmaintainers/scripts/kde/generate-sources.py113
-rw-r--r--maintainers/scripts/kde/utils.py185
-rw-r--r--nixos/doc/manual/development/settings-options.section.md28
-rw-r--r--nixos/doc/manual/release-notes/rl-2405.section.md2
-rw-r--r--nixos/lib/systemd-lib.nix16
-rw-r--r--nixos/modules/installer/cd-dvd/installation-cd-graphical-calamares-plasma6.nix46
-rw-r--r--nixos/modules/programs/gnupg.nix1
-rw-r--r--nixos/modules/security/pam.nix39
-rw-r--r--nixos/modules/services/desktops/pipewire/wireplumber.nix4
-rw-r--r--nixos/modules/services/misc/ollama.nix2
-rw-r--r--nixos/modules/services/x11/desktop-managers/default.nix2
-rw-r--r--nixos/modules/services/x11/desktop-managers/plasma5.nix2
-rw-r--r--nixos/modules/services/x11/desktop-managers/plasma6.nix276
-rw-r--r--nixos/modules/services/x11/display-managers/sddm.nix26
-rw-r--r--nixos/modules/system/boot/systemd/coredump.nix2
-rw-r--r--nixos/release.nix6
-rw-r--r--nixos/tests/all-tests.nix1
-rw-r--r--nixos/tests/consul.nix4
-rw-r--r--nixos/tests/incus/container.nix13
-rw-r--r--nixos/tests/plasma6.nix64
-rw-r--r--pkgs/applications/audio/mopidy/spotify.nix6
-rw-r--r--pkgs/applications/audio/squeezelite/default.nix6
-rw-r--r--pkgs/applications/blockchains/clightning/default.nix4
-rw-r--r--pkgs/applications/display-managers/lightdm/gtk-greeter.nix6
-rw-r--r--pkgs/applications/display-managers/sddm/default.nix105
-rw-r--r--pkgs/applications/display-managers/sddm/greeter-path.patch14
-rw-r--r--pkgs/applications/display-managers/sddm/unwrapped.nix86
-rw-r--r--pkgs/applications/editors/vscode/extensions/default.nix4
-rw-r--r--pkgs/applications/emulators/mame/default.nix4
-rw-r--r--pkgs/applications/kde/default.nix4
-rw-r--r--pkgs/applications/kde/gwenview/default.nix (renamed from pkgs/applications/kde/gwenview.nix)4
-rw-r--r--pkgs/applications/kde/gwenview/kimageannotator.patch56
-rw-r--r--pkgs/applications/misc/lutris/fhsenv.nix9
-rw-r--r--pkgs/applications/misc/mako/default.nix4
-rw-r--r--pkgs/applications/misc/rofi-emoji/default.nix4
-rw-r--r--pkgs/applications/misc/syncthingtray/default.nix10
-rw-r--r--pkgs/applications/misc/typioca/default.nix6
-rw-r--r--pkgs/applications/networking/asn/default.nix4
-rw-r--r--pkgs/applications/networking/browsers/chromium/upstream-info.nix14
-rw-r--r--pkgs/applications/networking/browsers/microsoft-edge/default.nix12
-rw-r--r--pkgs/applications/networking/cluster/karmor/default.nix6
-rw-r--r--pkgs/applications/networking/cluster/popeye/default.nix4
-rw-r--r--pkgs/applications/networking/ids/suricata/default.nix4
-rw-r--r--pkgs/applications/networking/instant-messengers/discord/default.nix4
-rw-r--r--pkgs/applications/networking/instant-messengers/element/pin.nix10
-rw-r--r--pkgs/applications/networking/instant-messengers/twitch-tui/default.nix6
-rw-r--r--pkgs/applications/office/moneyplex/default.nix123
-rw-r--r--pkgs/applications/radio/wsjtx/default.nix2
-rw-r--r--pkgs/applications/science/math/eigenmath/default.nix6
-rw-r--r--pkgs/applications/version-management/commitizen/default.nix4
-rw-r--r--pkgs/applications/version-management/git-gone/default.nix6
-rw-r--r--pkgs/applications/version-management/gitoxide/default.nix16
-rw-r--r--pkgs/applications/video/kodi/addons/mediathekview/default.nix8
-rw-r--r--pkgs/applications/video/kodi/addons/youtube/default.nix4
-rw-r--r--pkgs/applications/virtualization/OVMF/default.nix8
-rw-r--r--pkgs/applications/virtualization/lima/bin.nix10
-rw-r--r--pkgs/build-support/substitute/substitute.nix56
-rw-r--r--pkgs/build-support/substitute/substitute.sh8
-rw-r--r--pkgs/build-support/trivial-builders/default.nix13
-rw-r--r--pkgs/by-name/au/audiobookshelf/source.json10
-rwxr-xr-xpkgs/by-name/au/audiobookshelf/update.nu2
-rw-r--r--pkgs/by-name/ca/cargo-make/package.nix (renamed from pkgs/development/tools/rust/cargo-make/default.nix)6
-rw-r--r--pkgs/by-name/fl/flarectl/package.nix4
-rw-r--r--pkgs/by-name/gi/gickup/package.nix6
-rw-r--r--pkgs/by-name/hy/hypridle/package.nix4
-rw-r--r--pkgs/by-name/hy/hyprlang/package.nix13
-rw-r--r--pkgs/by-name/in/incus/client.nix3
-rw-r--r--pkgs/by-name/in/incus/latest.nix13
-rw-r--r--pkgs/by-name/in/incus/lts.nix2
-rw-r--r--pkgs/by-name/in/incus/package.nix17
-rw-r--r--pkgs/by-name/in/incus/unwrapped.nix12
-rw-r--r--pkgs/by-name/li/libappimage/package.nix87
-rw-r--r--pkgs/by-name/oe/oelint-adv/package.nix4
-rw-r--r--pkgs/by-name/pa/patch2pr/package.nix40
-rw-r--r--pkgs/by-name/re/renode-dts2repl/package.nix6
-rw-r--r--pkgs/by-name/re/renode-unstable/package.nix4
-rw-r--r--pkgs/by-name/sn/sn0int/package.nix (renamed from pkgs/tools/security/sn0int/default.nix)10
-rw-r--r--pkgs/by-name/sp/spicetify-cli/package.nix4
-rw-r--r--pkgs/by-name/sw/swaycons/package.nix2
-rw-r--r--pkgs/by-name/ui/uiua/package.nix7
-rwxr-xr-xpkgs/by-name/ui/uiua/update.sh7
-rw-r--r--pkgs/by-name/ux/uxn/package.nix2
-rw-r--r--pkgs/by-name/vl/vlc/package.nix (renamed from pkgs/applications/video/vlc/default.nix)94
-rw-r--r--pkgs/by-name/wi/wit-bindgen/package.nix (renamed from pkgs/tools/misc/wit-bindgen/default.nix)8
-rw-r--r--pkgs/by-name/xc/xclicker/package.nix63
-rw-r--r--pkgs/by-name/xd/xdg-utils-cxx/package.nix30
-rw-r--r--pkgs/data/misc/v2ray-domain-list-community/default.nix4
-rw-r--r--pkgs/development/compilers/factor-lang/factor99.nix4
-rw-r--r--pkgs/development/libraries/accounts-qt/default.nix11
-rw-r--r--pkgs/development/libraries/hunspell/dictionaries.nix6
-rw-r--r--pkgs/development/libraries/imgui/default.nix4
-rw-r--r--pkgs/development/libraries/kcolorpicker/default.nix18
-rw-r--r--pkgs/development/libraries/kimageannotator/default.nix21
-rw-r--r--pkgs/development/libraries/paho-mqtt-c/default.nix8
-rw-r--r--pkgs/development/libraries/paho-mqtt-cpp/default.nix8
-rw-r--r--pkgs/development/libraries/science/math/libamplsolver/default.nix2
-rw-r--r--pkgs/development/libraries/signond/default.nix13
-rw-r--r--pkgs/development/ocaml-modules/caqti/async.nix2
-rw-r--r--pkgs/development/ocaml-modules/caqti/default.nix31
-rw-r--r--pkgs/development/ocaml-modules/caqti/driver-mariadb.nix2
-rw-r--r--pkgs/development/ocaml-modules/caqti/driver-postgresql.nix2
-rw-r--r--pkgs/development/ocaml-modules/caqti/driver-sqlite3.nix8
-rw-r--r--pkgs/development/ocaml-modules/caqti/dynload.nix2
-rw-r--r--pkgs/development/ocaml-modules/caqti/lwt.nix2
-rw-r--r--pkgs/development/ocaml-modules/caqti/type-calendar.nix2
-rw-r--r--pkgs/development/python-modules/cachecontrol/default.nix19
-rw-r--r--pkgs/development/python-modules/dnf-plugins-core/default.nix6
-rw-r--r--pkgs/development/python-modules/home-assistant-chip-clusters/default.nix4
-rw-r--r--pkgs/development/python-modules/home-assistant-chip-core/default.nix8
-rw-r--r--pkgs/development/python-modules/huggingface-hub/default.nix13
-rw-r--r--pkgs/development/python-modules/lxml-stubs/default.nix19
-rw-r--r--pkgs/development/python-modules/monty/default.nix4
-rw-r--r--pkgs/development/python-modules/nats-py/default.nix4
-rw-r--r--pkgs/development/python-modules/nibabel/default.nix4
-rw-r--r--pkgs/development/python-modules/oelint-parser/default.nix4
-rw-r--r--pkgs/development/python-modules/overrides/default.nix13
-rw-r--r--pkgs/development/python-modules/pyenphase/default.nix4
-rw-r--r--pkgs/development/python-modules/pysignalclirestapi/default.nix11
-rw-r--r--pkgs/development/python-modules/pytest-testmon/default.nix4
-rw-r--r--pkgs/development/python-modules/python-idzip/default.nix69
-rw-r--r--pkgs/development/python-modules/python-matter-server/default.nix13
-rw-r--r--pkgs/development/python-modules/rdkit/default.nix4
-rw-r--r--pkgs/development/python-modules/requests-ratelimiter/default.nix6
-rw-r--r--pkgs/development/python-modules/ripser/default.nix4
-rw-r--r--pkgs/development/python-modules/rope/default.nix8
-rw-r--r--pkgs/development/python-modules/simpful/default.nix4
-rw-r--r--pkgs/development/python-modules/slackclient/default.nix4
-rw-r--r--pkgs/development/python-modules/types-docutils/default.nix4
-rw-r--r--pkgs/development/python-modules/unstructured/default.nix4
-rw-r--r--pkgs/development/python-modules/yolink-api/default.nix4
-rw-r--r--pkgs/development/skaware-packages/s6-networking/default.nix4
-rw-r--r--pkgs/development/skaware-packages/s6-rc-man-pages/default.nix2
-rw-r--r--pkgs/development/skaware-packages/skalibs/default.nix4
-rw-r--r--pkgs/development/tools/build-managers/xmake/default.nix4
-rw-r--r--pkgs/development/tools/buildah/default.nix9
-rw-r--r--pkgs/development/tools/continuous-integration/github-runner/default.nix4
-rw-r--r--pkgs/development/tools/misc/binutils/2.38/default.nix2
-rw-r--r--pkgs/development/tools/rbspy/default.nix6
-rw-r--r--pkgs/development/tools/rust/cargo-shuttle/Cargo.lock1510
-rw-r--r--pkgs/development/tools/rust/cargo-shuttle/default.nix5
-rw-r--r--pkgs/development/tools/rust/cargo-tauri/default.nix6
-rw-r--r--pkgs/development/tools/rye/Cargo.lock113
-rw-r--r--pkgs/development/tools/rye/default.nix21
-rw-r--r--pkgs/development/tools/sentry-cli/default.nix10
-rw-r--r--pkgs/development/tools/twilio-cli/default.nix4
-rw-r--r--pkgs/games/shattered-pixel-dungeon/summoning-pixel-dungeon.nix2
-rw-r--r--pkgs/games/unnethack/default.nix5
-rw-r--r--pkgs/kde/default.nix84
-rw-r--r--pkgs/kde/frameworks/attica/default.nix4
-rw-r--r--pkgs/kde/frameworks/baloo/default.nix10
-rw-r--r--pkgs/kde/frameworks/bluez-qt/default.nix9
-rw-r--r--pkgs/kde/frameworks/breeze-icons/default.nix16
-rw-r--r--pkgs/kde/frameworks/default.nix74
-rw-r--r--pkgs/kde/frameworks/extra-cmake-modules/default.nix8
-rw-r--r--pkgs/kde/frameworks/extra-cmake-modules/ecm-hook.sh128
-rw-r--r--pkgs/kde/frameworks/frameworkintegration/default.nix11
-rw-r--r--pkgs/kde/frameworks/kapidox/default.nix4
-rw-r--r--pkgs/kde/frameworks/karchive/default.nix12
-rw-r--r--pkgs/kde/frameworks/kauth/default.nix13
-rw-r--r--pkgs/kde/frameworks/kauth/fix-paths.patch17
-rw-r--r--pkgs/kde/frameworks/kbookmarks/default.nix9
-rw-r--r--pkgs/kde/frameworks/kcalendarcore/default.nix9
-rw-r--r--pkgs/kde/frameworks/kcmutils/default.nix9
-rw-r--r--pkgs/kde/frameworks/kcodecs/default.nix11
-rw-r--r--pkgs/kde/frameworks/kcolorscheme/default.nix4
-rw-r--r--pkgs/kde/frameworks/kcompletion/default.nix9
-rw-r--r--pkgs/kde/frameworks/kconfig/default.nix11
-rw-r--r--pkgs/kde/frameworks/kconfigwidgets/default.nix9
-rw-r--r--pkgs/kde/frameworks/kcontacts/default.nix4
-rw-r--r--pkgs/kde/frameworks/kcoreaddons/default.nix12
-rw-r--r--pkgs/kde/frameworks/kcrash/default.nix4
-rw-r--r--pkgs/kde/frameworks/kdav/default.nix4
-rw-r--r--pkgs/kde/frameworks/kdbusaddons/default.nix9
-rw-r--r--pkgs/kde/frameworks/kdeclarative/default.nix11
-rw-r--r--pkgs/kde/frameworks/kded/default.nix4
-rw-r--r--pkgs/kde/frameworks/kdesu/default.nix7
-rw-r--r--pkgs/kde/frameworks/kdesu/kdesu-search-for-wrapped-daemon-first.patch38
-rw-r--r--pkgs/kde/frameworks/kdnssd/default.nix11
-rw-r--r--pkgs/kde/frameworks/kdoctools/default.nix18
-rw-r--r--pkgs/kde/frameworks/kfilemetadata/cmake-install-paths.patch14
-rw-r--r--pkgs/kde/frameworks/kfilemetadata/default.nix21
-rw-r--r--pkgs/kde/frameworks/kglobalaccel/default.nix9
-rw-r--r--pkgs/kde/frameworks/kguiaddons/default.nix12
-rw-r--r--pkgs/kde/frameworks/kholidays/default.nix11
-rw-r--r--pkgs/kde/frameworks/ki18n/default.nix9
-rw-r--r--pkgs/kde/frameworks/kiconthemes/default.nix15
-rw-r--r--pkgs/kde/frameworks/kidletime/default.nix13
-rw-r--r--pkgs/kde/frameworks/kimageformats/default.nix16
-rw-r--r--pkgs/kde/frameworks/kio/0001-Remove-impure-smbd-search-path.patch25
-rw-r--r--pkgs/kde/frameworks/kio/default.nix18
-rw-r--r--pkgs/kde/frameworks/kirigami/default.nix14
-rw-r--r--pkgs/kde/frameworks/kitemmodels/default.nix9
-rw-r--r--pkgs/kde/frameworks/kitemviews/default.nix9
-rw-r--r--pkgs/kde/frameworks/kjobwidgets/default.nix9
-rw-r--r--pkgs/kde/frameworks/knewstuff/default.nix16
-rw-r--r--pkgs/kde/frameworks/knewstuff/delay-resolving-knsrcdir.patch14
-rw-r--r--pkgs/kde/frameworks/knotifications/default.nix12
-rw-r--r--pkgs/kde/frameworks/knotifyconfig/default.nix9
-rw-r--r--pkgs/kde/frameworks/kpackage/default.nix8
-rw-r--r--pkgs/kde/frameworks/kpackage/follow-symlinks.patch13
-rw-r--r--pkgs/kde/frameworks/kparts/default.nix4
-rw-r--r--pkgs/kde/frameworks/kpeople/default.nix9
-rw-r--r--pkgs/kde/frameworks/kplotting/default.nix9
-rw-r--r--pkgs/kde/frameworks/kpty/default.nix4
-rw-r--r--pkgs/kde/frameworks/kquickcharts/default.nix9
-rw-r--r--pkgs/kde/frameworks/krunner/default.nix9
-rw-r--r--pkgs/kde/frameworks/kservice/default.nix10
-rw-r--r--pkgs/kde/frameworks/kservice/qdiriterator-follow-symlinks.patch13
-rw-r--r--pkgs/kde/frameworks/kstatusnotifieritem/default.nix9
-rw-r--r--pkgs/kde/frameworks/ksvg/default.nix10
-rw-r--r--pkgs/kde/frameworks/ktexteditor/default.nix11
-rw-r--r--pkgs/kde/frameworks/ktexttemplate/default.nix9
-rw-r--r--pkgs/kde/frameworks/ktextwidgets/default.nix13
-rw-r--r--pkgs/kde/frameworks/kunitconversion/default.nix4
-rw-r--r--pkgs/kde/frameworks/kuserfeedback/default.nix12
-rw-r--r--pkgs/kde/frameworks/kwallet/default.nix10
-rw-r--r--pkgs/kde/frameworks/kwidgetsaddons/default.nix9
-rw-r--r--pkgs/kde/frameworks/kwindowsystem/default.nix14
-rw-r--r--pkgs/kde/frameworks/kxmlgui/default.nix9
-rw-r--r--pkgs/kde/frameworks/modemmanager-qt/default.nix11
-rw-r--r--pkgs/kde/frameworks/networkmanager-qt/default.nix13
-rw-r--r--pkgs/kde/frameworks/prison/default.nix12
-rw-r--r--pkgs/kde/frameworks/purpose/default.nix13
-rw-r--r--pkgs/kde/frameworks/qqc2-desktop-style/default.nix11
-rw-r--r--pkgs/kde/frameworks/solid/default.nix16
-rw-r--r--pkgs/kde/frameworks/solid/fix-search-path.patch17
-rw-r--r--pkgs/kde/frameworks/sonnet/default.nix14
-rw-r--r--pkgs/kde/frameworks/syndication/default.nix4
-rw-r--r--pkgs/kde/frameworks/syntax-highlighting/default.nix12
-rw-r--r--pkgs/kde/frameworks/threadweaver/default.nix4
-rw-r--r--pkgs/kde/gear/akonadi-calendar-tools/default.nix4
-rw-r--r--pkgs/kde/gear/akonadi-calendar/default.nix4
-rw-r--r--pkgs/kde/gear/akonadi-contacts/default.nix4
-rw-r--r--pkgs/kde/gear/akonadi-import-wizard/default.nix4
-rw-r--r--pkgs/kde/gear/akonadi-mime/default.nix9
-rw-r--r--pkgs/kde/gear/akonadi-notes/default.nix4
-rw-r--r--pkgs/kde/gear/akonadi-search/default.nix33
-rw-r--r--pkgs/kde/gear/akonadi/default.nix16
-rw-r--r--pkgs/kde/gear/akonadiconsole/default.nix9
-rw-r--r--pkgs/kde/gear/akregator/default.nix9
-rw-r--r--pkgs/kde/gear/alligator/default.nix4
-rw-r--r--pkgs/kde/gear/analitza/default.nix14
-rw-r--r--pkgs/kde/gear/angelfish/default.nix32
-rw-r--r--pkgs/kde/gear/arianna/default.nix21
-rw-r--r--pkgs/kde/gear/ark/default.nix10
-rw-r--r--pkgs/kde/gear/artikulate/default.nix11
-rw-r--r--pkgs/kde/gear/audiocd-kio/default.nix24
-rw-r--r--pkgs/kde/gear/audiocd-kio/encoder-paths.patch35
-rw-r--r--pkgs/kde/gear/audiotube/default.nix53
-rw-r--r--pkgs/kde/gear/baloo-widgets/default.nix4
-rw-r--r--pkgs/kde/gear/blinken/default.nix9
-rw-r--r--pkgs/kde/gear/bomber/default.nix9
-rw-r--r--pkgs/kde/gear/bovo/default.nix9
-rw-r--r--pkgs/kde/gear/calendarsupport/default.nix4
-rw-r--r--pkgs/kde/gear/calindori/default.nix15
-rw-r--r--pkgs/kde/gear/cantor/default.nix11
-rw-r--r--pkgs/kde/gear/cervisia/default.nix6
-rw-r--r--pkgs/kde/gear/colord-kde/default.nix12
-rw-r--r--pkgs/kde/gear/default.nix248
-rw-r--r--pkgs/kde/gear/dolphin-plugins/default.nix4
-rw-r--r--pkgs/kde/gear/dolphin/default.nix4
-rw-r--r--pkgs/kde/gear/dragon/default.nix4
-rw-r--r--pkgs/kde/gear/elisa/default.nix10
-rw-r--r--pkgs/kde/gear/eventviews/default.nix4
-rw-r--r--pkgs/kde/gear/falkon/default.nix14
-rw-r--r--pkgs/kde/gear/ffmpegthumbs/default.nix9
-rw-r--r--pkgs/kde/gear/filelight/default.nix4
-rw-r--r--pkgs/kde/gear/ghostwriter/default.nix17
-rw-r--r--pkgs/kde/gear/granatier/default.nix11
-rw-r--r--pkgs/kde/gear/grantlee-editor/default.nix9
-rw-r--r--pkgs/kde/gear/grantleetheme/default.nix4
-rw-r--r--pkgs/kde/gear/gwenview/default.nix32
-rw-r--r--pkgs/kde/gear/incidenceeditor/default.nix4
-rw-r--r--pkgs/kde/gear/isoimagewriter/default.nix9
-rw-r--r--pkgs/kde/gear/itinerary/default.nix17
-rw-r--r--pkgs/kde/gear/itinerary/optional-runtime-dependencies.patch15
-rw-r--r--pkgs/kde/gear/juk/default.nix10
-rw-r--r--pkgs/kde/gear/k3b/default.nix53
-rw-r--r--pkgs/kde/gear/kaccounts-integration/default.nix9
-rw-r--r--pkgs/kde/gear/kaccounts-providers/default.nix12
-rw-r--r--pkgs/kde/gear/kaddressbook/default.nix4
-rw-r--r--pkgs/kde/gear/kajongg/default.nix12
-rw-r--r--pkgs/kde/gear/kalarm/default.nix4
-rw-r--r--pkgs/kde/gear/kalgebra/default.nix12
-rw-r--r--pkgs/kde/gear/kalk/default.nix25
-rw-r--r--pkgs/kde/gear/kalzium/default.nix16
-rw-r--r--pkgs/kde/gear/kamera/default.nix11
-rw-r--r--pkgs/kde/gear/kamoso/default.nix6
-rw-r--r--pkgs/kde/gear/kanagram/default.nix9
-rw-r--r--pkgs/kde/gear/kapman/default.nix11
-rw-r--r--pkgs/kde/gear/kapptemplate/default.nix4
-rw-r--r--pkgs/kde/gear/kasts/default.nix21
-rw-r--r--pkgs/kde/gear/kate/default.nix4
-rw-r--r--pkgs/kde/gear/katomic/default.nix4
-rw-r--r--pkgs/kde/gear/kbackup/default.nix12
-rw-r--r--pkgs/kde/gear/kblackbox/default.nix9
-rw-r--r--pkgs/kde/gear/kblocks/default.nix9
-rw-r--r--pkgs/kde/gear/kbounce/default.nix9
-rw-r--r--pkgs/kde/gear/kbreakout/default.nix9
-rw-r--r--pkgs/kde/gear/kbruch/default.nix4
-rw-r--r--pkgs/kde/gear/kcachegrind/default.nix9
-rw-r--r--pkgs/kde/gear/kcalc/default.nix13
-rw-r--r--pkgs/kde/gear/kcalutils/default.nix4
-rw-r--r--pkgs/kde/gear/kcharselect/default.nix4
-rw-r--r--pkgs/kde/gear/kclock/default.nix10
-rw-r--r--pkgs/kde/gear/kcolorchooser/default.nix4
-rw-r--r--pkgs/kde/gear/kcron/default.nix4
-rw-r--r--pkgs/kde/gear/kde-dev-scripts/default.nix4
-rw-r--r--pkgs/kde/gear/kde-dev-utils/default.nix9
-rw-r--r--pkgs/kde/gear/kde-inotify-survey/default.nix4
-rw-r--r--pkgs/kde/gear/kdebugsettings/default.nix4
-rw-r--r--pkgs/kde/gear/kdeconnect-kde/default.nix20
-rw-r--r--pkgs/kde/gear/kdeedu-data/default.nix4
-rw-r--r--pkgs/kde/gear/kdegraphics-mobipocket/default.nix9
-rw-r--r--pkgs/kde/gear/kdegraphics-thumbnailers/default.nix17
-rw-r--r--pkgs/kde/gear/kdegraphics-thumbnailers/gs-paths.patch22
-rw-r--r--pkgs/kde/gear/kdenetwork-filesharing/default.nix14
-rw-r--r--pkgs/kde/gear/kdenetwork-filesharing/smbd-path.patch14
-rw-r--r--pkgs/kde/gear/kdenlive/default.nix40
-rw-r--r--pkgs/kde/gear/kdenlive/dependency-paths.patch46
-rw-r--r--pkgs/kde/gear/kdepim-addons/default.nix35
-rw-r--r--pkgs/kde/gear/kdepim-runtime/default.nix15
-rw-r--r--pkgs/kde/gear/kdesdk-kio/default.nix4
-rw-r--r--pkgs/kde/gear/kdesdk-thumbnailers/default.nix4
-rw-r--r--pkgs/kde/gear/kdev-php/default.nix6
-rw-r--r--pkgs/kde/gear/kdev-python/default.nix6
-rw-r--r--pkgs/kde/gear/kdevelop/default.nix11
-rw-r--r--pkgs/kde/gear/kdf/default.nix4
-rw-r--r--pkgs/kde/gear/kdialog/default.nix4
-rw-r--r--pkgs/kde/gear/kdiamond/default.nix9
-rw-r--r--pkgs/kde/gear/keditbookmarks/default.nix4
-rw-r--r--pkgs/kde/gear/keysmith/default.nix12
-rw-r--r--pkgs/kde/gear/kfind/default.nix9
-rw-r--r--pkgs/kde/gear/kfourinline/default.nix9
-rw-r--r--pkgs/kde/gear/kgeography/default.nix4
-rw-r--r--pkgs/kde/gear/kget/default.nix10
-rw-r--r--pkgs/kde/gear/kgoldrunner/default.nix9
-rw-r--r--pkgs/kde/gear/kgpg/default.nix11
-rw-r--r--pkgs/kde/gear/khangman/default.nix9
-rw-r--r--pkgs/kde/gear/khealthcertificate/default.nix9
-rw-r--r--pkgs/kde/gear/khelpcenter/default.nix10
-rw-r--r--pkgs/kde/gear/kidentitymanagement/default.nix9
-rw-r--r--pkgs/kde/gear/kig/default.nix6
-rw-r--r--pkgs/kde/gear/kigo/default.nix11
-rw-r--r--pkgs/kde/gear/killbots/default.nix9
-rw-r--r--pkgs/kde/gear/kimagemapeditor/default.nix9
-rw-r--r--pkgs/kde/gear/kimap/default.nix9
-rw-r--r--pkgs/kde/gear/kio-admin/default.nix4
-rw-r--r--pkgs/kde/gear/kio-extras-kf5/default.nix62
-rw-r--r--pkgs/kde/gear/kio-extras/default.nix45
-rw-r--r--pkgs/kde/gear/kio-gdrive/default.nix4
-rw-r--r--pkgs/kde/gear/kio-zeroconf/default.nix4
-rw-r--r--pkgs/kde/gear/kipi-plugins/default.nix6
-rw-r--r--pkgs/kde/gear/kirigami-gallery/default.nix11
-rw-r--r--pkgs/kde/gear/kiriki/default.nix4
-rw-r--r--pkgs/kde/gear/kiten/default.nix4
-rw-r--r--pkgs/kde/gear/kitinerary/default.nix21
-rw-r--r--pkgs/kde/gear/kjournald/default.nix12
-rw-r--r--pkgs/kde/gear/kjumpingcube/default.nix9
-rw-r--r--pkgs/kde/gear/kldap/default.nix10
-rw-r--r--pkgs/kde/gear/kleopatra/default.nix11
-rw-r--r--pkgs/kde/gear/klettres/default.nix9
-rw-r--r--pkgs/kde/gear/klickety/default.nix4
-rw-r--r--pkgs/kde/gear/klines/default.nix4
-rw-r--r--pkgs/kde/gear/kmag/default.nix4
-rw-r--r--pkgs/kde/gear/kmahjongg/default.nix13
-rw-r--r--pkgs/kde/gear/kmail-account-wizard/default.nix4
-rw-r--r--pkgs/kde/gear/kmail/default.nix4
-rw-r--r--pkgs/kde/gear/kmailtransport/default.nix4
-rw-r--r--pkgs/kde/gear/kmbox/default.nix4
-rw-r--r--pkgs/kde/gear/kmime/default.nix4
-rw-r--r--pkgs/kde/gear/kmines/default.nix4
-rw-r--r--pkgs/kde/gear/kmix/default.nix6
-rw-r--r--pkgs/kde/gear/kmousetool/default.nix10
-rw-r--r--pkgs/kde/gear/kmouth/default.nix9
-rw-r--r--pkgs/kde/gear/kmplot/default.nix9
-rw-r--r--pkgs/kde/gear/knavalbattle/default.nix4
-rw-r--r--pkgs/kde/gear/knetwalk/default.nix9
-rw-r--r--pkgs/kde/gear/knights/default.nix12
-rw-r--r--pkgs/kde/gear/knotes/default.nix4
-rw-r--r--pkgs/kde/gear/koko/default.nix46
-rw-r--r--pkgs/kde/gear/kolf/default.nix4
-rw-r--r--pkgs/kde/gear/kollision/default.nix4
-rw-r--r--pkgs/kde/gear/kolourpaint/default.nix4
-rw-r--r--pkgs/kde/gear/kompare/default.nix4
-rw-r--r--pkgs/kde/gear/kongress/default.nix9
-rw-r--r--pkgs/kde/gear/konqueror/default.nix14
-rw-r--r--pkgs/kde/gear/konquest/default.nix10
-rw-r--r--pkgs/kde/gear/konsole/default.nix10
-rw-r--r--pkgs/kde/gear/kontact/default.nix23
-rw-r--r--pkgs/kde/gear/kontactinterface/default.nix4
-rw-r--r--pkgs/kde/gear/kontrast/default.nix10
-rw-r--r--pkgs/kde/gear/konversation/default.nix11
-rw-r--r--pkgs/kde/gear/kopeninghours/default.nix20
-rw-r--r--pkgs/kde/gear/korganizer/default.nix9
-rw-r--r--pkgs/kde/gear/kosmindoormap/default.nix10
-rw-r--r--pkgs/kde/gear/kpat/default.nix21
-rw-r--r--pkgs/kde/gear/kpimtextedit/default.nix9
-rw-r--r--pkgs/kde/gear/kpkpass/default.nix9
-rw-r--r--pkgs/kde/gear/kpmcore/default.nix74
-rw-r--r--pkgs/kde/gear/kpublictransport/default.nix11
-rw-r--r--pkgs/kde/gear/kqtquickcharts/default.nix6
-rw-r--r--pkgs/kde/gear/krdc/default.nix11
-rw-r--r--pkgs/kde/gear/krecorder/default.nix9
-rw-r--r--pkgs/kde/gear/kreversi/default.nix9
-rw-r--r--pkgs/kde/gear/krfb/default.nix15
-rw-r--r--pkgs/kde/gear/kross-interpreters/default.nix11
-rw-r--r--pkgs/kde/gear/kruler/default.nix4
-rw-r--r--pkgs/kde/gear/ksanecore/default.nix9
-rw-r--r--pkgs/kde/gear/kshisen/default.nix4
-rw-r--r--pkgs/kde/gear/ksirk/default.nix9
-rw-r--r--pkgs/kde/gear/ksmtp/default.nix10
-rw-r--r--pkgs/kde/gear/ksnakeduel/default.nix9
-rw-r--r--pkgs/kde/gear/kspaceduel/default.nix9
-rw-r--r--pkgs/kde/gear/ksquares/default.nix4
-rw-r--r--pkgs/kde/gear/ksudoku/default.nix9
-rw-r--r--pkgs/kde/gear/ksystemlog/default.nix12
-rw-r--r--pkgs/kde/gear/kteatime/default.nix4
-rw-r--r--pkgs/kde/gear/ktimer/default.nix9
-rw-r--r--pkgs/kde/gear/ktnef/default.nix4
-rw-r--r--pkgs/kde/gear/ktorrent/default.nix11
-rw-r--r--pkgs/kde/gear/ktouch/default.nix6
-rw-r--r--pkgs/kde/gear/ktrip/default.nix4
-rw-r--r--pkgs/kde/gear/ktuberling/default.nix9
-rw-r--r--pkgs/kde/gear/kturtle/default.nix9
-rw-r--r--pkgs/kde/gear/kubrick/default.nix10
-rw-r--r--pkgs/kde/gear/kwalletmanager/default.nix4
-rw-r--r--pkgs/kde/gear/kwave/default.nix6
-rw-r--r--pkgs/kde/gear/kweather/default.nix12
-rw-r--r--pkgs/kde/gear/kwordquiz/default.nix15
-rw-r--r--pkgs/kde/gear/libgravatar/default.nix4
-rw-r--r--pkgs/kde/gear/libkcddb/default.nix9
-rw-r--r--pkgs/kde/gear/libkcompactdisc/default.nix9
-rw-r--r--pkgs/kde/gear/libkdcraw/default.nix11
-rw-r--r--pkgs/kde/gear/libkdegames/default.nix15
-rw-r--r--pkgs/kde/gear/libkdepim/default.nix9
-rw-r--r--pkgs/kde/gear/libkeduvocdocument/default.nix4
-rw-r--r--pkgs/kde/gear/libkexiv2/default.nix12
-rw-r--r--pkgs/kde/gear/libkgapi/default.nix10
-rw-r--r--pkgs/kde/gear/libkipi/default.nix6
-rw-r--r--pkgs/kde/gear/libkleo/default.nix12
-rw-r--r--pkgs/kde/gear/libkmahjongg/default.nix12
-rw-r--r--pkgs/kde/gear/libkomparediff2/default.nix9
-rw-r--r--pkgs/kde/gear/libksane/default.nix4
-rw-r--r--pkgs/kde/gear/libksieve/default.nix10
-rw-r--r--pkgs/kde/gear/libktorrent/default.nix15
-rw-r--r--pkgs/kde/gear/lokalize/default.nix6
-rw-r--r--pkgs/kde/gear/lskat/default.nix9
-rw-r--r--pkgs/kde/gear/mailcommon/default.nix10
-rw-r--r--pkgs/kde/gear/mailimporter/default.nix4
-rw-r--r--pkgs/kde/gear/marble/default.nix6
-rw-r--r--pkgs/kde/gear/markdownpart/default.nix4
-rw-r--r--pkgs/kde/gear/mbox-importer/default.nix4
-rw-r--r--pkgs/kde/gear/merkuro/default.nix10
-rw-r--r--pkgs/kde/gear/messagelib/default.nix9
-rw-r--r--pkgs/kde/gear/mimetreeparser/default.nix11
-rw-r--r--pkgs/kde/gear/minuet/default.nix11
-rw-r--r--pkgs/kde/gear/neochat/default.nix11
-rw-r--r--pkgs/kde/gear/okular/default.nix30
-rw-r--r--pkgs/kde/gear/palapeli/default.nix11
-rw-r--r--pkgs/kde/gear/parley/default.nix11
-rw-r--r--pkgs/kde/gear/partitionmanager/default.nix9
-rw-r--r--pkgs/kde/gear/picmi/default.nix9
-rw-r--r--pkgs/kde/gear/pim-data-exporter/default.nix4
-rw-r--r--pkgs/kde/gear/pim-sieve-editor/default.nix4
-rw-r--r--pkgs/kde/gear/pimcommon/default.nix9
-rw-r--r--pkgs/kde/gear/plasmatube/default.nix15
-rw-r--r--pkgs/kde/gear/poxml/default.nix6
-rw-r--r--pkgs/kde/gear/qmlkonsole/default.nix9
-rw-r--r--pkgs/kde/gear/rocs/default.nix11
-rw-r--r--pkgs/kde/gear/signon-kwallet-extension/default.nix16
-rw-r--r--pkgs/kde/gear/skanlite/default.nix9
-rw-r--r--pkgs/kde/gear/skanpage/default.nix14
-rw-r--r--pkgs/kde/gear/spectacle/default.nix10
-rw-r--r--pkgs/kde/gear/step/default.nix16
-rw-r--r--pkgs/kde/gear/svgpart/default.nix9
-rw-r--r--pkgs/kde/gear/sweeper/default.nix9
-rw-r--r--pkgs/kde/gear/telly-skout/default.nix4
-rw-r--r--pkgs/kde/gear/tokodon/default.nix17
-rw-r--r--pkgs/kde/gear/umbrello/default.nix6
-rw-r--r--pkgs/kde/gear/yakuake/default.nix9
-rw-r--r--pkgs/kde/gear/zanshin/default.nix9
-rw-r--r--pkgs/kde/generated/dependencies.json6133
-rw-r--r--pkgs/kde/generated/licenses.json2873
-rw-r--r--pkgs/kde/generated/projects.json8078
-rw-r--r--pkgs/kde/generated/sources/frameworks.json362
-rw-r--r--pkgs/kde/generated/sources/gear.json1232
-rw-r--r--pkgs/kde/generated/sources/plasma.json317
-rw-r--r--pkgs/kde/lib/mk-kde-derivation.nix123
-rw-r--r--pkgs/kde/lib/move-dev-hook.sh8
-rw-r--r--pkgs/kde/misc/alpaka/default.nix25
-rw-r--r--pkgs/kde/misc/kdiagram/default.nix20
-rw-r--r--pkgs/kde/misc/kdsoap-ws-discovery-client/default.nix19
-rw-r--r--pkgs/kde/misc/kio-fuse/default.nix21
-rw-r--r--pkgs/kde/misc/kirigami-addons/default.nix31
-rw-r--r--pkgs/kde/misc/ktextaddons/default.nix27
-rw-r--r--pkgs/kde/misc/kunifiedpush/default.nix24
-rw-r--r--pkgs/kde/misc/kweathercore/default.nix19
-rw-r--r--pkgs/kde/misc/mpvqt/default.nix23
-rw-r--r--pkgs/kde/misc/oxygen-icons/default.nix18
-rw-r--r--pkgs/kde/misc/phonon-vlc/default.nix23
-rw-r--r--pkgs/kde/misc/phonon/default.nix36
-rw-r--r--pkgs/kde/misc/polkit-qt-1/default.nix24
-rw-r--r--pkgs/kde/misc/polkit-qt-1/full-paths.patch184
-rw-r--r--pkgs/kde/misc/pulseaudio-qt/default.nix21
-rw-r--r--pkgs/kde/plasma/bluedevil/default.nix9
-rw-r--r--pkgs/kde/plasma/breeze-grub/default.nix17
-rw-r--r--pkgs/kde/plasma/breeze-gtk/0001-fix-add-executable-bit.patch25
-rw-r--r--pkgs/kde/plasma/breeze-gtk/default.nix14
-rw-r--r--pkgs/kde/plasma/breeze-plymouth/default.nix52
-rw-r--r--pkgs/kde/plasma/breeze-plymouth/install-paths.patch19
-rw-r--r--pkgs/kde/plasma/breeze/default.nix44
-rw-r--r--pkgs/kde/plasma/default.nix65
-rw-r--r--pkgs/kde/plasma/discover/default.nix14
-rw-r--r--pkgs/kde/plasma/drkonqi/default.nix41
-rw-r--r--pkgs/kde/plasma/drkonqi/gdb-path.patch28
-rw-r--r--pkgs/kde/plasma/flatpak-kcm/default.nix12
-rw-r--r--pkgs/kde/plasma/kactivitymanagerd/default.nix10
-rw-r--r--pkgs/kde/plasma/kde-cli-tools/default.nix9
-rw-r--r--pkgs/kde/plasma/kde-gtk-config/0001-gsettings-schemas-path.patch21
-rw-r--r--pkgs/kde/plasma/kde-gtk-config/default.nix24
-rw-r--r--pkgs/kde/plasma/kdecoration/default.nix4
-rw-r--r--pkgs/kde/plasma/kdeplasma-addons/default.nix9
-rw-r--r--pkgs/kde/plasma/kgamma/default.nix9
-rw-r--r--pkgs/kde/plasma/kglobalacceld/default.nix4
-rw-r--r--pkgs/kde/plasma/kinfocenter/0001-tool-paths.patch51
-rw-r--r--pkgs/kde/plasma/kinfocenter/default.nix29
-rw-r--r--pkgs/kde/plasma/kmenuedit/default.nix4
-rw-r--r--pkgs/kde/plasma/kpipewire/default.nix15
-rw-r--r--pkgs/kde/plasma/kscreen/default.nix15
-rw-r--r--pkgs/kde/plasma/kscreenlocker/default.nix10
-rw-r--r--pkgs/kde/plasma/ksshaskpass/default.nix4
-rw-r--r--pkgs/kde/plasma/ksystemstats/default.nix16
-rw-r--r--pkgs/kde/plasma/kwallet-pam/default.nix16
-rw-r--r--pkgs/kde/plasma/kwayland-integration/default.nix6
-rw-r--r--pkgs/kde/plasma/kwayland/default.nix12
-rw-r--r--pkgs/kde/plasma/kwin/0001-NixOS-Unwrap-executable-name-for-.desktop-search.patch114
-rw-r--r--pkgs/kde/plasma/kwin/0001-follow-symlinks.patch25
-rw-r--r--pkgs/kde/plasma/kwin/0003-plugins-qpa-allow-using-nixos-wrapper.patch26
-rw-r--r--pkgs/kde/plasma/kwin/default.nix54
-rw-r--r--pkgs/kde/plasma/kwrited/default.nix4
-rw-r--r--pkgs/kde/plasma/layer-shell-qt/default.nix13
-rw-r--r--pkgs/kde/plasma/libkscreen/default.nix12
-rw-r--r--pkgs/kde/plasma/libksysguard/default.nix14
-rw-r--r--pkgs/kde/plasma/libplasma/default.nix13
-rw-r--r--pkgs/kde/plasma/lightdm-greeter-kde/default.nix4
-rw-r--r--pkgs/kde/plasma/milou/default.nix4
-rw-r--r--pkgs/kde/plasma/ocean-sound-theme/default.nix4
-rw-r--r--pkgs/kde/plasma/oxygen-sounds/default.nix4
-rw-r--r--pkgs/kde/plasma/oxygen/default.nix6
-rw-r--r--pkgs/kde/plasma/plasma-activities-stats/default.nix4
-rw-r--r--pkgs/kde/plasma/plasma-activities/default.nix10
-rw-r--r--pkgs/kde/plasma/plasma-browser-integration/default.nix4
-rw-r--r--pkgs/kde/plasma/plasma-desktop/default.nix67
-rw-r--r--pkgs/kde/plasma/plasma-desktop/hwclock-path.patch24
-rw-r--r--pkgs/kde/plasma/plasma-desktop/kcm-access.patch13
-rw-r--r--pkgs/kde/plasma/plasma-desktop/no-discover-shortcut.patch13
-rw-r--r--pkgs/kde/plasma/plasma-desktop/tzdir.patch18
-rw-r--r--pkgs/kde/plasma/plasma-disks/default.nix16
-rw-r--r--pkgs/kde/plasma/plasma-disks/smartctl-path.patch13
-rw-r--r--pkgs/kde/plasma/plasma-firewall/default.nix4
-rw-r--r--pkgs/kde/plasma/plasma-integration/default.nix67
-rw-r--r--pkgs/kde/plasma/plasma-integration/qml-path.patch12
-rw-r--r--pkgs/kde/plasma/plasma-mobile/default.nix11
-rw-r--r--pkgs/kde/plasma/plasma-nano/default.nix9
-rw-r--r--pkgs/kde/plasma/plasma-nm/0002-openvpn-binary-path.patch13
-rw-r--r--pkgs/kde/plasma/plasma-nm/default.nix26
-rw-r--r--pkgs/kde/plasma/plasma-pa/default.nix12
-rw-r--r--pkgs/kde/plasma/plasma-sdk/default.nix9
-rw-r--r--pkgs/kde/plasma/plasma-systemmonitor/default.nix4
-rw-r--r--pkgs/kde/plasma/plasma-thunderbolt/default.nix4
-rw-r--r--pkgs/kde/plasma/plasma-vault/0001-encfs-path.patch31
-rw-r--r--pkgs/kde/plasma/plasma-vault/0002-cryfs-path.patch25
-rw-r--r--pkgs/kde/plasma/plasma-vault/0003-fusermount-path.patch25
-rw-r--r--pkgs/kde/plasma/plasma-vault/0004-gocryptfs-path.patch13
-rw-r--r--pkgs/kde/plasma/plasma-vault/default.nix29
-rw-r--r--pkgs/kde/plasma/plasma-welcome/default.nix10
-rw-r--r--pkgs/kde/plasma/plasma-workspace-wallpapers/default.nix9
-rw-r--r--pkgs/kde/plasma/plasma-workspace/default.nix54
-rw-r--r--pkgs/kde/plasma/plasma-workspace/tool-paths.patch68
-rw-r--r--pkgs/kde/plasma/plasma-workspace/wallpaper-paths.patch9
-rw-r--r--pkgs/kde/plasma/plasma5support/default.nix4
-rw-r--r--pkgs/kde/plasma/plymouth-kcm/default.nix11
-rw-r--r--pkgs/kde/plasma/polkit-kde-agent-1/default.nix9
-rw-r--r--pkgs/kde/plasma/powerdevil/default.nix11
-rw-r--r--pkgs/kde/plasma/print-manager/default.nix10
-rw-r--r--pkgs/kde/plasma/qqc2-breeze-style/default.nix4
-rw-r--r--pkgs/kde/plasma/sddm-kcm/default.nix4
-rw-r--r--pkgs/kde/plasma/systemsettings/default.nix4
-rw-r--r--pkgs/kde/plasma/wacomtablet/default.nix12
-rw-r--r--pkgs/kde/plasma/xdg-desktop-portal-kde/default.nix14
-rw-r--r--pkgs/misc/cups/drivers/mfcj470dwcupswrapper/default.nix35
-rw-r--r--pkgs/misc/cups/drivers/mfcj6510dwcupswrapper/default.nix35
-rw-r--r--pkgs/os-specific/darwin/hexfiend/default.nix13
-rw-r--r--pkgs/os-specific/linux/openvswitch/default.nix4
-rw-r--r--pkgs/os-specific/linux/uhk-agent/default.nix4
-rw-r--r--pkgs/pkgs-lib/formats.nix121
-rw-r--r--pkgs/pkgs-lib/tests/formats.nix251
-rw-r--r--pkgs/servers/home-assistant/component-packages.nix2
-rw-r--r--pkgs/servers/home-assistant/default.nix15
-rw-r--r--pkgs/servers/home-assistant/stubs.nix4
-rw-r--r--pkgs/servers/mail/rspamd/default.nix4
-rw-r--r--pkgs/servers/monitoring/prometheus/alertmanager.nix6
-rw-r--r--pkgs/servers/sql/postgresql/ext/pgroonga.nix4
-rw-r--r--pkgs/shells/nushell/default.nix10
-rw-r--r--pkgs/shells/nushell/plugins/formats.nix2
-rw-r--r--pkgs/shells/nushell/plugins/gstat.nix2
-rw-r--r--pkgs/shells/nushell/plugins/query.nix2
-rw-r--r--pkgs/test/default.nix2
-rw-r--r--pkgs/test/substitute/default.nix96
-rw-r--r--pkgs/tools/admin/lxd/wrapper.nix11
-rw-r--r--pkgs/tools/graphics/asymptote/default.nix4
-rw-r--r--pkgs/tools/misc/audible-cli/default.nix1
-rw-r--r--pkgs/tools/misc/ksnip/default.nix13
-rw-r--r--pkgs/tools/misc/mise/default.nix6
-rw-r--r--pkgs/tools/misc/nautilus-open-any-terminal/default.nix6
-rw-r--r--pkgs/tools/misc/parallel/default.nix4
-rw-r--r--pkgs/tools/misc/rauc/default.nix4
-rw-r--r--pkgs/tools/networking/muffet/default.nix6
-rw-r--r--pkgs/tools/networking/sing-box/default.nix6
-rw-r--r--pkgs/tools/nix/nixdoc/default.nix6
-rw-r--r--pkgs/tools/package-management/poetry/default.nix6
-rw-r--r--pkgs/tools/package-management/poetry/unwrapped.nix50
-rw-r--r--pkgs/tools/security/exploitdb/default.nix4
-rw-r--r--pkgs/tools/virtualization/distrobuilder/nixos-generator.patch27
-rw-r--r--pkgs/top-level/aliases.nix1
-rw-r--r--pkgs/top-level/all-packages.nix21
-rw-r--r--pkgs/top-level/darwin-packages.nix2
-rw-r--r--pkgs/top-level/python-packages.nix2
-rw-r--r--pkgs/top-level/qt6-packages.nix6
645 files changed, 28884 insertions, 1709 deletions
diff --git a/.editorconfig b/.editorconfig
index c4682829e357..cd8012574508 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -108,3 +108,7 @@ charset = unset
 [lib/tests/*.plist]
 indent_style = tab
 insert_final_newline = unset
+
+[pkgs/kde/generated/**]
+insert_final_newline = unset
+end_of_line = unset
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index d69b00bbc121..278e11ce6863 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -185,11 +185,18 @@ pkgs/development/python-modules/buildcatrust/ @ajs124 @lukegb @mweinelt
 # Licenses
 /lib/licenses.nix @alyssais
 
-# Qt / KDE
-/pkgs/applications/kde @ttuegel
-/pkgs/desktops/plasma-5 @ttuegel
-/pkgs/development/libraries/kde-frameworks @ttuegel
-/pkgs/development/libraries/qt-5 @ttuegel
+# Qt
+/pkgs/development/libraries/qt-5 @NixOS/qt-kde
+/pkgs/development/libraries/qt-6 @NixOS/qt-kde
+
+# KDE / Plasma 5
+/pkgs/applications/kde @NixOS/qt-kde
+/pkgs/desktops/plasma-5 @NixOS/qt-kde
+/pkgs/development/libraries/kde-frameworks @NixOS/qt-kde
+
+# KDE / Plasma 6
+/pkgs/kde @NixOS/qt-kde
+/maintainers/scripts/kde @NixOS/qt-kde
 
 # PostgreSQL and related stuff
 /pkgs/servers/sql/postgresql @thoughtpolice @marsam
diff --git a/doc/packages/darwin-builder.section.md b/doc/packages/darwin-builder.section.md
index bf6ef906ca5a..3a547de53705 100644
--- a/doc/packages/darwin-builder.section.md
+++ b/doc/packages/darwin-builder.section.md
@@ -1,5 +1,12 @@
 # darwin.linux-builder {#sec-darwin-builder}
 
+:::{.warning}
+By default, `darwin.linux-builder` uses a publicly-known private SSH **host key** (this is different from the SSH key used by the user that connects to the builder).
+
+Given the intended use case for it (a Linux builder that runs **on the same machine**), this shouldn't be an issue.
+However, if you plan to deviate from this use case in any way (e.g. by exposing this builder to remote machines), you should understand the security implications of doing so and take any appropriate measures.
+:::
+
 `darwin.linux-builder` provides a way to bootstrap a Linux remote builder on a macOS machine.
 
 This requires macOS version 12.4 or later.
@@ -97,6 +104,7 @@ $ sudo launchctl kickstart -k system/org.nixos.nix-daemon
         { virtualisation = {
             host.pkgs = pkgs;
             darwin-builder.workingDirectory = "/var/lib/darwin-builder";
+            darwin-builder.hostPort = 22;
           };
         }
       ];
@@ -110,7 +118,9 @@ $ sudo launchctl kickstart -k system/org.nixos.nix-daemon
           {
             nix.distributedBuilds = true;
             nix.buildMachines = [{
-              hostName = "ssh://builder@localhost";
+              hostName = "localhost";
+              sshUser = "builder";
+              sshKey = "/etc/nix/builder_ed25519";
               system = linuxSystem;
               maxJobs = 4;
               supportedFeatures = [ "kvm" "benchmark" "big-parallel" ];
diff --git a/lib/attrsets.nix b/lib/attrsets.nix
index 0e896a93156d..4f7d795c397f 100644
--- a/lib/attrsets.nix
+++ b/lib/attrsets.nix
@@ -2,10 +2,10 @@
 { lib }:
 
 let
-  inherit (builtins) head tail length;
-  inherit (lib.trivial) id mergeAttrs warn;
+  inherit (builtins) head length;
+  inherit (lib.trivial) mergeAttrs warn;
   inherit (lib.strings) concatStringsSep concatMapStringsSep escapeNixIdentifier sanitizeDerivationName;
-  inherit (lib.lists) foldr foldl' concatMap concatLists elemAt all partition groupBy take foldl;
+  inherit (lib.lists) foldr foldl' concatMap elemAt all partition groupBy take foldl;
 in
 
 rec {
@@ -369,7 +369,7 @@ rec {
      Type:
        attrValues :: AttrSet -> [Any]
   */
-  attrValues = builtins.attrValues or (attrs: attrVals (attrNames attrs) attrs);
+  attrValues = builtins.attrValues;
 
 
   /* Given a set of attribute names, return the set of the corresponding
@@ -398,8 +398,7 @@ rec {
      Type:
        catAttrs :: String -> [AttrSet] -> [Any]
   */
-  catAttrs = builtins.catAttrs or
-    (attr: l: concatLists (map (s: if s ? ${attr} then [s.${attr}] else []) l));
+  catAttrs = builtins.catAttrs;
 
 
   /* Filter an attribute set by removing all attributes for which the
@@ -608,9 +607,7 @@ rec {
      Type:
        mapAttrs :: (String -> Any -> Any) -> AttrSet -> AttrSet
   */
-  mapAttrs = builtins.mapAttrs or
-    (f: set:
-      listToAttrs (map (attr: { name = attr; value = f attr set.${attr}; }) (attrNames set)));
+  mapAttrs = builtins.mapAttrs;
 
 
   /* Like `mapAttrs`, but allows the name of each attribute to be
diff --git a/lib/lists.nix b/lib/lists.nix
index b612bc16697e..05216c1a66eb 100644
--- a/lib/lists.nix
+++ b/lib/lists.nix
@@ -4,7 +4,6 @@ let
   inherit (lib.strings) toInt;
   inherit (lib.trivial) compare min id warn;
   inherit (lib.attrsets) mapAttrs;
-  inherit (lib.lists) sort;
 in
 rec {
 
@@ -172,7 +171,7 @@ rec {
        concatMap (x: [x] ++ ["z"]) ["a" "b"]
        => [ "a" "z" "b" "z" ]
   */
-  concatMap = builtins.concatMap or (f: list: concatLists (map f list));
+  concatMap = builtins.concatMap;
 
   /* Flatten the argument into a single list; that is, nested lists are
      spliced into the top-level lists.
@@ -316,7 +315,7 @@ rec {
        any isString [ 1 { } ]
        => false
   */
-  any = builtins.any or (pred: foldr (x: y: if pred x then true else y) false);
+  any = builtins.any;
 
   /* Return true if function `pred` returns true for all elements of
      `list`.
@@ -329,7 +328,7 @@ rec {
        all (x: x < 3) [ 1 2 3 ]
        => false
   */
-  all = builtins.all or (pred: foldr (x: y: if pred x then y else false) true);
+  all = builtins.all;
 
   /* Count how many elements of `list` match the supplied predicate
      function.
@@ -428,12 +427,7 @@ rec {
        partition (x: x > 2) [ 5 1 2 3 4 ]
        => { right = [ 5 3 4 ]; wrong = [ 1 2 ]; }
   */
-  partition = builtins.partition or (pred:
-    foldr (h: t:
-      if pred h
-      then { right = [h] ++ t.right; wrong = t.wrong; }
-      else { right = t.right; wrong = [h] ++ t.wrong; }
-    ) { right = []; wrong = []; });
+  partition = builtins.partition;
 
   /* Splits the elements of a list into many lists, using the return value of a predicate.
      Predicate should return a string which becomes keys of attrset `groupBy` returns.
@@ -602,22 +596,7 @@ rec {
      Type:
        sort :: (a -> a -> Bool) -> [a] -> [a]
   */
-  sort = builtins.sort or (
-    strictLess: list:
-    let
-      len = length list;
-      first = head list;
-      pivot' = n: acc@{ left, right }: let el = elemAt list n; next = pivot' (n + 1); in
-        if n == len
-          then acc
-        else if strictLess first el
-          then next { inherit left; right = [ el ] ++ right; }
-        else
-          next { left = [ el ] ++ left; inherit right; };
-      pivot = pivot' 1 { left = []; right = []; };
-    in
-      if len < 2 then list
-      else (sort strictLess pivot.left) ++  [ first ] ++  (sort strictLess pivot.right));
+  sort = builtins.sort;
 
   /*
     Sort a list based on the default comparison of a derived property `b`.
diff --git a/lib/strings.nix b/lib/strings.nix
index 7083576dd529..47ee095f1b68 100644
--- a/lib/strings.nix
+++ b/lib/strings.nix
@@ -95,8 +95,7 @@ rec {
         concatStringsSep "/" ["usr" "local" "bin"]
         => "usr/local/bin"
   */
-  concatStringsSep = builtins.concatStringsSep or (separator: list:
-    lib.foldl' (x: y: x + y) "" (intersperse separator list));
+  concatStringsSep = builtins.concatStringsSep;
 
   /* Maps a function over a list of strings and then concatenates the
      result with the specified separator interspersed between
diff --git a/lib/trivial.nix b/lib/trivial.nix
index 58620006de15..fa499cbbf028 100644
--- a/lib/trivial.nix
+++ b/lib/trivial.nix
@@ -95,21 +95,6 @@ in {
   /* boolean “and” */
   and = x: y: x && y;
 
-  /* bitwise “and” */
-  bitAnd = builtins.bitAnd
-    or (import ./zip-int-bits.nix
-        (a: b: if a==1 && b==1 then 1 else 0));
-
-  /* bitwise “or” */
-  bitOr = builtins.bitOr
-    or (import ./zip-int-bits.nix
-        (a: b: if a==1 || b==1 then 1 else 0));
-
-  /* bitwise “xor” */
-  bitXor = builtins.bitXor
-    or (import ./zip-int-bits.nix
-        (a: b: if a!=b then 1 else 0));
-
   /* bitwise “not” */
   bitNot = builtins.sub (-1);
 
@@ -165,8 +150,8 @@ in {
   inherit (builtins)
     pathExists readFile isBool
     isInt isFloat add sub lessThan
-    seq deepSeq genericClosure;
-
+    seq deepSeq genericClosure
+    bitAnd bitOr bitXor;
 
   ## nixpkgs version strings
 
diff --git a/lib/versions.nix b/lib/versions.nix
index 986e7e5f9b37..720d19e8ca29 100644
--- a/lib/versions.nix
+++ b/lib/versions.nix
@@ -9,7 +9,7 @@ rec {
        splitVersion "1.2.3"
        => ["1" "2" "3"]
   */
-  splitVersion = builtins.splitVersion or (lib.splitString ".");
+  splitVersion = builtins.splitVersion;
 
   /* Get the major version string from a string.
 
diff --git a/lib/zip-int-bits.nix b/lib/zip-int-bits.nix
deleted file mode 100644
index 53efd2bb0a04..000000000000
--- a/lib/zip-int-bits.nix
+++ /dev/null
@@ -1,39 +0,0 @@
-/* Helper function to implement a fallback for the bit operators
-   `bitAnd`, `bitOr` and `bitXor` on older nix version.
-   See ./trivial.nix
-*/
-f: x: y:
-  let
-    # (intToBits 6) -> [ 0 1 1 ]
-    intToBits = x:
-      if x == 0 || x == -1 then
-        []
-      else
-        let
-          headbit  = if (x / 2) * 2 != x then 1 else 0;          # x & 1
-          tailbits = if x < 0 then ((x + 1) / 2) - 1 else x / 2; # x >> 1
-        in
-          [headbit] ++ (intToBits tailbits);
-
-    # (bitsToInt [ 0 1 1 ] 0) -> 6
-    # (bitsToInt [ 0 1 0 ] 1) -> -6
-    bitsToInt = l: signum:
-      if l == [] then
-        (if signum == 0 then 0 else -1)
-      else
-        (builtins.head l) + (2 * (bitsToInt (builtins.tail l) signum));
-
-    xsignum = if x < 0 then 1 else 0;
-    ysignum = if y < 0 then 1 else 0;
-    zipListsWith' = fst: snd:
-      if fst==[] && snd==[] then
-        []
-      else if fst==[] then
-        [(f xsignum             (builtins.head snd))] ++ (zipListsWith' []                  (builtins.tail snd))
-      else if snd==[] then
-        [(f (builtins.head fst) ysignum            )] ++ (zipListsWith' (builtins.tail fst) []                 )
-      else
-        [(f (builtins.head fst) (builtins.head snd))] ++ (zipListsWith' (builtins.tail fst) (builtins.tail snd));
-  in
-    assert (builtins.isInt x) && (builtins.isInt y);
-    bitsToInt (zipListsWith' (intToBits x) (intToBits y)) (f xsignum ysignum)
diff --git a/maintainers/maintainer-list.nix b/maintainers/maintainer-list.nix
index 11d4ceccfa1e..d800d0619079 100644
--- a/maintainers/maintainer-list.nix
+++ b/maintainers/maintainer-list.nix
@@ -20280,6 +20280,12 @@
     githubId = 326263;
     name = "Danny Wilson";
   };
+  vizid = {
+    email = "vizid1337@gmail.com";
+    github = "ViZiD";
+    githubId = 7444430;
+    name = "Radik Islamov";
+  };
   vklquevs = {
     email = "vklquevs@gmail.com";
     github = "vklquevs";
diff --git a/maintainers/scripts/bootstrap-files/README.md b/maintainers/scripts/bootstrap-files/README.md
index ae385cbd6ce8..b55878f34192 100644
--- a/maintainers/scripts/bootstrap-files/README.md
+++ b/maintainers/scripts/bootstrap-files/README.md
@@ -39,7 +39,7 @@ target:
    ```
 
    To validate cross-targets `binfmt` `NixOS` helper can be useful.
-   For `riscv64-unknown-linux-gnu` the `/etc/nixox/configuraqtion.nix`
+   For `riscv64-unknown-linux-gnu` the `/etc/nixos/configuration.nix`
    entry would be `boot.binfmt.emulatedSystems = [ "riscv64-linux" ]`.
 
 3. Propose the commit as a PR to update bootstrap tarballs, tag people
diff --git a/maintainers/scripts/kde/collect-licenses.sh b/maintainers/scripts/kde/collect-licenses.sh
new file mode 100755
index 000000000000..87da901c255c
--- /dev/null
+++ b/maintainers/scripts/kde/collect-licenses.sh
@@ -0,0 +1,31 @@
+#!/usr/bin/env nix-shell
+#!nix-shell -i bash -p gnutar jq reuse
+set -eu
+cd "$(dirname "$(readlink -f "$0")")"/../../..
+
+TMPDIR=$(mktemp -d)
+trap 'rm -rf $TMPDIR' EXIT
+
+echo "# Prebuilding sources..."
+nix-build -A kdePackages.sources --no-link || true
+
+echo "# Evaluating sources..."
+declare -A sources
+eval "$(nix-instantiate --eval -A kdePackages.sources --json --strict | jq 'to_entries[] | "sources[" + .key + "]=" + .value' -r)"
+
+echo "# Collecting licenses..."
+for k in "${!sources[@]}"; do
+    echo "- Processing $k..."
+
+    if [ ! -f "${sources[$k]}" ]; then
+        echo "Not found!"
+        continue
+    fi
+
+    mkdir "$TMPDIR/$k"
+    tar -C "$TMPDIR/$k" -xf "${sources[$k]}"
+
+    (cd "$TMPDIR/$k"; reuse lint --json) | jq --arg name "$k" '{$name: .summary.used_licenses | sort}' -c > "$TMPDIR/$k.json"
+done
+
+jq -s 'add' -S "$TMPDIR"/*.json > pkgs/kde/generated/licenses.json
diff --git a/maintainers/scripts/kde/collect-logs.nu b/maintainers/scripts/kde/collect-logs.nu
new file mode 100755
index 000000000000..1d07fa9d2caf
--- /dev/null
+++ b/maintainers/scripts/kde/collect-logs.nu
@@ -0,0 +1,11 @@
+#!/usr/bin/env nix-shell
+#!nix-shell -i nu -p nushell
+cd $"($env.FILE_PWD)/../../.."
+
+mkdir logs
+nix-env -qaP -f . -A kdePackages --json --out-path | from json | values | par-each { |it|
+    echo $"Processing ($it.pname)..."
+    if "outputs" in $it {
+        nix-store --read-log $it.outputs.out | save -f $"logs/($it.pname).log"
+    }
+}
diff --git a/maintainers/scripts/kde/collect-metadata.py b/maintainers/scripts/kde/collect-metadata.py
new file mode 100755
index 000000000000..eaa619647136
--- /dev/null
+++ b/maintainers/scripts/kde/collect-metadata.py
@@ -0,0 +1,36 @@
+#!/usr/bin/env nix-shell
+#!nix-shell -i python3 -p "python3.withPackages(ps: [ ps.click ps.pyyaml ])"
+import pathlib
+
+import click
+
+import utils
+
+@click.command
+@click.argument(
+    "repo-metadata",
+    type=click.Path(
+        exists=True,
+        file_okay=False,
+        resolve_path=True,
+        path_type=pathlib.Path,
+    ),
+)
+@click.option(
+    "--nixpkgs",
+    type=click.Path(
+        exists=True,
+        file_okay=False,
+        resolve_path=True,
+        writable=True,
+        path_type=pathlib.Path,
+    ),
+    default=pathlib.Path(__file__).parent.parent.parent.parent
+)
+def main(repo_metadata: pathlib.Path, nixpkgs: pathlib.Path):
+    metadata = utils.KDERepoMetadata.from_repo_metadata_checkout(repo_metadata)
+    out_dir = nixpkgs / "pkgs/kde/generated"
+    metadata.write_json(out_dir)
+
+if __name__ == "__main__":
+    main()  # type: ignore
diff --git a/maintainers/scripts/kde/collect-missing-deps.py b/maintainers/scripts/kde/collect-missing-deps.py
new file mode 100755
index 000000000000..f3943338b57f
--- /dev/null
+++ b/maintainers/scripts/kde/collect-missing-deps.py
@@ -0,0 +1,127 @@
+#!/usr/bin/env nix-shell
+#!nix-shell -i python3 -p python3
+import pathlib
+
+OK_MISSING = {
+    # we don't use precompiled QML
+    'Qt6QuickCompiler',
+    'Qt6QmlCompilerPlusPrivate',
+    # usually used for version numbers
+    'Git',
+    # useless by itself, will warn if something else is not found
+    'PkgConfig',
+    # license verification
+    'ReuseTool',
+    # dev only
+    'ClangFormat',
+    # doesn't exist
+    'Qt6X11Extras',
+}
+
+OK_MISSING_BY_PACKAGE = {
+    "angelfish": {
+        "Qt6Feedback",  # we don't have it
+    },
+    "attica": {
+        "Python3",  # only used for license checks
+    },
+    "discover": {
+        "rpm-ostree-1",  # we don't have rpm-ostree (duh)
+        "Snapd",  # we don't have snaps and probably never will
+    },
+    "elisa": {
+        "UPNPQT",  # upstream says it's broken
+    },
+    "extra-cmake-modules": {
+        "Sphinx",  # only used for docs, bloats closure size
+        "QCollectionGenerator"
+    },
+    "kio-extras-kf5": {
+        "KDSoapWSDiscoveryClient",  # actually vendored on KF5 version
+    },
+    "kitinerary": {
+        "OsmTools",  # used for map data updates, we use prebuilt
+    },
+    "kosmindoormap": {
+        "OsmTools",  # same
+        "Protobuf",
+    },
+    "kpty": {
+        "UTEMPTER",  # we don't have it and it probably wouldn't work anyway
+    },
+    "kpublictransport": {
+        "OsmTools",  # same
+        "PolyClipping",
+        "Protobuf",
+    },
+    "krfb": {
+        "Qt6XkbCommonSupport",  # not real
+    },
+    "kuserfeedback": {
+        "Qt6Svg",  # all used for backend console stuff we don't ship
+        "QmlLint",
+        "Qt6Charts",
+        "FLEX",
+        "BISON",
+        "Php",
+        "PhpUnit",
+    },
+    "kwin": {
+        "display-info",  # newer versions identify as libdisplay-info
+    },
+    "mlt": {
+        "Qt5",  # intentionally disabled
+        "SWIG",
+    },
+    "plasma-desktop": {
+        "scim",  # upstream is dead, not packaged in Nixpkgs
+    },
+    "powerdevil": {
+        "DDCUtil",  # cursed, intentionally disabled
+    },
+    "pulseaudio-qt": {
+        "Qt6Qml",  # tests only
+        "Qt6Quick",
+    },
+    "syntax-highlighting": {
+        "XercesC",  # only used for extra validation at build time
+    }
+}
+
+def main():
+    here = pathlib.Path(__file__).parent.parent.parent.parent
+    logs = (here / "logs").glob("*.log")
+
+    for log in sorted(logs):
+        pname = log.stem
+
+        missing = []
+        is_in_block = False
+        with log.open(errors="replace") as fd:
+            for line in fd:
+                line = line.strip()
+                if line.startswith("--   No package '"):
+                    package = line.removeprefix("--   No package '").removesuffix("' found")
+                    missing.append(package)
+                if line == "-- The following OPTIONAL packages have not been found:" or line == "-- The following RECOMMENDED packages have not been found:":
+                    is_in_block = True
+                elif line.startswith("--") and is_in_block:
+                    is_in_block = False
+                elif line.startswith("*") and is_in_block:
+                    package = line.removeprefix("* ")
+                    missing.append(package)
+
+        missing = {
+            package
+            for package in missing
+            if not any(package.startswith(i) for i in OK_MISSING | OK_MISSING_BY_PACKAGE.get(pname, set()))
+        }
+
+        if missing:
+            print(pname + ":")
+            for line in missing:
+                print("  -", line)
+            print()
+
+if __name__ == '__main__':
+    main()
diff --git a/maintainers/scripts/kde/generate-sources.py b/maintainers/scripts/kde/generate-sources.py
new file mode 100755
index 000000000000..e9f8c41ef4d7
--- /dev/null
+++ b/maintainers/scripts/kde/generate-sources.py
@@ -0,0 +1,113 @@
+#!/usr/bin/env nix-shell
+#!nix-shell -i python3 -p "python3.withPackages(ps: [ ps.beautifulsoup4 ps.click ps.httpx ps.jinja2 ps.pyyaml ])
+import base64
+import binascii
+import json
+import pathlib
+from urllib.parse import urlparse
+
+import bs4
+import click
+import httpx
+import jinja2
+
+import utils
+
+
+LEAF_TEMPLATE = jinja2.Template('''
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "{{ pname }}";
+}
+'''.strip())
+
+ROOT_TEMPLATE = jinja2.Template('''
+{callPackage}: {
+  {%- for p in packages %}
+  {{ p }} = callPackage ./{{ p }} {};
+  {%- endfor %}
+}
+'''.strip());
+
+def to_sri(hash):
+    raw = binascii.unhexlify(hash)
+    b64 = base64.b64encode(raw).decode()
+    return f"sha256-{b64}"
+
+
+@click.command
+@click.argument(
+    "set",
+    type=click.Choice(["frameworks", "gear", "plasma"]),
+    required=True
+)
+@click.argument(
+    "version",
+    type=str,
+    required=True
+)
+@click.option(
+    "--nixpkgs",
+    type=click.Path(
+        exists=True,
+        file_okay=False,
+        resolve_path=True,
+        writable=True,
+        path_type=pathlib.Path,
+    ),
+    default=pathlib.Path(__file__).parent.parent.parent.parent
+)
+def main(set: str, version: str, nixpkgs: pathlib.Path):
+    root_dir = nixpkgs / "pkgs/kde"
+    set_dir = root_dir / set
+    generated_dir = root_dir / "generated"
+    metadata = utils.KDERepoMetadata.from_json(generated_dir)
+
+    set_url = {
+        "frameworks": "kf",
+        "gear": "releases",
+        "plasma": "plasma",
+    }[set]
+
+    sources = httpx.get(f"https://kde.org/info/sources/source-{set_url}-{version}.html")
+    sources.raise_for_status()
+    bs = bs4.BeautifulSoup(sources.text, features="html.parser")
+
+    results = {}
+    for item in bs.select("tr")[1:]:
+        link = item.select_one("td:nth-child(1) a")
+        assert link
+
+        hash = item.select_one("td:nth-child(3) tt")
+        assert hash
+
+        project_name, version = link.text.rsplit("-", maxsplit=1)
+        if project_name not in metadata.projects_by_name:
+            print(f"Warning: unknown tarball: {project_name}")
+
+        results[project_name] = {
+            "version": version,
+            "url": "mirror://kde" + urlparse(link.attrs["href"]).path,
+            "hash": to_sri(hash.text)
+        }
+
+        pkg_dir = set_dir / project_name
+        pkg_file = pkg_dir / "default.nix"
+        if not pkg_file.exists():
+            print(f"Generated new package: {set}/{project_name}")
+            pkg_dir.mkdir(parents=True, exist_ok=True)
+            with pkg_file.open("w") as fd:
+                fd.write(LEAF_TEMPLATE.render(pname=project_name) + "\n")
+
+    set_dir.mkdir(parents=True, exist_ok=True)
+    with (set_dir / "default.nix").open("w") as fd:
+        fd.write(ROOT_TEMPLATE.render(packages=results.keys()) + "\n")
+
+    sources_dir = generated_dir / "sources"
+    sources_dir.mkdir(parents=True, exist_ok=True)
+    with (sources_dir / f"{set}.json").open("w") as fd:
+        json.dump(results, fd, indent=2)
+
+
+if __name__ == "__main__":
+    main()  # type: ignore
diff --git a/maintainers/scripts/kde/utils.py b/maintainers/scripts/kde/utils.py
new file mode 100644
index 000000000000..7a82c4955c6b
--- /dev/null
+++ b/maintainers/scripts/kde/utils.py
@@ -0,0 +1,185 @@
+import collections
+import dataclasses
+import functools
+import json
+import pathlib
+import subprocess
+
+import yaml
+
+class DataclassEncoder(json.JSONEncoder):
+    def default(self, it):
+        if dataclasses.is_dataclass(it):
+            return dataclasses.asdict(it)
+        return super().default(it)
+
+
+@dataclasses.dataclass
+class Project:
+    name: str
+    description: str | None
+    project_path: str
+    repo_path: str | None
+
+    def __hash__(self) -> int:
+        return hash(self.name)
+
+    @classmethod
+    def from_yaml(cls, path: pathlib.Path):
+        data = yaml.safe_load(path.open())
+        return cls(
+            name=data["identifier"],
+            description=data["description"],
+            project_path=data["projectpath"],
+            repo_path=data["repopath"]
+        )
+
+
+def get_git_commit(path: pathlib.Path):
+    return subprocess.check_output(["git", "-C", path, "rev-parse", "--short", "HEAD"]).decode().strip()
+
+
+def validate_unique(projects: list[Project], attr: str):
+    seen = set()
+    for item in projects:
+        attr_value = getattr(item, attr)
+        if attr_value in seen:
+            raise Exception(f"Duplicate {attr}: {attr_value}")
+        seen.add(attr_value)
+
+
+THIRD_PARTY = {
+    "third-party/appstream": "appstream-qt",
+    "third-party/cmark": "cmark",
+    "third-party/gpgme": "gpgme",
+    "third-party/kdsoap": "kdsoap",
+    "third-party/libaccounts-qt": "accounts-qt",
+    "third-party/libgpg-error": "libgpg-error",
+    "third-party/libquotient": "libquotient",
+    "third-party/packagekit-qt": "packagekit-qt",
+    "third-party/poppler": "poppler",
+    "third-party/qcoro": "qcoro",
+    "third-party/qmltermwidget": "qmltermwidget",
+    "third-party/qtkeychain": "qtkeychain",
+    "third-party/signond": "signond",
+    "third-party/taglib": "taglib",
+    "third-party/wayland-protocols": "wayland-protocols",
+    "third-party/wayland": "wayland",
+    "third-party/zxing-cpp": "zxing-cpp",
+}
+
+IGNORE = {
+    "kdesupport/phonon-directshow",
+    "kdesupport/phonon-mmf",
+    "kdesupport/phonon-mplayer",
+    "kdesupport/phonon-quicktime",
+    "kdesupport/phonon-waveout",
+    "kdesupport/phonon-xine"
+}
+
+WARNED = set()
+
+
+@dataclasses.dataclass
+class KDERepoMetadata:
+    version: str
+    projects: list[Project]
+    dep_graph: dict[Project, set[Project]]
+
+    @functools.cached_property
+    def projects_by_name(self):
+        return {p.name: p for p in self.projects}
+
+    @functools.cached_property
+    def projects_by_path(self):
+        return {p.project_path: p for p in self.projects}
+
+    def try_lookup_package(self, path):
+        if path in IGNORE:
+            return None
+        project = self.projects_by_path.get(path)
+        if project is None and path not in WARNED:
+            WARNED.add(path)
+            print(f"Warning: unknown project {path}")
+        return project
+
+    @classmethod
+    def from_repo_metadata_checkout(cls, repo_metadata: pathlib.Path):
+        projects = [
+            Project.from_yaml(metadata_file)
+            for metadata_file in repo_metadata.glob("projects-invent/**/metadata.yaml")
+        ] + [
+            Project(id, None, project_path, None)
+            for project_path, id in THIRD_PARTY.items()
+        ]
+
+        validate_unique(projects, "name")
+        validate_unique(projects, "project_path")
+
+        self = cls(
+            version=get_git_commit(repo_metadata),
+            projects=projects,
+            dep_graph={},
+        )
+
+        dep_specs = [
+            "dependency-data-common",
+            "dependency-data-kf6-qt6"
+        ]
+        dep_graph = collections.defaultdict(set)
+
+        for spec in dep_specs:
+            spec_path = repo_metadata / "dependencies" / spec
+            for line in spec_path.open():
+                line = line.strip()
+                if line.startswith("#"):
+                    continue
+                if not line:
+                    continue
+
+                dependent, dependency = line.split(": ")
+
+                dependent = self.try_lookup_package(dependent)
+                if dependent is None:
+                    continue
+
+                dependency = self.try_lookup_package(dependency)
+                if dependency is None:
+                    continue
+
+                dep_graph[dependent].add(dependency)
+
+        self.dep_graph = dep_graph
+
+        return self
+
+    def write_json(self, root: pathlib.Path):
+        root.mkdir(parents=True, exist_ok=True)
+
+        with (root / "projects.json").open("w") as fd:
+            json.dump(self.projects_by_name, fd, cls=DataclassEncoder, sort_keys=True, indent=2)
+
+        with (root / "dependencies.json").open("w") as fd:
+            deps = {k.name: sorted(dep.name for dep in v) for k, v in self.dep_graph.items()}
+            json.dump({"version": self.version, "dependencies": deps}, fd, cls=DataclassEncoder, sort_keys=True, indent=2)
+
+    @classmethod
+    def from_json(cls, root: pathlib.Path):
+        projects = [
+            Project(**v) for v in json.load((root / "projects.json").open()).values()
+        ]
+
+        deps = json.load((root / "dependencies.json").open())
+        self = cls(
+            version=deps["version"],
+            projects=projects,
+            dep_graph={},
+        )
+
+        dep_graph = collections.defaultdict(set)
+        for dependent, dependencies in deps["dependencies"].items():
+            for dependency in dependencies:
+                dep_graph[self.projects_by_name[dependent]].add(self.projects_by_name[dependency])
+
+        self.dep_graph = dep_graph
+        return self
diff --git a/nixos/doc/manual/development/settings-options.section.md b/nixos/doc/manual/development/settings-options.section.md
index 3a4800742b04..71ec9bbc8892 100644
--- a/nixos/doc/manual/development/settings-options.section.md
+++ b/nixos/doc/manual/development/settings-options.section.md
@@ -73,6 +73,34 @@ have a predefined type and string generator already declared under
 
     It returns a set with INI-specific attributes `type` and `generate`
     as specified [below](#pkgs-formats-result).
+    The type of the input is an *attrset* of sections; key-value pairs where
+    the key is the section name and the value is the corresponding content
+    which is also an *attrset* of key-value pairs for the actual key-value
+    mappings of the INI format.
+    The values of the INI atoms are subject to the above parameters (e.g. lists
+    may be transformed into multiple key-value pairs depending on
+    `listToValue`).
+
+`pkgs.formats.iniWithGlobalSection` { *`listsAsDuplicateKeys`* ? false, *`listToValue`* ? null, \.\.\. }
+
+:   A function taking an attribute set with values
+
+    `listsAsDuplicateKeys`
+
+    :   A boolean for controlling whether list values can be used to
+        represent duplicate INI keys
+
+    `listToValue`
+
+    :   A function for turning a list of values into a single value.
+
+    It returns a set with INI-specific attributes `type` and `generate`
+    as specified [below](#pkgs-formats-result).
+    The type of the input is an *attrset* of the structure
+    `{ sections = {}; globalSection = {}; }` where *sections* are several
+    sections as with *pkgs.formats.ini* and *globalSection* being just a single
+    attrset of key-value pairs for a single section, the global section which
+    preceedes the section definitions.
 
 `pkgs.formats.toml` { }
 
diff --git a/nixos/doc/manual/release-notes/rl-2405.section.md b/nixos/doc/manual/release-notes/rl-2405.section.md
index f42d169657f4..8fc7308f32e1 100644
--- a/nixos/doc/manual/release-notes/rl-2405.section.md
+++ b/nixos/doc/manual/release-notes/rl-2405.section.md
@@ -52,6 +52,8 @@ In addition to numerous new and upgraded packages, this release has the followin
   }
   ```
 
+- Plasma 6 is now available and can be installed with `services.xserver.desktopManager.plasma6.enable = true;`. Plasma 5 will likely be deprecated in the next release (24.11). Note that Plasma 6 runs as Wayland by default, and the X11 session needs to be explicitly selected if necessary.
+
 ## New Services {#sec-release-24.05-new-services}
 
 <!-- To avoid merge conflicts, consider adding your item at an arbitrary place in the list instead. -->
diff --git a/nixos/lib/systemd-lib.nix b/nixos/lib/systemd-lib.nix
index c9cca619ed70..ef218e674ebf 100644
--- a/nixos/lib/systemd-lib.nix
+++ b/nixos/lib/systemd-lib.nix
@@ -378,7 +378,7 @@ in rec {
     '';
 
   targetToUnit = name: def:
-    { inherit (def) aliases wantedBy requiredBy enable overrideStrategy;
+    { inherit (def) aliases wantedBy requiredBy upheldBy enable overrideStrategy;
       text =
         ''
           [Unit]
@@ -387,7 +387,7 @@ in rec {
     };
 
   serviceToUnit = name: def:
-    { inherit (def) aliases wantedBy requiredBy enable overrideStrategy;
+    { inherit (def) aliases wantedBy requiredBy upheldBy enable overrideStrategy;
       text = commonUnitText def (''
         [Service]
       '' + (let env = cfg.globalEnvironment // def.environment;
@@ -408,7 +408,7 @@ in rec {
     };
 
   socketToUnit = name: def:
-    { inherit (def) aliases wantedBy requiredBy enable overrideStrategy;
+    { inherit (def) aliases wantedBy requiredBy upheldBy enable overrideStrategy;
       text = commonUnitText def ''
         [Socket]
         ${attrsToSection def.socketConfig}
@@ -418,7 +418,7 @@ in rec {
     };
 
   timerToUnit = name: def:
-    { inherit (def) aliases wantedBy requiredBy enable overrideStrategy;
+    { inherit (def) aliases wantedBy requiredBy upheldBy enable overrideStrategy;
       text = commonUnitText def ''
         [Timer]
         ${attrsToSection def.timerConfig}
@@ -426,7 +426,7 @@ in rec {
     };
 
   pathToUnit = name: def:
-    { inherit (def) aliases wantedBy requiredBy enable overrideStrategy;
+    { inherit (def) aliases wantedBy requiredBy upheldBy enable overrideStrategy;
       text = commonUnitText def ''
         [Path]
         ${attrsToSection def.pathConfig}
@@ -434,7 +434,7 @@ in rec {
     };
 
   mountToUnit = name: def:
-    { inherit (def) aliases wantedBy requiredBy enable overrideStrategy;
+    { inherit (def) aliases wantedBy requiredBy upheldBy enable overrideStrategy;
       text = commonUnitText def ''
         [Mount]
         ${attrsToSection def.mountConfig}
@@ -442,7 +442,7 @@ in rec {
     };
 
   automountToUnit = name: def:
-    { inherit (def) aliases wantedBy requiredBy enable overrideStrategy;
+    { inherit (def) aliases wantedBy requiredBy upheldBy enable overrideStrategy;
       text = commonUnitText def ''
         [Automount]
         ${attrsToSection def.automountConfig}
@@ -450,7 +450,7 @@ in rec {
     };
 
   sliceToUnit = name: def:
-    { inherit (def) aliases wantedBy requiredBy enable overrideStrategy;
+    { inherit (def) aliases wantedBy requiredBy upheldBy enable overrideStrategy;
       text = commonUnitText def ''
         [Slice]
         ${attrsToSection def.sliceConfig}
diff --git a/nixos/modules/installer/cd-dvd/installation-cd-graphical-calamares-plasma6.nix b/nixos/modules/installer/cd-dvd/installation-cd-graphical-calamares-plasma6.nix
new file mode 100644
index 000000000000..11118db3aae2
--- /dev/null
+++ b/nixos/modules/installer/cd-dvd/installation-cd-graphical-calamares-plasma6.nix
@@ -0,0 +1,46 @@
+# This module defines a NixOS installation CD that contains Plasma 6.
+
+{ pkgs, ... }:
+
+{
+  imports = [ ./installation-cd-graphical-calamares.nix ];
+
+  isoImage.edition = "plasma6";
+
+  services.xserver = {
+    desktopManager.plasma6.enable = true;
+
+    # Automatically login as nixos.
+    displayManager = {
+      sddm.enable = true;
+      autoLogin = {
+        enable = true;
+        user = "nixos";
+      };
+    };
+  };
+
+  environment.systemPackages = [
+    # FIXME: using Qt5 builds of Maliit as upstream has not ported to Qt6 yet
+    pkgs.maliit-framework
+    pkgs.maliit-keyboard
+  ];
+
+  system.activationScripts.installerDesktop = let
+
+    # Comes from documentation.nix when xserver and nixos.enable are true.
+    manualDesktopFile = "/run/current-system/sw/share/applications/nixos-manual.desktop";
+
+    homeDir = "/home/nixos/";
+    desktopDir = homeDir + "Desktop/";
+
+  in ''
+    mkdir -p ${desktopDir}
+    chown nixos ${homeDir} ${desktopDir}
+
+    ln -sfT ${manualDesktopFile} ${desktopDir + "nixos-manual.desktop"}
+    ln -sfT ${pkgs.gparted}/share/applications/gparted.desktop ${desktopDir + "gparted.desktop"}
+    ln -sfT ${pkgs.calamares-nixos}/share/applications/io.calamares.calamares.desktop ${desktopDir + "io.calamares.calamares.desktop"}
+  '';
+
+}
diff --git a/nixos/modules/programs/gnupg.nix b/nixos/modules/programs/gnupg.nix
index 8f82de033666..179d2de87cc5 100644
--- a/nixos/modules/programs/gnupg.nix
+++ b/nixos/modules/programs/gnupg.nix
@@ -15,6 +15,7 @@ let
   defaultPinentryFlavor =
     if xserverCfg.desktopManager.lxqt.enable
     || xserverCfg.desktopManager.plasma5.enable
+    || xserverCfg.desktopManager.plasma6.enable
     || xserverCfg.desktopManager.deepin.enable then
       "qt"
     else if xserverCfg.desktopManager.xfce.enable then
diff --git a/nixos/modules/security/pam.nix b/nixos/modules/security/pam.nix
index ed03254cb5ee..b87e22b23980 100644
--- a/nixos/modules/security/pam.nix
+++ b/nixos/modules/security/pam.nix
@@ -96,6 +96,10 @@ let
 
   pamOpts = { config, name, ... }: let cfg = config; in let config = parentConfig; in {
 
+    imports = [
+      (lib.mkRenamedOptionModule [ "enableKwallet" ] [ "kwallet" "enable" ])
+    ];
+
     options = {
 
       name = mkOption {
@@ -462,16 +466,23 @@ let
         '';
       };
 
-      enableKwallet = mkOption {
-        default = false;
-        type = types.bool;
-        description = lib.mdDoc ''
-          If enabled, pam_wallet will attempt to automatically unlock the
-          user's default KDE wallet upon login. If the user has no wallet named
-          "kdewallet", or the login password does not match their wallet
-          password, KDE will prompt separately after login.
-        '';
+      kwallet = {
+        enable = mkOption {
+          default = false;
+          type = types.bool;
+          description = lib.mdDoc ''
+            If enabled, pam_wallet will attempt to automatically unlock the
+            user's default KDE wallet upon login. If the user has no wallet named
+            "kdewallet", or the login password does not match their wallet
+            password, KDE will prompt separately after login.
+          '';
+        };
+
+        package = mkPackageOption pkgs.plasma5Packages "kwallet-pam" {
+          pkgsText = "pkgs.plasma5Packages";
+        };
       };
+
       sssdStrictAccess = mkOption {
         default = false;
         type = types.bool;
@@ -686,7 +697,7 @@ let
             (config.security.pam.enableEcryptfs
               || config.security.pam.enableFscrypt
               || cfg.pamMount
-              || cfg.enableKwallet
+              || cfg.kwallet.enable
               || cfg.enableGnomeKeyring
               || config.services.intune.enable
               || cfg.googleAuthenticator.enable
@@ -711,9 +722,7 @@ let
               { name = "mount"; enable = cfg.pamMount; control = "optional"; modulePath = "${pkgs.pam_mount}/lib/security/pam_mount.so"; settings = {
                 disable_interactive = true;
               }; }
-              { name = "kwallet5"; enable = cfg.enableKwallet; control = "optional"; modulePath = "${pkgs.plasma5Packages.kwallet-pam}/lib/security/pam_kwallet5.so"; settings = {
-                kwalletd = "${pkgs.plasma5Packages.kwallet.bin}/bin/kwalletd5";
-              }; }
+              { name = "kwallet"; enable = cfg.kwallet.enable; control = "optional"; modulePath = "${cfg.kwallet.package}/lib/security/pam_kwallet5.so"; }
               { name = "gnome_keyring"; enable = cfg.enableGnomeKeyring; control = "optional"; modulePath = "${pkgs.gnome.gnome-keyring}/lib/security/pam_gnome_keyring.so"; }
               { name = "intune"; enable = config.services.intune.enable; control = "optional"; modulePath = "${pkgs.intune-portal}/lib/security/pam_intune.so"; }
               { name = "gnupg"; enable = cfg.gnupg.enable; control = "optional"; modulePath = "${pkgs.pam_gnupg}/lib/security/pam_gnupg.so"; settings = {
@@ -848,9 +857,7 @@ let
             order = "user,group,default";
             debug = true;
           }; }
-          { name = "kwallet5"; enable = cfg.enableKwallet; control = "optional"; modulePath = "${pkgs.plasma5Packages.kwallet-pam}/lib/security/pam_kwallet5.so"; settings = {
-            kwalletd = "${pkgs.plasma5Packages.kwallet.bin}/bin/kwalletd5";
-          }; }
+          { name = "kwallet"; enable = cfg.kwallet.enable; control = "optional"; modulePath = "${cfg.kwallet.package}/lib/security/pam_kwallet5.so"; }
           { name = "gnome_keyring"; enable = cfg.enableGnomeKeyring; control = "optional"; modulePath = "${pkgs.gnome.gnome-keyring}/lib/security/pam_gnome_keyring.so"; settings = {
             auto_start = true;
           }; }
diff --git a/nixos/modules/services/desktops/pipewire/wireplumber.nix b/nixos/modules/services/desktops/pipewire/wireplumber.nix
index 0d3545ae7b4b..99aea8facb16 100644
--- a/nixos/modules/services/desktops/pipewire/wireplumber.nix
+++ b/nixos/modules/services/desktops/pipewire/wireplumber.nix
@@ -56,13 +56,13 @@ in
         -- PipeWire is not used for audio, so prevent it from grabbing audio devices
         alsa_monitor.enable = function() end
       '';
-      systemwideConfigPkg = pkgs.writeTextDir "wireplumber/main.lua.d/80-systemwide.lua" ''
+      systemwideConfigPkg = pkgs.writeTextDir "share/wireplumber/main.lua.d/80-systemwide.lua" ''
         -- When running system-wide, these settings need to be disabled (they
         -- use functions that aren't available on the system dbus).
         alsa_monitor.properties["alsa.reserve"] = false
         default_access.properties["enable-flatpak-portal"] = false
       '';
-      systemwideBluetoothConfigPkg = pkgs.writeTextDir "wireplumber/bluetooth.lua.d/80-systemwide.lua" ''
+      systemwideBluetoothConfigPkg = pkgs.writeTextDir "share/wireplumber/bluetooth.lua.d/80-systemwide.lua" ''
         -- When running system-wide, logind-integration needs to be disabled.
         bluez_monitor.properties["with-logind"] = false
       '';
diff --git a/nixos/modules/services/misc/ollama.nix b/nixos/modules/services/misc/ollama.nix
index 7784f3170cef..3ac3beb4de07 100644
--- a/nixos/modules/services/misc/ollama.nix
+++ b/nixos/modules/services/misc/ollama.nix
@@ -5,7 +5,7 @@ let
   cfg = config.services.ollama;
   ollamaPackage = cfg.package.override {
     inherit (cfg) acceleration;
-    linuxPackages = config.boot.kernelPackages.overrideAttrs {
+    linuxPackages = config.boot.kernelPackages // {
       nvidia_x11 = config.hardware.nvidia.package;
     };
   };
diff --git a/nixos/modules/services/x11/desktop-managers/default.nix b/nixos/modules/services/x11/desktop-managers/default.nix
index 66cb4ee29c0a..ecb8d1e91bde 100644
--- a/nixos/modules/services/x11/desktop-managers/default.nix
+++ b/nixos/modules/services/x11/desktop-managers/default.nix
@@ -18,7 +18,7 @@ in
   # determines the default: later modules (if enabled) are preferred.
   # E.g., if Plasma 5 is enabled, it supersedes xterm.
   imports = [
-    ./none.nix ./xterm.nix ./phosh.nix ./xfce.nix ./plasma5.nix ./lumina.nix
+    ./none.nix ./xterm.nix ./phosh.nix ./xfce.nix ./plasma5.nix ./plasma6.nix ./lumina.nix
     ./lxqt.nix ./enlightenment.nix ./gnome.nix ./retroarch.nix ./kodi.nix
     ./mate.nix ./pantheon.nix ./surf-display.nix ./cde.nix
     ./cinnamon.nix ./budgie.nix ./deepin.nix
diff --git a/nixos/modules/services/x11/desktop-managers/plasma5.nix b/nixos/modules/services/x11/desktop-managers/plasma5.nix
index 0eb492ce4684..7645b3070369 100644
--- a/nixos/modules/services/x11/desktop-managers/plasma5.nix
+++ b/nixos/modules/services/x11/desktop-managers/plasma5.nix
@@ -362,7 +362,7 @@ in
 
       security.pam.services.kde = { allowNullPassword = true; };
 
-      security.pam.services.login.enableKwallet = true;
+      security.pam.services.login.kwallet.enable = true;
 
       systemd.user.services = {
         plasma-early-setup = mkIf cfg.runUsingSystemd {
diff --git a/nixos/modules/services/x11/desktop-managers/plasma6.nix b/nixos/modules/services/x11/desktop-managers/plasma6.nix
new file mode 100644
index 000000000000..bc246b1af278
--- /dev/null
+++ b/nixos/modules/services/x11/desktop-managers/plasma6.nix
@@ -0,0 +1,276 @@
+{
+  config,
+  lib,
+  pkgs,
+  utils,
+  ...
+}: let
+  xcfg = config.services.xserver;
+  cfg = xcfg.desktopManager.plasma6;
+
+  inherit (pkgs) kdePackages;
+  inherit (lib) literalExpression mkDefault mkIf mkOption mkPackageOptionMD types;
+in {
+  options = {
+    services.xserver.desktopManager.plasma6 = {
+      enable = mkOption {
+        type = types.bool;
+        default = false;
+        description = lib.mdDoc "Enable the Plasma 6 (KDE 6) desktop environment.";
+      };
+
+      enableQt5Integration = mkOption {
+        type = types.bool;
+        default = true;
+        description = lib.mdDoc "Enable Qt 5 integration (theming, etc). Disable for a pure Qt 6 system.";
+      };
+
+      notoPackage = mkPackageOptionMD pkgs "Noto fonts - used for UI by default" {
+        default = ["noto-fonts"];
+        example = "noto-fonts-lgc-plus";
+      };
+    };
+
+    environment.plasma6.excludePackages = mkOption {
+      description = lib.mdDoc "List of default packages to exclude from the configuration";
+      type = types.listOf types.package;
+      default = [];
+      example = literalExpression "[ pkgs.kdePackages.elisa ]";
+    };
+  };
+
+  config = mkIf cfg.enable {
+    assertions = [
+      {
+        assertion = cfg.enable -> !config.services.xserver.desktopManager.plasma5.enable;
+        message = "Cannot enable plasma5 and plasma6 at the same time!";
+      }
+    ];
+
+    qt.enable = true;
+    environment.systemPackages = with kdePackages; let
+      requiredPackages = [
+        # Hack? To make everything run on Wayland
+        qtwayland
+        # Needed to render SVG icons
+        qtsvg
+
+        # Frameworks with globally loadable bits
+        frameworkintegration # provides Qt plugin
+        kauth # provides helper service
+        kcoreaddons # provides extra mime type info
+        kded # provides helper service
+        kfilemetadata # provides Qt plugins
+        kguiaddons # provides geo URL handlers
+        kiconthemes # provides Qt plugins
+        kimageformats # provides Qt plugins
+        kio # provides helper service + a bunch of other stuff
+        kpackage # provides kpackagetool tool
+        kservice # provides kbuildsycoca6 tool
+        kwallet # provides helper service
+        kwallet-pam # provides helper service
+        kwalletmanager # provides KCMs and stuff
+        plasma-activities # provides plasma-activities-cli tool
+        solid # provides solid-hardware6 tool
+        phonon-vlc # provides Phonon plugin
+
+        # Core Plasma parts
+        kwin
+        pkgs.xwayland
+
+        kscreen
+        libkscreen
+
+        kscreenlocker
+
+        kactivitymanagerd
+        kde-cli-tools
+        kglobalacceld
+        kwrited # wall message proxy, not to be confused with kwrite
+
+        milou
+        polkit-kde-agent-1
+
+        plasma-desktop
+        plasma-workspace
+
+        # Crash handler
+        drkonqi
+
+        # Application integration
+        libplasma # provides Kirigami platform theme
+        plasma-integration # provides Qt platform theme
+        kde-gtk-config
+
+        # Artwork + themes
+        breeze
+        breeze-icons
+        breeze-gtk
+        ocean-sound-theme
+        plasma-workspace-wallpapers
+        pkgs.hicolor-icon-theme # fallback icons
+        qqc2-breeze-style
+        qqc2-desktop-style
+
+        # misc Plasma extras
+        kdeplasma-addons
+
+        pkgs.xdg-user-dirs # recommended upstream
+
+        # Plasma utilities
+        kmenuedit
+
+        kinfocenter
+        plasma-systemmonitor
+        ksystemstats
+        libksysguard
+
+        spectacle
+        systemsettings
+
+        # Gear
+        baloo
+        dolphin
+        dolphin-plugins
+        ffmpegthumbs
+        kdegraphics-thumbnailers
+        kde-inotify-survey
+        kio-admin
+        kio-extras
+        kio-fuse
+      ];
+      optionalPackages = [
+        plasma-browser-integration
+        konsole
+        (lib.getBin qttools) # Expose qdbus in PATH
+
+        ark
+        elisa
+        gwenview
+        okular
+        kate
+        khelpcenter
+        print-manager
+      ];
+    in
+      requiredPackages
+      ++ utils.removePackagesByName optionalPackages config.environment.plasma6.excludePackages
+      ++ lib.optionals config.services.xserver.desktopManager.plasma6.enableQt5Integration [
+        breeze.qt5
+        plasma-integration.qt5
+        pkgs.plasma5Packages.kwayland-integration
+        kio-extras-kf5
+      ]
+      # Optional hardware support features
+      ++ lib.optionals config.hardware.bluetooth.enable [bluedevil bluez-qt pkgs.openobex pkgs.obexftp]
+      ++ lib.optional config.networking.networkmanager.enable plasma-nm
+      ++ lib.optional config.hardware.pulseaudio.enable plasma-pa
+      ++ lib.optional config.services.pipewire.pulse.enable plasma-pa
+      ++ lib.optional config.powerManagement.enable powerdevil
+      ++ lib.optional config.services.colord.enable colord-kde
+      ++ lib.optional config.services.hardware.bolt.enable plasma-thunderbolt
+      ++ lib.optionals config.services.samba.enable [kdenetwork-filesharing pkgs.samba]
+      ++ lib.optional config.services.xserver.wacom.enable wacomtablet
+      ++ lib.optional config.services.flatpak.enable flatpak-kcm;
+
+    environment.pathsToLink = [
+      # FIXME: modules should link subdirs of `/share` rather than relying on this
+      "/share"
+      "/libexec" # for drkonqi
+    ];
+
+    environment.etc."X11/xkb".source = xcfg.xkb.dir;
+
+    # Add ~/.config/kdedefaults to XDG_CONFIG_DIRS for shells, since Plasma sets that.
+    # FIXME: maybe we should append to XDG_CONFIG_DIRS in /etc/set-environment instead?
+    environment.sessionVariables.XDG_CONFIG_DIRS = ["$HOME/.config/kdedefaults"];
+
+    # Needed for things that depend on other store.kde.org packages to install correctly,
+    # notably Plasma look-and-feel packages (a.k.a. Global Themes)
+    #
+    # FIXME: this is annoyingly impure and should really be fixed at source level somehow,
+    # but kpackage is a library so we can't just wrap the one thing invoking it and be done.
+    # This also means things won't work for people not on Plasma, but at least this way it
+    # works for SOME people.
+    environment.sessionVariables.KPACKAGE_DEP_RESOLVERS_PATH = "${kdePackages.frameworkintegration.out}/libexec/kf6/kpackagehandlers";
+
+    # Enable GTK applications to load SVG icons
+    services.xserver.gdk-pixbuf.modulePackages = [pkgs.librsvg];
+
+    fonts.packages = [cfg.notoPackage pkgs.hack-font];
+    fonts.fontconfig.defaultFonts = {
+      monospace = ["Hack" "Noto Sans Mono"];
+      sansSerif = ["Noto Sans"];
+      serif = ["Noto Serif"];
+    };
+
+    programs.ssh.askPassword = mkDefault "${kdePackages.ksshaskpass.out}/bin/ksshaskpass";
+
+    # Enable helpful DBus services.
+    services.accounts-daemon.enable = true;
+    # when changing an account picture the accounts-daemon reads a temporary file containing the image which systemsettings5 may place under /tmp
+    systemd.services.accounts-daemon.serviceConfig.PrivateTmp = false;
+
+    services.power-profiles-daemon.enable = mkDefault true;
+    services.system-config-printer.enable = mkIf config.services.printing.enable (mkDefault true);
+    services.udisks2.enable = true;
+    services.upower.enable = config.powerManagement.enable;
+    services.xserver.libinput.enable = mkDefault true;
+
+    # Extra UDEV rules used by Solid
+    services.udev.packages = [
+      # libmtp has "bin", "dev", "out" outputs. UDEV rules file is in "out".
+      pkgs.libmtp.out
+      pkgs.media-player-info
+    ];
+
+    # Set up Dr. Konqi as crash handler
+    systemd.packages = [kdePackages.drkonqi];
+    systemd.services."drkonqi-coredump-processor@".wantedBy = ["systemd-coredump@.service"];
+
+    xdg.portal.enable = true;
+    xdg.portal.extraPortals = [kdePackages.xdg-desktop-portal-kde];
+    xdg.portal.configPackages = mkDefault [kdePackages.xdg-desktop-portal-kde];
+    services.pipewire.enable = mkDefault true;
+
+    services.xserver.displayManager = {
+      sessionPackages = [kdePackages.plasma-workspace];
+      defaultSession = mkDefault "plasma";
+    };
+    services.xserver.displayManager.sddm = {
+      package = kdePackages.sddm;
+      theme = mkDefault "breeze";
+      extraPackages = with kdePackages; [
+        breeze-icons
+        kirigami
+        plasma5support
+        qtsvg
+        qtvirtualkeyboard
+      ];
+    };
+
+    security.pam.services = {
+      login.kwallet = {
+        enable = true;
+        package = kdePackages.kwallet-pam;
+      };
+      kde.kwallet = {
+        enable = true;
+        package = kdePackages.kwallet-pam;
+      };
+      kde-fingerprint = lib.mkIf config.services.fprintd.enable { fprintAuth = true; };
+      kde-smartcard = lib.mkIf config.security.pam.p11.enable { p11Auth = true; };
+    };
+
+    programs.dconf.enable = true;
+
+    programs.firefox.nativeMessagingHosts.packages = [kdePackages.plasma-browser-integration];
+
+    programs.chromium = {
+      enablePlasmaBrowserIntegration = true;
+      plasmaBrowserIntegrationPackage = pkgs.kdePackages.plasma-browser-integration;
+    };
+
+    programs.kdeconnect.package = kdePackages.kdeconnect-kde;
+  };
+}
diff --git a/nixos/modules/services/x11/display-managers/sddm.nix b/nixos/modules/services/x11/display-managers/sddm.nix
index 0576619cc8d2..5b7f4bc58d80 100644
--- a/nixos/modules/services/x11/display-managers/sddm.nix
+++ b/nixos/modules/services/x11/display-managers/sddm.nix
@@ -7,7 +7,10 @@ let
   cfg = dmcfg.sddm;
   xEnv = config.systemd.services.display-manager.environment;
 
-  sddm = cfg.package;
+  sddm = cfg.package.override(old: {
+    withWayland = cfg.wayland.enable;
+    extraPackages = old.extraPackages or [] ++ cfg.extraPackages;
+  });
 
   iniFmt = pkgs.formats.ini { };
 
@@ -140,6 +143,15 @@ in
         '';
       };
 
+      extraPackages = mkOption {
+        type = types.listOf types.package;
+        default = [];
+        defaultText = "[]";
+        description = lib.mdDoc ''
+          Extra Qt plugins / QML libraries to add to the environment.
+        '';
+      };
+
       autoNumlock = mkOption {
         type = types.bool;
         default = false;
@@ -211,7 +223,7 @@ in
                 keymap_variant = xcfg.xkb.variant;
                 keymap_options = xcfg.xkb.options;
               };
-            }; in "${pkgs.weston}/bin/weston --shell=fullscreen-shell.so -c ${westonIni}";
+            }; in "${pkgs.weston}/bin/weston --shell=kiosk -c ${westonIni}";
           description = lib.mdDoc "Command used to start the selected compositor";
         };
       };
@@ -235,15 +247,7 @@ in
       }
     ];
 
-    services.xserver.displayManager.job = {
-      environment = {
-        # Load themes from system environment
-        QT_PLUGIN_PATH = "/run/current-system/sw/" + pkgs.qt5.qtbase.qtPluginPrefix;
-        QML2_IMPORT_PATH = "/run/current-system/sw/" + pkgs.qt5.qtbase.qtQmlPrefix;
-      };
-
-      execCmd = "exec /run/current-system/sw/bin/sddm";
-    };
+    services.xserver.displayManager.job.execCmd = "exec /run/current-system/sw/bin/sddm";
 
     security.pam.services = {
       sddm.text = ''
diff --git a/nixos/modules/system/boot/systemd/coredump.nix b/nixos/modules/system/boot/systemd/coredump.nix
index 03ef00e5683c..271d8f86d0e6 100644
--- a/nixos/modules/system/boot/systemd/coredump.nix
+++ b/nixos/modules/system/boot/systemd/coredump.nix
@@ -52,7 +52,7 @@ in {
           # See: https://github.com/NixOS/nixpkgs/issues/213408
           pkgs.substitute {
             src = "${systemd}/example/sysctl.d/50-coredump.conf";
-            replacements = [
+            substitutions = [
               "--replace"
               "${systemd}"
               "${pkgs.symlinkJoin { name = "systemd"; paths = [ systemd ]; }}"
diff --git a/nixos/release.nix b/nixos/release.nix
index 2acc5ade7848..ff60b0b79f6d 100644
--- a/nixos/release.nix
+++ b/nixos/release.nix
@@ -177,6 +177,12 @@ in rec {
     inherit system;
   });
 
+  iso_plasma6 = forMatchingSystems supportedSystems (system: makeIso {
+    module = ./modules/installer/cd-dvd/installation-cd-graphical-calamares-plasma6.nix;
+    type = "plasma6";
+    inherit system;
+  });
+
   iso_gnome = forMatchingSystems supportedSystems (system: makeIso {
     module = ./modules/installer/cd-dvd/installation-cd-graphical-calamares-gnome.nix;
     type = "gnome";
diff --git a/nixos/tests/all-tests.nix b/nixos/tests/all-tests.nix
index a5991abbfc88..e9d3e9935c9a 100644
--- a/nixos/tests/all-tests.nix
+++ b/nixos/tests/all-tests.nix
@@ -695,6 +695,7 @@ in {
   plantuml-server = handleTest ./plantuml-server.nix {};
   plasma-bigscreen = handleTest ./plasma-bigscreen.nix {};
   plasma5 = handleTest ./plasma5.nix {};
+  plasma6 = handleTest ./plasma6.nix {};
   plasma5-systemd-start = handleTest ./plasma5-systemd-start.nix {};
   plausible = handleTest ./plausible.nix {};
   please = handleTest ./please.nix {};
diff --git a/nixos/tests/consul.nix b/nixos/tests/consul.nix
index 6233234ff083..c819312068dc 100644
--- a/nixos/tests/consul.nix
+++ b/nixos/tests/consul.nix
@@ -42,6 +42,8 @@ let
         ];
         networking.firewall = firewallSettings;
 
+        nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [ "consul" ];
+
         services.consul = {
           enable = true;
           inherit webUi;
@@ -65,6 +67,8 @@ let
         ];
         networking.firewall = firewallSettings;
 
+        nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [ "consul" ];
+
         services.consul =
           assert builtins.elem thisConsensusServerHost allConsensusServerHosts;
           {
diff --git a/nixos/tests/incus/container.nix b/nixos/tests/incus/container.nix
index 0f42d16f133d..eb00429e53fe 100644
--- a/nixos/tests/incus/container.nix
+++ b/nixos/tests/incus/container.nix
@@ -5,6 +5,8 @@ let
     configuration = {
       # Building documentation makes the test unnecessarily take a longer time:
       documentation.enable = lib.mkForce false;
+
+      boot.kernel.sysctl."net.ipv4.ip_forward" = "1";
     } // extra;
   };
 
@@ -40,6 +42,12 @@ in
         with machine.nested("Waiting for instance to start and be usable"):
           retry(instance_is_up)
 
+    def check_sysctl(instance):
+        with subtest("systemd sysctl settings are applied"):
+            machine.succeed(f"incus exec {instance} -- systemctl status systemd-sysctl")
+            sysctl = machine.succeed(f"incus exec {instance} -- sysctl net.ipv4.ip_forward").strip().split(" ")[-1]
+            assert "1" == sysctl, f"systemd-sysctl configuration not correctly applied, {sysctl} != 1"
+
     machine.wait_for_unit("incus.service")
 
     # no preseed should mean no service
@@ -83,6 +91,7 @@ in
     with subtest("lxc-container generator configures plain container"):
         # reuse the existing container to save some time
         machine.succeed("incus exec container test -- -e /run/systemd/system/service.d/zzz-lxc-service.conf")
+        check_sysctl("container")
 
     with subtest("lxc-container generator configures nested container"):
         machine.execute("incus delete --force container")
@@ -94,6 +103,8 @@ in
         target = machine.succeed("incus exec container readlink -- -f /run/systemd/system/systemd-binfmt.service").strip()
         assert target == "/dev/null", "lxc generator did not correctly mask /run/systemd/system/systemd-binfmt.service"
 
+        check_sysctl("container")
+
     with subtest("lxc-container generator configures privileged container"):
         machine.execute("incus delete --force container")
         machine.succeed("incus launch nixos container --config security.privileged=true")
@@ -101,5 +112,7 @@ in
           retry(instance_is_up)
 
         machine.succeed("incus exec container test -- -e /run/systemd/system/service.d/zzz-lxc-service.conf")
+
+        check_sysctl("container")
   '';
 })
diff --git a/nixos/tests/plasma6.nix b/nixos/tests/plasma6.nix
new file mode 100644
index 000000000000..ec5b3f24ef74
--- /dev/null
+++ b/nixos/tests/plasma6.nix
@@ -0,0 +1,64 @@
+import ./make-test-python.nix ({ pkgs, ...} :
+
+{
+  name = "plasma6";
+  meta = with pkgs.lib.maintainers; {
+    maintainers = [ k900 ];
+  };
+
+  nodes.machine = { ... }:
+
+  {
+    imports = [ ./common/user-account.nix ];
+    services.xserver.enable = true;
+    services.xserver.displayManager.sddm.enable = true;
+    # FIXME: this should be testing Wayland
+    services.xserver.displayManager.defaultSession = "plasmax11";
+    services.xserver.desktopManager.plasma6.enable = true;
+    environment.plasma6.excludePackages = [ pkgs.kdePackages.elisa ];
+    services.xserver.displayManager.autoLogin = {
+      enable = true;
+      user = "alice";
+    };
+  };
+
+  testScript = { nodes, ... }: let
+    user = nodes.machine.users.users.alice;
+    xdo = "${pkgs.xdotool}/bin/xdotool";
+  in ''
+    with subtest("Wait for login"):
+        start_all()
+        machine.wait_for_file("/tmp/xauth_*")
+        machine.succeed("xauth merge /tmp/xauth_*")
+
+    with subtest("Check plasmashell started"):
+        machine.wait_until_succeeds("pgrep plasmashell")
+        machine.wait_for_window("^Desktop ")
+
+    with subtest("Check that KDED is running"):
+        machine.succeed("pgrep kded6")
+
+    with subtest("Ensure Elisa is not installed"):
+        machine.fail("which elisa")
+
+    machine.succeed("su - ${user.name} -c 'xauth merge /tmp/xauth_*'")
+
+    with subtest("Run Dolphin"):
+        machine.execute("su - ${user.name} -c 'DISPLAY=:0.0 dolphin >&2 &'")
+        machine.wait_for_window(" Dolphin")
+
+    with subtest("Run Konsole"):
+        machine.execute("su - ${user.name} -c 'DISPLAY=:0.0 konsole >&2 &'")
+        machine.wait_for_window("Konsole")
+
+    with subtest("Run systemsettings"):
+        machine.execute("su - ${user.name} -c 'DISPLAY=:0.0 systemsettings >&2 &'")
+        machine.wait_for_window("Settings")
+
+    with subtest("Wait to get a screenshot"):
+        machine.execute(
+            "${xdo} key Alt+F1 sleep 10"
+        )
+        machine.screenshot("screen")
+  '';
+})
diff --git a/pkgs/applications/audio/mopidy/spotify.nix b/pkgs/applications/audio/mopidy/spotify.nix
index 474088572883..58b5f852a4c9 100644
--- a/pkgs/applications/audio/mopidy/spotify.nix
+++ b/pkgs/applications/audio/mopidy/spotify.nix
@@ -2,13 +2,13 @@
 
 pythonPackages.buildPythonApplication rec {
   pname = "mopidy-spotify";
-  version = "unstable-2024-02-11";
+  version = "unstable-2024-02-27";
 
   src = fetchFromGitHub {
     owner = "mopidy";
     repo = "mopidy-spotify";
-    rev = "fc6ffb3bbbae9224316e2a888db08ef56608966a";
-    hash = "sha256-V1SW8OyuBKLbUoQ4O5iiS4mq3MOXidcVKpiw125vxjQ=";
+    rev = "112d4abbb3f5b6477dab796f2824fa42196bfa0a";
+    hash = "sha256-RkXDzAbOOll3uCNZ2mFRnjqMkT/NkXOGjywLRTC9i60=";
   };
 
   propagatedBuildInputs = [
diff --git a/pkgs/applications/audio/squeezelite/default.nix b/pkgs/applications/audio/squeezelite/default.nix
index 58261e4a9fcc..3fd633506b2d 100644
--- a/pkgs/applications/audio/squeezelite/default.nix
+++ b/pkgs/applications/audio/squeezelite/default.nix
@@ -45,13 +45,13 @@ stdenv.mkDerivation {
   pname = binName;
   # versions are specified in `squeezelite.h`
   # see https://github.com/ralph-irving/squeezelite/issues/29
-  version = "2.0.0.1465";
+  version = "2.0.0.1468";
 
   src = fetchFromGitHub {
     owner = "ralph-irving";
     repo = "squeezelite";
-    rev = "6de9e229aa4cc7c3131ff855f3ead39581127090";
-    hash = "sha256-qSRmiX1+hbsWQsU9cRQ7QRkdXs5Q6aE7n7lxZsx8+Hs=";
+    rev = "fd89d67b1b9a17a6dd212be0c91d0417b440f60a";
+    hash = "sha256-wYVRlv+Y1jvdAGlj2zXKUhQBwWX9pGgNX6U71PsfySg=";
   };
 
   buildInputs = [ flac libmad libvorbis mpg123 ]
diff --git a/pkgs/applications/blockchains/clightning/default.nix b/pkgs/applications/blockchains/clightning/default.nix
index 9b0e069bef58..823c0a158d6d 100644
--- a/pkgs/applications/blockchains/clightning/default.nix
+++ b/pkgs/applications/blockchains/clightning/default.nix
@@ -22,11 +22,11 @@ let
 in
 stdenv.mkDerivation rec {
   pname = "clightning";
-  version = "23.11.2";
+  version = "24.02";
 
   src = fetchurl {
     url = "https://github.com/ElementsProject/lightning/releases/download/v${version}/clightning-v${version}.zip";
-    sha256 = "sha256-n1+9Q493N/N5sr7sVpzhObtbKpEejsNUUhhbYPukveg=";
+    sha256 = "sha256-hud6NU2apAJNf2epNk+3nwTUmRy5DfNOYiGp402H4ik=";
   };
 
   # when building on darwin we need dawin.cctools to provide the correct libtool
diff --git a/pkgs/applications/display-managers/lightdm/gtk-greeter.nix b/pkgs/applications/display-managers/lightdm/gtk-greeter.nix
index 1a949c4dc0a3..4ceeeb9f6b5d 100644
--- a/pkgs/applications/display-managers/lightdm/gtk-greeter.nix
+++ b/pkgs/applications/display-managers/lightdm/gtk-greeter.nix
@@ -16,12 +16,12 @@
 
 stdenv.mkDerivation rec {
   pname = "lightdm-gtk-greeter";
-  version = "2.0.8";
+  version = "2.0.9";
 
   src = fetchurl {
     # Release tarball differs from source tarball.
     url = "https://github.com/Xubuntu/lightdm-gtk-greeter/releases/download/lightdm-gtk-greeter-${version}/lightdm-gtk-greeter-${version}.tar.gz";
-    sha256 = "vvuzAMezT/IYZf28iBIB9zD8fFYOngHRfomelHcVBhM=";
+    hash = "sha256-yP3xmKqaP50NrQtI3+I8Ine3kQfo/PxillKQ8QgfZF0=";
   };
 
   nativeBuildInputs = [
@@ -56,7 +56,7 @@ stdenv.mkDerivation rec {
 
   postInstall = ''
     substituteInPlace "$out/share/xgreeters/lightdm-gtk-greeter.desktop" \
-      --replace "Exec=lightdm-gtk-greeter" "Exec=$out/bin/lightdm-gtk-greeter"
+      --replace-fail "Exec=lightdm-gtk-greeter" "Exec=$out/bin/lightdm-gtk-greeter"
   '';
 
   passthru.xgreeters = linkFarm "lightdm-gtk-greeter-xgreeters" [{
diff --git a/pkgs/applications/display-managers/sddm/default.nix b/pkgs/applications/display-managers/sddm/default.nix
index 8c7e1745bcd3..2708ff060814 100644
--- a/pkgs/applications/display-managers/sddm/default.nix
+++ b/pkgs/applications/display-managers/sddm/default.nix
@@ -1,82 +1,37 @@
-{ stdenv, lib, fetchFromGitHub
-, cmake, pkg-config, qttools
-, libxcb, libXau, pam, qtbase, wrapQtAppsHook, qtdeclarative
-, qtquickcontrols2 ? null, systemd, xkeyboardconfig
+{
+  lib,
+  callPackage,
+  runCommand,
+  qtwayland,
+  wrapQtAppsHook,
+  unwrapped ? callPackage ./unwrapped.nix {},
+  withWayland ? false,
+  extraPackages ? [],
 }:
-let
-  isQt6 = lib.versions.major qtbase.version == "6";
-in stdenv.mkDerivation {
-  pname = "sddm";
-  version = "0.20.0-unstable-2023-12-29";
+runCommand "sddm-wrapped" {
+  inherit (unwrapped) version;
 
-  src = fetchFromGitHub {
-    owner = "sddm";
-    repo = "sddm";
-    rev = "501129294be1487f753482c29949fc1c19ef340e";
-    hash = "sha256-mLm987Ah0X9s0tBK2a45iERwYoh5JzWb3TFlSoxi8CA=";
-  };
-
-  patches = [
-    ./sddm-ignore-config-mtime.patch
-    ./sddm-default-session.patch
-  ];
-
-  postPatch = ''
-    substituteInPlace src/greeter/waylandkeyboardbackend.cpp \
-      --replace "/usr/share/X11/xkb/rules/evdev.xml" "${xkeyboardconfig}/share/X11/xkb/rules/evdev.xml"
-  '';
-
-  nativeBuildInputs = [ wrapQtAppsHook cmake pkg-config qttools ];
+  buildInputs = unwrapped.buildInputs ++ extraPackages ++ lib.optional withWayland qtwayland;
+  nativeBuildInputs = [ wrapQtAppsHook ];
 
-  buildInputs = [
-    libxcb
-    libXau
-    pam
-    qtbase
-    qtdeclarative
-    qtquickcontrols2
-    systemd
-  ];
-
-  cmakeFlags = [
-    (lib.cmakeBool "BUILD_WITH_QT6" isQt6)
-    "-DCONFIG_FILE=/etc/sddm.conf"
-    "-DCONFIG_DIR=/etc/sddm.conf.d"
-
-    # Set UID_MIN and UID_MAX so that the build script won't try
-    # to read them from /etc/login.defs (fails in chroot).
-    # The values come from NixOS; they may not be appropriate
-    # for running SDDM outside NixOS, but that configuration is
-    # not supported anyway.
-    "-DUID_MIN=1000"
-    "-DUID_MAX=29999"
+  passthru = {
+    inherit unwrapped;
+  };
 
-    # we still want to run the DM on VT 7 for the time being, as 1-6 are
-    # occupied by getties by default
-    "-DSDDM_INITIAL_VT=7"
+  meta = unwrapped.meta;
+} ''
+  mkdir -p $out/bin
 
-    "-DQT_IMPORTS_DIR=${placeholder "out"}/${qtbase.qtQmlPrefix}"
-    "-DCMAKE_INSTALL_SYSCONFDIR=${placeholder "out"}/etc"
-    "-DSYSTEMD_SYSTEM_UNIT_DIR=${placeholder "out"}/lib/systemd/system"
-    "-DSYSTEMD_SYSUSERS_DIR=${placeholder "out"}/lib/sysusers.d"
-    "-DSYSTEMD_TMPFILES_DIR=${placeholder "out"}/lib/tmpfiles.d"
-    "-DDBUS_CONFIG_DIR=${placeholder "out"}/share/dbus-1/system.d"
-  ];
+  cd ${unwrapped}
 
-  postInstall = ''
-    # remove empty scripts
-    rm "$out/share/sddm/scripts/Xsetup" "$out/share/sddm/scripts/Xstop"
-    for f in $out/share/sddm/themes/**/theme.conf ; do
-      substituteInPlace $f \
-        --replace 'background=' "background=$(dirname $f)/"
-    done
-  '';
+  for i in *; do
+    if [ "$i" == "bin" ]; then
+      continue
+    fi
+    ln -s ${unwrapped}/$i $out/$i
+  done
 
-  meta = with lib; {
-    description = "QML based X11 display manager";
-    homepage    = "https://github.com/sddm/sddm";
-    maintainers = with maintainers; [ abbradar ttuegel ];
-    platforms   = platforms.linux;
-    license     = licenses.gpl2Plus;
-  };
-}
+  for i in bin/*; do
+    makeQtWrapper ${unwrapped}/$i $out/$i --set SDDM_GREETER_DIR $out/bin
+  done
+''
diff --git a/pkgs/applications/display-managers/sddm/greeter-path.patch b/pkgs/applications/display-managers/sddm/greeter-path.patch
new file mode 100644
index 000000000000..b314108952a9
--- /dev/null
+++ b/pkgs/applications/display-managers/sddm/greeter-path.patch
@@ -0,0 +1,14 @@
+diff --git a/src/daemon/Greeter.cpp b/src/daemon/Greeter.cpp
+index 07fccde..dd22a07 100644
+--- a/src/daemon/Greeter.cpp
++++ b/src/daemon/Greeter.cpp
+@@ -83,7 +83,8 @@ namespace SDDM {
+     QString Greeter::greeterPathForQt(int qtVersion)
+     {
+         const QString suffix = qtVersion == 5 ? QString() : QStringLiteral("-qt%1").arg(qtVersion);
+-        return QStringLiteral(BIN_INSTALL_DIR "/sddm-greeter%1").arg(suffix);
++        const QString greeterDir = qEnvironmentVariable("SDDM_GREETER_DIR", QStringLiteral(BIN_INSTALL_DIR));
++        return QStringLiteral("%1/sddm-greeter%2").arg(greeterDir).arg(suffix);
+     }
+ 
+     bool Greeter::start() {
diff --git a/pkgs/applications/display-managers/sddm/unwrapped.nix b/pkgs/applications/display-managers/sddm/unwrapped.nix
new file mode 100644
index 000000000000..430e62a5ef4a
--- /dev/null
+++ b/pkgs/applications/display-managers/sddm/unwrapped.nix
@@ -0,0 +1,86 @@
+{ stdenv, lib, fetchFromGitHub
+, cmake, pkg-config, qttools
+, libxcb, libXau, pam, qtbase, qtdeclarative
+, qtquickcontrols2 ? null, systemd, xkeyboardconfig
+}:
+let
+  isQt6 = lib.versions.major qtbase.version == "6";
+in stdenv.mkDerivation(finalAttrs: {
+  pname = "sddm-unwrapped";
+  version = "0.21.0";
+
+  src = fetchFromGitHub {
+    owner = "sddm";
+    repo = "sddm";
+    rev = "v${finalAttrs.version}";
+    hash = "sha256-r5mnEWham2WnoEqRh5tBj/6rn5mN62ENOCmsLv2Ht+w=";
+  };
+
+  patches = [
+    ./greeter-path.patch
+    ./sddm-ignore-config-mtime.patch
+    ./sddm-default-session.patch
+  ];
+
+  postPatch = ''
+    substituteInPlace src/greeter/waylandkeyboardbackend.cpp \
+      --replace "/usr/share/X11/xkb/rules/evdev.xml" "${xkeyboardconfig}/share/X11/xkb/rules/evdev.xml"
+  '';
+
+  nativeBuildInputs = [ cmake pkg-config qttools ];
+
+  buildInputs = [
+    libxcb
+    libXau
+    pam
+    qtbase
+    qtdeclarative
+    qtquickcontrols2
+    systemd
+  ];
+
+  # We will wrap manually later
+  dontWrapQtApps = true;
+
+  cmakeFlags = [
+    (lib.cmakeBool "BUILD_WITH_QT6" isQt6)
+    "-DCONFIG_FILE=/etc/sddm.conf"
+    "-DCONFIG_DIR=/etc/sddm.conf.d"
+
+    # Set UID_MIN and UID_MAX so that the build script won't try
+    # to read them from /etc/login.defs (fails in chroot).
+    # The values come from NixOS; they may not be appropriate
+    # for running SDDM outside NixOS, but that configuration is
+    # not supported anyway.
+    "-DUID_MIN=1000"
+    "-DUID_MAX=29999"
+
+    # we still want to run the DM on VT 7 for the time being, as 1-6 are
+    # occupied by getties by default
+    "-DSDDM_INITIAL_VT=7"
+
+    "-DQT_IMPORTS_DIR=${placeholder "out"}/${qtbase.qtQmlPrefix}"
+    "-DCMAKE_INSTALL_SYSCONFDIR=${placeholder "out"}/etc"
+    "-DSYSTEMD_SYSTEM_UNIT_DIR=${placeholder "out"}/lib/systemd/system"
+    "-DSYSTEMD_SYSUSERS_DIR=${placeholder "out"}/lib/sysusers.d"
+    "-DSYSTEMD_TMPFILES_DIR=${placeholder "out"}/lib/tmpfiles.d"
+    "-DDBUS_CONFIG_DIR=${placeholder "out"}/share/dbus-1/system.d"
+  ];
+
+  postInstall = ''
+    # remove empty scripts
+    rm "$out/share/sddm/scripts/Xsetup" "$out/share/sddm/scripts/Xstop"
+    for f in $out/share/sddm/themes/**/theme.conf ; do
+      substituteInPlace $f \
+        --replace 'background=' "background=$(dirname $f)/"
+    done
+  '';
+
+  meta = with lib; {
+    description = "QML based X11 display manager";
+    homepage    = "https://github.com/sddm/sddm";
+    maintainers = with maintainers; [ abbradar ttuegel k900 ];
+    platforms   = platforms.linux;
+    license     = licenses.gpl2Plus;
+  };
+})
diff --git a/pkgs/applications/editors/vscode/extensions/default.nix b/pkgs/applications/editors/vscode/extensions/default.nix
index 677abcfe9804..a1eeb57d9a4c 100644
--- a/pkgs/applications/editors/vscode/extensions/default.nix
+++ b/pkgs/applications/editors/vscode/extensions/default.nix
@@ -3928,8 +3928,8 @@ let
         mktplcRef = {
           name = "uiua-vscode";
           publisher = "uiua-lang";
-          version = "0.0.27";
-          sha256 = "sha256-wEY1FZjgiQJ7VrJGZX0SgZqz/14v//jxgrqdafLjIfM=";
+          version = "0.0.39";
+          sha256 = "sha256-B+p5bIwVhzWAdKQPCGPlImQihYCeTtYFTlkZIkgWayk=";
         };
         meta = {
           description = "VSCode language extension for Uiua";
diff --git a/pkgs/applications/emulators/mame/default.nix b/pkgs/applications/emulators/mame/default.nix
index c12135370d6c..e2ed7e5f9c70 100644
--- a/pkgs/applications/emulators/mame/default.nix
+++ b/pkgs/applications/emulators/mame/default.nix
@@ -38,14 +38,14 @@ let
 in
 stdenv.mkDerivation rec {
   pname = "mame";
-  version = "0.262";
+  version = "0.263";
   srcVersion = builtins.replaceStrings [ "." ] [ "" ] version;
 
   src = fetchFromGitHub {
     owner = "mamedev";
     repo = "mame";
     rev = "mame${srcVersion}";
-    hash = "sha256-avVHtnmKPUq+mMtxyaqSaGyrdsi5LXF1YS8JAb2QvBo=";
+    hash = "sha256-6MH4dMGOekiiq4yE68dIAiWWfvQvFcvqKtT/Z1SQ1aY=";
   };
 
   outputs = [ "out" "tools" ];
diff --git a/pkgs/applications/kde/default.nix b/pkgs/applications/kde/default.nix
index 3fd389471975..8e04700b83fd 100644
--- a/pkgs/applications/kde/default.nix
+++ b/pkgs/applications/kde/default.nix
@@ -13,7 +13,7 @@ IF YOUR PACKAGE IS NOT LISTED IN `./srcs.nix`, IT DOES NOT GO HERE.
 Many of the packages released upstream are not yet built in Nixpkgs due to lack
 of demand. To add a Nixpkgs build for an upstream package, copy one of the
 existing packages here and modify it as necessary. A simple example package that
-still shows most of the available features is in `./gwenview.nix`.
+still shows most of the available features is in `./gwenview`.
 
 # Updates
 
@@ -92,7 +92,7 @@ let
       ghostwriter = callPackage ./ghostwriter.nix {};
       granatier = callPackage ./granatier.nix {};
       grantleetheme = callPackage ./grantleetheme {};
-      gwenview = callPackage ./gwenview.nix {};
+      gwenview = callPackage ./gwenview {};
       incidenceeditor = callPackage ./incidenceeditor.nix {};
       itinerary = callPackage ./itinerary.nix {};
       juk = callPackage ./juk.nix {};
diff --git a/pkgs/applications/kde/gwenview.nix b/pkgs/applications/kde/gwenview/default.nix
index 2913f7a46455..d697778f4726 100644
--- a/pkgs/applications/kde/gwenview.nix
+++ b/pkgs/applications/kde/gwenview/default.nix
@@ -16,6 +16,10 @@ mkDerivation {
     maintainers = [ lib.maintainers.ttuegel ];
     mainProgram = "gwenview";
   };
+
+  # Fix build with versioned kImageAnnotator
+  patches = [./kimageannotator.patch];
+
   nativeBuildInputs = [ extra-cmake-modules kdoctools ];
   buildInputs = [
     baloo kactivities kio kitemmodels kparts libkdcraw libkipi phonon
diff --git a/pkgs/applications/kde/gwenview/kimageannotator.patch b/pkgs/applications/kde/gwenview/kimageannotator.patch
new file mode 100644
index 000000000000..83cba93e49c1
--- /dev/null
+++ b/pkgs/applications/kde/gwenview/kimageannotator.patch
@@ -0,0 +1,56 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 01db0fb1..06319c54 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -166,12 +166,12 @@ if(NOT WITHOUT_X11)
+ endif()
+ 
+ if (QT_MAJOR_VERSION STREQUAL "5")
+-    find_package(kImageAnnotator)
+-    set_package_properties(kImageAnnotator PROPERTIES URL "https://github.com/ksnip/kImageAnnotator" DESCRIPTION "The kImageAnnotator library provides tools to annotate" TYPE REQUIRED)
+-    if(kImageAnnotator_FOUND)
++    find_package(kImageAnnotator-Qt5)
++    set_package_properties(kImageAnnotator-Qt5 PROPERTIES URL "https://github.com/ksnip/kImageAnnotator" DESCRIPTION "The kImageAnnotator library provides tools to annotate" TYPE REQUIRED)
++    if(kImageAnnotator-Qt5_FOUND)
+         set(KIMAGEANNOTATOR_FOUND 1)
+-        find_package(kColorPicker REQUIRED)
+-        if(NOT kImageAnnotator_VERSION VERSION_LESS 0.5.0)
++        find_package(kColorPicker-Qt5 REQUIRED)
++        if(NOT kImageAnnotator-Qt5_VERSION VERSION_LESS 0.5.0)
+             set(KIMAGEANNOTATOR_CAN_LOAD_TRANSLATIONS 1)
+         endif()
+     endif()
+diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt
+index 8c136835..ef4cff74 100644
+--- a/app/CMakeLists.txt
++++ b/app/CMakeLists.txt
+@@ -157,6 +157,6 @@ target_link_libraries(slideshowfileitemaction
+     KF${QT_MAJOR_VERSION}::KIOWidgets
+     KF${QT_MAJOR_VERSION}::Notifications)
+ 
+-if(kImageAnnotator_FOUND)
++if(kImageAnnotator-Qt5_FOUND)
+     target_link_libraries(gwenview kImageAnnotator::kImageAnnotator)
+ endif()
+diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt
+index 05a2ea67..4167a1bb 100644
+--- a/lib/CMakeLists.txt
++++ b/lib/CMakeLists.txt
+@@ -157,7 +157,7 @@ set(gwenviewlib_SRCS
+     touch/touch_helper.cpp
+     ${GV_JPEG_DIR}/transupp.c
+     )
+-if (kImageAnnotator_FOUND)
++if (kImageAnnotator-Qt5_FOUND)
+     set(gwenviewlib_SRCS ${gwenviewlib_SRCS}
+         annotate/annotatedialog.cpp
+         annotate/annotateoperation.cpp
+@@ -338,7 +338,7 @@ if (GWENVIEW_SEMANTICINFO_BACKEND_BALOO)
+         )
+ endif()
+ 
+-if(kImageAnnotator_FOUND)
++if(kImageAnnotator-Qt5_FOUND)
+     target_link_libraries(gwenviewlib kImageAnnotator::kImageAnnotator)
+ endif()
+ 
diff --git a/pkgs/applications/misc/lutris/fhsenv.nix b/pkgs/applications/misc/lutris/fhsenv.nix
index 7f78b60f45bc..acdbf8835e31 100644
--- a/pkgs/applications/misc/lutris/fhsenv.nix
+++ b/pkgs/applications/misc/lutris/fhsenv.nix
@@ -12,6 +12,14 @@ let
     libX11 libXrender libXrandr libxcb libXmu libpthreadstubs libXext libXdmcp
     libXxf86vm libXinerama libSM libXv libXaw libXi libXcursor libXcomposite
   ];
+  gstreamerDeps = pkgs: with pkgs.gst_all_1; [
+    gstreamer
+    gst-plugins-base
+    gst-plugins-good
+    gst-plugins-ugly
+    gst-plugins-bad
+    gst-libav
+  ];
 
 in buildFHSEnv {
   name = "lutris";
@@ -121,6 +129,7 @@ in buildFHSEnv {
     # Winetricks
     fribidi
   ] ++ xorgDeps pkgs
+    ++ gstreamerDeps pkgs
     ++ extraLibraries pkgs;
 
   extraInstallCommands = ''
diff --git a/pkgs/applications/misc/mako/default.nix b/pkgs/applications/misc/mako/default.nix
index b4eeb51049be..ca7849c566a9 100644
--- a/pkgs/applications/misc/mako/default.nix
+++ b/pkgs/applications/misc/mako/default.nix
@@ -1,5 +1,5 @@
 { lib, stdenv, fetchFromGitHub, meson, ninja, pkg-config, scdoc
-, systemd, pango, cairo, gdk-pixbuf, jq
+, systemd, pango, cairo, gdk-pixbuf, jq, bash
 , wayland, wayland-protocols
 , wrapGAppsHook }:
 
@@ -25,7 +25,7 @@ stdenv.mkDerivation rec {
 
   preFixup = ''
     gappsWrapperArgs+=(
-      --prefix PATH : "${lib.makeBinPath [ systemd /* for busctl */ jq ]}"
+      --prefix PATH : "${lib.makeBinPath [ systemd /* for busctl */ jq bash ]}"
     )
   '';
 
diff --git a/pkgs/applications/misc/rofi-emoji/default.nix b/pkgs/applications/misc/rofi-emoji/default.nix
index 6d6682713855..921ba4ddd9b3 100644
--- a/pkgs/applications/misc/rofi-emoji/default.nix
+++ b/pkgs/applications/misc/rofi-emoji/default.nix
@@ -17,13 +17,13 @@
 
 stdenv.mkDerivation rec {
   pname = "rofi-emoji";
-  version = "3.2.0";
+  version = "3.3.0";
 
   src = fetchFromGitHub {
     owner = "Mange";
     repo = pname;
     rev = "v${version}";
-    sha256 = "sha256-P7AHLwqicKYj5I0Rl9B5mdD/v9iW9aihkNo7enonRF4=";
+    sha256 = "sha256-Y+E5TViKFVtqXMLVEcq1VMLPzG04vfZyThUM7a/fFGM=";
   };
 
   patches = [
diff --git a/pkgs/applications/misc/syncthingtray/default.nix b/pkgs/applications/misc/syncthingtray/default.nix
index 35632008f716..0badd7997603 100644
--- a/pkgs/applications/misc/syncthingtray/default.nix
+++ b/pkgs/applications/misc/syncthingtray/default.nix
@@ -1,9 +1,8 @@
-{ mkDerivation
-, lib
+{ lib
 , stdenv
 , fetchFromGitHub
-, substituteAll
 , qtbase
+, qtsvg
 , qtwebengine
 , qtdeclarative
 , extra-cmake-modules
@@ -46,6 +45,7 @@ stdenv.mkDerivation (finalAttrs: {
 
   buildInputs = [
     qtbase
+    qtsvg
     cpp-utilities
     qtutilities
     boost
@@ -74,7 +74,7 @@ stdenv.mkDerivation (finalAttrs: {
   doCheck = !stdenv.isDarwin;
   preCheck = ''
     export QT_QPA_PLATFORM=offscreen
-    export QT_PLUGIN_PATH="${qtbase.bin}/${qtbase.qtPluginPrefix}"
+    export QT_PLUGIN_PATH="${lib.getBin qtbase}/${qtbase.qtPluginPrefix}"
   '';
   # don't test --help  on Darwin because output is .app
   doInstallCheck = !stdenv.isDarwin;
@@ -83,6 +83,8 @@ stdenv.mkDerivation (finalAttrs: {
   '';
 
   cmakeFlags = [
+    "-DQT_PACKAGE_PREFIX=Qt${lib.versions.major qtbase.version}"
+    "-DKF_PACKAGE_PREFIX=KF${lib.versions.major qtbase.version}"
     "-DBUILD_TESTING=ON"
     # See https://github.com/Martchus/syncthingtray/issues/208
     "-DEXCLUDE_TESTS_FROM_ALL=OFF"
diff --git a/pkgs/applications/misc/typioca/default.nix b/pkgs/applications/misc/typioca/default.nix
index 87b499f010be..70becdc143bd 100644
--- a/pkgs/applications/misc/typioca/default.nix
+++ b/pkgs/applications/misc/typioca/default.nix
@@ -7,16 +7,16 @@
 
 buildGoModule rec {
   pname = "typioca";
-  version = "2.9.0";
+  version = "2.10.0";
 
   src = fetchFromGitHub {
     owner = "bloznelis";
     repo = "typioca";
     rev = version;
-    hash = "sha256-N7+etRqHxLX0eVvdOofXQ1fqEUTsck7UAL5mX6NUsOU=";
+    hash = "sha256-D6I1r+8cvUerqXR2VyBL33lapWAs5Cl5yvYOsmUBnHo=";
   };
 
-  vendorHash = "sha256-FKLAbrZVtF8gj90NU7m47pG+BBKYkPjJKax5nZmpehY=";
+  vendorHash = "sha256-j/nyAHNwUoNkcdNJqcaUuhQk5a2VHQw/XgYIoTR9ctQ=";
 
   ldflags = [
     "-s"
diff --git a/pkgs/applications/networking/asn/default.nix b/pkgs/applications/networking/asn/default.nix
index ddd9c1d34c32..6a8ec939cb33 100644
--- a/pkgs/applications/networking/asn/default.nix
+++ b/pkgs/applications/networking/asn/default.nix
@@ -15,13 +15,13 @@
 
 stdenv.mkDerivation rec {
   pname = "asn";
-  version = "0.76.0";
+  version = "0.76.1";
 
   src = fetchFromGitHub {
     owner = "nitefood";
     repo = "asn";
     rev = "refs/tags/v${version}";
-    hash = "sha256-pdtRf9VKEdNg1UeYSaLNLm9O057dT+n5g3Dd0bcP4EI=";
+    hash = "sha256-9UDd0tgRKEFC1V1+1s9Ghev0I48L8UR9/YbZKX3F1MU=";
   };
 
   nativeBuildInputs = [
diff --git a/pkgs/applications/networking/browsers/chromium/upstream-info.nix b/pkgs/applications/networking/browsers/chromium/upstream-info.nix
index c4888aac71f6..5a75f0ad2022 100644
--- a/pkgs/applications/networking/browsers/chromium/upstream-info.nix
+++ b/pkgs/applications/networking/browsers/chromium/upstream-info.nix
@@ -1,11 +1,11 @@
 {
   stable = {
     chromedriver = {
-      hash_darwin = "sha256-qo7eiMC4MR4pskSim6twkC2QDeqe3qfZsIEe5mjS7jg=";
+      hash_darwin = "sha256-iv370BYH8HobUxeYbsV4/A6JyZG2feEuVbJCLVZc3Og=";
       hash_darwin_aarch64 =
-        "sha256-RHqu0wNeAx34LTkVgNjBfXrSWvZ1G7OkNAIGA4WUhmw=";
-      hash_linux = "sha256-K4QeHFp520Z3KjefvVsJf8V7gz7gTf2BCSW4Jxz/H9M=";
-      version = "122.0.6261.69";
+        "sha256-Gc0OXG7dx5Mvy0aAsnqVIJtPFK8OYmFr8Ofy+UXacM4=";
+      hash_linux = "sha256-ZcN/v7co08aRWM88s93nBU/FLEfE7JGf/hEH0tk3qy8=";
+      version = "122.0.6261.94";
     };
     deps = {
       gn = {
@@ -15,9 +15,9 @@
         version = "2024-01-22";
       };
     };
-    hash = "sha256-uEN1hN6DOLgw4QDrMBZdiLLPx+yKQc5MimIf/vbCC84=";
-    hash_deb_amd64 = "sha256-k3/Phs72eIMB6LAU4aU0+ze/cRu6KlRhpBshKhmq9N4=";
-    version = "122.0.6261.69";
+    hash = "sha256-7fIs8qQon9L0iNmM/cHuyqtVm09qf7L4j9qb6KSbw2w=";
+    hash_deb_amd64 = "sha256-hOm7YZ9ya/SmwKhj6uIPkdgIDv5bIbss398szBYHuXk=";
+    version = "122.0.6261.94";
   };
   ungoogled-chromium = {
     deps = {
diff --git a/pkgs/applications/networking/browsers/microsoft-edge/default.nix b/pkgs/applications/networking/browsers/microsoft-edge/default.nix
index ae98d8aa44a2..784e89adc629 100644
--- a/pkgs/applications/networking/browsers/microsoft-edge/default.nix
+++ b/pkgs/applications/networking/browsers/microsoft-edge/default.nix
@@ -1,20 +1,20 @@
 {
   beta = import ./browser.nix {
     channel = "beta";
-    version = "122.0.2365.52";
+    version = "122.0.2365.59";
     revision = "1";
-    hash = "sha256-H8VTDyDY2Rm5z4cJruzMa1YorBAUL0pJuwhQ6cy4WfY=";
+    hash = "sha256-hs6NHAdqji5Cg1ReGWqalFHv6wyRlyclssyc0cxM+ZU=";
   };
   dev = import ./browser.nix {
     channel = "dev";
-    version = "123.0.2400.1";
+    version = "123.0.2420.6";
     revision = "1";
-    hash = "sha256-I9PT320DJgqJYNwB0pvngyLlV+N2jaS5tOwVwwNHex0=";
+    hash = "sha256-fX6lxhJstz2cZZODu7xRe1fez8WTXqlYNgsMhIVTLaU=";
   };
   stable = import ./browser.nix {
     channel = "stable";
-    version = "122.0.2365.52";
+    version = "122.0.2365.59";
     revision = "1";
-    hash = "sha256-hULyUUFhMjiareXr1zTynyknVyert45N0H4iR8woGRw=";
+    hash = "sha256-LbyipfA5TZWSZu1jeUykGZ2FXwt9rZ7ak7mmryXRnMQ=";
   };
 }
diff --git a/pkgs/applications/networking/cluster/karmor/default.nix b/pkgs/applications/networking/cluster/karmor/default.nix
index 8ee03d825d65..38058e57d2d8 100644
--- a/pkgs/applications/networking/cluster/karmor/default.nix
+++ b/pkgs/applications/networking/cluster/karmor/default.nix
@@ -8,16 +8,16 @@
 
 buildGoModule rec {
   pname = "karmor";
-  version = "1.1.0";
+  version = "1.1.1";
 
   src = fetchFromGitHub {
     owner = "kubearmor";
     repo = "kubearmor-client";
     rev = "v${version}";
-    hash = "sha256-HQJHtRi/ddKD+CNG3Ea61jz8zKcACBYCUR+qKbzADcI=";
+    hash = "sha256-NeLMHecfDyMhXmq1HO3qRIWeYpkoj9Od5wWStZEkHYU=";
   };
 
-  vendorHash = "sha256-Lzp6n66oMrzTk4oWERa8Btb3FwiASpSj8hdQmYxYges=";
+  vendorHash = "sha256-EIvwzgpC9Ls43RJEhxNYDlF4luKthFgJleaXcYzOYow=";
 
   nativeBuildInputs = [ installShellFiles ];
 
diff --git a/pkgs/applications/networking/cluster/popeye/default.nix b/pkgs/applications/networking/cluster/popeye/default.nix
index 3afe0bfe0eae..f1db435c443c 100644
--- a/pkgs/applications/networking/cluster/popeye/default.nix
+++ b/pkgs/applications/networking/cluster/popeye/default.nix
@@ -2,13 +2,13 @@
 
 buildGoModule rec {
   pname = "popeye";
-  version = "0.20.3";
+  version = "0.20.4";
 
   src = fetchFromGitHub {
     rev = "v${version}";
     owner = "derailed";
     repo = "popeye";
-    sha256 = "sha256-Iq33TEl6yCw4e6LeOsXcaMGRmOJqq9XV4KChEArDL6Q=";
+    sha256 = "sha256-rUG2tZokWXWVvGiyDAxVYfVwSDInaLptBCBuawtP1bc=";
   };
 
   ldflags = [
diff --git a/pkgs/applications/networking/ids/suricata/default.nix b/pkgs/applications/networking/ids/suricata/default.nix
index eb784c95b9fc..1ea754149554 100644
--- a/pkgs/applications/networking/ids/suricata/default.nix
+++ b/pkgs/applications/networking/ids/suricata/default.nix
@@ -33,11 +33,11 @@
 in
 stdenv.mkDerivation rec {
   pname = "suricata";
-  version = "7.0.2";
+  version = "7.0.3";
 
   src = fetchurl {
     url = "https://www.openinfosecfoundation.org/download/${pname}-${version}.tar.gz";
-    hash = "sha256-tOtgSDjvmag5a8i3u1TK0R8kQsvXy7MA5/WqsZCXvE0=";
+    hash = "sha256-6gdC16mHg/GvSldmGvYGi8LYUKw+ygSzIE0ozhZeNf8=";
   };
 
   nativeBuildInputs = [
diff --git a/pkgs/applications/networking/instant-messengers/discord/default.nix b/pkgs/applications/networking/instant-messengers/discord/default.nix
index e95b9eb99905..8a19ec12c308 100644
--- a/pkgs/applications/networking/instant-messengers/discord/default.nix
+++ b/pkgs/applications/networking/instant-messengers/discord/default.nix
@@ -4,7 +4,7 @@ let
     if stdenv.isLinux then {
       stable = "0.0.43";
       ptb = "0.0.71";
-      canary = "0.0.282";
+      canary = "0.0.285";
       development = "0.0.13";
     } else {
       stable = "0.0.294";
@@ -25,7 +25,7 @@ let
       };
       canary = fetchurl {
         url = "https://dl-canary.discordapp.net/apps/linux/${version}/discord-canary-${version}.tar.gz";
-        hash = "sha256-+Ijl/yPa7DVzVKOWTxCu6FxIsschIqYa+tYBnnKdCBA=";
+        hash = "sha256-dfBwe/YOzUUAfBrf51mNXtpyGL3Mp235e6TfQM4h04s=";
       };
       development = fetchurl {
         url = "https://dl-development.discordapp.net/apps/linux/${version}/discord-development-${version}.tar.gz";
diff --git a/pkgs/applications/networking/instant-messengers/element/pin.nix b/pkgs/applications/networking/instant-messengers/element/pin.nix
index ba1606582b88..19ea95b452ff 100644
--- a/pkgs/applications/networking/instant-messengers/element/pin.nix
+++ b/pkgs/applications/networking/instant-messengers/element/pin.nix
@@ -1,9 +1,9 @@
 {
-  "version" = "1.11.58";
+  "version" = "1.11.59";
   "hashes" = {
-    "desktopSrcHash" = "sha256-otZNhe6V/kGErx6J0+TcIwk5ASD/H4K/pYtm864VTIE=";
-    "desktopYarnHash" = "1pdja3rw4ykf9pgk937i4n0w8dj1r64fz7nzk9fsqlq8ciygabsq";
-    "webSrcHash" = "sha256-IAIsg9dvZMFfWst1xeVQLp+8URUauiaL3j2ui4lpKaY=";
-    "webYarnHash" = "0gv0vrgb62hgw58lgrmn6yywvrl9a5v5msd4l06n5wgnbbqi0i5j";
+    "desktopSrcHash" = "sha256-dasRfLsa8Jc6Vyay02f6IytjvYs3xbSFB2fU5bxi79E=";
+    "desktopYarnHash" = "00jvid2li68ji1xkbbpdiy39fzvhmw7ypnr3x82wbqqafkc5vil6";
+    "webSrcHash" = "sha256-UpRRTPrNiFsqXKD072jXVIqS8ZiuKt/BUzx1oja90VA=";
+    "webYarnHash" = "1s9lp2dd3slpp70rrbmsbmzphm6fwglnrqwk9fgylzqa1ds8nfjd";
   };
 }
diff --git a/pkgs/applications/networking/instant-messengers/twitch-tui/default.nix b/pkgs/applications/networking/instant-messengers/twitch-tui/default.nix
index 0c0949688382..0814ff148653 100644
--- a/pkgs/applications/networking/instant-messengers/twitch-tui/default.nix
+++ b/pkgs/applications/networking/instant-messengers/twitch-tui/default.nix
@@ -11,16 +11,16 @@
 
 rustPlatform.buildRustPackage rec {
   pname = "twitch-tui";
-  version = "2.6.3";
+  version = "2.6.4";
 
   src = fetchFromGitHub {
     owner = "Xithrius";
     repo = pname;
     rev = "refs/tags/v${version}";
-    hash = "sha256-h8qpsrMFFb49yfNb5mKEYRpul0hB0m1rDCvVW6jW+Pg=";
+    hash = "sha256-8jb5SrPAPas4TG4RbsaiL7bdbl/o/KX2WpDu/avPxp8=";
   };
 
-  cargoHash = "sha256-L7psqmU4Zd7c0mbd4pK/tmPslTaxIhQoWtN0/RRMerA=";
+  cargoHash = "sha256-riDRGoPMLoDuBD1iFxoTgr5pgZLYkL18sidtQM5HYNk=";
 
   nativeBuildInputs = [
     pkg-config
diff --git a/pkgs/applications/office/moneyplex/default.nix b/pkgs/applications/office/moneyplex/default.nix
deleted file mode 100644
index 08d926a6d5e2..000000000000
--- a/pkgs/applications/office/moneyplex/default.nix
+++ /dev/null
@@ -1,123 +0,0 @@
-{ lib, stdenv, fetchurl, patchelf, coreutils, pcsclite
-, zlib, glib, gdk-pixbuf, gtk2, cairo, pango, libX11, atk, openssl
-, runtimeShell }:
-
-let
-  libPath = lib.makeLibraryPath [
-    stdenv.cc.cc zlib glib gdk-pixbuf gtk2 cairo pango libX11 atk openssl
-  ];
-
-  src_i686 = {
-    url = "http://www.matrica.com/download/distribution/moneyplex_16_install32_22424.tar.gz";
-    sha256 = "0yfpc6s85r08g796dycl378kagkma865vp7j72npia3hjc4vwamr";
-  };
-
-  src_x86_64 = {
-    url = "http://www.matrica.com/download/distribution/moneyplex_16_install64_22424.tar.gz";
-    sha256 = "03vxbg1yp8qyvcn6bw2a5s134nxzq9cn0vqbmlld7hh4knbsfqzw";
-  };
-in
-
-stdenv.mkDerivation {
-  pname = "moneyplex";
-  version = "16.0.22424";
-
-  src = fetchurl (if stdenv.hostPlatform.system == "i686-linux" then src_i686
-                  else if stdenv.hostPlatform.system == "x86_64-linux" then src_x86_64
-                  else throw "moneyplex requires i686-linux or x86_64-linux");
-
-
-  phases = [ "unpackPhase" "installPhase" "postInstall" ];
-
-  buildInputs = [ ];
-
-  installPhase =
-  ''
-    mkdir -p "$out/opt/moneyplex"
-    cp -r . $out/opt/moneyplex
-
-    mkdir "$out/bin"
-
-    cat > $out/bin/moneyplex <<EOF
-    #!${runtimeShell}
-
-    if [ -z "\$XDG_DATA_HOME" ]; then
-        MDIR=\$HOME/.local/share/moneyplex
-    else
-        MDIR=\$XDG_DATA_HOME/moneyplex
-    fi
-
-    if [ ! -d "\$MDIR" ]; then
-        ${coreutils}/bin/mkdir -p \$MDIR
-        ${coreutils}/bin/cp -r $out/opt/moneyplex/* \$MDIR
-        ${coreutils}/bin/chmod 0644 \$MDIR/*
-        ${coreutils}/bin/chmod 0755 \$MDIR/system
-        ${coreutils}/bin/chmod 0644 \$MDIR/system/*
-        ${coreutils}/bin/chmod 0755 \$MDIR/reports
-        ${coreutils}/bin/chmod 0644 \$MDIR/reports/*
-        ${coreutils}/bin/chmod 0755 \$MDIR/moneyplex
-        ${coreutils}/bin/chmod 0755 \$MDIR/prestart
-        ${coreutils}/bin/chmod 0755 \$MDIR/mpxalarm
-    fi
-
-    if [ ! -d "\$MDIR/pcsc" ]; then
-        ${coreutils}/bin/mkdir -p \$MDIR/pcsc
-    fi
-    if [ ! -e "\$MDIR/pcsc/libpcsclite.so.1" ] || [ ! \`${coreutils}/bin/readlink -f "\$MDIR/pcsc/libpcsclite.so.1"\` -ef "${lib.getLib pcsclite}/lib/libpcsclite.so.1" ]; then
-        ${coreutils}/bin/ln -sf "${lib.getLib pcsclite}/lib/libpcsclite.so.1" "\$MDIR/pcsc/libpcsclite.so.1"
-    fi
-
-
-    if [ -e "\$MDIR/rup/rupremote.lst" ]; then
-      for i in \`${coreutils}/bin/cat "\$MDIR/rup/rupremote.lst"\`; do
-        ${coreutils}/bin/mv "\$MDIR/rup/"\`${coreutils}/bin/basename \$i\` "\$MDIR/\$i"
-      done
-      rm -r "\$MDIR/rup/rupremote.lst"
-    fi
-
-    if [ ! -e "\$MDIR/moneyplex.patched" ] || [ "\$MDIR/moneyplex" -nt "\$MDIR/moneyplex.patched" ]; then
-        ${coreutils}/bin/cp "\$MDIR/moneyplex" "\$MDIR/moneyplex.patched"
-        ${coreutils}/bin/chmod 0755 "\$MDIR/moneyplex.patched"
-    fi
-    if [ ! \`${patchelf}/bin/patchelf --print-interpreter \$MDIR/moneyplex.patched\` = $(cat $NIX_CC/nix-support/dynamic-linker) ] ||
-       [ ! \`${patchelf}/bin/patchelf --print-rpath \$MDIR/moneyplex.patched\` = "${libPath}" ]; then
-        ${patchelf}/bin/patchelf --set-interpreter $(cat $NIX_CC/nix-support/dynamic-linker) --set-rpath "${libPath}" "\$MDIR/moneyplex.patched"
-    fi
-
-    exec \$MDIR/moneyplex.patched
-    EOF
-
-    chmod +x $out/bin/moneyplex
-    '';
-
-  postInstall = ''
-    mkdir -p $out/share/icons
-    cp -r $out/opt/moneyplex/system/mpx256.png $out/share/icons/moneyplex.png
-
-    mkdir -p $out/share/applications
-    cat > $out/share/applications/moneyplex.desktop <<EOF
-    [Desktop Entry]
-    Type=Application
-    Encoding=UTF-8
-    Name=Moneyplex
-    GenericName=Moneyplex online banking software
-    Comment=Online banking software
-    Icon=$out/share/icons/moneyplex.png
-    Exec=$out/bin/moneyplex
-    Terminal=false
-    Categories=Application;
-    StartupNotify=true
-    EOF
-    '';
-
-
-  meta = with lib; {
-    description = "Moneyplex online banking software";
-    maintainers = with maintainers; [ ];
-    sourceProvenance = with sourceTypes; [ binaryNativeCode ];
-    platforms = platforms.linux;
-    license = licenses.unfree;
-    downloadPage = "http://matrica.de/download/download.html";
-  };
-
-}
diff --git a/pkgs/applications/radio/wsjtx/default.nix b/pkgs/applications/radio/wsjtx/default.nix
index 23fb34db0e32..b624898664c8 100644
--- a/pkgs/applications/radio/wsjtx/default.nix
+++ b/pkgs/applications/radio/wsjtx/default.nix
@@ -27,7 +27,7 @@ stdenv.mkDerivation rec {
       These modes were all designed for making reliable, confirmed ham radio
       contacts under extreme weak-signal conditions.
     '';
-    homepage = "https://physics.princeton.edu/pulsar/k1jt/wsjtx.html";
+    homepage = "https://wsjt.sourceforge.io";
     license = with licenses; [ gpl3Plus ];
     platforms = platforms.linux;
     maintainers = with maintainers; [ lasandell numinit melling ];
diff --git a/pkgs/applications/science/math/eigenmath/default.nix b/pkgs/applications/science/math/eigenmath/default.nix
index c43add48fcb6..e91ec9e5bbbf 100644
--- a/pkgs/applications/science/math/eigenmath/default.nix
+++ b/pkgs/applications/science/math/eigenmath/default.nix
@@ -7,13 +7,13 @@
 
 stdenv.mkDerivation rec {
   pname = "eigenmath";
-  version = "unstable-2024-02-04";
+  version = "unstable-2024-02-25";
 
   src = fetchFromGitHub {
     owner = "georgeweigt";
     repo = pname;
-    rev = "3e37263611e181e2927d63b97b7656790c7f4fe1";
-    hash = "sha256-gjmz9Ma7OLQyIry6i2HMNy4Ai5Wh5NUzDKPO2a9Hp+s=";
+    rev = "4391a5bfe22d095cdf9fc12f376f64a8ffccccd9";
+    hash = "sha256-p+dnu35HGX8SgVpq5NczoZVehzfcuN+uucGurT7lWYM=";
   };
 
   checkPhase = let emulator = stdenv.hostPlatform.emulator buildPackages; in ''
diff --git a/pkgs/applications/version-management/commitizen/default.nix b/pkgs/applications/version-management/commitizen/default.nix
index 98a5549faab4..5b5042494c49 100644
--- a/pkgs/applications/version-management/commitizen/default.nix
+++ b/pkgs/applications/version-management/commitizen/default.nix
@@ -11,7 +11,7 @@
 
 python3.pkgs.buildPythonApplication rec {
   pname = "commitizen";
-  version = "3.15.0";
+  version = "3.16.0";
   format = "pyproject";
 
   disabled = python3.pythonOlder "3.8";
@@ -20,7 +20,7 @@ python3.pkgs.buildPythonApplication rec {
     owner = "commitizen-tools";
     repo = pname;
     rev = "refs/tags/v${version}";
-    hash = "sha256-WXsEkJRis9L9heHj6SkTFFTuGmnDXPMKfr7rYy8vzcI=";
+    hash = "sha256-vd8MtkzI7PPow0Ld0NhwbWOUWgSgecAT/DZK0ocUWCw=";
   };
 
   pythonRelaxDeps = [
diff --git a/pkgs/applications/version-management/git-gone/default.nix b/pkgs/applications/version-management/git-gone/default.nix
index 559c81dd48c6..133bc35f64fa 100644
--- a/pkgs/applications/version-management/git-gone/default.nix
+++ b/pkgs/applications/version-management/git-gone/default.nix
@@ -8,16 +8,16 @@
 
 rustPlatform.buildRustPackage rec {
   pname = "git-gone";
-  version = "1.0.0";
+  version = "1.1.0";
 
   src = fetchFromGitHub {
     owner = "swsnr";
     repo = "git-gone";
     rev = "v${version}";
-    hash = "sha256-cEMFbG7L48s1SigLD/HfQ2NplGZPpO+KIgs3oV3rgQQ=";
+    hash = "sha256-Mc9/P4VBmLOC05xqdx/yopbhvdpQS3uejc4YA7BIgug=";
   };
 
-  cargoHash = "sha256-CCPVjOWM59ELd4AyT968v6kvGdVwkMxxLZGDiJlLkzA=";
+  cargoHash = "sha256-NyyficEDJReMLAw2VAK2fOXNIwHilnUqQRACGck+0Vo=";
 
   nativeBuildInputs = [ installShellFiles ];
 
diff --git a/pkgs/applications/version-management/gitoxide/default.nix b/pkgs/applications/version-management/gitoxide/default.nix
index ed3f3c8764f4..eb3ee122bf51 100644
--- a/pkgs/applications/version-management/gitoxide/default.nix
+++ b/pkgs/applications/version-management/gitoxide/default.nix
@@ -9,9 +9,14 @@
 , SystemConfiguration
 , curl
 , openssl
+, buildPackages
+, installShellFiles
 }:
 
-rustPlatform.buildRustPackage rec {
+let
+  canRunCmd = stdenv.hostPlatform.emulatorAvailable buildPackages;
+  gix = "${stdenv.hostPlatform.emulator buildPackages} $out/bin/gix";
+in rustPlatform.buildRustPackage rec {
   pname = "gitoxide";
   version = "0.33.0";
 
@@ -24,12 +29,19 @@ rustPlatform.buildRustPackage rec {
 
   cargoHash = "sha256-JOl/hhyuc6vqeK6/oXXMB3fGRapBsuOTaUG+BQ9QSnk=";
 
-  nativeBuildInputs = [ cmake pkg-config ];
+  nativeBuildInputs = [ cmake pkg-config installShellFiles ];
 
   buildInputs = [ curl ] ++ (if stdenv.isDarwin
     then [ libiconv Security SystemConfiguration ]
     else [ openssl ]);
 
+  preFixup = lib.optionalString canRunCmd ''
+    installShellCompletion --cmd gix \
+      --bash <(${gix} completions --shell bash) \
+      --fish <(${gix} completions --shell fish) \
+      --zsh <(${gix} completions --shell zsh)
+  '';
+
   # Needed to get openssl-sys to use pkg-config.
   env.OPENSSL_NO_VENDOR = 1;
 
diff --git a/pkgs/applications/video/kodi/addons/mediathekview/default.nix b/pkgs/applications/video/kodi/addons/mediathekview/default.nix
index 327cf16ae895..7f03d813388d 100644
--- a/pkgs/applications/video/kodi/addons/mediathekview/default.nix
+++ b/pkgs/applications/video/kodi/addons/mediathekview/default.nix
@@ -1,4 +1,4 @@
-{ lib, buildKodiAddon, fetchFromGitHub, addonUpdateScript, myconnpy }:
+{ lib, buildKodiAddon, fetchFromGitHub, myconnpy }:
 
 buildKodiAddon rec {
   pname = "mediathekview";
@@ -16,14 +16,10 @@ buildKodiAddon rec {
     myconnpy
   ];
 
-  passthru.updateScript = addonUpdateScript {
-    attrPath = "kodi.packages.mediathekview";
-  };
-
   meta = with lib; {
     homepage = "https://github.com/mediathekview/plugin.video.mediathekview";
     description = "Access media libraries of German speaking broadcasting stations";
     license = licenses.mit;
-    maintainers = teams.kodi.members;
+    maintainers = teams.kodi.members ++ [ lib.maintainers.dschrempf ];
   };
 }
diff --git a/pkgs/applications/video/kodi/addons/youtube/default.nix b/pkgs/applications/video/kodi/addons/youtube/default.nix
index d6bc80d0189e..83afc51053ba 100644
--- a/pkgs/applications/video/kodi/addons/youtube/default.nix
+++ b/pkgs/applications/video/kodi/addons/youtube/default.nix
@@ -3,13 +3,13 @@
 buildKodiAddon rec {
   pname = "youtube";
   namespace = "plugin.video.youtube";
-  version = "7.0.3";
+  version = "7.0.3.2";
 
   src = fetchFromGitHub {
     owner = "anxdpanic";
     repo = "plugin.video.youtube";
     rev = "v${version}";
-    hash = "sha256-dD9jl/W8RDfYHv13TBniOeRyc4cocj8160BHWz3MKlE=";
+    hash = "sha256-gJ7RGB0pSG/iLdpmXHpQOoQTisXnMl1Mgd0KYFgg2qI=";
   };
 
   propagatedBuildInputs = [
diff --git a/pkgs/applications/virtualization/OVMF/default.nix b/pkgs/applications/virtualization/OVMF/default.nix
index d3ebd6a7f29e..2e8c5bd1f603 100644
--- a/pkgs/applications/virtualization/OVMF/default.nix
+++ b/pkgs/applications/virtualization/OVMF/default.nix
@@ -1,7 +1,6 @@
 { stdenv, nixosTests, lib, edk2, util-linux, nasm, acpica-tools, llvmPackages
 , fetchurl, python3, pexpect, xorriso, qemu, dosfstools, mtools
-, csmSupport ? false, seabios
-, fdSize2MB ? csmSupport
+, fdSize2MB ? false
 , fdSize4MB ? secureBoot
 , secureBoot ? false
 , systemManagementModeRequired ? secureBoot && stdenv.hostPlatform.isx86
@@ -99,7 +98,6 @@ edk2.mkDerivation projectDscPath (finalAttrs: {
     ++ lib.optionals sourceDebug [ "-D SOURCE_DEBUG_ENABLE=TRUE" ]
     ++ lib.optionals secureBoot [ "-D SECURE_BOOT_ENABLE=TRUE" ]
     ++ lib.optionals systemManagementModeRequired [ "-D SMM_REQUIRE=TRUE" ]
-    ++ lib.optionals csmSupport [ "-D CSM_ENABLE" ]
     ++ lib.optionals fdSize2MB ["-D FD_SIZE_2MB"]
     ++ lib.optionals fdSize4MB ["-D FD_SIZE_4MB"]
     ++ lib.optionals httpSupport [ "-D NETWORK_HTTP_ENABLE=TRUE" "-D NETWORK_HTTP_BOOT_ENABLE=TRUE" ]
@@ -115,10 +113,6 @@ edk2.mkDerivation projectDscPath (finalAttrs: {
     unpackFile ${debian-edk-src}
   '';
 
-  postPatch = lib.optionalString csmSupport ''
-    cp ${seabios}/share/seabios/Csm16.bin OvmfPkg/Csm/Csm16/Csm16.bin
-  '';
-
   postConfigure = lib.optionalDrvAttr msVarsTemplate ''
     tr -d '\n' < ${vendorPkKek} | sed \
       -e 's/.*-----BEGIN CERTIFICATE-----/${OvmfPkKek1AppPrefix}:/' \
diff --git a/pkgs/applications/virtualization/lima/bin.nix b/pkgs/applications/virtualization/lima/bin.nix
index 2080ac1e7876..e02d41f4ddc3 100644
--- a/pkgs/applications/virtualization/lima/bin.nix
+++ b/pkgs/applications/virtualization/lima/bin.nix
@@ -9,31 +9,31 @@
 }:
 
 let
-  version = "0.19.1";
+  version = "0.20.1";
 
   dist = {
     aarch64-darwin = rec {
       archSuffix = "Darwin-arm64";
       url = "https://github.com/lima-vm/lima/releases/download/v${version}/lima-${version}-${archSuffix}.tar.gz";
-      sha256 = "0dfcf3a39782baf1c2ea43cf026f8df0321c671d914c105fbb78de507aa8bda4";
+      sha256 = "a561a457d3620965e017fc750805dd2fb99db1c21b2f14e8f044dfaa042de76f";
     };
 
     x86_64-darwin = rec {
       archSuffix = "Darwin-x86_64";
       url = "https://github.com/lima-vm/lima/releases/download/v${version}/lima-${version}-${archSuffix}.tar.gz";
-      sha256 = "ac8827479f66ef1b288b31f164b22f6433faa14c44ce5bbebe09e6e913582479";
+      sha256 = "c57d2b317e5488c96b642b05146146a5ec94d0407cccba0f31401f52824d404d";
     };
 
     aarch64-linux = rec {
       archSuffix = "Linux-aarch64";
       url = "https://github.com/lima-vm/lima/releases/download/v${version}/lima-${version}-${archSuffix}.tar.gz";
-      sha256 = "c55e57ddbefd9988d0f3676bb873bcc6e0f7b3c3d47a1f07599ee151c5198d96";
+      sha256 = "1d93b5fc0bde1369fce3029c917934ef57514fa23a715f8fb7fb333c1db9ec41";
     };
 
     x86_64-linux = rec {
       archSuffix = "Linux-x86_64";
       url = "https://github.com/lima-vm/lima/releases/download/v${version}/lima-${version}-${archSuffix}.tar.gz";
-      sha256 = "7d18b1716aae14bf98d6ea93a703e8877b0c3142f7ba2e87401d47d5d0fe3ff1";
+      sha256 = "e7093ca1889d2dab436d9f0e6b53d65336f75cf8ebd54f583085eca462a1fc4b";
     };
   };
 in
diff --git a/pkgs/build-support/substitute/substitute.nix b/pkgs/build-support/substitute/substitute.nix
index 7f0332334585..37233a306840 100644
--- a/pkgs/build-support/substitute/substitute.nix
+++ b/pkgs/build-support/substitute/substitute.nix
@@ -1,14 +1,58 @@
-{ stdenvNoCC }:
+{ lib, stdenvNoCC }:
+/*
+This is a wrapper around `substitute` in the stdenv.
 
+Attribute arguments:
+- `name` (optional): The name of the resulting derivation
+- `src`: The path to the file to substitute
+- `substitutions`: The list of substitution arguments to pass
+  See https://nixos.org/manual/nixpkgs/stable/#fun-substitute
+- `replacements`: Deprecated version of `substitutions`
+  that doesn't support spaces in arguments.
+
+Example:
+
+```nix
+{ substitute }:
+substitute {
+  src = ./greeting.txt;
+  substitutions = [
+    "--replace"
+    "world"
+    "paul"
+  ];
+}
+```
+
+See ../../test/substitute for tests
+*/
 args:
 
-# This is a wrapper around `substitute` in the stdenv.
-# The `replacements` attribute should be a list of list of arguments
-# to `substitute`, such as `[ "--replace" "sourcetext" "replacementtext" ]`
-stdenvNoCC.mkDerivation ({
+let
   name = if args ? name then args.name else baseNameOf (toString args.src);
+  deprecationReplacement = lib.pipe args.replacements [
+    lib.toList
+    (map (lib.splitString " "))
+    lib.concatLists
+    (lib.concatMapStringsSep " " lib.strings.escapeNixString)
+  ];
+  optionalDeprecationWarning =
+    # substitutions is only available starting 24.05.
+    # TODO: Remove support for replacements sometime after the next release
+    lib.warnIf (args ? replacements && lib.isInOldestRelease 2405) ''
+      pkgs.substitute: For "${name}", `replacements` is used, which is deprecated since it doesn't support arguments with spaces. Use `substitutions` instead:
+        substitutions = [ ${deprecationReplacement} ];'';
+in
+optionalDeprecationWarning
+stdenvNoCC.mkDerivation ({
+  inherit name;
   builder = ./substitute.sh;
   inherit (args) src;
   preferLocalBuild = true;
   allowSubstitutes = false;
-} // args // { replacements = args.replacements; })
+} // args // lib.optionalAttrs (args ? substitutions) {
+  substitutions =
+    assert lib.assertMsg (lib.isList args.substitutions) ''
+      pkgs.substitute: For "${name}", `substitutions` is passed, which is expected to be a list, but it's a ${builtins.typeOf args.substitutions} instead.'';
+    lib.escapeShellArgs args.substitutions;
+})
diff --git a/pkgs/build-support/substitute/substitute.sh b/pkgs/build-support/substitute/substitute.sh
index dbac275a80ed..d50a82446639 100644
--- a/pkgs/build-support/substitute/substitute.sh
+++ b/pkgs/build-support/substitute/substitute.sh
@@ -8,7 +8,13 @@ if test -n "$dir"; then
     mkdir -p $out/$dir
 fi
 
-substitute $src $target $replacements
+substitutionsList=($replacements)
+
+if [[ -v substitutions ]]; then
+    eval "substitutionsList+=($substitutions)"
+fi
+
+substitute $src $target "${substitutionsList[@]}"
 
 if test -n "$isExecutable"; then
     chmod +x $target
diff --git a/pkgs/build-support/trivial-builders/default.nix b/pkgs/build-support/trivial-builders/default.nix
index a38231bdcaa3..cecf3f5eae84 100644
--- a/pkgs/build-support/trivial-builders/default.nix
+++ b/pkgs/build-support/trivial-builders/default.nix
@@ -904,22 +904,23 @@ rec {
         else throw "applyPatches: please supply a `name` argument because a default name can only be computed when the `src` is a path or is an attribute set with a `name` attribute."
       ) + "-patched"
     , patches ? [ ]
+    , prePatch ? ""
     , postPatch ? ""
     , ...
     }@args:
-    if patches == [ ] && postPatch == ""
+    if patches == [ ] && prePatch == "" && postPatch == ""
     then src # nothing to do, so use original src to avoid additional drv
     else stdenvNoCC.mkDerivation
-      {
-        inherit name src patches postPatch;
+      ({
+        inherit name src patches prePatch postPatch;
         preferLocalBuild = true;
         allowSubstitutes = false;
         phases = "unpackPhase patchPhase installPhase";
         installPhase = "cp -R ./ $out";
       }
-    # Carry `meta` information from the underlying `src` if present.
-    // (optionalAttrs (src?meta) { inherit (src) meta; })
-    // (removeAttrs args [ "src" "name" "patches" "postPatch" ]);
+      # Carry `meta` information from the underlying `src` if present.
+      // (optionalAttrs (src?meta) { inherit (src) meta; })
+      // (removeAttrs args [ "src" "name" "patches" "prePatch" "postPatch" ]));
 
   /* An immutable file in the store with a length of 0 bytes. */
   emptyFile = runCommand "empty-file"
diff --git a/pkgs/by-name/au/audiobookshelf/source.json b/pkgs/by-name/au/audiobookshelf/source.json
index 74a387587170..7dced826db6d 100644
--- a/pkgs/by-name/au/audiobookshelf/source.json
+++ b/pkgs/by-name/au/audiobookshelf/source.json
@@ -1,9 +1,9 @@
 {
   "owner": "advplyr",
   "repo": "audiobookshelf",
-  "rev": "90f4833c9e0957f08799af15966d1909516b335e",
-  "hash": "sha256-m+CwUV3Bu9sHvRKCA1vFXYYRx48bxZ8N3BornO1tLQ0=",
-  "version": "2.7.2",
-  "depsHash": "sha256-1623oXtkOp43xQvHI3GbJpEQLvgr5WD5FpfNO+d0RR8=",
-  "clientDepsHash": "sha256-ugf9C/L5aBTO7gCy561kV06Ihb/mg/ZW916NKngIYXI="
+  "rev": "85fecbd1b9fc424d8bfd1b63cbae45b8b23a7d34",
+  "hash": "sha256-GWaaoVa1UJptbYAZ99LbrzfKEksSqK0GSsl3Vh2xKKs=",
+  "version": "2.8.0",
+  "depsHash": "sha256-vznd+ZKn0nx0Q7/lsMfWRUZUsK2LtxQor/3C4fQc0Ss=",
+  "clientDepsHash": "sha256-oqINZO4v5WeRRiLQnnChrnK8VeIzLg1MRhG/gEjkv58="
 }
diff --git a/pkgs/by-name/au/audiobookshelf/update.nu b/pkgs/by-name/au/audiobookshelf/update.nu
index 25166c9cf1d1..4aef2276e4f0 100755
--- a/pkgs/by-name/au/audiobookshelf/update.nu
+++ b/pkgs/by-name/au/audiobookshelf/update.nu
@@ -1,5 +1,5 @@
 #!/usr/bin/env nix-shell
-#!nix-shell -i nu -p nushell common-updater-scripts prefetch-npm-deps
+#!nix-shell -i nu -p nushell common-updater-scripts prefetch-npm-deps nix-prefetch-github
 
 def main [] {
   let sourceFile = $"(pwd)/pkgs/by-name/au/audiobookshelf/source.json"
diff --git a/pkgs/development/tools/rust/cargo-make/default.nix b/pkgs/by-name/ca/cargo-make/package.nix
index 1971c81f4609..0c8aaec637f3 100644
--- a/pkgs/development/tools/rust/cargo-make/default.nix
+++ b/pkgs/by-name/ca/cargo-make/package.nix
@@ -10,16 +10,16 @@
 
 rustPlatform.buildRustPackage rec {
   pname = "cargo-make";
-  version = "0.37.9";
+  version = "0.37.10";
 
   src = fetchFromGitHub {
     owner = "sagiegurari";
     repo = "cargo-make";
     rev = version;
-    hash = "sha256-pfLK9QGDS4KPIdXq/LI++/r1OxqmgF0qqVJNDSVrZFI=";
+    hash = "sha256-qahmRwRjwefkp21f4nsIR4THGibkQ8+20qVmQmJ7+Vk=";
   };
 
-  cargoHash = "sha256-x8cx64B+skusk0LDRQT/1g57NBQMchy2HvvryoY0R/I=";
+  cargoHash = "sha256-NTi+1ULK+k1JIP7z3/3v7gPUxXgliq3i8gtJQVLDGEY=";
 
   nativeBuildInputs = [ pkg-config ];
 
diff --git a/pkgs/by-name/fl/flarectl/package.nix b/pkgs/by-name/fl/flarectl/package.nix
index e73f0741b0fe..aedf03584372 100644
--- a/pkgs/by-name/fl/flarectl/package.nix
+++ b/pkgs/by-name/fl/flarectl/package.nix
@@ -5,13 +5,13 @@
 
 buildGoModule rec {
   pname = "flarectl";
-  version = "0.88.0";
+  version = "0.89.0";
 
   src = fetchFromGitHub {
     owner = "cloudflare";
     repo = "cloudflare-go";
     rev = "v${version}";
-    hash = "sha256-nFTE6RCVpfF/CPcwKM0wK15/1KMXAuvSdmtrt+Xrp8E=";
+    hash = "sha256-BXG9pKkgSSlBNiWiDOWL6D/DSC2iVzVCktL4xyi6/Ao=";
   };
 
   vendorHash = "sha256-AxBvmDB3mfgkv7U+BzR0Khdgx1hrDI61CSxr45pRZqg=";
diff --git a/pkgs/by-name/gi/gickup/package.nix b/pkgs/by-name/gi/gickup/package.nix
index f5286032c28c..55ae72c6e94c 100644
--- a/pkgs/by-name/gi/gickup/package.nix
+++ b/pkgs/by-name/gi/gickup/package.nix
@@ -6,16 +6,16 @@
 
 buildGoModule rec {
   pname = "gickup";
-  version = "0.10.27";
+  version = "0.10.28";
 
   src = fetchFromGitHub {
     owner = "cooperspencer";
     repo = "gickup";
     rev = "refs/tags/v${version}";
-    hash = "sha256-ExSTvIq5u5Zmep/tipAJOHcXMxtESLQlEVMWnD8/rSI=";
+    hash = "sha256-IGzwMSpbGiUjlO7AtxL20m72VXYW3MJemLpO5BN2rMo=";
   };
 
-  vendorHash = "sha256-riRFDhVOMdqwgGd6wowSDNgt8lZPzagCvKPWTHSqm6U=";
+  vendorHash = "sha256-sINmTwUERhxZ/qEAhKiJratWV6fDxrP21cJg97RBKVc=";
 
   ldflags = ["-X main.version=${version}"];
 
diff --git a/pkgs/by-name/hy/hypridle/package.nix b/pkgs/by-name/hy/hypridle/package.nix
index 9ded2f57d774..0526d741dd9d 100644
--- a/pkgs/by-name/hy/hypridle/package.nix
+++ b/pkgs/by-name/hy/hypridle/package.nix
@@ -12,13 +12,13 @@
 
 stdenv.mkDerivation (finalAttrs: {
   pname = "hypridle";
-  version = "0.1.0";
+  version = "0.1.1";
 
   src = fetchFromGitHub {
     owner = "hyprwm";
     repo = "hypridle";
     rev = "v${finalAttrs.version}";
-    hash = "sha256-0x5R6v82nKBualYf+TxAduMsvG80EZAl7gofTIYtpf4=";
+    hash = "sha256-YayFU0PZkwnKn1RSV3+i2HlSha/IFkG5osXcT0b/EUw=";
   };
 
   nativeBuildInputs = [
diff --git a/pkgs/by-name/hy/hyprlang/package.nix b/pkgs/by-name/hy/hyprlang/package.nix
index 672499f6bee9..6dc2c4fecbcc 100644
--- a/pkgs/by-name/hy/hyprlang/package.nix
+++ b/pkgs/by-name/hy/hyprlang/package.nix
@@ -7,18 +7,23 @@
 
 stdenv.mkDerivation (finalAttrs: {
   pname = "hyprlang";
-  version = "0.4.0";
+  version = "0.4.1";
 
   src = fetchFromGitHub {
     owner = "hyprwm";
     repo = "hyprlang";
     rev = "v${finalAttrs.version}";
-    hash = "sha256-nW3Zrhh9RJcMTvOcXAaKADnJM/g6tDf3121lJtTHnYo=";
+    hash = "sha256-upV2PWOoQ5hKbeuMwiJ4RJUa1JDVqzxdr5LL7YJJ/f4=";
   };
 
-  nativeBuildInputs = [cmake];
+  nativeBuildInputs = [
+    cmake
+  ];
 
-  outputs = ["out" "dev"];
+  outputs = [
+    "out"
+    "dev"
+  ];
 
   doCheck = true;
 
diff --git a/pkgs/by-name/in/incus/client.nix b/pkgs/by-name/in/incus/client.nix
index 46bf691c6951..76f792377b10 100644
--- a/pkgs/by-name/in/incus/client.nix
+++ b/pkgs/by-name/in/incus/client.nix
@@ -3,12 +3,13 @@
 
   lib,
   buildGoModule,
+  fetchpatch,
   fetchFromGitHub,
   installShellFiles,
 }:
 let
   releaseFile = if lts then ./lts.nix else ./latest.nix;
-  inherit (import releaseFile) version hash vendorHash;
+  inherit (import releaseFile { inherit fetchpatch; }) version hash vendorHash;
 in
 
 buildGoModule rec {
diff --git a/pkgs/by-name/in/incus/latest.nix b/pkgs/by-name/in/incus/latest.nix
index 0c0c32ba9af3..78c09a857488 100644
--- a/pkgs/by-name/in/incus/latest.nix
+++ b/pkgs/by-name/in/incus/latest.nix
@@ -1,5 +1,12 @@
+{ fetchpatch }:
 {
-  hash = "sha256-3eWkQT2P69ZfN62H9B4WLnmlUOGkpzRR0rctgchP+6A=";
-  version = "0.5.1";
-  vendorHash = "sha256-2ZJU7WshN4UIbJv55bFeo9qiAQ/wxu182mnz7pE60xA=";
+  hash = "sha256-tGuAS0lZvoYb+TvmCklQ8TADZhbm4w/lhdI0ycS4/0o=";
+  version = "0.6.0";
+  vendorHash = "sha256-+WmgLOEBJ/7GF596iiTgyTPxn8l+hE6RVqjLKfCi5rs=";
+  patches = [
+    (fetchpatch {
+      url = "https://github.com/lxc/incus/pull/529.patch";
+      hash = "sha256-2aaPrzW/LVJidWeom0rqYOGpT2gvuV1yHLJN/TwQ1fk=";
+    })
+  ];
 }
diff --git a/pkgs/by-name/in/incus/lts.nix b/pkgs/by-name/in/incus/lts.nix
index d70793f94dfa..a78deb48e23b 100644
--- a/pkgs/by-name/in/incus/lts.nix
+++ b/pkgs/by-name/in/incus/lts.nix
@@ -1,3 +1,3 @@
 # this release doesn't exist yet, but satisfay the by-name checks
 # will be added as incus-lts in all-packages.nix once ready
-{ }
+_: { }
diff --git a/pkgs/by-name/in/incus/package.nix b/pkgs/by-name/in/incus/package.nix
index 110bc41dce28..2958ab036ac9 100644
--- a/pkgs/by-name/in/incus/package.nix
+++ b/pkgs/by-name/in/incus/package.nix
@@ -81,20 +81,11 @@ let
 
   ovmf-2mb = OVMF.override {
     secureBoot = true;
-    csmSupport = false;
     fdSize2MB = true;
   };
 
   ovmf-4mb = OVMF.override {
     secureBoot = true;
-    csmSupport = false;
-    fdSize4MB = true;
-  };
-
-  ovmf-4mb-csm = OVMF.override {
-    secureBoot = true;
-    csmSupport = false;
-    fdSize2MB = false;
     fdSize4MB = true;
   };
 
@@ -108,10 +99,6 @@ let
       path = "${ovmf-2mb.fd}/FV/${ovmf-prefix}_CODE.fd";
     }
     {
-      name = "OVMF_CODE.4MB.CSM.fd";
-      path = "${ovmf-4mb-csm.fd}/FV/${ovmf-prefix}_CODE.fd";
-    }
-    {
       name = "OVMF_CODE.4MB.fd";
       path = "${ovmf-4mb.fd}/FV/${ovmf-prefix}_CODE.fd";
     }
@@ -129,10 +116,6 @@ let
       path = "${ovmf-2mb.fd}/FV/${ovmf-prefix}_VARS.fd";
     }
     {
-      name = "OVMF_VARS.4MB.CSM.fd";
-      path = "${ovmf-4mb-csm.fd}/FV/${ovmf-prefix}_VARS.fd";
-    }
-    {
       name = "OVMF_VARS.4MB.fd";
       path = "${ovmf-4mb.fd}/FV/${ovmf-prefix}_VARS.fd";
     }
diff --git a/pkgs/by-name/in/incus/unwrapped.nix b/pkgs/by-name/in/incus/unwrapped.nix
index 73257c583940..7a28737ea390 100644
--- a/pkgs/by-name/in/incus/unwrapped.nix
+++ b/pkgs/by-name/in/incus/unwrapped.nix
@@ -3,6 +3,7 @@
 
   lib,
   buildGoModule,
+  fetchpatch,
   fetchFromGitHub,
   writeShellScript,
   acl,
@@ -19,14 +20,19 @@
 
 let
   releaseFile = if lts then ./lts.nix else ./latest.nix;
-  inherit (import releaseFile) version hash vendorHash;
+  inherit (import releaseFile { inherit fetchpatch; })
+    version
+    hash
+    patches
+    vendorHash
+    ;
   name = "incus${lib.optionalString lts "-lts"}";
 in
 
-buildGoModule rec {
+buildGoModule {
   pname = "${name}-unwrapped";
 
-  inherit vendorHash version;
+  inherit patches vendorHash version;
 
   src = fetchFromGitHub {
     owner = "lxc";
diff --git a/pkgs/by-name/li/libappimage/package.nix b/pkgs/by-name/li/libappimage/package.nix
new file mode 100644
index 000000000000..8d2a1013aff8
--- /dev/null
+++ b/pkgs/by-name/li/libappimage/package.nix
@@ -0,0 +1,87 @@
+{
+  lib,
+  stdenv,
+  fetchFromGitHub,
+  fetchpatch,
+  cmake,
+  autoconf,
+  automake,
+  libtool,
+  pkg-config,
+  boost,
+  cairo,
+  fuse,
+  glib,
+  libarchive,
+  librsvg,
+  squashfuse,
+  xdg-utils-cxx,
+  zlib,
+}:
+stdenv.mkDerivation rec {
+  pname = "libappimage";
+  version = "1.0.4-5";
+
+  src = fetchFromGitHub {
+    owner = "AppImageCommunity";
+    repo = "libappimage";
+    rev = "v${version}";
+    hash = "sha256-V9Ilo0zFo9Urke+jCA4CSQB5tpzLC/S5jmon+bA+TEU=";
+  };
+
+  patches = [
+    # Fix build with GCC 13
+    # FIXME: remove in next release
+    (fetchpatch {
+      url = "https://github.com/AppImageCommunity/libappimage/commit/1e0515b23b90588ce406669134feca56ddcbbe43.patch";
+      hash = "sha256-WIMvXNqC1stgPiBTRpXHWq3edIRnQomtRSW2qO52TRo=";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace cmake/libappimage.pc.in \
+      --replace 'libdir=''${prefix}/@CMAKE_INSTALL_LIBDIR@' 'libdir=@CMAKE_INSTALL_FULL_LIBDIR@' \
+      --replace 'includedir=''${prefix}/@CMAKE_INSTALL_INCLUDEDIR@' 'includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@'
+  '';
+
+  cmakeFlags = [
+    "-DUSE_SYSTEM_BOOST=1"
+    "-DUSE_SYSTEM_LIBARCHIVE=1"
+    "-DUSE_SYSTEM_SQUASHFUSE=1"
+    "-DUSE_SYSTEM_XDGUTILS=1"
+    "-DUSE_SYSTEM_XZ=1"
+  ];
+
+  nativeBuildInputs = [
+    cmake
+    autoconf
+    automake
+    libtool
+    pkg-config
+  ];
+
+  buildInputs = [
+    boost
+    fuse
+    libarchive
+    squashfuse
+    xdg-utils-cxx
+  ];
+
+  propagatedBuildInputs = [
+    cairo
+    glib
+    librsvg
+    zlib
+  ];
+
+  strictDeps = true;
+
+  meta = with lib; {
+    description = "Implements functionality for dealing with AppImage files";
+    homepage = "https://github.com/AppImageCommunity/libappimage/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ k900 ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/pkgs/by-name/oe/oelint-adv/package.nix b/pkgs/by-name/oe/oelint-adv/package.nix
index 2b1b6f5f3ad6..32215b708f98 100644
--- a/pkgs/by-name/oe/oelint-adv/package.nix
+++ b/pkgs/by-name/oe/oelint-adv/package.nix
@@ -6,13 +6,13 @@
 
 python3.pkgs.buildPythonApplication rec {
   pname = "oelint-adv";
-  version = "4.4.0";
+  version = "4.4.1";
   format = "setuptools";
 
   src = fetchPypi {
     inherit version;
     pname = "oelint_adv";
-    hash = "sha256-Sg7qn/yZUJEJdMmaGm27kyL+fKkUsZo25eExZPOem40=";
+    hash = "sha256-Yv0GCz0vZTVrnFjHFIl4XF/jbVD4DJ4J6V6+X5IllJ8=";
   };
 
   propagatedBuildInputs = with python3.pkgs; [
diff --git a/pkgs/by-name/pa/patch2pr/package.nix b/pkgs/by-name/pa/patch2pr/package.nix
new file mode 100644
index 000000000000..67b5f227bcd4
--- /dev/null
+++ b/pkgs/by-name/pa/patch2pr/package.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildGoModule
+, fetchFromGitHub
+, testers
+, patch2pr
+}:
+
+buildGoModule rec {
+  pname = "patch2pr";
+  version = "0.22.0";
+
+  src = fetchFromGitHub {
+    owner = "bluekeyes";
+    repo = "patch2pr";
+    rev = "v${version}";
+    hash = "sha256-tG0pSXmrWT5PCcR25XngbKAS3q9jKdDKqWdPqA62omE=";
+  };
+
+  vendorHash = "sha256-Z6BHUD7WrEpUmCaLvrFYCQCSbhPhee+gR5ep1oLzqbE=";
+
+  ldflags = [
+    "-X main.version=${version}"
+    "-X main.commit=${src.rev}"
+  ];
+
+  passthru.tests.patch2pr-version = testers.testVersion {
+    package = patch2pr;
+    command = "${patch2pr.meta.mainProgram} --version";
+    version = version;
+  };
+
+  meta = with lib; {
+    description = "Create pull requests from patches without cloning the repository";
+    homepage = "https://github.com/bluekeyes/patch2pr";
+    changelog = "https://github.com/bluekeyes/patch2pr/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ katrinafyi ];
+    mainProgram = "patch2pr";
+  };
+}
diff --git a/pkgs/by-name/re/renode-dts2repl/package.nix b/pkgs/by-name/re/renode-dts2repl/package.nix
index c39103910f62..82d0ce4dbda5 100644
--- a/pkgs/by-name/re/renode-dts2repl/package.nix
+++ b/pkgs/by-name/re/renode-dts2repl/package.nix
@@ -6,14 +6,14 @@
 
 python3.pkgs.buildPythonApplication {
   pname = "renode-dts2repl";
-  version = "unstable-2024-02-23";
+  version = "unstable-2024-02-26";
   pyproject = true;
 
   src = fetchFromGitHub {
     owner = "antmicro";
     repo = "dts2repl";
-    rev = "ae616f4f6a70a2f497c2a9ce8c9c64b34238e553";
-    hash = "sha256-2Q7hfXf9nCrmHxJ0S8njF5zIgcGXaRPPVogtsPgLLsI=";
+    rev = "de8d8b276ceaae79ea90ed67065e9616e06b2558";
+    hash = "sha256-uiS/zzAf4lCg/yUAoci2JXrmwb3xsObuzSi1U08lSjo=";
   };
 
   nativeBuildInputs = [
diff --git a/pkgs/by-name/re/renode-unstable/package.nix b/pkgs/by-name/re/renode-unstable/package.nix
index 1eafcf30a34e..6f53c1c45045 100644
--- a/pkgs/by-name/re/renode-unstable/package.nix
+++ b/pkgs/by-name/re/renode-unstable/package.nix
@@ -7,10 +7,10 @@
   inherit buildUnstable;
 }).overrideAttrs (finalAttrs: _: {
   pname = "renode-unstable";
-  version = "1.14.0+20240222git83285cc63";
+  version = "1.14.0+20240226git732d357b4";
 
   src = fetchurl {
     url = "https://builds.renode.io/renode-${finalAttrs.version}.linux-portable.tar.gz";
-    hash = "sha256-RFZdl2t1356h4Hvab6Gn3LZZnCWlQlK6C0otlXzVlMI=";
+    hash = "sha256-08xV/6ch6dWA4pwg8tuDywYhQ4ZIFRD5zegojDZtAHE=";
   };
 })
diff --git a/pkgs/tools/security/sn0int/default.nix b/pkgs/by-name/sn/sn0int/package.nix
index 66f89f77e8ea..2410fa0cc230 100644
--- a/pkgs/tools/security/sn0int/default.nix
+++ b/pkgs/by-name/sn/sn0int/package.nix
@@ -7,6 +7,7 @@
 , pkgs
 , sqlite
 , stdenv
+, installShellFiles
 }:
 
 rustPlatform.buildRustPackage rec {
@@ -24,6 +25,7 @@ rustPlatform.buildRustPackage rec {
 
   nativeBuildInputs = [
     pkg-config
+    installShellFiles
   ];
 
   buildInputs = [
@@ -39,6 +41,13 @@ rustPlatform.buildRustPackage rec {
   # in "checkPhase", hence fails in sandbox of "nix".
   doCheck = false;
 
+  postInstall = ''
+    installShellCompletion --cmd sn0int \
+      --bash <($out/bin/sn0int completions bash) \
+      --fish <($out/bin/sn0int completions fish) \
+      --zsh  <($out/bin/sn0int completions zsh)
+  '';
+
   meta = with lib; {
     description = "Semi-automatic OSINT framework and package manager";
     homepage = "https://github.com/kpcyrd/sn0int";
@@ -46,5 +55,6 @@ rustPlatform.buildRustPackage rec {
     license = with licenses; [ gpl3Plus ];
     maintainers = with maintainers; [ fab xrelkd ];
     platforms = platforms.linux ++ platforms.darwin;
+    mainProgram = "sn0int";
   };
 }
diff --git a/pkgs/by-name/sp/spicetify-cli/package.nix b/pkgs/by-name/sp/spicetify-cli/package.nix
index d0fe744b23f6..b7dddb8ad7e7 100644
--- a/pkgs/by-name/sp/spicetify-cli/package.nix
+++ b/pkgs/by-name/sp/spicetify-cli/package.nix
@@ -2,13 +2,13 @@
 
 buildGoModule rec {
   pname = "spicetify-cli";
-  version = "2.32.1";
+  version = "2.33.0";
 
   src = fetchFromGitHub {
     owner = "spicetify";
     repo = "spicetify-cli";
     rev = "v${version}";
-    hash = "sha256-GUtQwSiC/2wzJmPE0uqJHvLyrIM+5B2YARK9WAQex8k=";
+    hash = "sha256-1bakWUhB47o37pV6cbfDRdHdqreGKFhU7LFajIM5mhw=";
   };
 
   vendorHash = "sha256-9rYShpUVI3KSY6UgGmoXo899NkUezkAAkTgFPdq094E=";
diff --git a/pkgs/by-name/sw/swaycons/package.nix b/pkgs/by-name/sw/swaycons/package.nix
index c990a2bb5186..33e5ab3666d4 100644
--- a/pkgs/by-name/sw/swaycons/package.nix
+++ b/pkgs/by-name/sw/swaycons/package.nix
@@ -20,7 +20,7 @@ rustPlatform.buildRustPackage rec {
     description = "Window Icons in Sway with Nerd Fonts!";
     homepage = "https://github.com/ActuallyAllie/swaycons";
     license = licenses.asl20;
-    platforms = [ "x86_64-linux" ];
+    platforms = platforms.linux;
     maintainers = with maintainers; [ aacebedo ];
   };
 }
diff --git a/pkgs/by-name/ui/uiua/package.nix b/pkgs/by-name/ui/uiua/package.nix
index 8b11104cb9a0..52d364fb7fbd 100644
--- a/pkgs/by-name/ui/uiua/package.nix
+++ b/pkgs/by-name/ui/uiua/package.nix
@@ -14,16 +14,16 @@
 
 rustPlatform.buildRustPackage rec {
   pname = "uiua";
-  version = "0.8.0";
+  version = "0.9.5";
 
   src = fetchFromGitHub {
     owner = "uiua-lang";
     repo = "uiua";
     rev = version;
-    hash = "sha256-JilYPIeJbVf9wgGpLTy8pbMwFRrW7Od+8y0tWwAXU84=";
+    hash = "sha256-629hJLSGf0LJ+P1j1b87RV6XGgsDaWif1a6+Eo3NmMw=";
   };
 
-  cargoHash = "sha256-oXO2TBdKmVIpZD0jLI1CK9b48r3SwdeygcJoUG6HGXo=";
+  cargoHash = "sha256-ZRiDlsSZ5jjTrOrB/bg2xOcOTsCNFdP0jY0SwZ1zwGU=";
 
   nativeBuildInputs = lib.optionals stdenv.isDarwin [
     rustPlatform.bindgenHook
@@ -41,6 +41,7 @@ rustPlatform.buildRustPackage rec {
 
   buildFeatures = lib.optional audioSupport "audio";
 
+  passthru.updateScript = ./update.sh;
   passthru.tests.run = runCommand "uiua-test-run" { nativeBuildInputs = [ uiua ]; } ''
     uiua init
     diff -U3 --color=auto <(uiua run main.ua) <(echo '"Hello, World!"')
diff --git a/pkgs/by-name/ui/uiua/update.sh b/pkgs/by-name/ui/uiua/update.sh
new file mode 100755
index 000000000000..389ba4867198
--- /dev/null
+++ b/pkgs/by-name/ui/uiua/update.sh
@@ -0,0 +1,7 @@
+#!/usr/bin/env nix-shell
+#!nix-shell -i bash -p curl jq nix-update common-updater-scripts
+
+nix-update uiua
+
+EXT_VER=$(curl https://raw.githubusercontent.com/uiua-lang/uiua-vscode/main/package.json | jq -r .version)
+update-source-version vscode-extensions.uiua-lang.uiua-vscode $EXT_VER
diff --git a/pkgs/by-name/ux/uxn/package.nix b/pkgs/by-name/ux/uxn/package.nix
index 389c8dd77c78..2dc429a126bd 100644
--- a/pkgs/by-name/ux/uxn/package.nix
+++ b/pkgs/by-name/ux/uxn/package.nix
@@ -7,7 +7,7 @@
 
 stdenv.mkDerivation (finalAttrs: {
   pname = "uxn";
-  version = "0-unstable-2024-02-15";
+  version = "1.0-unstable-2024-02-15";
 
   src = fetchFromSourcehut {
     owner = "~rabbits";
diff --git a/pkgs/applications/video/vlc/default.nix b/pkgs/by-name/vl/vlc/package.nix
index 2b5c86b0efb2..9b89cca9a192 100644
--- a/pkgs/applications/video/vlc/default.nix
+++ b/pkgs/by-name/vl/vlc/package.nix
@@ -1,8 +1,4 @@
 { lib
-, stdenv
-, pkgsBuildBuild
-, fetchurl
-, fetchpatch
 , SDL
 , SDL_image
 , a52dec
@@ -11,6 +7,8 @@
 , avahi
 , dbus
 , faad2
+, fetchpatch
+, fetchurl
 , ffmpeg
 , flac
 , fluidsynth
@@ -48,6 +46,7 @@
 , libpulseaudio
 , libraw1394
 , librsvg
+, libsForQt5
 , libsamplerate
 , libspatialaudio
 , libssh2
@@ -65,23 +64,20 @@
 , ncurses
 , perl
 , pkg-config
+, pkgsBuildBuild
 , protobuf
-, qtbase
-, qtsvg
-, qtwayland
-, qtx11extras
 , removeReferencesTo
 , samba
 , schroedinger
 , speex
 , srt
+, stdenv
 , systemd
 , taglib
 , unzip
 , wayland
 , wayland-protocols
 , wrapGAppsHook
-, wrapQtAppsHook
 , xcbutilkeysyms
 , zlib
 
@@ -98,7 +94,7 @@
 #   networking.firewall.allowedTCPPorts = [ 8010 ];
 
 let
-  inherit (lib) optionalString optional optionals;
+  inherit (lib) optionalString optionals;
 in
 stdenv.mkDerivation (finalAttrs: {
   pname = "${optionalString onlyLibVLC "lib"}vlc";
@@ -118,8 +114,8 @@ stdenv.mkDerivation (finalAttrs: {
     unzip
     wrapGAppsHook
   ]
-  ++ optional chromecastSupport protobuf
-  ++ optionals withQt5 [ wrapQtAppsHook ]
+  ++ optionals chromecastSupport [ protobuf ]
+  ++ optionals withQt5 [ libsForQt5.wrapQtAppsHook ]
   ++ optionals waylandSupport [
     wayland
     wayland-protocols
@@ -191,8 +187,8 @@ stdenv.mkDerivation (finalAttrs: {
     xcbutilkeysyms
     zlib
   ]
-  ++ optional (!stdenv.hostPlatform.isAarch && !onlyLibVLC) live555
-  ++ optional jackSupport libjack2
+  ++ optionals (!stdenv.hostPlatform.isAarch && !onlyLibVLC) [ live555 ]
+  ++ optionals jackSupport [ libjack2 ]
   ++ optionals chromecastSupport [ libmicrodns protobuf ]
   ++ optionals skins2Support [
     freetype
@@ -201,8 +197,12 @@ stdenv.mkDerivation (finalAttrs: {
     libXpm
   ]
   ++ optionals waylandSupport [ wayland wayland-protocols ]
-  ++ optionals withQt5 [ qtbase qtsvg qtx11extras ]
-  ++ optional (waylandSupport && withQt5) qtwayland;
+  ++ optionals withQt5 (with libsForQt5; [
+    qtbase
+    qtsvg
+    qtx11extras
+  ])
+  ++ optionals (waylandSupport && withQt5) [ libsForQt5.qtwayland ];
 
   env = {
     # vlc depends on a c11-gcc wrapper script which we don't have so we need to
@@ -218,51 +218,37 @@ stdenv.mkDerivation (finalAttrs: {
     # upstream issue: https://code.videolan.org/videolan/vlc/-/issues/25473
     (fetchpatch {
       url = "https://code.videolan.org/videolan/vlc/uploads/eb1c313d2d499b8a777314f789794f9d/0001-Add-lssl-and-lcrypto-to-liblive555_plugin_la_LIBADD.patch";
-      sha256 = "0kyi8q2zn2ww148ngbia9c7qjgdrijf4jlvxyxgrj29cb5iy1kda";
+      hash = "sha256-qs3gY1ksCZlf931TSZyMuT2JD0sqrmcRCZwL+wVG0U8=";
     })
   ];
 
   postPatch = ''
-    substituteInPlace modules/text_renderer/freetype/platform_fonts.h --replace \
-      /usr/share/fonts/truetype/freefont ${freefont_ttf}/share/fonts/truetype
-  '' + lib.optionalString (!stdenv.hostPlatform.canExecute stdenv.buildPlatform) ''
-    # Upstream luac can't cross compile, so we have to install the lua
-    # sources, not bytecode:
-    # https://www.lua.org/wshop13/Jericke.pdf#page=39
-    substituteInPlace share/Makefile.am --replace $'.luac \\\n' $'.lua \\\n'
+    substituteInPlace modules/text_renderer/freetype/platform_fonts.h \
+      --replace \
+        /usr/share/fonts/truetype/freefont \
+        ${freefont_ttf}/share/fonts/truetype
+  ''
+  # Upstream luac can't cross compile, so we have to install the lua sources
+  # instead of bytecode:
+  # https://www.lua.org/wshop13/Jericke.pdf#page=39
+  + lib.optionalString (!stdenv.hostPlatform.canExecute stdenv.buildPlatform) ''
+      substituteInPlace share/Makefile.am \
+        --replace $'.luac \\\n' $'.lua \\\n'
   '';
 
   enableParallelBuilding = true;
 
   dontWrapGApps = true; # to prevent double wrapping of Qtwrap and Gwrap
 
-  preFixup = ''
-    qtWrapperArgs+=("''${gappsWrapperArgs[@]}")
-  '';
-
-  # - Touch plugins (plugins cache keyed off mtime and file size:
-  #     https://github.com/NixOS/nixpkgs/pull/35124#issuecomment-370552830
-  # - Remove references to the Qt development headers (used in error messages)
-  #
-  # pkgsBuildBuild is used here because buildPackages.libvlc somehow
-  # depends on a qt5.qttranslations that doesn't build, even though it
-  # should be the same as pkgsBuildBuild.qt5.qttranslations.
-  postFixup = ''
-    find $out/lib/vlc/plugins -exec touch -d @1 '{}' ';'
-    ${if stdenv.buildPlatform.canExecute stdenv.hostPlatform then "$out" else pkgsBuildBuild.libvlc}/lib/vlc/vlc-cache-gen $out/vlc/plugins
-  '' + optionalString withQt5 ''
-    remove-references-to -t "${qtbase.dev}" $out/lib/vlc/plugins/gui/libqt_plugin.so
-  '';
-
   # Most of the libraries are auto-detected so we don't need to set a bunch of
   # "--enable-foo" flags here
   configureFlags = [
     "--enable-srt" # Explicit enable srt to ensure the patch is applied.
     "--with-kde-solid=$out/share/apps/solid/actions"
   ]
-  ++ optional onlyLibVLC "--disable-vlc"
-  ++ optional skins2Support "--enable-skins2"
-  ++ optional waylandSupport "--enable-wayland"
+  ++ optionals onlyLibVLC [ "--disable-vlc" ]
+  ++ optionals skins2Support [ "--enable-skins2" ]
+  ++ optionals waylandSupport [ "--enable-wayland" ]
   ++ optionals chromecastSupport [
     "--enable-sout"
     "--enable-chromecast"
@@ -285,6 +271,24 @@ stdenv.mkDerivation (finalAttrs: {
     cp -R share/hrtfs $out/share/vlc
   '';
 
+  preFixup = ''
+    qtWrapperArgs+=("''${gappsWrapperArgs[@]}")
+  '';
+
+  # - Touch plugins (plugins cache keyed off mtime and file size:
+  #     https://github.com/NixOS/nixpkgs/pull/35124#issuecomment-370552830
+  # - Remove references to the Qt development headers (used in error messages)
+  #
+  # pkgsBuildBuild is used here because buildPackages.libvlc somehow
+  # depends on a qt5.qttranslations that doesn't build, even though it
+  # should be the same as pkgsBuildBuild.qt5.qttranslations.
+  postFixup = ''
+    find $out/lib/vlc/plugins -exec touch -d @1 '{}' ';'
+    ${if stdenv.buildPlatform.canExecute stdenv.hostPlatform then "$out" else pkgsBuildBuild.libvlc}/lib/vlc/vlc-cache-gen $out/vlc/plugins
+  '' + optionalString withQt5 ''
+    remove-references-to -t "${libsForQt5.qtbase.dev}" $out/lib/vlc/plugins/gui/libqt_plugin.so
+  '';
+
   meta = {
     description = "Cross-platform media player and streaming server";
     homepage = "https://www.videolan.org/vlc/";
diff --git a/pkgs/tools/misc/wit-bindgen/default.nix b/pkgs/by-name/wi/wit-bindgen/package.nix
index 9f0fbe1f4565..4407ecbdcc53 100644
--- a/pkgs/tools/misc/wit-bindgen/default.nix
+++ b/pkgs/by-name/wi/wit-bindgen/package.nix
@@ -5,16 +5,16 @@
 
 rustPlatform.buildRustPackage rec {
   pname = "wit-bindgen";
-  version = "0.17.0";
+  version = "0.19.1";
 
   src = fetchFromGitHub {
     owner = "bytecodealliance";
     repo = "wit-bindgen";
-    rev = "wit-bindgen-cli-${version}";
-    hash = "sha256-eFJkr/RqQdULPquCVbjhR8843aGjeEnUCF/Ws2U5fQk=";
+    rev = "v${version}";
+    hash = "sha256-vJqJ+qDoU6W5S4mhBG6YQoVvvXqcqm7WXwypCS36z6c=";
   };
 
-  cargoHash = "sha256-934lHOXzE2cLW6LMM0AQl/GJt4wSIKZlY1C7gmjGVrc=";
+  cargoHash = "sha256-uDqXG/OyFyJbwrZzQVRDLxreKdyOEvenE8MNnLFs9CA=";
 
   # Some tests fail because they need network access to install the `wasm32-unknown-unknown` target.
   # However, GitHub Actions ensures a proper build.
diff --git a/pkgs/by-name/xc/xclicker/package.nix b/pkgs/by-name/xc/xclicker/package.nix
new file mode 100644
index 000000000000..3a6597dc4832
--- /dev/null
+++ b/pkgs/by-name/xc/xclicker/package.nix
@@ -0,0 +1,63 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, fetchpatch
+, meson
+, ninja
+, pkg-config
+, wrapGAppsHook
+, gtk3
+, libXtst
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "xclicker";
+  version = "1.5.0";
+
+  src = fetchFromGitHub {
+    owner = "robiot";
+    repo = "xclicker";
+    rev = "v${finalAttrs.version}";
+    hash = "sha256-3D49iMzCCT9Z2Pf5INHYFZusG0BQI7La7lLaSVM/4mc=";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "fix-malloc-size.patch";
+      url = "https://github.com/robiot/xclicker/commit/c99f69a747e9df75fb3676be20a3ec805526d022.patch";
+      hash = "sha256-ESbMBusJVNfbGxlEn1Kby00mnXvM5H0r03bX5ofC6Fg=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    gtk3
+    libXtst
+  ];
+
+  mesonBuildType = "release";
+
+  installPhase = ''
+    runHook preInstall
+    install -Dm755 ./src/xclicker $out/bin/xclicker
+    install -Dm644 $src/assets/xclicker.desktop $out/share/applications/xclicker.desktop
+    install -Dm644 $src/assets/icon.png $out/share/pixmaps/xclicker.png
+    runHook postInstall
+  '';
+
+  meta = {
+    changelog = "https://github.com/robiot/xclicker/releases/tag/${finalAttrs.src.rev}";
+    description = "Fast gui autoclicker for x11 linux desktops";
+    homepage = "https://xclicker.xyz/";
+    license = lib.licenses.gpl3Only;
+    mainProgram = "xclicker";
+    maintainers = with lib.maintainers; [ tomasajt ];
+    platforms = lib.platforms.linux;
+  };
+})
diff --git a/pkgs/by-name/xd/xdg-utils-cxx/package.nix b/pkgs/by-name/xd/xdg-utils-cxx/package.nix
new file mode 100644
index 000000000000..d5c9e7c9aff8
--- /dev/null
+++ b/pkgs/by-name/xd/xdg-utils-cxx/package.nix
@@ -0,0 +1,30 @@
+{
+  lib,
+  stdenv,
+  fetchFromGitHub,
+  cmake,
+}:
+stdenv.mkDerivation rec {
+  pname = "xdg-utils-cxx";
+  version = "1.0.1";
+
+  src = fetchFromGitHub {
+    owner = "azubieta";
+    repo = "xdg-utils-cxx";
+    rev = "v${version}";
+    hash = "sha256-hEN0xqZUNfMOIrw3q+x4kEFhYoqmyn7W3f2w8AGw2wI=";
+  };
+
+  nativeBuildInputs = [
+    cmake
+  ];
+
+  meta = with lib; {
+    description = "Implementation of the FreeDesktop specifications to be used in c++ projects";
+    homepage = "https://github.com/azubieta/xdg-utils-cxx";
+    license = licenses.mit;
+    maintainers = with maintainers; [ k900 ];
+    mainProgram = "xdg-utils-cxx";
+    platforms = platforms.linux;
+  };
+}
diff --git a/pkgs/data/misc/v2ray-domain-list-community/default.nix b/pkgs/data/misc/v2ray-domain-list-community/default.nix
index 7a5c8fc0c3f4..1533cd089228 100644
--- a/pkgs/data/misc/v2ray-domain-list-community/default.nix
+++ b/pkgs/data/misc/v2ray-domain-list-community/default.nix
@@ -3,12 +3,12 @@
 let
   generator = pkgsBuildBuild.buildGoModule rec {
     pname = "v2ray-domain-list-community";
-    version = "20240217140518";
+    version = "20240221053250";
     src = fetchFromGitHub {
       owner = "v2fly";
       repo = "domain-list-community";
       rev = version;
-      hash = "sha256-7Voepx8+tFWpugtUKoRJ55nSX3cWtXgPhYiNDhE3OGs=";
+      hash = "sha256-oPffStUx2CD4gfSNIYqCzLLj+IAhm3aGQknRsrauD+k=";
     };
     vendorHash = "sha256-azvMUi8eLNoNofRa2X4SKTTiMd6aOyO6H/rOiKjkpIY=";
     meta = with lib; {
diff --git a/pkgs/development/compilers/factor-lang/factor99.nix b/pkgs/development/compilers/factor-lang/factor99.nix
index 85ff98a28ba1..59595210dd1a 100644
--- a/pkgs/development/compilers/factor-lang/factor99.nix
+++ b/pkgs/development/compilers/factor-lang/factor99.nix
@@ -57,7 +57,7 @@ let
     # Defined in gdk-pixbuf setup hook
     findGdkPixbufLoaders "${librsvg}"
 
-    ${if to then "makeWrapper ${from} ${to}" else "wrapProgram ${from}"} \
+    ${if (builtins.isString to) then "makeWrapper ${from} ${to}" else "wrapProgram ${from}"} \
       --set GDK_PIXBUF_MODULE_FILE "$GDK_PIXBUF_MODULE_FILE" \
       --argv0 factor \
       --prefix LD_LIBRARY_PATH : /run/opengl-driver/lib:${lib.makeLibraryPath runtimeLibs} \
@@ -72,7 +72,7 @@ let
         passthru.runtimeLibs = runtimeLibs ++ interpreter.runtimeLibs;
       }
       (wrapFactorScript {
-        from = "${interpreter}/lib/factor/.factor.wrapped";
+        from = "${interpreter}/lib/factor/.factor-wrapped";
         to = "$out/bin/factor";
         runtimeLibs = (runtimeLibs ++ interpreter.runtimeLibs);
       });
diff --git a/pkgs/development/libraries/accounts-qt/default.nix b/pkgs/development/libraries/accounts-qt/default.nix
index 7549f02fc56c..7d2617a6ee60 100644
--- a/pkgs/development/libraries/accounts-qt/default.nix
+++ b/pkgs/development/libraries/accounts-qt/default.nix
@@ -1,14 +1,15 @@
 { stdenv, lib, fetchFromGitLab, doxygen, glib, libaccounts-glib, pkg-config, qmake, qtbase, wrapQtAppsHook }:
 
-stdenv.mkDerivation rec {
+stdenv.mkDerivation {
   pname = "accounts-qt";
-  version = "1.16";
+  version = "1.16-unstable-2023-11-24";
 
+  # pinned to fork with Qt6 support
   src = fetchFromGitLab {
-    sha256 = "1vmpjvysm0ld8dqnx8msa15hlhrkny02cqycsh4k2azrnijg0xjz";
-    rev = "VERSION_${version}";
+    owner = "nicolasfella";
     repo = "libaccounts-qt";
-    owner = "accounts-sso";
+    rev = "18557f7def9af8f4a9e0e93e9f575ae11e5066aa";
+    hash = "sha256-8FGZmg2ljSh1DYZfklMTrWN7Sdlk/Atw0qfpbb+GaBc=";
   };
 
   propagatedBuildInputs = [ glib libaccounts-glib ];
diff --git a/pkgs/development/libraries/hunspell/dictionaries.nix b/pkgs/development/libraries/hunspell/dictionaries.nix
index dbaa4888922c..d62f672f0660 100644
--- a/pkgs/development/libraries/hunspell/dictionaries.nix
+++ b/pkgs/development/libraries/hunspell/dictionaries.nix
@@ -828,14 +828,14 @@ rec {
   th_TH = th-th;
   th-th = mkDict {
     pname = "hunspell-dict-th-th";
-    version = "experimental-2023-03-01";
+    version = "experimental-2024-02-27";
     dictFileName = "th_TH";
     readmeFile = "README.md";
     src = fetchFromGitHub {
       owner = "SyafiqHadzir";
       repo = "Hunspell-TH";
-      rev = "9c09f1b7c0eb4d04b9f6f427901686c5c3d9fa54";
-      sha256 = "1wszpnbgj31k72x1vvcfkzcpmxsncdpqsi3zagah7swilpi7cqm4";
+      rev = "62d35f9211ca1eb4c367eac2ae57193efe6e88d2";
+      sha256 = "sha256-t4m4u+qIgJPrKz58Cu2Q+knYm/+cvrNLzQsiiSRTB1A=";
     };
     meta = with lib; {
       description = "Hunspell dictionary for Central Thai (Thailand)";
diff --git a/pkgs/development/libraries/imgui/default.nix b/pkgs/development/libraries/imgui/default.nix
index a9ce7358447d..275d44e88dd9 100644
--- a/pkgs/development/libraries/imgui/default.nix
+++ b/pkgs/development/libraries/imgui/default.nix
@@ -2,13 +2,13 @@
 
 stdenv.mkDerivation rec {
   pname = "imgui";
-  version = "1.90.3";
+  version = "1.90.4";
 
   src = fetchFromGitHub {
     owner = "ocornut";
     repo = "imgui";
     rev = "v${version}";
-    sha256 = "sha256-dmCQ7p9gpQiBb2hPhzX+/Y0ZiYX01cRNQYXC1KTRYck=";
+    sha256 = "sha256-7+Ay7H97tIO6CUsEyaQv4i9q2FCw98eQUq/KYZyfTAw=";
   };
 
   dontBuild = true;
diff --git a/pkgs/development/libraries/kcolorpicker/default.nix b/pkgs/development/libraries/kcolorpicker/default.nix
index 4647d65882cd..9a96b92c1258 100644
--- a/pkgs/development/libraries/kcolorpicker/default.nix
+++ b/pkgs/development/libraries/kcolorpicker/default.nix
@@ -1,19 +1,29 @@
-{ lib, mkDerivation, fetchFromGitHub, cmake, qtbase }:
+{ lib, stdenv, fetchFromGitHub, cmake, qtbase }:
 
-mkDerivation rec {
+let
+  isQt6 = lib.versions.major qtbase.version == "6";
+in stdenv.mkDerivation rec {
   pname = "kcolorpicker";
-  version = "0.2.0";
+  version = "0.3.0";
 
   src = fetchFromGitHub {
     owner = "ksnip";
     repo = "kColorPicker";
     rev = "v${version}";
-    sha256 = "sha256-ahmMj/yzQiRP9oJwDuhJGxe849kxNsoGFDZ2CGQNhKs=";
+    hash = "sha256-gkjlIiLB3/074EEFrQUa0djvVt/C44O3afqqNis64P0=";
   };
 
   nativeBuildInputs = [ cmake ];
   buildInputs = [ qtbase ];
 
+  cmakeFlags = [
+    (lib.cmakeBool "BUILD_WITH_QT6" isQt6)
+    (lib.cmakeBool "BUILD_SHARED_LIBS" true)
+  ];
+
+  # Library only
+  dontWrapQtApps = true;
+
   meta = with lib; {
     description = "Qt based Color Picker with popup menu";
     homepage = "https://github.com/ksnip/kColorPicker";
diff --git a/pkgs/development/libraries/kimageannotator/default.nix b/pkgs/development/libraries/kimageannotator/default.nix
index ce1be1d18062..e32247a488a3 100644
--- a/pkgs/development/libraries/kimageannotator/default.nix
+++ b/pkgs/development/libraries/kimageannotator/default.nix
@@ -1,18 +1,29 @@
-{ lib, mkDerivation, fetchFromGitHub, cmake, qtbase, kcolorpicker, qttools }:
+{ lib, stdenv, fetchFromGitHub, cmake, qttools, qtbase, qtsvg, kcolorpicker }:
 
-mkDerivation rec {
+let
+  isQt6 = lib.versions.major qtbase.version == "6";
+in stdenv.mkDerivation rec {
   pname = "kimageannotator";
-  version = "0.6.1";
+  version = "0.7.0";
 
   src = fetchFromGitHub {
     owner = "ksnip";
     repo = "kImageAnnotator";
     rev = "v${version}";
-    sha256 = "sha256-lNoYAJ5yTC5H0gWPVkBGhLroRhFCPyC1DsVBy0IrqL4=";
+    hash = "sha256-Dq9CM/D3nA7MaY9rfwqF/UAw/+1ptKLf3P8jhFdngKk=";
   };
 
   nativeBuildInputs = [ cmake qttools ];
-  buildInputs = [ qtbase kcolorpicker ];
+  buildInputs = [ qtbase qtsvg ];
+  propagatedBuildInputs = [ kcolorpicker ];
+
+  cmakeFlags = [
+    (lib.cmakeBool "BUILD_WITH_QT6" isQt6)
+    (lib.cmakeBool "BUILD_SHARED_LIBS" true)
+  ];
+
+  # Library only
+  dontWrapQtApps = true;
 
   meta = with lib; {
     description = "Tool for annotating images";
diff --git a/pkgs/development/libraries/paho-mqtt-c/default.nix b/pkgs/development/libraries/paho-mqtt-c/default.nix
index 149432788221..0f345eb5134f 100644
--- a/pkgs/development/libraries/paho-mqtt-c/default.nix
+++ b/pkgs/development/libraries/paho-mqtt-c/default.nix
@@ -1,4 +1,4 @@
-{ lib, stdenv, fetchFromGitHub, cmake, openssl }:
+{ lib, stdenv, fetchFromGitHub, cmake, openssl, enableStatic ? stdenv.hostPlatform.isStatic, enableShared ? !stdenv.hostPlatform.isStatic }:
 
 stdenv.mkDerivation rec {
   pname = "paho.mqtt.c";
@@ -21,7 +21,11 @@ stdenv.mkDerivation rec {
 
   buildInputs = [ openssl ];
 
-  cmakeFlags = [ "-DPAHO_WITH_SSL=TRUE" ];
+  cmakeFlags = [
+    (lib.cmakeBool "PAHO_WITH_SSL" true)
+    (lib.cmakeBool "PAHO_BUILD_STATIC" enableStatic)
+    (lib.cmakeBool "PAHO_BUILD_SHARED" enableShared)
+  ];
 
   meta = with lib; {
     description = "Eclipse Paho MQTT C Client Library";
diff --git a/pkgs/development/libraries/paho-mqtt-cpp/default.nix b/pkgs/development/libraries/paho-mqtt-cpp/default.nix
index 62d9aa597792..6f1b9b215e26 100644
--- a/pkgs/development/libraries/paho-mqtt-cpp/default.nix
+++ b/pkgs/development/libraries/paho-mqtt-cpp/default.nix
@@ -1,4 +1,4 @@
-{ lib, stdenv, fetchFromGitHub, cmake, openssl, paho-mqtt-c }:
+{ lib, stdenv, fetchFromGitHub, cmake, openssl, paho-mqtt-c, enableStatic ? stdenv.hostPlatform.isStatic, enableShared ? !stdenv.hostPlatform.isStatic }:
 
 stdenv.mkDerivation rec {
   pname = "paho.mqtt.cpp";
@@ -15,6 +15,12 @@ stdenv.mkDerivation rec {
 
   buildInputs = [ openssl paho-mqtt-c ];
 
+  cmakeFlags = [
+    (lib.cmakeBool "PAHO_WITH_SSL" true)
+    (lib.cmakeBool "PAHO_BUILD_STATIC" enableStatic)
+    (lib.cmakeBool "PAHO_BUILD_SHARED" enableShared)
+  ];
+
   meta = with lib; {
     description = "Eclipse Paho MQTT C++ Client Library";
     homepage = "https://www.eclipse.org/paho/";
diff --git a/pkgs/development/libraries/science/math/libamplsolver/default.nix b/pkgs/development/libraries/science/math/libamplsolver/default.nix
index c0bc89b492ea..a40091bac8b5 100644
--- a/pkgs/development/libraries/science/math/libamplsolver/default.nix
+++ b/pkgs/development/libraries/science/math/libamplsolver/default.nix
@@ -12,7 +12,7 @@ stdenv.mkDerivation rec {
   patches = [
     (substitute {
       src = ./libamplsolver-sharedlib.patch;
-      replacements = [ "--replace" "@sharedlibext@" "${stdenv.hostPlatform.extensions.sharedLibrary}" ];
+      substitutions = [ "--replace" "@sharedlibext@" "${stdenv.hostPlatform.extensions.sharedLibrary}" ];
     })
   ];
 
diff --git a/pkgs/development/libraries/signond/default.nix b/pkgs/development/libraries/signond/default.nix
index ea57e872ab29..5e9e53855313 100644
--- a/pkgs/development/libraries/signond/default.nix
+++ b/pkgs/development/libraries/signond/default.nix
@@ -1,14 +1,15 @@
 { stdenv, lib, fetchFromGitLab, qmake, qtbase, wrapQtAppsHook, doxygen }:
 
-stdenv.mkDerivation rec {
+stdenv.mkDerivation {
   pname = "signond";
-  version = "8.61";
+  version = "8.61-unstable-2023-11-24";
 
+  # pinned to fork with Qt6 support
   src = fetchFromGitLab {
-    owner = "accounts-sso";
-    repo = pname;
-    rev = "VERSION_${version}";
-    sha256 = "sha256-d7JZmGpjIvSN9l1nvKbBZjF0OR5L5frPTGHF/pNEqHE=";
+    owner = "nicolasfella";
+    repo = "signond";
+    rev = "c8ad98249af541514ff7a81634d3295e712f1a39";
+    hash = "sha256-0FcSVF6cPuFEU9h7JIbanoosW/B4rQhFPOq7iBaOdKw=";
   };
 
   nativeBuildInputs = [
diff --git a/pkgs/development/ocaml-modules/caqti/async.nix b/pkgs/development/ocaml-modules/caqti/async.nix
index 328cf37986d2..22755be193df 100644
--- a/pkgs/development/ocaml-modules/caqti/async.nix
+++ b/pkgs/development/ocaml-modules/caqti/async.nix
@@ -4,7 +4,7 @@ buildDunePackage {
   pname = "caqti-async";
   inherit (caqti) version src;
 
-  duneVersion = "3";
+  minimalOCamlVersion = "4.14";
 
   propagatedBuildInputs = [ async_kernel async_unix caqti core_kernel ];
 
diff --git a/pkgs/development/ocaml-modules/caqti/default.nix b/pkgs/development/ocaml-modules/caqti/default.nix
index 68eb2657b324..218f4cf3c120 100644
--- a/pkgs/development/ocaml-modules/caqti/default.nix
+++ b/pkgs/development/ocaml-modules/caqti/default.nix
@@ -1,25 +1,34 @@
-{ lib, fetchurl, buildDunePackage, ocaml
-, cppo, logs, ptime, uri, bigstringaf
-, re, cmdliner, alcotest
+{ lib
+, fetchurl
+, buildDunePackage
+, angstrom
+, bigstringaf
+, domain-name
+, dune-site
+, ipaddr
+, logs
+, lwt-dllist
+, mtime
+, ptime
+, uri
 }:
 
 buildDunePackage rec {
   pname = "caqti";
-  version = "1.9.1";
+  version = "2.1.1";
 
-  minimalOCamlVersion = "4.04";
-  duneVersion = "3";
+  minimalOCamlVersion = "4.08";
 
   src = fetchurl {
     url = "https://github.com/paurkedal/ocaml-caqti/releases/download/v${version}/caqti-v${version}.tbz";
-    sha256 = "sha256-PQBgJBNx3IcE6/vyNIf26a2xStU22LBhff8eM6UPaJ4=";
+    hash = "sha256-SDpTX0HiZBkX/BgyzkrRX/w/ToKDsbMBiiYXNJWDCQo=";
   };
 
-  nativeBuildInputs = [ cppo ];
-  propagatedBuildInputs = [ logs ptime uri bigstringaf ];
-  checkInputs = [ re cmdliner alcotest ];
+  buildInputs = [ dune-site ];
+  propagatedBuildInputs = [ angstrom bigstringaf domain-name ipaddr logs lwt-dllist mtime ptime uri ];
 
-  doCheck = lib.versionAtLeast ocaml.version "4.08";
+  # Checks depend on caqti-driver-sqlite3 (circural dependency)
+  doCheck = false;
 
   meta = {
     description = "Unified interface to relational database libraries";
diff --git a/pkgs/development/ocaml-modules/caqti/driver-mariadb.nix b/pkgs/development/ocaml-modules/caqti/driver-mariadb.nix
index 859402d83ea1..bff515eff381 100644
--- a/pkgs/development/ocaml-modules/caqti/driver-mariadb.nix
+++ b/pkgs/development/ocaml-modules/caqti/driver-mariadb.nix
@@ -6,8 +6,6 @@ buildDunePackage {
 
   propagatedBuildInputs = [ caqti mariadb ];
 
-  duneVersion = "3";
-
   meta = caqti.meta // {
     description = "MariaDB driver for Caqti using C bindings";
   };
diff --git a/pkgs/development/ocaml-modules/caqti/driver-postgresql.nix b/pkgs/development/ocaml-modules/caqti/driver-postgresql.nix
index d48ae1186bf7..f33e38fab8df 100644
--- a/pkgs/development/ocaml-modules/caqti/driver-postgresql.nix
+++ b/pkgs/development/ocaml-modules/caqti/driver-postgresql.nix
@@ -4,8 +4,6 @@ buildDunePackage {
   pname = "caqti-driver-postgresql";
   inherit (caqti) version src;
 
-  duneVersion = "3";
-
   propagatedBuildInputs = [ caqti postgresql ];
 
   meta = caqti.meta // {
diff --git a/pkgs/development/ocaml-modules/caqti/driver-sqlite3.nix b/pkgs/development/ocaml-modules/caqti/driver-sqlite3.nix
index d6c230d9dbde..ddac07f7fcfb 100644
--- a/pkgs/development/ocaml-modules/caqti/driver-sqlite3.nix
+++ b/pkgs/development/ocaml-modules/caqti/driver-sqlite3.nix
@@ -1,13 +1,15 @@
-{ lib, buildDunePackage, caqti, ocaml_sqlite3 }:
+{ lib, buildDunePackage, caqti, ocaml_sqlite3, alcotest }:
 
 buildDunePackage {
   pname = "caqti-driver-sqlite3";
   inherit (caqti) version src;
 
-  duneVersion = "3";
-
   propagatedBuildInputs = [ caqti ocaml_sqlite3 ];
 
+  checkInputs = [ alcotest ];
+
+  doCheck = true;
+
   meta = caqti.meta // {
     description = "Sqlite3 driver for Caqti using C bindings";
   };
diff --git a/pkgs/development/ocaml-modules/caqti/dynload.nix b/pkgs/development/ocaml-modules/caqti/dynload.nix
index dfd52e24dd1e..3dd94fc0e310 100644
--- a/pkgs/development/ocaml-modules/caqti/dynload.nix
+++ b/pkgs/development/ocaml-modules/caqti/dynload.nix
@@ -4,8 +4,6 @@ buildDunePackage {
   pname = "caqti-dynload";
   inherit (caqti) version src;
 
-  duneVersion = "3";
-
   propagatedBuildInputs = [ caqti findlib ];
 
   meta = caqti.meta // {
diff --git a/pkgs/development/ocaml-modules/caqti/lwt.nix b/pkgs/development/ocaml-modules/caqti/lwt.nix
index 66e5a7ce293d..d06421136280 100644
--- a/pkgs/development/ocaml-modules/caqti/lwt.nix
+++ b/pkgs/development/ocaml-modules/caqti/lwt.nix
@@ -4,8 +4,6 @@ buildDunePackage {
   pname = "caqti-lwt";
   inherit (caqti) version src;
 
-  duneVersion = "3";
-
   propagatedBuildInputs = [ caqti logs lwt ];
 
   meta = caqti.meta // { description = "Lwt support for Caqti"; };
diff --git a/pkgs/development/ocaml-modules/caqti/type-calendar.nix b/pkgs/development/ocaml-modules/caqti/type-calendar.nix
index db4d5983aedf..26b0887f20e8 100644
--- a/pkgs/development/ocaml-modules/caqti/type-calendar.nix
+++ b/pkgs/development/ocaml-modules/caqti/type-calendar.nix
@@ -4,8 +4,6 @@ buildDunePackage {
   pname = "caqti-type-calendar";
   inherit (caqti) src version;
 
-  duneVersion = "3";
-
   propagatedBuildInputs = [ calendar caqti ];
 
   meta = caqti.meta // {
diff --git a/pkgs/development/python-modules/cachecontrol/default.nix b/pkgs/development/python-modules/cachecontrol/default.nix
index 99a128b0496b..c40d0b8d4ee5 100644
--- a/pkgs/development/python-modules/cachecontrol/default.nix
+++ b/pkgs/development/python-modules/cachecontrol/default.nix
@@ -14,27 +14,20 @@
 
 buildPythonPackage rec {
   pname = "cachecontrol";
-  version = "0.13.1";
-  format = "pyproject";
+  version = "0.14.0";
+  pyproject = true;
 
-  disabled = pythonOlder "3.6";
+  disabled = pythonOlder "3.7";
 
   __darwinAllowLocalNetworking = true;
 
   src = fetchFromGitHub {
     owner = "ionrock";
-    repo = pname;
+    repo = "cachecontrol";
     rev = "refs/tags/v${version}";
-    hash = "sha256-4N+vk65WxOrT+IJRn+lEnbs5vlWQh9ievVHWWe3BKJ0=";
+    hash = "sha256-myyqiUGna+5S2GJGnwZTOfLh49NhjfHAvpUB49dQbgY=";
   };
 
-  postPatch = ''
-    # https://github.com/ionrock/cachecontrol/issues/297
-    substituteInPlace tests/test_etag.py --replace \
-      "requests.adapters.HTTPResponse.from_httplib" \
-      "urllib3.response.HTTPResponse.from_httplib"
-  '';
-
   nativeBuildInputs = [
     flit-core
   ];
@@ -69,6 +62,6 @@ buildPythonPackage rec {
     homepage = "https://github.com/ionrock/cachecontrol";
     changelog = "https://github.com/psf/cachecontrol/releases/tag/v${version}";
     license = licenses.asl20;
-    maintainers = with maintainers; [ ];
+    maintainers = with maintainers; [ dotlambda ];
   };
 }
diff --git a/pkgs/development/python-modules/dnf-plugins-core/default.nix b/pkgs/development/python-modules/dnf-plugins-core/default.nix
index 5ba20ff94565..81404145e8b8 100644
--- a/pkgs/development/python-modules/dnf-plugins-core/default.nix
+++ b/pkgs/development/python-modules/dnf-plugins-core/default.nix
@@ -22,7 +22,7 @@ in
 
 buildPythonPackage rec {
   pname = "dnf-plugins-core";
-  version = "4.4.4";
+  version = "4.5.0";
   format = "other";
 
   outputs = [ "out" "man" ];
@@ -30,8 +30,8 @@ buildPythonPackage rec {
   src = fetchFromGitHub {
     owner = "rpm-software-management";
     repo = "dnf-plugins-core";
-    rev = version;
-    hash = "sha256-SGgUozOAU6h87SguXh+13CxV4GnVhdN3SpwKfDPh2GY=";
+    rev = "refs/tags/${version}";
+    hash = "sha256-og20X2AUzoOphwF+508EobGEp/VYLtxWY7N4k327o8o=";
   };
 
   patches = [
diff --git a/pkgs/development/python-modules/home-assistant-chip-clusters/default.nix b/pkgs/development/python-modules/home-assistant-chip-clusters/default.nix
index 44fb32e25c2d..6ffdda58a6ce 100644
--- a/pkgs/development/python-modules/home-assistant-chip-clusters/default.nix
+++ b/pkgs/development/python-modules/home-assistant-chip-clusters/default.nix
@@ -7,7 +7,7 @@
 
 buildPythonPackage rec {
   pname = "home-assistant-chip-clusters";
-  version = "2024.1.0";
+  version = "2024.2.1";
   format = "wheel";
 
   src = fetchPypi {
@@ -15,7 +15,7 @@ buildPythonPackage rec {
     pname = "home_assistant_chip_clusters";
     dist = "py3";
     python = "py3";
-    hash = "sha256-4btkqAHbwAsyGV1LjngEoeTT5qyI8dtqFVTp0lIFwmg=";
+    hash = "sha256-QMsfs9gUWeaz1LfMZF5J2OFVCPnuckZvvF9x5bQ5uZY=";
   };
 
   propagatedBuildInputs = [
diff --git a/pkgs/development/python-modules/home-assistant-chip-core/default.nix b/pkgs/development/python-modules/home-assistant-chip-core/default.nix
index a983bdd0a2cf..b3d5a232c10a 100644
--- a/pkgs/development/python-modules/home-assistant-chip-core/default.nix
+++ b/pkgs/development/python-modules/home-assistant-chip-core/default.nix
@@ -10,7 +10,6 @@
 # runtime
 , glib
 , libnl
-, openssl_1_1
 
 # propagates
 , aenum
@@ -29,7 +28,7 @@
 
 buildPythonPackage rec {
   pname = "home-assistant-chip-core";
-  version = "2024.1.0";
+  version = "2024.2.1";
   format = "wheel";
 
   disabled = pythonOlder "3.7";
@@ -38,11 +37,11 @@ buildPythonPackage rec {
     system = {
       "aarch64-linux" = {
         name = "aarch64";
-        hash = "sha256-UiikZ2DVhTqX6WYfiE8sp2e52BMlyoQnDjLap/efmNc=";
+        hash = "sha256-gHnTuiyCD9A9Ru8xhniNEpCyn+W9zYnCAoTJeGOW7TI=";
       };
       "x86_64-linux" = {
         name = "x86_64";
-        hash = "sha256-/+gegUMd2n7MpJvdilS5VWefXc0tuRcLrXBBXSH35b0=";
+        hash = "sha256-gKZKcCXQ8PvZAPV2QRQl+u+r95CVLBDDDgtC0MT7xw4=";
       };
     }.${stdenv.system} or (throw "Unsupported system: ${stdenv.system}");
   in fetchPypi {
@@ -62,7 +61,6 @@ buildPythonPackage rec {
   buildInputs = [
     glib
     libnl
-    openssl_1_1
   ];
 
   propagatedBuildInputs = [
diff --git a/pkgs/development/python-modules/huggingface-hub/default.nix b/pkgs/development/python-modules/huggingface-hub/default.nix
index 17ad769329c7..e9c477cef97b 100644
--- a/pkgs/development/python-modules/huggingface-hub/default.nix
+++ b/pkgs/development/python-modules/huggingface-hub/default.nix
@@ -1,7 +1,8 @@
 { lib
-, fetchFromGitHub
 , buildPythonPackage
 , pythonOlder
+, fetchFromGitHub
+, setuptools
 , filelock
 , fsspec
 , packaging
@@ -13,8 +14,8 @@
 
 buildPythonPackage rec {
   pname = "huggingface-hub";
-  version = "0.20.3";
-  format = "setuptools";
+  version = "0.21.2";
+  pyproject = true;
 
   disabled = pythonOlder "3.8";
 
@@ -22,9 +23,13 @@ buildPythonPackage rec {
     owner = "huggingface";
     repo = "huggingface_hub";
     rev = "refs/tags/v${version}";
-    hash = "sha256-21Ay8RVS2vtQIh4bBUxE8jFk6F+yeFBJ3XgvRRNtNgI=";
+    hash = "sha256-0Nr6qs9rzuBQo8SGuQ2Ai2Q+E+Gs4DT/AMrYf7dYM/E=";
   };
 
+  nativeBuildInputs = [
+    setuptools
+  ];
+
   propagatedBuildInputs = [
     filelock
     fsspec
diff --git a/pkgs/development/python-modules/lxml-stubs/default.nix b/pkgs/development/python-modules/lxml-stubs/default.nix
index 8df03f526896..abb0d17f3918 100644
--- a/pkgs/development/python-modules/lxml-stubs/default.nix
+++ b/pkgs/development/python-modules/lxml-stubs/default.nix
@@ -1,35 +1,42 @@
 { lib
 , buildPythonPackage
 , fetchFromGitHub
-, setuptools
-, pytestCheckHook
-, pytest-mypy-plugins
 , lxml
+, pytest-mypy-plugins
+, pytestCheckHook
+, setuptools
 }:
 
 buildPythonPackage rec {
   pname = "lxml-stubs";
-  version = "0.4.0";
+  version = "0.5.1";
   pyproject = true;
 
   src = fetchFromGitHub {
     owner = "lxml";
     repo = "lxml-stubs";
-    rev = version;
-    hash = "sha256-RRH/taLtgaXOl0G/ve2Ad7Xy8WRDUG2/k26EFMv1PRM=";
+    rev = "refs/tags/${version}";
+    hash = "sha256-OwaPnCr0vylhdAvMMUfGV6DjZEh7Q71pgMOt66urg5I=";
   };
 
   nativeBuildInputs = [
     setuptools
   ];
+
   propagatedBuildInputs = [
     lxml
   ];
+
   nativeCheckInputs = [
     pytestCheckHook
     pytest-mypy-plugins
   ];
 
+  disabledTests = [
+    # Output difference, https://github.com/lxml/lxml-stubs/issues/101
+    "etree_element_iterchildren"
+  ];
+
   meta = with lib; {
     description = "Type stubs for the lxml package";
     homepage = "https://github.com/lxml/lxml-stubs";
diff --git a/pkgs/development/python-modules/monty/default.nix b/pkgs/development/python-modules/monty/default.nix
index 80256a11bfdb..77c7547e0b69 100644
--- a/pkgs/development/python-modules/monty/default.nix
+++ b/pkgs/development/python-modules/monty/default.nix
@@ -17,7 +17,7 @@
 
 buildPythonPackage rec {
   pname = "monty";
-  version = "2024.2.2";
+  version = "2024.2.26";
   pyproject = true;
 
   disabled = pythonOlder "3.9";
@@ -26,7 +26,7 @@ buildPythonPackage rec {
     owner = "materialsvirtuallab";
     repo = "monty";
     rev = "refs/tags/v${version}";
-    hash = "sha256-tKt0IMUmx1WvnQ27PyeyEEGekOKGY33YX4af1/ipbk4=";
+    hash = "sha256-+NxgZ8JCoAih4nHq+KP4jym0xnKCjUXJqs+xPpKZPbs=";
   };
 
   postPatch = ''
diff --git a/pkgs/development/python-modules/nats-py/default.nix b/pkgs/development/python-modules/nats-py/default.nix
index 3c384b8c5784..93cb33f9fd07 100644
--- a/pkgs/development/python-modules/nats-py/default.nix
+++ b/pkgs/development/python-modules/nats-py/default.nix
@@ -14,7 +14,7 @@
 
 buildPythonPackage rec {
   pname = "nats-py";
-  version = "2.7.0";
+  version = "2.7.2";
   pyproject = true;
 
   disabled = pythonOlder "3.7";
@@ -23,7 +23,7 @@ buildPythonPackage rec {
     owner = "nats-io";
     repo = "nats.py";
     rev = "refs/tags/v${version}";
-    hash = "sha256-spKz0rKTI8hWdO6r8VLtP3G8tS9ANsjYRbinXOARCOQ=";
+    hash = "sha256-5lvdt1JbOmdts0CYU00bSmv0LsMQsOe//yUgyevBULE=";
   };
 
   nativeBuildInputs = [
diff --git a/pkgs/development/python-modules/nibabel/default.nix b/pkgs/development/python-modules/nibabel/default.nix
index 3bccab344741..7d8e021fd0cf 100644
--- a/pkgs/development/python-modules/nibabel/default.nix
+++ b/pkgs/development/python-modules/nibabel/default.nix
@@ -20,14 +20,14 @@
 
 buildPythonPackage rec {
   pname = "nibabel";
-  version = "5.2.0";
+  version = "5.2.1";
   pyproject = true;
 
   disabled = pythonOlder "3.8";
 
   src = fetchPypi {
     inherit pname version;
-    hash = "sha256-Pfjxq5gdG9kvQzHVZVKNEmq5cX/b1M/mj0P80cK/P1I=";
+    hash = "sha256-tsgLLnKOS8K2XxFC2bjSKHqRAqi/hHfhFe8NgzRVmXU=";
   };
 
   nativeBuildInputs = [
diff --git a/pkgs/development/python-modules/oelint-parser/default.nix b/pkgs/development/python-modules/oelint-parser/default.nix
index daf2a58fc5ed..57750768e4db 100644
--- a/pkgs/development/python-modules/oelint-parser/default.nix
+++ b/pkgs/development/python-modules/oelint-parser/default.nix
@@ -9,13 +9,13 @@
 
 buildPythonPackage rec {
   pname = "oelint-parser";
-  version = "3.2.2";
+  version = "3.3.1";
   format = "setuptools";
 
   src = fetchPypi {
     inherit version;
     pname = "oelint_parser";
-    hash = "sha256-pjdPiM23jITqYW5dklJJN5X8C8OmetIDvpN/RCLMWoE=";
+    hash = "sha256-+u0whEnzA5XZlqgTpQtGH25/krLLvNPycWXzBUedMRc=";
   };
 
   buildInputs = [ pip ];
diff --git a/pkgs/development/python-modules/overrides/default.nix b/pkgs/development/python-modules/overrides/default.nix
index 8109a428140d..220f7dcbed14 100644
--- a/pkgs/development/python-modules/overrides/default.nix
+++ b/pkgs/development/python-modules/overrides/default.nix
@@ -4,22 +4,27 @@
 , pythonAtLeast
 , pythonOlder
 , pytestCheckHook
+, setuptools
 }:
 
 buildPythonPackage rec {
   pname = "overrides";
-  version = "7.4.0";
-  format = "setuptools";
+  version = "7.6.0";
+  pyproject = true;
 
   disabled = pythonOlder "3.7";
 
   src = fetchFromGitHub {
     owner = "mkorpela";
-    repo = pname;
+    repo = "overrides";
     rev = "refs/tags/${version}";
-    hash = "sha256-7fbuBcb47BTVxAoKokZmGdIwHSyfyfSiCAZ4XZjWz60=";
+    hash = "sha256-UdahbhmRfuxKTxb6Afjny/hMgXX1UuDUrIcLjZ0Jtak=";
   };
 
+  nativeBuildInputs = [
+    setuptools
+  ];
+
   nativeCheckInputs = [
     pytestCheckHook
   ];
diff --git a/pkgs/development/python-modules/pyenphase/default.nix b/pkgs/development/python-modules/pyenphase/default.nix
index 4826806c19f1..05514f610ad1 100644
--- a/pkgs/development/python-modules/pyenphase/default.nix
+++ b/pkgs/development/python-modules/pyenphase/default.nix
@@ -18,7 +18,7 @@
 
 buildPythonPackage rec {
   pname = "pyenphase";
-  version = "1.19.0";
+  version = "1.19.1";
   pyproject = true;
 
   disabled = pythonOlder "3.11";
@@ -27,7 +27,7 @@ buildPythonPackage rec {
     owner = "pyenphase";
     repo = "pyenphase";
     rev = "refs/tags/v${version}";
-    hash = "sha256-Wj2CkOvH5mS+DaIcbrqHjK+0mG3gfyF5M9tFImeJ/ko=";
+    hash = "sha256-2dKBqGIT4D4QUMixg4ZCxWXjE2zcXoji5i2v+vAPhL4=";
   };
 
   postPatch = ''
diff --git a/pkgs/development/python-modules/pysignalclirestapi/default.nix b/pkgs/development/python-modules/pysignalclirestapi/default.nix
index b3dd6f696006..a2eff3fc4ad8 100644
--- a/pkgs/development/python-modules/pysignalclirestapi/default.nix
+++ b/pkgs/development/python-modules/pysignalclirestapi/default.nix
@@ -3,20 +3,20 @@
 , fetchFromGitHub
 , setuptools
 , requests
-, future
+, six
 }:
 
 buildPythonPackage rec {
   pname = "pysignalclirestapi";
-  version = "0.3.22";
+  version = "0.3.23";
 
   pyproject = true;
 
   src = fetchFromGitHub {
     owner = "bbernhard";
     repo = "pysignalclirestapi";
-    rev = version;
-    hash = "sha256-m8Sihf5vTDntd5Tbaa5o55G/k/rqtmjWreoTab58CHU=";
+    rev = "refs/tags/${version}";
+    hash = "sha256-DI6dPh8TJElDSk2ExMk4w32ROYgc33cwWNmc3pIBADM=";
   };
 
   nativeBuildInputs = [
@@ -25,7 +25,7 @@ buildPythonPackage rec {
 
   propagatedBuildInputs = [
     requests
-    future
+    six
   ];
 
   # upstream has no tests
@@ -34,6 +34,7 @@ buildPythonPackage rec {
   pythonImportsCheck = [ "pysignalclirestapi" ];
 
   meta = with lib; {
+    changelog = "https://github.com/bbernhard/pysignalclirestapi/releases/tag/${version}";
     description = "Small python library for the Signal Cli REST API";
     homepage = "https://github.com/bbernhard/pysignalclirestapi";
     license = licenses.mit;
diff --git a/pkgs/development/python-modules/pytest-testmon/default.nix b/pkgs/development/python-modules/pytest-testmon/default.nix
index 3c0b0ec629b4..9bceb430820e 100644
--- a/pkgs/development/python-modules/pytest-testmon/default.nix
+++ b/pkgs/development/python-modules/pytest-testmon/default.nix
@@ -10,7 +10,7 @@
 
 buildPythonPackage rec {
   pname = "pytest-testmon";
-  version = "2.1.0";
+  version = "2.1.1";
   format = "pyproject";
 
   disabled = pythonOlder "3.8";
@@ -19,7 +19,7 @@ buildPythonPackage rec {
     owner = "tarpas";
     repo = pname;
     rev = "refs/tags/v${version}";
-    hash = "sha256-M4636yqzChRI37UdGPOZTjj8POLdrOoJtzmECtZZi4k=";
+    hash = "sha256-zbMX9r9lftdm9hzXMZRZZ/GEDViGk9QiYYUhO9ZcEAc=";
   };
 
   nativeBuildInputs = [
diff --git a/pkgs/development/python-modules/python-idzip/default.nix b/pkgs/development/python-modules/python-idzip/default.nix
new file mode 100644
index 000000000000..6c64bb6c257e
--- /dev/null
+++ b/pkgs/development/python-modules/python-idzip/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+
+, pythonOlder
+
+, setuptools
+
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "python-idzip";
+  version = "0.3.9";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "bauman";
+    repo = "python-idzip";
+    rev = "refs/tags/${version}";
+    hash = "sha256-ChzwC/Afn0qeo5anq4anIu2eI9i6XDnSvB7jAwY7rSw=";
+  };
+
+  patches = [
+    # fix collision
+    # https://github.com/bauman/python-idzip/pull/23
+    (fetchpatch {
+      name = "fix-bin-folder-collisions.patch";
+      url = "https://patch-diff.githubusercontent.com/raw/bauman/python-idzip/pull/23.patch";
+      hash = "sha256-4fPhLdY9MaH1aX6tqMT+NNNNDsyv87G0xBh4MC+5yQE=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # need third-party files
+    # https://github.com/bauman/python-idzip/blob/master/.github/workflows/test.yaml#L2https://github.com/bauman/python-idzip/blob/master/.github/workflows/test.yaml#L288
+    "test/test_compressor.py"
+    "test/test_decompressor.py"
+    "test/test_lucky_cache.py"
+    "test/test_readline.py"
+    "test/test_seek_read_behavior.py"
+    "test/test_zero_cache.py"
+  ];
+
+  disabledTests = [
+    # Terminated
+    # pop_var_context: head of shell_variables not a function context
+    "test_bufferedio_compat"
+  ];
+
+  meta = with lib; {
+    description = "Seekable, gzip compatible, compression format";
+    homepage = "https://github.com/bauman/python-idzip";
+    changelog = "https://github.com/bauman/python-idzip/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ vizid ];
+  };
+}
diff --git a/pkgs/development/python-modules/python-matter-server/default.nix b/pkgs/development/python-modules/python-matter-server/default.nix
index 570ee23fcbf4..588f2042bd9b 100644
--- a/pkgs/development/python-modules/python-matter-server/default.nix
+++ b/pkgs/development/python-modules/python-matter-server/default.nix
@@ -5,6 +5,7 @@
 
 # build
 , setuptools
+, pythonRelaxDepsHook
 
 # propagates
 , aiohttp
@@ -29,7 +30,7 @@
 
 buildPythonPackage rec {
   pname = "python-matter-server";
-  version = "5.5.3";
+  version = "5.7.0b2";
   format = "pyproject";
 
   disabled = pythonOlder "3.10";
@@ -38,16 +39,22 @@ buildPythonPackage rec {
     owner = "home-assistant-libs";
     repo = "python-matter-server";
     rev = "refs/tags/${version}";
-    hash = "sha256-8daAABR5l8ZEX+PR4XrxRHlLllgnOVE4Q9yY/7UQXHw=";
+    hash = "sha256-fMtvVizHeAzLdou0U1tqbmQATIBLK4w9I7EwMlzB8QA=";
   };
 
   postPatch = ''
     substituteInPlace pyproject.toml \
-      --replace 'version = "0.0.0"' 'version = "${version}"'
+      --replace 'version = "0.0.0"' 'version = "${version}"' \
+      --replace '--cov' ""
   '';
 
   nativeBuildInputs = [
     setuptools
+    pythonRelaxDepsHook
+  ];
+
+  pythonRelaxDeps = [
+    "home-assistant-chip-clusters"
   ];
 
   propagatedBuildInputs = [
diff --git a/pkgs/development/python-modules/rdkit/default.nix b/pkgs/development/python-modules/rdkit/default.nix
index 8a29bc837cfa..2d5af44a068d 100644
--- a/pkgs/development/python-modules/rdkit/default.nix
+++ b/pkgs/development/python-modules/rdkit/default.nix
@@ -42,7 +42,7 @@ let
 in
 buildPythonPackage rec {
   pname = "rdkit";
-  version = "2023.09.4";
+  version = "2023.09.5";
   pyproject = false;
 
   src =
@@ -53,7 +53,7 @@ buildPythonPackage rec {
       owner = pname;
       repo = pname;
       rev = "Release_${versionTag}";
-      hash = "sha256-yPpt7F3w17tZEe+HECODZ7p27QidNt1sd5f/T2V87NE=";
+      hash = "sha256-ZYNAHNBHQPx8rBJSvEWFEpdSpYyXcoqJ+nBA7tpHwQs=";
     };
 
   unpackPhase = ''
diff --git a/pkgs/development/python-modules/requests-ratelimiter/default.nix b/pkgs/development/python-modules/requests-ratelimiter/default.nix
index 5cc57d86a57f..dbd142e378bd 100644
--- a/pkgs/development/python-modules/requests-ratelimiter/default.nix
+++ b/pkgs/development/python-modules/requests-ratelimiter/default.nix
@@ -10,14 +10,14 @@
 
 buildPythonPackage rec {
   pname = "requests-ratelimiter";
-  version = "0.4.2";
+  version = "0.5.0";
   pyproject = true;
 
   src = fetchFromGitHub {
     owner = "JWCook";
     repo = "requests-ratelimiter";
-    rev = "v${version}";
-    hash = "sha256-w4cBQRpk9UTuGA0lPDsqpQ3UEIQdYe38NYXz+V4+Lvc=";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-JdxyBLrxXXb2KJ89qWl7yXP0fIafgnAguPGsN5iit8Y=";
   };
 
   nativeBuildInputs = [
diff --git a/pkgs/development/python-modules/ripser/default.nix b/pkgs/development/python-modules/ripser/default.nix
index 0b65e8c1c487..6e847e483636 100644
--- a/pkgs/development/python-modules/ripser/default.nix
+++ b/pkgs/development/python-modules/ripser/default.nix
@@ -12,14 +12,14 @@
 
 buildPythonPackage rec {
   pname = "ripser";
-  version = "0.6.4";
+  version = "0.6.7";
   format = "setuptools";
 
   disabled = pythonOlder "3.6";
 
   src = fetchPypi {
     inherit pname version;
-    hash = "sha256-eps+lCCGnFDfhemkRskSuK+BYh5iyhr4+UksYzW35ZQ=";
+    hash = "sha256-UuxI1bA6H8s2D9xWVwCecXEHkCV0rhkxuoooaer/a8A=";
   };
 
   nativeBuildInputs = [
diff --git a/pkgs/development/python-modules/rope/default.nix b/pkgs/development/python-modules/rope/default.nix
index c014314685b9..ad5cad2dd8cb 100644
--- a/pkgs/development/python-modules/rope/default.nix
+++ b/pkgs/development/python-modules/rope/default.nix
@@ -10,16 +10,16 @@
 
 buildPythonPackage rec {
   pname = "rope";
-  version = "1.9.0";
-  format = "pyproject";
+  version = "1.12.0";
+  pyproject = true;
 
-  disabled = pythonOlder "3.7";
+  disabled = pythonOlder "3.8";
 
   src = fetchFromGitHub {
     owner = "python-rope";
     repo = pname;
     rev = "refs/tags/${version}";
-    hash = "sha256-j65C3x3anhH23D4kic5j++r/Ft0RqgZ/jFrNrNHVcXA=";
+    hash = "sha256-j/9q2S2B3DzmEqMOBLG9iHwnLqZipcPxLaKppysJffA=";
   };
 
   nativeBuildInputs = [
diff --git a/pkgs/development/python-modules/simpful/default.nix b/pkgs/development/python-modules/simpful/default.nix
index 2060210a3bd8..37f2ae860c0e 100644
--- a/pkgs/development/python-modules/simpful/default.nix
+++ b/pkgs/development/python-modules/simpful/default.nix
@@ -14,7 +14,7 @@
 
 buildPythonPackage rec {
   pname = "simpful";
-  version = "2.11.1";
+  version = "2.12.0";
   pyproject = true;
 
   disabled = pythonOlder "3.7";
@@ -23,7 +23,7 @@ buildPythonPackage rec {
     owner = "aresio";
     repo = "simpful";
     rev = "refs/tags/${version}";
-    hash = "sha256-54WkKnPB3xA2CaOpmasqxgDoga3uAqoC1nOivytXmGY=";
+    hash = "sha256-NtTw7sF1WfVebUk1wHrM8FHAe3/FXDcMApPkDbw0WXo=";
   };
 
   nativeBuildInputs = [
diff --git a/pkgs/development/python-modules/slackclient/default.nix b/pkgs/development/python-modules/slackclient/default.nix
index 3a66c42111b9..9769f22727a3 100644
--- a/pkgs/development/python-modules/slackclient/default.nix
+++ b/pkgs/development/python-modules/slackclient/default.nix
@@ -21,7 +21,7 @@
 
 buildPythonPackage rec {
   pname = "slackclient";
-  version = "3.27.0";
+  version = "3.27.1";
   format =  "setuptools";
 
   disabled = pythonOlder "3.6";
@@ -30,7 +30,7 @@ buildPythonPackage rec {
     owner = "slackapi";
     repo = "python-slack-sdk";
     rev = "refs/tags/v${version}";
-    hash = "sha256-MA3pn6NQxzXYu/BBpOgfZWnS51dl7oXrAi43jenHhxI=";
+    hash = "sha256-fBHu4e6pSt8yzXbLWr5cwjRFDfvdH2jzpSNzdMBg4N0=";
   };
 
   propagatedBuildInputs = [
diff --git a/pkgs/development/python-modules/types-docutils/default.nix b/pkgs/development/python-modules/types-docutils/default.nix
index 13cd4f61f93c..69cbd695f910 100644
--- a/pkgs/development/python-modules/types-docutils/default.nix
+++ b/pkgs/development/python-modules/types-docutils/default.nix
@@ -6,12 +6,12 @@
 
 buildPythonPackage rec {
   pname = "types-docutils";
-  version = "0.20.0.20240201";
+  version = "0.20.0.20240227";
   pyproject = true;
 
   src = fetchPypi {
     inherit pname version;
-    hash = "sha256-ukv9T/bdGWQLp6tdk5ADk6ZYl4gPNlCZeWSpQ/Tnmms=";
+    hash = "sha256-fy27AjVgJLXbPv2d8msjbaBQrS6tqJhy5ShLSjlLd2E=";
   };
 
   nativeBuildInputs = [
diff --git a/pkgs/development/python-modules/unstructured/default.nix b/pkgs/development/python-modules/unstructured/default.nix
index ac1f937a44b4..388cd89371ed 100644
--- a/pkgs/development/python-modules/unstructured/default.nix
+++ b/pkgs/development/python-modules/unstructured/default.nix
@@ -56,7 +56,7 @@
 , grpcio
 }:
 let
-  version = "0.12.4";
+  version = "0.12.5";
   optional-dependencies = {
     huggingflace = [
       langdetect
@@ -90,7 +90,7 @@ buildPythonPackage {
     owner = "Unstructured-IO";
     repo = "unstructured";
     rev = "refs/tags/${version}";
-    hash = "sha256-lfsCmEhF6CTrEIa4y98NgDw6EgfLk39BVsTmYZD6MkU=";
+    hash = "sha256-69GukU2R38tM43vAk+l9vjypgjTS/Bcmcdcj1HXnzv4=";
   };
 
   propagatedBuildInputs = [
diff --git a/pkgs/development/python-modules/yolink-api/default.nix b/pkgs/development/python-modules/yolink-api/default.nix
index 5c155094cf64..6dacbe3f1f18 100644
--- a/pkgs/development/python-modules/yolink-api/default.nix
+++ b/pkgs/development/python-modules/yolink-api/default.nix
@@ -11,7 +11,7 @@
 
 buildPythonPackage rec {
   pname = "yolink-api";
-  version = "0.3.7";
+  version = "0.3.8";
   format = "pyproject";
 
   disabled = pythonOlder "3.7";
@@ -20,7 +20,7 @@ buildPythonPackage rec {
     owner = "YoSmart-Inc";
     repo = pname;
     rev = "refs/tags/v${version}";
-    hash = "sha256-P9Hu3JhoFDwKylTAZmXYX2AI2CPf/GbYhJCU4wX/aWY=";
+    hash = "sha256-QkN6gF2Gq/gWkQxm8ahXBEsG/ClydHaaKnT3t+r5sNo=";
   };
 
   nativeBuildInputs = [
diff --git a/pkgs/development/skaware-packages/s6-networking/default.nix b/pkgs/development/skaware-packages/s6-networking/default.nix
index 6e3722ef5772..1b8cd4e88fea 100644
--- a/pkgs/development/skaware-packages/s6-networking/default.nix
+++ b/pkgs/development/skaware-packages/s6-networking/default.nix
@@ -19,8 +19,8 @@ assert sslSupportEnabled -> sslLibs ? ${sslSupport};
 
 buildPackage {
   pname = "s6-networking";
-  version = "2.7.0.1";
-  sha256 = "36SWTU8b2umrX8RQh2n9b+/DOlJ9UVOjd3xrBG7upWQ=";
+  version = "2.7.0.2";
+  sha256 = "wzxvGyvhb4miGvlGz9BiQqEvmBhMiYt1XdskM4ZxzrE=";
 
   description = "A suite of small networking utilities for Unix systems";
 
diff --git a/pkgs/development/skaware-packages/s6-rc-man-pages/default.nix b/pkgs/development/skaware-packages/s6-rc-man-pages/default.nix
index 2c1df664431a..e919746fccdb 100644
--- a/pkgs/development/skaware-packages/s6-rc-man-pages/default.nix
+++ b/pkgs/development/skaware-packages/s6-rc-man-pages/default.nix
@@ -2,7 +2,7 @@
 
 buildManPages {
   pname = "s6-rc-man-pages";
-  version = "0.5.4.1.2";
+  version = "0.5.4.2.1";
   sha256 = "Ywke3FG/xhhUd934auDB+iFRDCvy8IJs6IkirP6O/As=";
   description = "mdoc(7) versions of the documentation for the s6-rc service manager";
   maintainers = [ lib.maintainers.qyliss ];
diff --git a/pkgs/development/skaware-packages/skalibs/default.nix b/pkgs/development/skaware-packages/skalibs/default.nix
index 7dc87458b620..aecbceda7506 100644
--- a/pkgs/development/skaware-packages/skalibs/default.nix
+++ b/pkgs/development/skaware-packages/skalibs/default.nix
@@ -8,8 +8,8 @@ with skawarePackages;
 
 buildPackage {
   pname = "skalibs";
-  version = "2.14.1.0";
-  sha256 = "24YTUWEngQ2N/thutCRaX/JCBPHhb6KOiqrTRtlqrug=";
+  version = "2.14.1.1";
+  sha256 = "trebgW9LoLaAFnaw7UF5tZyMeAnu/+JttnLkBGNr78M=";
 
   description = "A set of general-purpose C programming libraries";
 
diff --git a/pkgs/development/tools/build-managers/xmake/default.nix b/pkgs/development/tools/build-managers/xmake/default.nix
index 80c610eaa32b..b6d2f8ab6909 100644
--- a/pkgs/development/tools/build-managers/xmake/default.nix
+++ b/pkgs/development/tools/build-managers/xmake/default.nix
@@ -12,11 +12,11 @@
 
 stdenv.mkDerivation rec {
   pname = "xmake";
-  version = "2.8.6";
+  version = "2.8.7";
 
   src = fetchurl {
     url = "https://github.com/xmake-io/xmake/releases/download/v${version}/xmake-v${version}.tar.gz";
-    hash = "sha256-DmKE6v1RoyNgmCE8CVI39WrK+umoilBAa4gszl6iaz0=";
+    hash = "sha256-jHqMb3ex/BcF54ViTpoelEcWhEqDeP7Oc0HeJ7mfC4k=";
   };
 
   nativeBuildInputs = [
diff --git a/pkgs/development/tools/buildah/default.nix b/pkgs/development/tools/buildah/default.nix
index f67dba03c365..9c3e988085d8 100644
--- a/pkgs/development/tools/buildah/default.nix
+++ b/pkgs/development/tools/buildah/default.nix
@@ -17,13 +17,13 @@
 
 buildGoModule rec {
   pname = "buildah";
-  version = "1.34.0";
+  version = "1.34.1";
 
   src = fetchFromGitHub {
     owner = "containers";
     repo = "buildah";
     rev = "v${version}";
-    hash = "sha256-LX7yc2FnCiquHV/tESJV/VkuUYXbRNSxmMzVpSz/F8w=";
+    hash = "sha256-0mH6s9BSTkXutwYVG3EpqEcildO3g37Us4pdTmLPcAQ=";
   };
 
   outputs = [ "out" "man" ];
@@ -62,6 +62,10 @@ buildGoModule rec {
 
   passthru.tests.version = testers.testVersion {
     package = buildah;
+    command = ''
+      XDG_DATA_HOME="$TMPDIR" XDG_CACHE_HOME="$TMPDIR" XDG_CONFIG_HOME="$TMPDIR" \
+      buildah --version
+    '';
   };
 
   meta = with lib; {
@@ -72,3 +76,4 @@ buildGoModule rec {
     maintainers = with maintainers; [ ] ++ teams.podman.members;
   };
 }
+
diff --git a/pkgs/development/tools/continuous-integration/github-runner/default.nix b/pkgs/development/tools/continuous-integration/github-runner/default.nix
index f2a287b2d942..fced7e79a689 100644
--- a/pkgs/development/tools/continuous-integration/github-runner/default.nix
+++ b/pkgs/development/tools/continuous-integration/github-runner/default.nix
@@ -23,13 +23,13 @@ assert builtins.all (x: builtins.elem x [ "node20" ]) nodeRuntimes;
 
 buildDotnetModule rec {
   pname = "github-runner";
-  version = "2.314.0";
+  version = "2.314.1";
 
   src = fetchFromGitHub {
     owner = "actions";
     repo = "runner";
     rev = "v${version}";
-    hash = "sha256-qwFNEH29lu+RFqZBRD2Bo6E8gI07nnhFooWQNrgOQx0=";
+    hash = "sha256-PHcCXWA6LcxpqdbTGbOUqnS4fIJLbHOhEPdagGF71q0=";
     leaveDotGit = true;
     postFetch = ''
       git -C $out rev-parse --short HEAD > $out/.git-revision
diff --git a/pkgs/development/tools/misc/binutils/2.38/default.nix b/pkgs/development/tools/misc/binutils/2.38/default.nix
index fd9a3277532e..474a565f351f 100644
--- a/pkgs/development/tools/misc/binutils/2.38/default.nix
+++ b/pkgs/development/tools/misc/binutils/2.38/default.nix
@@ -91,7 +91,7 @@ stdenv.mkDerivation {
      # this patch is from debian:
      # https://sources.debian.org/data/main/b/binutils/2.38-3/debian/patches/mips64-default-n64.diff
      (if stdenv.targetPlatform.isMusl
-      then substitute { src = ./mips64-default-n64.patch; replacements = [ "--replace" "gnuabi64" "muslabi64" ]; }
+      then substitute { src = ./mips64-default-n64.patch; substitutions = [ "--replace" "gnuabi64" "muslabi64" ]; }
       else ./mips64-default-n64.patch)
   # On PowerPC, when generating assembly code, GCC generates a `.machine`
   # custom instruction which instructs the assembler to generate code for this
diff --git a/pkgs/development/tools/rbspy/default.nix b/pkgs/development/tools/rbspy/default.nix
index d30c75ea244e..309f8dbd9065 100644
--- a/pkgs/development/tools/rbspy/default.nix
+++ b/pkgs/development/tools/rbspy/default.nix
@@ -9,16 +9,16 @@
 
 rustPlatform.buildRustPackage rec {
   pname = "rbspy";
-  version = "0.19.0";
+  version = "0.19.1";
 
   src = fetchFromGitHub {
     owner = "rbspy";
     repo = "rbspy";
     rev = "refs/tags/v${version}";
-    hash = "sha256-OO0EX+r7W8HxPjbER+84m+nagPBM6GlCdB30VQV58mQ=";
+    hash = "sha256-2+miC7cp6YbeI7uucFlSdlDpPboJOhhBq7/eqXxZVqs=";
   };
 
-  cargoHash = "sha256-yywh/O4odm+VmM0k/Ft0DEihq6r+xehrpjbYryvVStw=";
+  cargoHash = "sha256-I+nh6cKniPIG5VYMMsABZNSP/c3DLWswsjenaQBh/X8=";
 
   # error: linker `aarch64-linux-gnu-gcc` not found
   postPatch = ''
diff --git a/pkgs/development/tools/rust/cargo-shuttle/Cargo.lock b/pkgs/development/tools/rust/cargo-shuttle/Cargo.lock
index 79e9d4526ce7..944f8e8112df 100644
--- a/pkgs/development/tools/rust/cargo-shuttle/Cargo.lock
+++ b/pkgs/development/tools/rust/cargo-shuttle/Cargo.lock
@@ -23,7 +23,7 @@ version = "0.8.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a"
 dependencies = [
- "cfg-if 1.0.0",
+ "cfg-if",
  "getrandom 0.2.11",
  "once_cell",
  "version_check",
@@ -88,30 +88,30 @@ checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87"
 
 [[package]]
 name = "anstyle-parse"
-version = "0.2.2"
+version = "0.2.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "317b9a89c1868f5ea6ff1d9539a69f45dffc21ce321ac1fd1160dfa48c8e2140"
+checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c"
 dependencies = [
  "utf8parse",
 ]
 
 [[package]]
 name = "anstyle-query"
-version = "1.0.0"
+version = "1.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b"
+checksum = "a3a318f1f38d2418400f8209655bfd825785afd25aa30bb7ba6cc792e4596748"
 dependencies = [
- "windows-sys 0.48.0",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
 name = "anstyle-wincon"
-version = "3.0.1"
+version = "3.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628"
+checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7"
 dependencies = [
  "anstyle",
- "windows-sys 0.48.0",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
@@ -133,18 +133,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6"
 
 [[package]]
-name = "arrayref"
-version = "0.3.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545"
-
-[[package]]
-name = "arrayvec"
-version = "0.5.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b"
-
-[[package]]
 name = "arrayvec"
 version = "0.7.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -190,6 +178,16 @@ dependencies = [
 ]
 
 [[package]]
+name = "assert-json-diff"
+version = "2.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "47e4f2b81832e72834d7518d8487a0396a28cc408186a2e8854c0f98011faf12"
+dependencies = [
+ "serde",
+ "serde_json",
+]
+
+[[package]]
 name = "assert_cmd"
 version = "2.0.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -216,33 +214,16 @@ dependencies = [
 ]
 
 [[package]]
-name = "async-lock"
-version = "2.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b"
-dependencies = [
- "event-listener",
-]
-
-[[package]]
-name = "async-session"
-version = "3.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "07da4ce523b4e2ebaaf330746761df23a465b951a83d84bbce4233dabedae630"
+name = "async-posthog"
+version = "0.2.3"
+source = "git+https://github.com/shuttle-hq/posthog-rs?branch=main#4a8299fde3080bff550620c0853be9b83fee8f44"
 dependencies = [
- "anyhow",
- "async-lock",
- "async-trait",
- "base64 0.13.1",
- "bincode",
- "blake3",
- "chrono",
- "hmac 0.11.0",
- "log",
- "rand 0.8.5",
+ "posthog-core",
+ "reqwest",
  "serde",
  "serde_json",
- "sha2 0.9.9",
+ "thiserror",
+ "tokio",
 ]
 
 [[package]]
@@ -275,7 +256,7 @@ checksum = "e1b39347f478f57a40cbaf82cbaebb4a350acc757cda30fc7ff88707a11d1d81"
 dependencies = [
  "futures-util",
  "http-types",
- "hyper",
+ "hyper 0.14.27",
  "hyper-rustls",
  "serde",
  "serde_json",
@@ -308,6 +289,16 @@ dependencies = [
 ]
 
 [[package]]
+name = "atomic-write-file"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "edcdbedc2236483ab103a53415653d6b4442ea6141baf1ffa85df29635e88436"
+dependencies = [
+ "nix 0.27.1",
+ "rand 0.8.5",
+]
+
+[[package]]
 name = "autocfg"
 version = "1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -333,8 +324,8 @@ dependencies = [
  "bytes",
  "fastrand 2.0.1",
  "hex",
- "http",
- "hyper",
+ "http 0.2.11",
+ "hyper 0.14.27",
  "ring 0.16.20",
  "time",
  "tokio",
@@ -368,8 +359,8 @@ dependencies = [
  "aws-smithy-types",
  "aws-types",
  "bytes",
- "http",
- "http-body",
+ "http 0.2.11",
+ "http-body 0.4.5",
  "lazy_static",
  "percent-encoding",
  "pin-project-lite",
@@ -391,7 +382,7 @@ dependencies = [
  "aws-smithy-types",
  "aws-types",
  "fastrand 2.0.1",
- "http",
+ "http 0.2.11",
  "percent-encoding",
  "tracing",
  "uuid",
@@ -416,7 +407,7 @@ dependencies = [
  "aws-smithy-types",
  "aws-smithy-xml",
  "aws-types",
- "http",
+ "http 0.2.11",
  "regex",
  "tokio-stream",
  "tracing",
@@ -440,7 +431,7 @@ dependencies = [
  "aws-smithy-types",
  "aws-types",
  "bytes",
- "http",
+ "http 0.2.11",
  "regex",
  "tokio-stream",
  "tracing",
@@ -465,7 +456,7 @@ dependencies = [
  "aws-smithy-types",
  "aws-smithy-xml",
  "aws-types",
- "http",
+ "http 0.2.11",
  "regex",
  "tracing",
 ]
@@ -479,12 +470,12 @@ dependencies = [
  "aws-smithy-http",
  "form_urlencoded",
  "hex",
- "hmac 0.12.1",
- "http",
+ "hmac",
+ "http 0.2.11",
  "once_cell",
  "percent-encoding",
  "regex",
- "sha2 0.10.8",
+ "sha2",
  "time",
  "tracing",
 ]
@@ -513,9 +504,9 @@ dependencies = [
  "aws-smithy-types",
  "bytes",
  "fastrand 2.0.1",
- "http",
- "http-body",
- "hyper",
+ "http 0.2.11",
+ "http-body 0.4.5",
+ "hyper 0.14.27",
  "hyper-rustls",
  "lazy_static",
  "pin-project-lite",
@@ -535,9 +526,9 @@ dependencies = [
  "bytes",
  "bytes-utils",
  "futures-core",
- "http",
- "http-body",
- "hyper",
+ "http 0.2.11",
+ "http-body 0.4.5",
+ "hyper 0.14.27",
  "once_cell",
  "percent-encoding",
  "pin-project-lite",
@@ -556,8 +547,8 @@ dependencies = [
  "aws-smithy-http",
  "aws-smithy-types",
  "bytes",
- "http",
- "http-body",
+ "http 0.2.11",
+ "http-body 0.4.5",
  "pin-project-lite",
  "tower",
  "tracing",
@@ -595,8 +586,8 @@ dependencies = [
  "aws-smithy-types",
  "bytes",
  "fastrand 2.0.1",
- "http",
- "http-body",
+ "http 0.2.11",
+ "http-body 0.4.5",
  "once_cell",
  "pin-project-lite",
  "pin-utils",
@@ -614,7 +605,7 @@ dependencies = [
  "aws-smithy-http",
  "aws-smithy-types",
  "bytes",
- "http",
+ "http 0.2.11",
  "tokio",
  "tracing",
 ]
@@ -653,7 +644,7 @@ dependencies = [
  "aws-smithy-client",
  "aws-smithy-http",
  "aws-smithy-types",
- "http",
+ "http 0.2.11",
  "rustc_version 0.4.0",
  "tracing",
 ]
@@ -671,9 +662,9 @@ dependencies = [
  "bytes",
  "futures-util",
  "headers",
- "http",
- "http-body",
- "hyper",
+ "http 0.2.11",
+ "http-body 0.4.5",
+ "hyper 0.14.27",
  "itoa",
  "matchit",
  "memchr",
@@ -703,8 +694,8 @@ dependencies = [
  "async-trait",
  "bytes",
  "futures-util",
- "http",
- "http-body",
+ "http 0.2.11",
+ "http-body 0.4.5",
  "mime",
  "rustversion",
  "tower-layer",
@@ -720,10 +711,9 @@ dependencies = [
  "axum",
  "axum-core",
  "bytes",
- "cookie",
  "futures-util",
- "http",
- "http-body",
+ "http 0.2.11",
+ "http-body 0.4.5",
  "mime",
  "pin-project-lite",
  "serde",
@@ -742,9 +732,9 @@ dependencies = [
  "arc-swap",
  "bytes",
  "futures-util",
- "http",
- "http-body",
- "hyper",
+ "http 0.2.11",
+ "http-body 0.4.5",
+ "hyper 0.14.27",
  "pin-project-lite",
  "rustls",
  "rustls-pemfile",
@@ -754,22 +744,6 @@ dependencies = [
 ]
 
 [[package]]
-name = "axum-sessions"
-version = "0.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "714cad544cd87d8da821cda715bb9aaa5d4d1adbdb64c549b18138e3cbf93c44"
-dependencies = [
- "async-session",
- "axum",
- "axum-extra",
- "futures",
- "http-body",
- "tokio",
- "tower",
- "tracing",
-]
-
-[[package]]
 name = "backtrace"
 version = "0.3.69"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -777,7 +751,7 @@ checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837"
 dependencies = [
  "addr2line",
  "cc",
- "cfg-if 1.0.0",
+ "cfg-if",
  "libc",
  "miniz_oxide",
  "object",
@@ -873,30 +847,6 @@ dependencies = [
 ]
 
 [[package]]
-name = "blake3"
-version = "0.3.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b64485778c4f16a6a5a9d335e80d449ac6c70cdd6a06d2af18a6f6f775a125b3"
-dependencies = [
- "arrayref",
- "arrayvec 0.5.2",
- "cc",
- "cfg-if 0.1.10",
- "constant_time_eq",
- "crypto-mac 0.8.0",
- "digest 0.9.0",
-]
-
-[[package]]
-name = "block-buffer"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4"
-dependencies = [
- "generic-array",
-]
-
-[[package]]
 name = "block-buffer"
 version = "0.10.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -917,8 +867,8 @@ dependencies = [
  "futures-core",
  "futures-util",
  "hex",
- "http",
- "hyper",
+ "http 0.2.11",
+ "hyper 0.14.27",
  "hyperlocal",
  "log",
  "pin-project-lite",
@@ -1121,7 +1071,7 @@ dependencies = [
 
 [[package]]
 name = "cargo-shuttle"
-version = "0.34.1"
+version = "0.39.0"
 dependencies = [
  "anyhow",
  "assert_cmd",
@@ -1131,6 +1081,7 @@ dependencies = [
  "chrono",
  "clap",
  "clap_complete",
+ "clap_mangen",
  "crossterm 0.27.0",
  "dialoguer",
  "dirs 5.0.1",
@@ -1233,12 +1184,6 @@ dependencies = [
 
 [[package]]
 name = "cfg-if"
-version = "0.1.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
-
-[[package]]
-name = "cfg-if"
 version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
@@ -1251,16 +1196,18 @@ checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38"
 dependencies = [
  "android-tzdata",
  "iana-time-zone",
+ "js-sys",
  "num-traits",
  "serde",
+ "wasm-bindgen",
  "windows-targets 0.48.5",
 ]
 
 [[package]]
 name = "clap"
-version = "4.4.8"
+version = "4.4.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2275f18819641850fa26c89acc84d465c1bf91ce57bc2748b28c420473352f64"
+checksum = "bfaff671f6b22ca62406885ece523383b9b64022e341e53e009a62ebc47a45f2"
 dependencies = [
  "clap_builder",
  "clap_derive",
@@ -1268,9 +1215,9 @@ dependencies = [
 
 [[package]]
 name = "clap_builder"
-version = "4.4.8"
+version = "4.4.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "07cdf1b148b25c1e1f7a42225e30a0d99a615cd4637eae7365548dd4529b95bc"
+checksum = "a216b506622bb1d316cd51328dce24e07bdff4a6128a47c7e7fad11878d5adbb"
 dependencies = [
  "anstream",
  "anstyle",
@@ -1306,6 +1253,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1"
 
 [[package]]
+name = "clap_mangen"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d3be86020147691e1d2ef58f75346a3d4d94807bfc473e377d52f09f0f7d77f7"
+dependencies = [
+ "clap",
+ "roff",
+]
+
+[[package]]
 name = "clru"
 version = "0.6.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1358,9 +1315,9 @@ checksum = "55b672471b4e9f9e95499ea597ff64941a309b2cdbffcc46f2cc5e2d971fd335"
 
 [[package]]
 name = "concurrent-queue"
-version = "2.3.0"
+version = "2.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f057a694a54f12365049b0958a1685bb52d567f5593b355fbf685838e873d400"
+checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363"
 dependencies = [
  "crossbeam-utils",
 ]
@@ -1385,38 +1342,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f"
 
 [[package]]
-name = "constant_time_eq"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc"
-
-[[package]]
 name = "convert_case"
 version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e"
 
 [[package]]
-name = "cookie"
-version = "0.17.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7efb37c3e1ccb1ff97164ad95ac1606e8ccd35b3fa0a7d99a304c7f4a428cc24"
-dependencies = [
- "base64 0.21.5",
- "hmac 0.12.1",
- "percent-encoding",
- "rand 0.8.5",
- "sha2 0.10.8",
- "subtle",
- "time",
- "version_check",
-]
-
-[[package]]
 name = "core-foundation"
-version = "0.9.3"
+version = "0.9.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146"
+checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f"
 dependencies = [
  "core-foundation-sys",
  "libc",
@@ -1424,9 +1359,9 @@ dependencies = [
 
 [[package]]
 name = "core-foundation-sys"
-version = "0.8.4"
+version = "0.8.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa"
+checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f"
 
 [[package]]
 name = "cpp_demangle"
@@ -1434,7 +1369,7 @@ version = "0.3.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "eeaa953eaad386a53111e47172c2fedba671e5684c8dd601a5f474f4f118710f"
 dependencies = [
- "cfg-if 1.0.0",
+ "cfg-if",
 ]
 
 [[package]]
@@ -1469,7 +1404,7 @@ dependencies = [
  "cranelift-entity",
  "cranelift-isle",
  "gimli",
- "hashbrown 0.14.2",
+ "hashbrown 0.14.3",
  "log",
  "regalloc2",
  "smallvec",
@@ -1576,7 +1511,7 @@ version = "1.3.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d"
 dependencies = [
- "cfg-if 1.0.0",
+ "cfg-if",
 ]
 
 [[package]]
@@ -1585,7 +1520,7 @@ version = "0.5.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200"
 dependencies = [
- "cfg-if 1.0.0",
+ "cfg-if",
  "crossbeam-utils",
 ]
 
@@ -1595,7 +1530,7 @@ version = "0.8.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef"
 dependencies = [
- "cfg-if 1.0.0",
+ "cfg-if",
  "crossbeam-epoch",
  "crossbeam-utils",
 ]
@@ -1607,7 +1542,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7"
 dependencies = [
  "autocfg",
- "cfg-if 1.0.0",
+ "cfg-if",
  "crossbeam-utils",
  "memoffset 0.9.0",
  "scopeguard",
@@ -1619,7 +1554,7 @@ version = "0.3.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add"
 dependencies = [
- "cfg-if 1.0.0",
+ "cfg-if",
  "crossbeam-utils",
 ]
 
@@ -1629,7 +1564,7 @@ version = "0.8.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294"
 dependencies = [
- "cfg-if 1.0.0",
+ "cfg-if",
 ]
 
 [[package]]
@@ -1684,26 +1619,6 @@ dependencies = [
 ]
 
 [[package]]
-name = "crypto-mac"
-version = "0.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab"
-dependencies = [
- "generic-array",
- "subtle",
-]
-
-[[package]]
-name = "crypto-mac"
-version = "0.11.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714"
-dependencies = [
- "generic-array",
- "subtle",
-]
-
-[[package]]
 name = "ctor"
 version = "0.2.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1750,9 +1665,28 @@ dependencies = [
 
 [[package]]
 name = "data-encoding"
-version = "2.4.0"
+version = "2.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308"
+checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5"
+
+[[package]]
+name = "deadpool"
+version = "0.9.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "421fe0f90f2ab22016f32a9881be5134fdd71c65298917084b0c7477cbc3856e"
+dependencies = [
+ "async-trait",
+ "deadpool-runtime",
+ "num_cpus",
+ "retain_mut",
+ "tokio",
+]
+
+[[package]]
+name = "deadpool-runtime"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "63dfa964fe2a66f3fde91fc70b267fe193d822c7e603e2a675a49a7f46ad3f49"
 
 [[package]]
 name = "debugid"
@@ -1790,9 +1724,9 @@ dependencies = [
 
 [[package]]
 name = "deranged"
-version = "0.3.9"
+version = "0.3.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0f32d04922c60427da6f9fef14d042d9edddef64cb9d4ce0d64d0685fbeb1fd3"
+checksum = "8eb30d70a07a3b04884d2677f06bec33509dc67ca60d92949e5535352d3191dc"
 dependencies = [
  "powerfmt",
  "serde",
@@ -1850,20 +1784,11 @@ checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8"
 
 [[package]]
 name = "digest"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066"
-dependencies = [
- "generic-array",
-]
-
-[[package]]
-name = "digest"
 version = "0.10.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
 dependencies = [
- "block-buffer 0.10.4",
+ "block-buffer",
  "const-oid",
  "crypto-common",
  "subtle",
@@ -1875,7 +1800,7 @@ version = "2.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "339ee130d97a610ea5a5872d2bbb130fdf68884ff09d3028b81bec8a1ac23bbc"
 dependencies = [
- "cfg-if 1.0.0",
+ "cfg-if",
  "dirs-sys-next",
 ]
 
@@ -1981,7 +1906,7 @@ version = "0.8.33"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1"
 dependencies = [
- "cfg-if 1.0.0",
+ "cfg-if",
 ]
 
 [[package]]
@@ -2016,12 +1941,12 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
 
 [[package]]
 name = "errno"
-version = "0.3.7"
+version = "0.3.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f258a7194e7f7c2a7837a8913aeab7fd8c383457034fa20ce4dd3dcb813e8eb8"
+checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245"
 dependencies = [
  "libc",
- "windows-sys 0.48.0",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
@@ -2030,7 +1955,7 @@ version = "0.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943"
 dependencies = [
- "cfg-if 1.0.0",
+ "cfg-if",
  "home",
  "windows-sys 0.48.0",
 ]
@@ -2073,25 +1998,25 @@ checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5"
 
 [[package]]
 name = "fd-lock"
-version = "4.0.0"
+version = "4.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b0377f1edc77dbd1118507bc7a66e4ab64d2b90c66f90726dc801e73a8c68f9"
+checksum = "b93f7a0db71c99f68398f80653ed05afb0b00e062e1a20c7ff849c4edfabbbcc"
 dependencies = [
- "cfg-if 1.0.0",
+ "cfg-if",
  "rustix",
- "windows-sys 0.48.0",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
 name = "filetime"
-version = "0.2.22"
+version = "0.2.23"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d4029edd3e734da6fe05b6cd7bd2960760a616bd2ddd0d59a0124746d6272af0"
+checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd"
 dependencies = [
- "cfg-if 1.0.0",
+ "cfg-if",
  "libc",
- "redox_syscall 0.3.5",
- "windows-sys 0.48.0",
+ "redox_syscall 0.4.1",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
@@ -2129,9 +2054,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
 
 [[package]]
 name = "form_urlencoded"
-version = "1.2.0"
+version = "1.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652"
+checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456"
 dependencies = [
  "percent-encoding",
 ]
@@ -2144,13 +2069,13 @@ checksum = "e3d76ed310eb8c6f88ddde3e976d015f4f91761fe98d7d41e497db542318fca9"
 
 [[package]]
 name = "fs-set-times"
-version = "0.20.0"
+version = "0.20.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dd738b84894214045e8414eaded76359b4a5773f0a0a56b16575110739cdcf39"
+checksum = "033b337d725b97690d86893f9de22b67b80dcc4e9ad815f348254c38119db8fb"
 dependencies = [
  "io-lifetimes",
  "rustix",
- "windows-sys 0.48.0",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
@@ -2321,7 +2246,7 @@ version = "0.1.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce"
 dependencies = [
- "cfg-if 1.0.0",
+ "cfg-if",
  "libc",
  "wasi 0.9.0+wasi-snapshot-preview1",
 ]
@@ -2332,7 +2257,7 @@ version = "0.2.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f"
 dependencies = [
- "cfg-if 1.0.0",
+ "cfg-if",
  "js-sys",
  "libc",
  "wasi 0.11.0+wasi-snapshot-preview1",
@@ -2341,9 +2266,9 @@ dependencies = [
 
 [[package]]
 name = "gimli"
-version = "0.28.0"
+version = "0.28.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0"
+checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253"
 dependencies = [
  "fallible-iterator",
  "indexmap 2.1.0",
@@ -2352,9 +2277,9 @@ dependencies = [
 
 [[package]]
 name = "git2"
-version = "0.18.1"
+version = "0.18.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fbf97ba92db08df386e10c8ede66a2a0369bd277090afd8710e19e38de9ec0cd"
+checksum = "1b3ba52851e73b46a4c3df1d89343741112003f0f6f13beb0dfac9e457c3fdcd"
 dependencies = [
  "bitflags 2.4.1",
  "libc",
@@ -2420,9 +2345,9 @@ dependencies = [
 
 [[package]]
 name = "gix-actor"
-version = "0.28.0"
+version = "0.28.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "948a5f9e43559d16faf583694f1c742eb401ce24ce8e6f2238caedea7486433c"
+checksum = "2eadca029ef716b4378f7afb19f7ee101fde9e58ba1f1445971315ac866db417"
 dependencies = [
  "bstr",
  "btoi",
@@ -2434,9 +2359,9 @@ dependencies = [
 
 [[package]]
 name = "gix-attributes"
-version = "0.20.0"
+version = "0.20.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dca120f0c6562d2d7cae467f2466e576d9f7f189beec2af2e026145107c729e2"
+checksum = "0f395469d38c76ec47cd1a6c5a53fbc3f13f737b96eaf7535f4e6b367e643381"
 dependencies = [
  "bstr",
  "gix-glob",
@@ -2451,18 +2376,18 @@ dependencies = [
 
 [[package]]
 name = "gix-bitmap"
-version = "0.2.7"
+version = "0.2.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0ccab4bc576844ddb51b78d81b4a42d73e6229660fa614dfc3d3999c874d1959"
+checksum = "d49e1a13a30d3f88be4bceae184dd13a2d3fb9ffa7515f7ed7ae771b857f4916"
 dependencies = [
  "thiserror",
 ]
 
 [[package]]
 name = "gix-chunk"
-version = "0.4.4"
+version = "0.4.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b42ea64420f7994000130328f3c7a2038f639120518870436d31b8bde704493"
+checksum = "d411ecd9b558b0c20b3252b7e409eec48eabc41d18324954fe526bac6e2db55f"
 dependencies = [
  "thiserror",
 ]
@@ -2478,15 +2403,15 @@ dependencies = [
 
 [[package]]
 name = "gix-commitgraph"
-version = "0.22.0"
+version = "0.22.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7e8bc78b1a6328fa6d8b3a53b6c73997af37fd6bfc1d6c49f149e63bda5cbb36"
+checksum = "85a7007ba021f059803afaf6f8a48872422abc20550ac12ede6ddea2936cec36"
 dependencies = [
  "bstr",
  "gix-chunk",
  "gix-features",
  "gix-hash",
- "memmap2",
+ "memmap2 0.9.0",
  "thiserror",
 ]
 
@@ -2513,9 +2438,9 @@ dependencies = [
 
 [[package]]
 name = "gix-config-value"
-version = "0.14.0"
+version = "0.14.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ea7505b97f4d8e7933e29735a568ba2f86d8de466669d9f0e8321384f9972f47"
+checksum = "6419db582ea84dfb58c7e7b0af7fd62c808aa14954af2936a33f89b0f4ed018e"
 dependencies = [
  "bitflags 2.4.1",
  "bstr",
@@ -2542,9 +2467,9 @@ dependencies = [
 
 [[package]]
 name = "gix-date"
-version = "0.8.0"
+version = "0.8.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fc7df669639582dc7c02737642f76890b03b5544e141caba68a7d6b4eb551e0d"
+checksum = "468dfbe411f335f01525a1352271727f8e7772075a93fa747260f502086b30be"
 dependencies = [
  "bstr",
  "itoa",
@@ -2580,9 +2505,9 @@ dependencies = [
 
 [[package]]
 name = "gix-features"
-version = "0.36.0"
+version = "0.36.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "51f4365ba17c4f218d7fd9ec102b8d2d3cb0ca200a835e81151ace7778aec827"
+checksum = "4d46a4a5c6bb5bebec9c0d18b65ada20e6517dbd7cf855b87dd4bbdce3a771b2"
 dependencies = [
  "bytes",
  "crc32fast",
@@ -2619,18 +2544,18 @@ dependencies = [
 
 [[package]]
 name = "gix-fs"
-version = "0.8.0"
+version = "0.8.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8cd171c0cae97cd0dc57e7b4601cb1ebf596450e263ef3c02be9107272c877bd"
+checksum = "20e86eb040f5776a5ade092282e51cdcad398adb77d948b88d17583c2ae4e107"
 dependencies = [
  "gix-features",
 ]
 
 [[package]]
 name = "gix-glob"
-version = "0.14.0"
+version = "0.14.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8fac08925dbc14d414bd02eb45ffb4cecd912d1fce3883f867bd0103c192d3e4"
+checksum = "5db19298c5eeea2961e5b3bf190767a2d1f09b8802aeb5f258e42276350aff19"
 dependencies = [
  "bitflags 2.4.1",
  "bstr",
@@ -2640,9 +2565,9 @@ dependencies = [
 
 [[package]]
 name = "gix-hash"
-version = "0.13.1"
+version = "0.13.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1884c7b41ea0875217c1be9ce91322f90bde433e91d374d0e1276073a51ccc60"
+checksum = "99c1e554a87759e672c7d2e37211e761aa390c61ffcd3753a57c51173143f3cb"
 dependencies = [
  "faster-hex",
  "thiserror",
@@ -2650,20 +2575,20 @@ dependencies = [
 
 [[package]]
 name = "gix-hashtable"
-version = "0.4.0"
+version = "0.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "409268480841ad008e81c17ca5a293393fbf9f2b6c2f85b8ab9de1f0c5176a16"
+checksum = "feb61880816d7ec4f0b20606b498147d480860ddd9133ba542628df2f548d3ca"
 dependencies = [
  "gix-hash",
- "hashbrown 0.14.2",
+ "hashbrown 0.14.3",
  "parking_lot 0.12.1",
 ]
 
 [[package]]
 name = "gix-ignore"
-version = "0.9.0"
+version = "0.9.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e73c07763a8005ae02cb5cf83040729cea9bb70c7cef68ec6c24159904c499a"
+checksum = "a215cc8cf21645bca131fcf6329d3ebd46299c47dbbe27df71bb1ca9e328b879"
 dependencies = [
  "bstr",
  "gix-glob",
@@ -2689,16 +2614,16 @@ dependencies = [
  "gix-object",
  "gix-traverse",
  "itoa",
- "memmap2",
+ "memmap2 0.7.1",
  "smallvec",
  "thiserror",
 ]
 
 [[package]]
 name = "gix-lock"
-version = "11.0.0"
+version = "11.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f4feb1dcd304fe384ddc22edba9dd56a42b0800032de6537728cea2f033a4f37"
+checksum = "7e5c65e6a29830a435664891ced3f3c1af010f14900226019590ee0971a22f37"
 dependencies = [
  "gix-tempfile",
  "gix-utils",
@@ -2707,9 +2632,9 @@ dependencies = [
 
 [[package]]
 name = "gix-macros"
-version = "0.1.0"
+version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9d8acb5ee668d55f0f2d19a320a3f9ef67a6999ad483e11135abcc2464ed18b6"
+checksum = "02a5bcaf6704d9354a3071cede7e77d366a5980c7352e102e2c2f9b645b1d3ae"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -2784,7 +2709,7 @@ dependencies = [
  "gix-object",
  "gix-path",
  "gix-tempfile",
- "memmap2",
+ "memmap2 0.7.1",
  "parking_lot 0.12.1",
  "smallvec",
  "thiserror",
@@ -2814,9 +2739,9 @@ dependencies = [
 
 [[package]]
 name = "gix-path"
-version = "0.10.0"
+version = "0.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6a1d370115171e3ae03c5c6d4f7d096f2981a40ddccb98dfd704c773530ba73b"
+checksum = "d86d6fac2fabe07b67b7835f46d07571f68b11aa1aaecae94fe722ea4ef305e1"
 dependencies = [
  "bstr",
  "gix-trace",
@@ -2827,9 +2752,9 @@ dependencies = [
 
 [[package]]
 name = "gix-pathspec"
-version = "0.4.0"
+version = "0.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e9cc7194fdcf43b4a1ccfa13ffae1d79f83beb4becff7761d88dd99faeafe625"
+checksum = "1dbbb92f75a38ef043c8bb830b339b38d0698d7f3746968b5fcbade7a880494d"
 dependencies = [
  "bitflags 2.4.1",
  "bstr",
@@ -2873,9 +2798,9 @@ dependencies = [
 
 [[package]]
 name = "gix-quote"
-version = "0.4.7"
+version = "0.4.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "475c86a97dd0127ba4465fbb239abac9ea10e68301470c9791a6dd5351cdc905"
+checksum = "4f84845efa535468bc79c5a87b9d29219f1da0313c8ecf0365a5daa7e72786f2"
 dependencies = [
  "bstr",
  "btoi",
@@ -2898,7 +2823,7 @@ dependencies = [
  "gix-path",
  "gix-tempfile",
  "gix-validate",
- "memmap2",
+ "memmap2 0.7.1",
  "thiserror",
  "winnow",
 ]
@@ -2950,9 +2875,9 @@ dependencies = [
 
 [[package]]
 name = "gix-sec"
-version = "0.10.0"
+version = "0.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "92b9542ac025a8c02ed5d17b3fc031a111a384e859d0be3532ec4d58c40a0f28"
+checksum = "a36ea2c5907d64a9b4b5d3cc9f430e6c30f0509646b5e38eb275ca57c5bf29e2"
 dependencies = [
  "bitflags 2.4.1",
  "gix-path",
@@ -2977,9 +2902,9 @@ dependencies = [
 
 [[package]]
 name = "gix-tempfile"
-version = "11.0.0"
+version = "11.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "05cc2205cf10d99f70b96e04e16c55d4c7cf33efc151df1f793e29fd12a931f8"
+checksum = "388dd29114a86ec69b28d1e26d6d63a662300ecf61ab3f4cc578f7d7dc9e7e23"
 dependencies = [
  "gix-fs",
  "libc",
@@ -2990,9 +2915,9 @@ dependencies = [
 
 [[package]]
 name = "gix-trace"
-version = "0.1.3"
+version = "0.1.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "96b6d623a1152c3facb79067d6e2ecdae48130030cf27d6eb21109f13bd7b836"
+checksum = "b686a35799b53a9825575ca3f06481d0a053a409c4d97ffcf5ddd67a8760b497"
 
 [[package]]
 name = "gix-transport"
@@ -3031,9 +2956,9 @@ dependencies = [
 
 [[package]]
 name = "gix-url"
-version = "0.25.1"
+version = "0.25.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b1b9ac8ed32ad45f9fc6c5f8c0be2ed911e544a5a19afd62d95d524ebaa95671"
+checksum = "0c427a1a11ccfa53a4a2da47d9442c2241deee63a154bc15cc14b8312fbc4005"
 dependencies = [
  "bstr",
  "gix-features",
@@ -3045,18 +2970,18 @@ dependencies = [
 
 [[package]]
 name = "gix-utils"
-version = "0.1.5"
+version = "0.1.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b85d89dc728613e26e0ed952a19583744e7f5240fcd4aa30d6c824ffd8b52f0f"
+checksum = "9f82c41937f00e15a1f6cb0b55307f0ca1f77f4407ff2bf440be35aa688c6a3e"
 dependencies = [
  "fastrand 2.0.1",
 ]
 
 [[package]]
 name = "gix-validate"
-version = "0.8.0"
+version = "0.8.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e05cab2b03a45b866156e052aa38619f4ece4adcb2f79978bfc249bc3b21b8c5"
+checksum = "75b7d8e4274be69f284bbc7e6bb2ccf7065dbcdeba22d8c549f2451ae426883f"
 dependencies = [
  "bstr",
  "thiserror",
@@ -3108,15 +3033,15 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
 
 [[package]]
 name = "globset"
-version = "0.4.13"
+version = "0.4.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "759c97c1e17c55525b57192c06a267cda0ac5210b222d6b82189a2338fa1c13d"
+checksum = "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1"
 dependencies = [
  "aho-corasick",
  "bstr",
- "fnv",
  "log",
- "regex",
+ "regex-automata 0.4.3",
+ "regex-syntax 0.8.2",
 ]
 
 [[package]]
@@ -3127,16 +3052,35 @@ checksum = "92620684d99f750bae383ecb3be3748142d6095760afd5cbcf2261e9a279d780"
 
 [[package]]
 name = "h2"
-version = "0.3.22"
+version = "0.3.24"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4d6250322ef6e60f93f9a2162799302cd6f68f79f6e5d85c8c16f14d1d958178"
+checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9"
 dependencies = [
  "bytes",
  "fnv",
  "futures-core",
  "futures-sink",
  "futures-util",
- "http",
+ "http 0.2.11",
+ "indexmap 2.1.0",
+ "slab",
+ "tokio",
+ "tokio-util",
+ "tracing",
+]
+
+[[package]]
+name = "h2"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "31d030e59af851932b72ceebadf4a2b5986dba4c3b99dd2493f8273a0f151943"
+dependencies = [
+ "bytes",
+ "fnv",
+ "futures-core",
+ "futures-sink",
+ "futures-util",
+ "http 1.0.0",
  "indexmap 2.1.0",
  "slab",
  "tokio",
@@ -3161,9 +3105,9 @@ dependencies = [
 
 [[package]]
 name = "hashbrown"
-version = "0.14.2"
+version = "0.14.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156"
+checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604"
 dependencies = [
  "ahash",
  "allocator-api2",
@@ -3175,7 +3119,7 @@ version = "0.8.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7"
 dependencies = [
- "hashbrown 0.14.2",
+ "hashbrown 0.14.3",
 ]
 
 [[package]]
@@ -3187,7 +3131,7 @@ dependencies = [
  "base64 0.21.5",
  "bytes",
  "headers-core",
- "http",
+ "http 0.2.11",
  "httpdate",
  "mime",
  "sha1",
@@ -3199,7 +3143,7 @@ version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429"
 dependencies = [
- "http",
+ "http 0.2.11",
 ]
 
 [[package]]
@@ -3229,17 +3173,7 @@ version = "0.12.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "791a029f6b9fc27657f6f188ec6e5e43f6911f6f878e0dc5501396e09809d437"
 dependencies = [
- "hmac 0.12.1",
-]
-
-[[package]]
-name = "hmac"
-version = "0.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b"
-dependencies = [
- "crypto-mac 0.11.1",
- "digest 0.9.0",
+ "hmac",
 ]
 
 [[package]]
@@ -3248,7 +3182,7 @@ version = "0.12.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e"
 dependencies = [
- "digest 0.10.7",
+ "digest",
 ]
 
 [[package]]
@@ -3283,13 +3217,47 @@ dependencies = [
 ]
 
 [[package]]
+name = "http"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b32afd38673a8016f7c9ae69e5af41a58f81b1d31689040f2f1959594ce194ea"
+dependencies = [
+ "bytes",
+ "fnv",
+ "itoa",
+]
+
+[[package]]
 name = "http-body"
 version = "0.4.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1"
 dependencies = [
  "bytes",
- "http",
+ "http 0.2.11",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "http-body"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643"
+dependencies = [
+ "bytes",
+ "http 1.0.0",
+]
+
+[[package]]
+name = "http-body-util"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "41cb79eb393015dadd30fc252023adb0b2400a0caee0fa2a077e6e21a551e840"
+dependencies = [
+ "bytes",
+ "futures-util",
+ "http 1.0.0",
+ "http-body 1.0.0",
  "pin-project-lite",
 ]
 
@@ -3305,7 +3273,7 @@ version = "1.1.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "6f560b665ad9f1572cfcaf034f7fb84338a7ce945216d64a90fd81f046a3caee"
 dependencies = [
- "http",
+ "http 0.2.11",
  "serde",
 ]
 
@@ -3319,7 +3287,7 @@ dependencies = [
  "async-channel",
  "base64 0.13.1",
  "futures-lite",
- "http",
+ "http 0.2.11",
  "infer",
  "pin-project-lite",
  "rand 0.7.3",
@@ -3352,9 +3320,9 @@ dependencies = [
  "futures-channel",
  "futures-core",
  "futures-util",
- "h2",
- "http",
- "http-body",
+ "h2 0.3.24",
+ "http 0.2.11",
+ "http-body 0.4.5",
  "httparse",
  "httpdate",
  "itoa",
@@ -3367,11 +3335,31 @@ dependencies = [
 ]
 
 [[package]]
+name = "hyper"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb5aa53871fc917b1a9ed87b683a5d86db645e23acb32c2e0785a353e522fb75"
+dependencies = [
+ "bytes",
+ "futures-channel",
+ "futures-util",
+ "h2 0.4.2",
+ "http 1.0.0",
+ "http-body 1.0.0",
+ "httparse",
+ "httpdate",
+ "itoa",
+ "pin-project-lite",
+ "tokio",
+ "want",
+]
+
+[[package]]
 name = "hyper-reverse-proxy"
 version = "0.5.2-dev"
 source = "git+https://github.com/chesedo/hyper-reverse-proxy?branch=bug/host_header#5f82b7dffe940abf896fe47dadf6c8e87ddc670b"
 dependencies = [
- "hyper",
+ "hyper 0.14.27",
  "lazy_static",
  "tokio",
  "tracing",
@@ -3384,8 +3372,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590"
 dependencies = [
  "futures-util",
- "http",
- "hyper",
+ "http 0.2.11",
+ "hyper 0.14.27",
  "log",
  "rustls",
  "rustls-native-certs",
@@ -3399,13 +3387,31 @@ version = "0.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1"
 dependencies = [
- "hyper",
+ "hyper 0.14.27",
  "pin-project-lite",
  "tokio",
  "tokio-io-timeout",
 ]
 
 [[package]]
+name = "hyper-util"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bdea9aac0dbe5a9240d68cfd9501e2db94222c6dc06843e06640b9e07f0fdc67"
+dependencies = [
+ "bytes",
+ "futures-channel",
+ "futures-util",
+ "http 1.0.0",
+ "http-body 1.0.0",
+ "hyper 1.1.0",
+ "pin-project-lite",
+ "socket2 0.5.5",
+ "tokio",
+ "tracing",
+]
+
+[[package]]
 name = "hyperlocal"
 version = "0.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3413,7 +3419,7 @@ checksum = "0fafdf7b2b2de7c9784f76e02c0935e65a8117ec3b768644379983ab333ac98c"
 dependencies = [
  "futures-util",
  "hex",
- "hyper",
+ "hyper 0.14.27",
  "pin-project",
  "tokio",
 ]
@@ -3475,18 +3481,27 @@ dependencies = [
 ]
 
 [[package]]
+name = "idna"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6"
+dependencies = [
+ "unicode-bidi",
+ "unicode-normalization",
+]
+
+[[package]]
 name = "ignore"
-version = "0.4.20"
+version = "0.4.21"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dbe7873dab538a9a44ad79ede1faf5f30d49f9a5c883ddbab48bce81b64b7492"
+checksum = "747ad1b4ae841a78e8aba0d63adbfbeaea26b517b63705d47856b73015d27060"
 dependencies = [
+ "crossbeam-deque",
  "globset",
- "lazy_static",
  "log",
  "memchr",
- "regex",
+ "regex-automata 0.4.3",
  "same-file",
- "thread_local",
  "walkdir",
  "winapi-util",
 ]
@@ -3509,7 +3524,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f"
 dependencies = [
  "equivalent",
- "hashbrown 0.14.2",
+ "hashbrown 0.14.3",
  "serde",
 ]
 
@@ -3544,7 +3559,7 @@ version = "0.1.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
 dependencies = [
- "cfg-if 1.0.0",
+ "cfg-if",
  "js-sys",
  "wasm-bindgen",
  "web-sys",
@@ -3557,7 +3572,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "f3d50eb225913c1903c788287ddd0b16369771e5abc988756a5e5927390ba04f"
 dependencies = [
  "base64 0.21.5",
- "hyper",
+ "hyper 0.14.27",
  "hyper-rustls",
  "ring 0.16.20",
  "serde",
@@ -3577,19 +3592,19 @@ dependencies = [
 
 [[package]]
 name = "io-extras"
-version = "0.18.0"
+version = "0.18.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9d3c230ee517ee76b1cc593b52939ff68deda3fae9e41eca426c6b4993df51c4"
+checksum = "c301e73fb90e8a29e600a9f402d095765f74310d582916a952f618836a1bd1ed"
 dependencies = [
  "io-lifetimes",
- "windows-sys 0.48.0",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
 name = "io-lifetimes"
-version = "2.0.2"
+version = "2.0.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bffb4def18c48926ccac55c1223e02865ce1a821751a95920448662696e7472c"
+checksum = "5a611371471e98973dbcab4e0ec66c31a10bc356eeb4d54a0e05eac8158fe38c"
 
 [[package]]
 name = "ipconfig"
@@ -3639,6 +3654,15 @@ dependencies = [
 ]
 
 [[package]]
+name = "itertools"
+version = "0.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "25db6b064527c5d482d0423354fcd07a89a2dfe07b67892e62411946db7f07b0"
+dependencies = [
+ "either",
+]
+
+[[package]]
 name = "itoa"
 version = "1.0.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3671,7 +3695,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97"
 dependencies = [
  "cesu8",
- "cfg-if 1.0.0",
+ "cfg-if",
  "combine",
  "jni-sys",
  "log",
@@ -3697,22 +3721,23 @@ dependencies = [
 
 [[package]]
 name = "js-sys"
-version = "0.3.65"
+version = "0.3.66"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "54c0c35952f67de54bb584e9fd912b3023117cbafc0a77d8f3dee1fb5f572fe8"
+checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca"
 dependencies = [
  "wasm-bindgen",
 ]
 
 [[package]]
 name = "jsonwebtoken"
-version = "9.1.0"
+version = "9.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "155c4d7e39ad04c172c5e3a99c434ea3b4a7ba7960b38ecd562b270b097cce09"
+checksum = "5c7ea04a7c5c055c175f189b6dc6ba036fd62306b58c66c9f6389036c503a3f4"
 dependencies = [
  "base64 0.21.5",
+ "js-sys",
  "pem 3.0.2",
- "ring 0.17.5",
+ "ring 0.17.7",
  "serde",
  "serde_json",
  "simple_asn1",
@@ -3750,9 +3775,9 @@ checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c"
 
 [[package]]
 name = "libgit2-sys"
-version = "0.16.1+1.7.1"
+version = "0.16.2+1.7.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f2a2bb3680b094add03bb3732ec520ece34da31a8cd2d633d1389d0f0fb60d0c"
+checksum = "ee4126d8b4ee5c9d9ea891dd875cfdc1e9d0950437179104b183d7d8a74d24e8"
 dependencies = [
  "cc",
  "libc",
@@ -3779,9 +3804,9 @@ dependencies = [
 
 [[package]]
 name = "libsqlite3-sys"
-version = "0.26.0"
+version = "0.27.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "afc22eff61b133b115c6e8c74e818c628d6d5e7a502afea6f64dee076dd94326"
+checksum = "cf4e226dcd58b4be396f7bd3c20da8fdee2911400705297ba7d2d7cc2c30f716"
 dependencies = [
  "cc",
  "pkg-config",
@@ -3808,9 +3833,9 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f"
 
 [[package]]
 name = "linux-raw-sys"
-version = "0.4.11"
+version = "0.4.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "969488b55f8ac402214f3f5fd243ebb7206cf82de60d3172994707a4bcc2b829"
+checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456"
 
 [[package]]
 name = "lock_api"
@@ -3905,8 +3930,8 @@ version = "0.10.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf"
 dependencies = [
- "cfg-if 1.0.0",
- "digest 0.10.7",
+ "cfg-if",
+ "digest",
 ]
 
 [[package]]
@@ -3934,6 +3959,15 @@ dependencies = [
 ]
 
 [[package]]
+name = "memmap2"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "deaba38d7abf1d4cca21cc89e932e542ba2b9258664d2a9ef0e61512039c9375"
+dependencies = [
+ "libc",
+]
+
+[[package]]
 name = "memoffset"
 version = "0.6.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3984,9 +4018,9 @@ dependencies = [
 
 [[package]]
 name = "mio"
-version = "0.8.9"
+version = "0.8.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0"
+checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09"
 dependencies = [
  "libc",
  "log",
@@ -4012,7 +4046,7 @@ dependencies = [
  "futures-io",
  "futures-util",
  "hex",
- "hmac 0.12.1",
+ "hmac",
  "lazy_static",
  "md-5",
  "pbkdf2",
@@ -4025,7 +4059,7 @@ dependencies = [
  "serde_bytes",
  "serde_with 1.14.0",
  "sha-1",
- "sha2 0.10.8",
+ "sha2",
  "socket2 0.4.10",
  "stringprep",
  "strsim",
@@ -4038,7 +4072,7 @@ dependencies = [
  "trust-dns-resolver 0.21.2",
  "typed-builder",
  "uuid",
- "webpki-roots 0.25.2",
+ "webpki-roots",
 ]
 
 [[package]]
@@ -4068,13 +4102,24 @@ checksum = "f346ff70e7dbfd675fe90590b92d59ef2de15a8779ae305ebcbfd3f0caf59be4"
 dependencies = [
  "autocfg",
  "bitflags 1.3.2",
- "cfg-if 1.0.0",
+ "cfg-if",
  "libc",
  "memoffset 0.6.5",
  "pin-utils",
 ]
 
 [[package]]
+name = "nix"
+version = "0.27.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053"
+dependencies = [
+ "bitflags 2.4.1",
+ "cfg-if",
+ "libc",
+]
+
+[[package]]
 name = "nom"
 version = "7.1.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -4194,7 +4239,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0"
 dependencies = [
  "crc32fast",
- "hashbrown 0.14.2",
+ "hashbrown 0.14.3",
  "indexmap 2.1.0",
  "memchr",
 ]
@@ -4210,15 +4255,9 @@ dependencies = [
 
 [[package]]
 name = "once_cell"
-version = "1.18.0"
+version = "1.19.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d"
-
-[[package]]
-name = "opaque-debug"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5"
+checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
 
 [[package]]
 name = "openssl-probe"
@@ -4228,6 +4267,22 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
 
 [[package]]
 name = "opentelemetry"
+version = "0.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "514d24875c140ed269eecc2d1b56d7b71b573716922a763c317fb1b1b4b58f15"
+dependencies = [
+ "async-trait",
+ "futures",
+ "js-sys",
+ "lazy_static",
+ "percent-encoding",
+ "pin-project",
+ "rand 0.8.5",
+ "thiserror",
+]
+
+[[package]]
+name = "opentelemetry"
 version = "0.21.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "1e32339a5dc40459130b3bd269e9892439f55b33e772d2a9d402a789baaf4e8a"
@@ -4243,6 +4298,48 @@ dependencies = [
 ]
 
 [[package]]
+name = "opentelemetry-appender-tracing"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "12c4bd073648dae8ac45cfc81588d74b3dc5f334119ac08567ddcbfe16f2d809"
+dependencies = [
+ "once_cell",
+ "opentelemetry 0.21.0",
+ "opentelemetry_sdk",
+ "tracing",
+ "tracing-core",
+ "tracing-subscriber",
+]
+
+[[package]]
+name = "opentelemetry-contrib"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e448fc8ad3687b1dd9073087941834f54093624c015a7fbd1f1efc5a38a7737"
+dependencies = [
+ "async-trait",
+ "http 0.2.11",
+ "indexmap 1.9.3",
+ "lazy_static",
+ "opentelemetry 0.12.0",
+ "opentelemetry-http 0.1.0",
+ "rmp",
+ "thiserror",
+]
+
+[[package]]
+name = "opentelemetry-http"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "69a853d37ac1c02889211517007a99b2a90d3d7e89526f9af037ada84f1326a1"
+dependencies = [
+ "async-trait",
+ "http 0.2.11",
+ "opentelemetry 0.12.0",
+ "thiserror",
+]
+
+[[package]]
 name = "opentelemetry-http"
 version = "0.10.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -4250,8 +4347,8 @@ checksum = "7f51189ce8be654f9b5f7e70e49967ed894e84a06fc35c6c042e64ac1fc5399e"
 dependencies = [
  "async-trait",
  "bytes",
- "http",
- "opentelemetry",
+ "http 0.2.11",
+ "opentelemetry 0.21.0",
 ]
 
 [[package]]
@@ -4262,8 +4359,8 @@ checksum = "f24cda83b20ed2433c68241f918d0f6fdec8b1d43b7a9590ab4420c5095ca930"
 dependencies = [
  "async-trait",
  "futures-core",
- "http",
- "opentelemetry",
+ "http 0.2.11",
+ "opentelemetry 0.21.0",
  "opentelemetry-proto",
  "opentelemetry-semantic-conventions",
  "opentelemetry_sdk",
@@ -4279,7 +4376,7 @@ version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "a2e155ce5cc812ea3d1dffbd1539aed653de4bf4882d60e6e04dcf0901d674e1"
 dependencies = [
- "opentelemetry",
+ "opentelemetry 0.21.0",
  "opentelemetry_sdk",
  "prost 0.11.9",
  "tonic 0.9.2",
@@ -4291,7 +4388,7 @@ version = "0.13.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "f5774f1ef1f982ef2a447f6ee04ec383981a3ab99c8e77a1a7b30182e65bbc84"
 dependencies = [
- "opentelemetry",
+ "opentelemetry 0.21.0",
 ]
 
 [[package]]
@@ -4307,10 +4404,11 @@ dependencies = [
  "futures-util",
  "glob",
  "once_cell",
- "opentelemetry",
+ "opentelemetry 0.21.0",
  "ordered-float",
  "percent-encoding",
  "rand 0.8.5",
+ "serde_json",
  "thiserror",
  "tokio",
  "tokio-stream",
@@ -4324,9 +4422,9 @@ checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d"
 
 [[package]]
 name = "ordered-float"
-version = "4.1.1"
+version = "4.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "536900a8093134cf9ccf00a27deb3532421099e958d9dd431135d0c7543ca1e8"
+checksum = "a76df7075c7d4d01fdcb46c912dd17fba5b60c78ea480b475f2b6ab6f666584e"
 dependencies = [
  "num-traits",
 ]
@@ -4386,7 +4484,7 @@ version = "0.8.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc"
 dependencies = [
- "cfg-if 1.0.0",
+ "cfg-if",
  "instant",
  "libc",
  "redox_syscall 0.2.16",
@@ -4400,7 +4498,7 @@ version = "0.9.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e"
 dependencies = [
- "cfg-if 1.0.0",
+ "cfg-if",
  "libc",
  "redox_syscall 0.4.1",
  "smallvec",
@@ -4419,7 +4517,7 @@ version = "0.11.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917"
 dependencies = [
- "digest 0.10.7",
+ "digest",
 ]
 
 [[package]]
@@ -4462,9 +4560,9 @@ dependencies = [
 
 [[package]]
 name = "percent-encoding"
-version = "2.3.0"
+version = "2.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94"
+checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
 
 [[package]]
 name = "pin-project"
@@ -4527,9 +4625,9 @@ checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964"
 
 [[package]]
 name = "portable-atomic"
-version = "1.5.1"
+version = "1.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3bccab0e7fd7cc19f820a1c8c91720af652d0c88dc9664dd72aef2614f04af3b"
+checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0"
 
 [[package]]
 name = "portpicker"
@@ -4541,6 +4639,17 @@ dependencies = [
 ]
 
 [[package]]
+name = "posthog-core"
+version = "0.1.0"
+source = "git+https://github.com/shuttle-hq/posthog-rs?branch=main#4a8299fde3080bff550620c0853be9b83fee8f44"
+dependencies = [
+ "chrono",
+ "serde",
+ "serde_json",
+ "thiserror",
+]
+
+[[package]]
 name = "powerfmt"
 version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -4616,9 +4725,9 @@ dependencies = [
 
 [[package]]
 name = "proc-macro2"
-version = "1.0.69"
+version = "1.0.70"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da"
+checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b"
 dependencies = [
  "unicode-ident",
 ]
@@ -4661,12 +4770,12 @@ dependencies = [
 
 [[package]]
 name = "prost"
-version = "0.12.2"
+version = "0.12.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a5a410fc7882af66deb8d01d01737353cf3ad6204c408177ba494291a626312"
+checksum = "146c289cda302b98a28d40c8b3b90498d6e526dd24ac2ecea73e4e491685b94a"
 dependencies = [
  "bytes",
- "prost-derive 0.12.2",
+ "prost-derive 0.12.3",
 ]
 
 [[package]]
@@ -4684,9 +4793,9 @@ dependencies = [
 
 [[package]]
 name = "prost-derive"
-version = "0.12.2"
+version = "0.12.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "065717a5dfaca4a83d2fe57db3487b311365200000551d7a364e715dbf4346bc"
+checksum = "efb6c9a1dd1def8e2124d17e83a20af56f1570d6c2d2bd9e266ccb768df3840e"
 dependencies = [
  "anyhow",
  "itertools 0.11.0",
@@ -4697,11 +4806,11 @@ dependencies = [
 
 [[package]]
 name = "prost-types"
-version = "0.12.2"
+version = "0.12.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8339f32236f590281e2f6368276441394fcd1b2133b549cc895d0ae80f2f9a52"
+checksum = "193898f59edcf43c26227dcd4c8427f00d99d61e95dcde58dabd49fa291d470e"
 dependencies = [
- "prost 0.12.2",
+ "prost 0.12.3",
 ]
 
 [[package]]
@@ -4880,15 +4989,6 @@ dependencies = [
 
 [[package]]
 name = "redox_syscall"
-version = "0.3.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"
-dependencies = [
- "bitflags 1.3.2",
-]
-
-[[package]]
-name = "redox_syscall"
 version = "0.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa"
@@ -4975,10 +5075,10 @@ dependencies = [
  "encoding_rs",
  "futures-core",
  "futures-util",
- "h2",
- "http",
- "http-body",
- "hyper",
+ "h2 0.3.24",
+ "http 0.2.11",
+ "http-body 0.4.5",
+ "hyper 0.14.27",
  "hyper-rustls",
  "ipnet",
  "js-sys",
@@ -5002,7 +5102,7 @@ dependencies = [
  "wasm-bindgen",
  "wasm-bindgen-futures",
  "web-sys",
- "webpki-roots 0.25.2",
+ "webpki-roots",
  "winreg",
 ]
 
@@ -5014,7 +5114,7 @@ checksum = "88a3e86aa6053e59030e7ce2d2a3b258dd08fc2d337d52f73f6cb480f5858690"
 dependencies = [
  "anyhow",
  "async-trait",
- "http",
+ "http 0.2.11",
  "reqwest",
  "serde",
  "task-local-extensions",
@@ -5032,8 +5132,8 @@ dependencies = [
  "chrono",
  "futures",
  "getrandom 0.2.11",
- "http",
- "hyper",
+ "http 0.2.11",
+ "hyper 0.14.27",
  "parking_lot 0.11.2",
  "reqwest",
  "reqwest-middleware",
@@ -5055,6 +5155,12 @@ dependencies = [
 ]
 
 [[package]]
+name = "retain_mut"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4389f1d5789befaf6029ebd9f7dac4af7f7e3d61b69d4f30e2ac02b57e7712b0"
+
+[[package]]
 name = "retry-policies"
 version = "0.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -5072,7 +5178,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "01ff60778f96fb5a48adbe421d21bf6578ed58c0872d712e7e08593c195adff8"
 dependencies = [
  "comma",
- "nix",
+ "nix 0.25.1",
  "regex",
  "tempfile",
  "thiserror",
@@ -5095,9 +5201,9 @@ dependencies = [
 
 [[package]]
 name = "ring"
-version = "0.17.5"
+version = "0.17.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fb0205304757e5d899b9c2e448b867ffd03ae7f988002e47cd24954391394d0b"
+checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74"
 dependencies = [
  "cc",
  "getrandom 0.2.11",
@@ -5130,13 +5236,19 @@ dependencies = [
 ]
 
 [[package]]
+name = "roff"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b833d8d034ea094b1ea68aa6d5c740e0d04bad9d16568d08ba6f76823a114316"
+
+[[package]]
 name = "rsa"
-version = "0.9.3"
+version = "0.9.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "86ef35bf3e7fe15a53c4ab08a998e42271eab13eb0db224126bc7bc4c4bad96d"
+checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc"
 dependencies = [
  "const-oid",
- "digest 0.10.7",
+ "digest",
  "num-bigint-dig",
  "num-integer",
  "num-traits",
@@ -5150,41 +5262,6 @@ dependencies = [
 ]
 
 [[package]]
-name = "rust-embed"
-version = "8.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b1e7d90385b59f0a6bf3d3b757f3ca4ece2048265d70db20a2016043d4509a40"
-dependencies = [
- "rust-embed-impl",
- "rust-embed-utils",
- "walkdir",
-]
-
-[[package]]
-name = "rust-embed-impl"
-version = "8.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c3d8c6fd84090ae348e63a84336b112b5c3918b3bf0493a581f7bd8ee623c29"
-dependencies = [
- "proc-macro2",
- "quote",
- "rust-embed-utils",
- "shellexpand",
- "syn 2.0.39",
- "walkdir",
-]
-
-[[package]]
-name = "rust-embed-utils"
-version = "8.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "873feff8cb7bf86fdf0a71bb21c95159f4e4a37dd7a4bd1855a940909b583ada"
-dependencies = [
- "sha2 0.10.8",
- "walkdir",
-]
-
-[[package]]
 name = "rustc-demangle"
 version = "0.1.23"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -5235,9 +5312,9 @@ dependencies = [
 
 [[package]]
 name = "rustix"
-version = "0.38.25"
+version = "0.38.26"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc99bc2d4f1fed22595588a013687477aedf3cdcfb26558c559edb67b4d9b22e"
+checksum = "9470c4bf8246c8daf25f9598dca807fb6510347b1e1cfa55749113850c79d88a"
 dependencies = [
  "bitflags 2.4.1",
  "errno",
@@ -5245,7 +5322,7 @@ dependencies = [
  "libc",
  "linux-raw-sys",
  "once_cell",
- "windows-sys 0.48.0",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
@@ -5255,7 +5332,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "629648aced5775d558af50b2b4c7b02983a04b312126d45eeead26e7caa498b9"
 dependencies = [
  "log",
- "ring 0.17.5",
+ "ring 0.17.7",
  "rustls-webpki",
  "sct",
 ]
@@ -5287,7 +5364,7 @@ version = "0.101.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765"
 dependencies = [
- "ring 0.17.5",
+ "ring 0.17.7",
  "untrusted 0.9.0",
 ]
 
@@ -5297,7 +5374,7 @@ version = "0.7.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "cfe3300a40b60e76a856237ad1fe2210da1f40686705a2211688bb5742109a63"
 dependencies = [
- "arrayvec 0.7.4",
+ "arrayvec",
  "bitflags 1.3.2",
  "doc-comment",
  "finl_unicode",
@@ -5362,7 +5439,7 @@ version = "0.7.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414"
 dependencies = [
- "ring 0.17.5",
+ "ring 0.17.7",
  "untrusted 0.9.0",
 ]
 
@@ -5415,9 +5492,9 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
 
 [[package]]
 name = "serde"
-version = "1.0.192"
+version = "1.0.193"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bca2a08484b285dcb282d0f67b26cadc0df8b19f8c12502c13d966bf9482f001"
+checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89"
 dependencies = [
  "serde_derive",
 ]
@@ -5433,9 +5510,9 @@ dependencies = [
 
 [[package]]
 name = "serde_derive"
-version = "1.0.192"
+version = "1.0.193"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1"
+checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -5562,9 +5639,9 @@ version = "0.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c"
 dependencies = [
- "cfg-if 1.0.0",
+ "cfg-if",
  "cpufeatures",
- "digest 0.10.7",
+ "digest",
 ]
 
 [[package]]
@@ -5573,9 +5650,9 @@ version = "0.10.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba"
 dependencies = [
- "cfg-if 1.0.0",
+ "cfg-if",
  "cpufeatures",
- "digest 0.10.7",
+ "digest",
 ]
 
 [[package]]
@@ -5586,26 +5663,13 @@ checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012"
 
 [[package]]
 name = "sha2"
-version = "0.9.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800"
-dependencies = [
- "block-buffer 0.9.0",
- "cfg-if 1.0.0",
- "cpufeatures",
- "digest 0.9.0",
- "opaque-debug",
-]
-
-[[package]]
-name = "sha2"
 version = "0.10.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8"
 dependencies = [
- "cfg-if 1.0.0",
+ "cfg-if",
  "cpufeatures",
- "digest 0.10.7",
+ "digest",
 ]
 
 [[package]]
@@ -5634,7 +5698,7 @@ dependencies = [
 
 [[package]]
 name = "shuttle-admin"
-version = "0.34.1"
+version = "0.39.0"
 dependencies = [
  "anyhow",
  "clap",
@@ -5651,40 +5715,43 @@ dependencies = [
 
 [[package]]
 name = "shuttle-auth"
-version = "0.34.1"
+version = "0.39.0"
 dependencies = [
  "anyhow",
  "async-stripe",
  "async-trait",
  "axum",
  "axum-extra",
- "axum-sessions",
  "base64 0.21.5",
+ "chrono",
  "clap",
- "http",
- "hyper",
+ "ctor",
+ "http 0.2.11",
+ "hyper 0.14.27",
  "jsonwebtoken",
- "opentelemetry",
+ "once_cell",
+ "opentelemetry 0.21.0",
  "pem 2.0.1",
  "portpicker",
- "rand 0.8.5",
- "ring 0.17.5",
+ "pretty_assertions",
+ "ring 0.17.7",
  "serde",
  "serde_json",
  "shuttle-common",
+ "shuttle-common-tests",
  "sqlx",
- "strum 0.25.0",
  "thiserror",
  "tokio",
  "tower",
  "tracing",
  "tracing-opentelemetry",
  "tracing-subscriber",
+ "wiremock",
 ]
 
 [[package]]
 name = "shuttle-builder"
-version = "0.34.1"
+version = "0.39.0"
 dependencies = [
  "async-trait",
  "clap",
@@ -5710,7 +5777,7 @@ dependencies = [
 
 [[package]]
 name = "shuttle-codegen"
-version = "0.34.1"
+version = "0.39.0"
 dependencies = [
  "pretty_assertions",
  "proc-macro-error",
@@ -5727,7 +5794,7 @@ dependencies = [
 
 [[package]]
 name = "shuttle-common"
-version = "0.34.1"
+version = "0.39.0"
 dependencies = [
  "anyhow",
  "async-trait",
@@ -5738,21 +5805,22 @@ dependencies = [
  "comfy-table",
  "crossterm 0.27.0",
  "headers",
- "http",
- "http-body",
+ "http 0.2.11",
+ "http-body 0.4.5",
  "http-serde",
- "hyper",
+ "hyper 0.14.27",
  "jsonwebtoken",
  "once_cell",
- "opentelemetry",
- "opentelemetry-http",
+ "opentelemetry 0.21.0",
+ "opentelemetry-appender-tracing",
+ "opentelemetry-http 0.10.0",
  "opentelemetry-otlp",
  "opentelemetry_sdk",
  "pin-project",
  "proptest",
  "rand 0.8.5",
  "reqwest",
- "ring 0.17.5",
+ "ring 0.17.7",
  "rmp-serde",
  "rustrict",
  "semver 1.0.20",
@@ -5760,60 +5828,60 @@ dependencies = [
  "serde_json",
  "sqlx",
  "strum 0.25.0",
+ "test-context",
  "thiserror",
  "tokio",
  "tonic 0.10.2",
  "tower",
  "tower-http 0.4.4",
  "tracing",
+ "tracing-core",
  "tracing-fluent-assertions",
  "tracing-opentelemetry",
  "tracing-subscriber",
  "ttl_cache",
  "url",
- "utoipa",
  "uuid",
+ "wiremock",
  "zeroize",
 ]
 
 [[package]]
 name = "shuttle-common-tests"
-version = "0.34.1"
+version = "0.39.0"
 dependencies = [
  "cargo-shuttle",
- "hyper",
+ "hyper 0.14.27",
  "portpicker",
  "reqwest",
+ "serde",
  "shuttle-common",
  "shuttle-proto",
  "tokio",
  "tokio-stream",
  "tonic 0.10.2",
  "tower",
+ "uuid",
 ]
 
 [[package]]
 name = "shuttle-deployer"
-version = "0.34.1"
+version = "0.39.0"
 dependencies = [
  "anyhow",
  "async-trait",
  "axum",
- "bytes",
  "cargo_metadata 0.18.1",
  "chrono",
  "clap",
  "ctor",
  "flate2",
- "fqdn",
- "futures",
  "hex",
  "home",
- "hyper",
+ "hyper 0.14.27",
  "hyper-reverse-proxy",
  "once_cell",
- "opentelemetry",
- "opentelemetry-http",
+ "opentelemetry 0.21.0",
  "portpicker",
  "prost-types",
  "rand 0.8.5",
@@ -5834,21 +5902,19 @@ dependencies = [
  "toml 0.8.8",
  "tonic 0.10.2",
  "tower",
- "tower-http 0.4.4",
  "tracing",
  "tracing-opentelemetry",
  "tracing-subscriber",
  "ulid",
- "utoipa",
- "utoipa-swagger-ui",
  "uuid",
 ]
 
 [[package]]
 name = "shuttle-gateway"
-version = "0.34.1"
+version = "0.39.0"
 dependencies = [
  "anyhow",
+ "async-posthog",
  "async-trait",
  "axum",
  "axum-server",
@@ -5859,23 +5925,24 @@ dependencies = [
  "flate2",
  "fqdn",
  "futures",
- "http",
- "hyper",
+ "http 0.2.11",
+ "hyper 0.14.27",
  "hyper-reverse-proxy",
  "instant-acme",
  "jsonwebtoken",
  "lazy_static",
  "num_cpus",
  "once_cell",
- "opentelemetry",
- "opentelemetry-http",
+ "opentelemetry 0.21.0",
+ "opentelemetry-contrib",
+ "opentelemetry-http 0.10.0",
  "pem 1.1.1",
  "pin-project",
  "portpicker",
  "rand 0.8.5",
  "rcgen",
  "reqwest",
- "ring 0.17.5",
+ "ring 0.17.7",
  "rmp-serde",
  "rustls",
  "rustls-pemfile",
@@ -5901,15 +5968,13 @@ dependencies = [
  "tracing-subscriber",
  "ttl_cache",
  "ulid",
- "utoipa",
- "utoipa-swagger-ui",
  "uuid",
  "x509-parser",
 ]
 
 [[package]]
 name = "shuttle-logger"
-version = "0.34.1"
+version = "0.39.0"
 dependencies = [
  "async-trait",
  "chrono",
@@ -5930,32 +5995,36 @@ dependencies = [
  "tonic 0.10.2",
  "tracing",
  "tracing-subscriber",
- "uuid",
 ]
 
 [[package]]
 name = "shuttle-orchestrator"
-version = "0.34.1"
+version = "0.39.0"
 
 [[package]]
 name = "shuttle-proto"
-version = "0.34.1"
+version = "0.39.0"
 dependencies = [
  "anyhow",
+ "async-trait",
  "chrono",
  "futures-core",
- "prost 0.12.2",
+ "http 0.2.11",
+ "portpicker",
+ "prost 0.12.3",
  "prost-types",
  "serde_json",
  "shuttle-common",
+ "test-context",
  "tokio",
  "tonic 0.10.2",
+ "tower",
  "tracing",
 ]
 
 [[package]]
 name = "shuttle-provisioner"
-version = "0.34.1"
+version = "0.39.0"
 dependencies = [
  "aws-config",
  "aws-sdk-rds",
@@ -5965,10 +6034,11 @@ dependencies = [
  "mongodb",
  "once_cell",
  "portpicker",
- "prost 0.12.2",
+ "prost 0.12.3",
  "rand 0.8.5",
  "serde_json",
  "shuttle-common",
+ "shuttle-common-tests",
  "shuttle-proto",
  "sqlx",
  "thiserror",
@@ -5980,7 +6050,7 @@ dependencies = [
 
 [[package]]
 name = "shuttle-resource-recorder"
-version = "0.34.1"
+version = "0.39.0"
 dependencies = [
  "async-trait",
  "chrono",
@@ -6004,7 +6074,7 @@ dependencies = [
 
 [[package]]
 name = "shuttle-runtime"
-version = "0.34.1"
+version = "0.39.0"
 dependencies = [
  "anyhow",
  "async-trait",
@@ -6012,7 +6082,7 @@ dependencies = [
  "chrono",
  "colored",
  "futures",
- "hyper",
+ "hyper 0.14.27",
  "portpicker",
  "prost-types",
  "rmp-serde",
@@ -6027,7 +6097,6 @@ dependencies = [
  "tokio",
  "tokio-stream",
  "tonic 0.10.2",
- "tower",
  "tracing-subscriber",
  "uuid",
  "wasi-common",
@@ -6037,7 +6106,7 @@ dependencies = [
 
 [[package]]
 name = "shuttle-service"
-version = "0.34.1"
+version = "0.39.0"
 dependencies = [
  "anyhow",
  "async-trait",
@@ -6050,7 +6119,6 @@ dependencies = [
  "thiserror",
  "tokio",
  "toml 0.8.8",
- "tower",
  "tracing",
 ]
 
@@ -6090,7 +6158,7 @@ version = "2.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de"
 dependencies = [
- "digest 0.10.7",
+ "digest",
  "rand_core 0.6.4",
 ]
 
@@ -6194,9 +6262,9 @@ dependencies = [
 
 [[package]]
 name = "spki"
-version = "0.7.2"
+version = "0.7.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a"
+checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d"
 dependencies = [
  "base64ct",
  "der",
@@ -6210,20 +6278,20 @@ checksum = "3b9b39299b249ad65f3b7e96443bad61c02ca5cd3589f46cb6d610a0fd6c0d6a"
 
 [[package]]
 name = "sqlformat"
-version = "0.2.2"
+version = "0.2.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6b7b278788e7be4d0d29c0f39497a0eef3fba6bbc8e70d8bf7fde46edeaa9e85"
+checksum = "ce81b7bd7c4493975347ef60d8c7e8b742d4694f4c49f93e0a12ea263938176c"
 dependencies = [
- "itertools 0.11.0",
+ "itertools 0.12.0",
  "nom",
  "unicode_categories",
 ]
 
 [[package]]
 name = "sqlx"
-version = "0.7.2"
+version = "0.7.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0e50c216e3624ec8e7ecd14c6a6a6370aad6ee5d8cfc3ab30b5162eeeef2ed33"
+checksum = "dba03c279da73694ef99763320dea58b51095dfe87d001b1d4b5fe78ba8763cf"
 dependencies = [
  "sqlx-core",
  "sqlx-macros",
@@ -6234,9 +6302,9 @@ dependencies = [
 
 [[package]]
 name = "sqlx-core"
-version = "0.7.2"
+version = "0.7.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8d6753e460c998bbd4cd8c6f0ed9a64346fcca0723d6e75e52fdc351c5d2169d"
+checksum = "d84b0a3c3739e220d94b3239fd69fb1f74bc36e16643423bd99de3b43c21bfbd"
 dependencies = [
  "ahash",
  "atoi",
@@ -6265,7 +6333,7 @@ dependencies = [
  "rustls-pemfile",
  "serde",
  "serde_json",
- "sha2 0.10.8",
+ "sha2",
  "smallvec",
  "sqlformat",
  "thiserror",
@@ -6274,14 +6342,14 @@ dependencies = [
  "tracing",
  "url",
  "uuid",
- "webpki-roots 0.24.0",
+ "webpki-roots",
 ]
 
 [[package]]
 name = "sqlx-macros"
-version = "0.7.2"
+version = "0.7.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a793bb3ba331ec8359c1853bd39eed32cdd7baaf22c35ccf5c92a7e8d1189ec"
+checksum = "89961c00dc4d7dffb7aee214964b065072bff69e36ddb9e2c107541f75e4f2a5"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -6292,10 +6360,11 @@ dependencies = [
 
 [[package]]
 name = "sqlx-macros-core"
-version = "0.7.2"
+version = "0.7.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0a4ee1e104e00dedb6aa5ffdd1343107b0a4702e862a84320ee7cc74782d96fc"
+checksum = "d0bd4519486723648186a08785143599760f7cc81c52334a55d6a83ea1e20841"
 dependencies = [
+ "atomic-write-file",
  "dotenvy",
  "either",
  "heck",
@@ -6305,7 +6374,7 @@ dependencies = [
  "quote",
  "serde",
  "serde_json",
- "sha2 0.10.8",
+ "sha2",
  "sqlx-core",
  "sqlx-mysql",
  "sqlx-postgres",
@@ -6318,9 +6387,9 @@ dependencies = [
 
 [[package]]
 name = "sqlx-mysql"
-version = "0.7.2"
+version = "0.7.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "864b869fdf56263f4c95c45483191ea0af340f9f3e3e7b4d57a61c7c87a970db"
+checksum = "e37195395df71fd068f6e2082247891bc11e3289624bbc776a0cdfa1ca7f1ea4"
 dependencies = [
  "atoi",
  "base64 0.21.5",
@@ -6329,7 +6398,7 @@ dependencies = [
  "bytes",
  "chrono",
  "crc",
- "digest 0.10.7",
+ "digest",
  "dotenvy",
  "either",
  "futures-channel",
@@ -6339,7 +6408,7 @@ dependencies = [
  "generic-array",
  "hex",
  "hkdf",
- "hmac 0.12.1",
+ "hmac",
  "itoa",
  "log",
  "md-5",
@@ -6350,7 +6419,7 @@ dependencies = [
  "rsa",
  "serde",
  "sha1",
- "sha2 0.10.8",
+ "sha2",
  "smallvec",
  "sqlx-core",
  "stringprep",
@@ -6362,9 +6431,9 @@ dependencies = [
 
 [[package]]
 name = "sqlx-postgres"
-version = "0.7.2"
+version = "0.7.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eb7ae0e6a97fb3ba33b23ac2671a5ce6e3cabe003f451abd5a56e7951d975624"
+checksum = "d6ac0ac3b7ccd10cc96c7ab29791a7dd236bd94021f31eec7ba3d46a74aa1c24"
 dependencies = [
  "atoi",
  "base64 0.21.5",
@@ -6380,7 +6449,7 @@ dependencies = [
  "futures-util",
  "hex",
  "hkdf",
- "hmac 0.12.1",
+ "hmac",
  "home",
  "itoa",
  "log",
@@ -6391,7 +6460,7 @@ dependencies = [
  "serde",
  "serde_json",
  "sha1",
- "sha2 0.10.8",
+ "sha2",
  "smallvec",
  "sqlx-core",
  "stringprep",
@@ -6403,9 +6472,9 @@ dependencies = [
 
 [[package]]
 name = "sqlx-sqlite"
-version = "0.7.2"
+version = "0.7.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d59dc83cf45d89c555a577694534fcd1b55c545a816c816ce51f20bbe56a4f3f"
+checksum = "210976b7d948c7ba9fced8ca835b11cbb2d677c59c79de41ac0d397e14547490"
 dependencies = [
  "atoi",
  "chrono",
@@ -6422,6 +6491,7 @@ dependencies = [
  "sqlx-core",
  "tracing",
  "url",
+ "urlencoding",
  "uuid",
 ]
 
@@ -6639,7 +6709,7 @@ version = "3.8.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5"
 dependencies = [
- "cfg-if 1.0.0",
+ "cfg-if",
  "fastrand 2.0.1",
  "redox_syscall 0.4.1",
  "rustix",
@@ -6708,7 +6778,7 @@ version = "1.1.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152"
 dependencies = [
- "cfg-if 1.0.0",
+ "cfg-if",
  "once_cell",
 ]
 
@@ -6844,7 +6914,7 @@ dependencies = [
  "tokio",
  "tokio-rustls",
  "tungstenite",
- "webpki-roots 0.25.2",
+ "webpki-roots",
 ]
 
 [[package]]
@@ -6869,7 +6939,7 @@ source = "git+https://github.com/shuttle-hq/tokiotest-httpserver?branch=feat/bod
 dependencies = [
  "async-trait",
  "futures",
- "hyper",
+ "hyper 0.14.27",
  "lazy_static",
  "queues",
  "serde_json",
@@ -6970,10 +7040,10 @@ dependencies = [
  "bytes",
  "futures-core",
  "futures-util",
- "h2",
- "http",
- "http-body",
- "hyper",
+ "h2 0.3.24",
+ "http 0.2.11",
+ "http-body 0.4.5",
+ "hyper 0.14.27",
  "hyper-timeout",
  "percent-encoding",
  "pin-project",
@@ -6997,14 +7067,14 @@ dependencies = [
  "axum",
  "base64 0.21.5",
  "bytes",
- "h2",
- "http",
- "http-body",
- "hyper",
+ "h2 0.3.24",
+ "http 0.2.11",
+ "http-body 0.4.5",
+ "hyper 0.14.27",
  "hyper-timeout",
  "percent-encoding",
  "pin-project",
- "prost 0.12.2",
+ "prost 0.12.3",
  "tokio",
  "tokio-stream",
  "tower",
@@ -7043,8 +7113,8 @@ dependencies = [
  "bytes",
  "futures-core",
  "futures-util",
- "http",
- "http-body",
+ "http 0.2.11",
+ "http-body 0.4.5",
  "http-range-header",
  "pin-project-lite",
  "tower-layer",
@@ -7057,15 +7127,13 @@ version = "0.4.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "61c5bb1d698276a2443e5ecfabc1008bf15a36c12e6a7176e7bf089ea9131140"
 dependencies = [
- "base64 0.21.5",
  "bitflags 2.4.1",
  "bytes",
  "futures-core",
  "futures-util",
- "http",
- "http-body",
+ "http 0.2.11",
+ "http-body 0.4.5",
  "http-range-header",
- "mime",
  "pin-project-lite",
  "tower-layer",
  "tower-service",
@@ -7084,7 +7152,7 @@ version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "4f8277387194ad48739f3516a54ef4486927ba53b8d889871f3715fb8f99f5aa"
 dependencies = [
- "http",
+ "http 0.2.11",
  "tower-layer",
  "tower-service",
  "url-escape",
@@ -7159,7 +7227,7 @@ checksum = "c67ac25c5407e7b961fafc6f7e9aa5958fd297aada2d20fa2ae1737357e55596"
 dependencies = [
  "js-sys",
  "once_cell",
- "opentelemetry",
+ "opentelemetry 0.21.0",
  "opentelemetry_sdk",
  "smallvec",
  "tracing",
@@ -7170,6 +7238,16 @@ dependencies = [
 ]
 
 [[package]]
+name = "tracing-serde"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1"
+dependencies = [
+ "serde",
+ "tracing-core",
+]
+
+[[package]]
 name = "tracing-subscriber"
 version = "0.3.18"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -7179,12 +7257,15 @@ dependencies = [
  "nu-ansi-term",
  "once_cell",
  "regex",
+ "serde",
+ "serde_json",
  "sharded-slab",
  "smallvec",
  "thread_local",
  "tracing",
  "tracing-core",
  "tracing-log",
+ "tracing-serde",
 ]
 
 [[package]]
@@ -7194,7 +7275,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "9c31f240f59877c3d4bb3b3ea0ec5a6a0cff07323580ff8c7a605cd7d08b255d"
 dependencies = [
  "async-trait",
- "cfg-if 1.0.0",
+ "cfg-if",
  "data-encoding",
  "enum-as-inner 0.4.0",
  "futures-channel",
@@ -7219,7 +7300,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "3119112651c157f4488931a01e586aa459736e9d6046d3bd9105ffb69352d374"
 dependencies = [
  "async-trait",
- "cfg-if 1.0.0",
+ "cfg-if",
  "data-encoding",
  "enum-as-inner 0.6.0",
  "futures-channel",
@@ -7243,7 +7324,7 @@ version = "0.21.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e4ba72c2ea84515690c9fcef4c6c660bb9df3036ed1051686de84605b74fd558"
 dependencies = [
- "cfg-if 1.0.0",
+ "cfg-if",
  "futures-util",
  "ipconfig",
  "lazy_static",
@@ -7263,7 +7344,7 @@ version = "0.23.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "10a3e6c3aff1718b3c73e395d1f35202ba2ffa847c6a62eea0db8fb4cfe30be6"
 dependencies = [
- "cfg-if 1.0.0",
+ "cfg-if",
  "futures-util",
  "ipconfig",
  "lru-cache",
@@ -7280,9 +7361,9 @@ dependencies = [
 
 [[package]]
 name = "try-lock"
-version = "0.2.4"
+version = "0.2.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed"
+checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
 
 [[package]]
 name = "trybuild"
@@ -7317,7 +7398,7 @@ dependencies = [
  "byteorder",
  "bytes",
  "data-encoding",
- "http",
+ "http 0.2.11",
  "httparse",
  "log",
  "rand 0.8.5",
@@ -7372,9 +7453,9 @@ dependencies = [
 
 [[package]]
 name = "unicode-bidi"
-version = "0.3.13"
+version = "0.3.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460"
+checksum = "6f2528f27a9eb2b21e69c95319b30bd0efd85d09c379741b0f78ea1d86be2416"
 
 [[package]]
 name = "unicode-bom"
@@ -7435,12 +7516,12 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
 
 [[package]]
 name = "url"
-version = "2.4.1"
+version = "2.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5"
+checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633"
 dependencies = [
  "form_urlencoded",
- "idna 0.4.0",
+ "idna 0.5.0",
  "percent-encoding",
  "serde",
 ]
@@ -7473,51 +7554,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a"
 
 [[package]]
-name = "utoipa"
-version = "4.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0ff05e3bac2c9428f57ade702667753ca3f5cf085e2011fe697de5bfd49aa72d"
-dependencies = [
- "indexmap 2.1.0",
- "serde",
- "serde_json",
- "utoipa-gen",
-]
-
-[[package]]
-name = "utoipa-gen"
-version = "4.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5f0b6f4667edd64be0e820d6631a60433a269710b6ee89ac39525b872b76d61d"
-dependencies = [
- "proc-macro-error",
- "proc-macro2",
- "quote",
- "syn 2.0.39",
- "uuid",
-]
-
-[[package]]
-name = "utoipa-swagger-ui"
-version = "4.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "154517adf0d0b6e22e8e1f385628f14fcaa3db43531dc74303d3edef89d6dfe5"
-dependencies = [
- "axum",
- "mime_guess",
- "regex",
- "rust-embed",
- "serde",
- "serde_json",
- "utoipa",
- "zip",
-]
-
-[[package]]
 name = "uuid"
-version = "1.5.0"
+version = "1.6.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "88ad59a7560b41a70d191093a945f0b87bc1deeda46fb237479708a1d6b6cdfc"
+checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560"
 dependencies = [
  "getrandom 0.2.11",
  "serde",
@@ -7639,19 +7679,19 @@ dependencies = [
 
 [[package]]
 name = "wasm-bindgen"
-version = "0.2.88"
+version = "0.2.89"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7daec296f25a1bae309c0cd5c29c4b260e510e6d813c286b19eaadf409d40fce"
+checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e"
 dependencies = [
- "cfg-if 1.0.0",
+ "cfg-if",
  "wasm-bindgen-macro",
 ]
 
 [[package]]
 name = "wasm-bindgen-backend"
-version = "0.2.88"
+version = "0.2.89"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e397f4664c0e4e428e8313a469aaa58310d302159845980fd23b0f22a847f217"
+checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826"
 dependencies = [
  "bumpalo",
  "log",
@@ -7664,11 +7704,11 @@ dependencies = [
 
 [[package]]
 name = "wasm-bindgen-futures"
-version = "0.4.38"
+version = "0.4.39"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9afec9963e3d0994cac82455b2b3502b81a7f40f9a0d32181f7528d9f4b43e02"
+checksum = "ac36a15a220124ac510204aec1c3e5db8a22ab06fd6706d881dc6149f8ed9a12"
 dependencies = [
- "cfg-if 1.0.0",
+ "cfg-if",
  "js-sys",
  "wasm-bindgen",
  "web-sys",
@@ -7676,9 +7716,9 @@ dependencies = [
 
 [[package]]
 name = "wasm-bindgen-macro"
-version = "0.2.88"
+version = "0.2.89"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5961017b3b08ad5f3fe39f1e79877f8ee7c23c5e5fd5eb80de95abc41f1f16b2"
+checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2"
 dependencies = [
  "quote",
  "wasm-bindgen-macro-support",
@@ -7686,9 +7726,9 @@ dependencies = [
 
 [[package]]
 name = "wasm-bindgen-macro-support"
-version = "0.2.88"
+version = "0.2.89"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c5353b8dab669f5e10f5bd76df26a9360c748f054f862ff5f3f8aae0c7fb3907"
+checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -7699,9 +7739,9 @@ dependencies = [
 
 [[package]]
 name = "wasm-bindgen-shared"
-version = "0.2.88"
+version = "0.2.89"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0d046c5d029ba91a1ed14da14dca44b68bf2f124cfbaf741c54151fdb3e0750b"
+checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f"
 
 [[package]]
 name = "wasm-encoder"
@@ -7714,9 +7754,9 @@ dependencies = [
 
 [[package]]
 name = "wasm-encoder"
-version = "0.37.0"
+version = "0.38.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7d135e8940b69dbee0f5b0a0be9c1cd6fa8b71d774904c13a3fcfc5dc265e43d"
+checksum = "0ad2b51884de9c7f4fe2fd1043fccb8dcad4b1e29558146ee57a144d15779f3f"
 dependencies = [
  "leb128",
 ]
@@ -7748,23 +7788,22 @@ dependencies = [
 
 [[package]]
 name = "wasmparser"
-version = "0.117.0"
+version = "0.118.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9b206de0c992af9f0b51ef2fb9455623e0a19eb68f172cd8ba9cd0e46637f5ab"
+checksum = "95ee9723b928e735d53000dec9eae7b07a60e490c85ab54abb66659fc61bfcd9"
 dependencies = [
- "hashbrown 0.14.2",
  "indexmap 2.1.0",
  "semver 1.0.20",
 ]
 
 [[package]]
 name = "wasmprinter"
-version = "0.2.73"
+version = "0.2.75"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a4fdb34710b461c868c3f79a10a48b404f23b46fd471ab02bcaa60fd96c5c4b"
+checksum = "3d027eb8294904fc715ac0870cebe6b0271e96b90605ee21511e7565c4ce568c"
 dependencies = [
  "anyhow",
- "wasmparser 0.117.0",
+ "wasmparser 0.118.1",
 ]
 
 [[package]]
@@ -7777,7 +7816,7 @@ dependencies = [
  "async-trait",
  "bincode",
  "bumpalo",
- "cfg-if 1.0.0",
+ "cfg-if",
  "encoding_rs",
  "fxprof-processed-profile",
  "indexmap 2.1.0",
@@ -7813,7 +7852,7 @@ version = "13.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "4711e5969236ecfbe70c807804ff9ffb5206c1dbb5c55c5e8200d9f7e8e76adf"
 dependencies = [
- "cfg-if 1.0.0",
+ "cfg-if",
 ]
 
 [[package]]
@@ -7830,7 +7869,7 @@ dependencies = [
  "rustix",
  "serde",
  "serde_derive",
- "sha2 0.10.8",
+ "sha2",
  "toml 0.5.11",
  "windows-sys 0.48.0",
  "zstd",
@@ -7864,7 +7903,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "4e63f53c61ba05eb815f905c1738ad82c95333dd42ef5a8cc2aa3d7dfb2b08d7"
 dependencies = [
  "anyhow",
- "cfg-if 1.0.0",
+ "cfg-if",
  "cranelift-codegen",
  "cranelift-control",
  "cranelift-entity",
@@ -7928,7 +7967,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "a615a2cf64a49c0dc659c7d850c6cd377b975e0abfdcf0888b282d274a82e730"
 dependencies = [
  "cc",
- "cfg-if 1.0.0",
+ "cfg-if",
  "rustix",
  "wasmtime-asm-macros",
  "wasmtime-versioned-export-macros",
@@ -7944,7 +7983,7 @@ dependencies = [
  "addr2line",
  "anyhow",
  "bincode",
- "cfg-if 1.0.0",
+ "cfg-if",
  "cpp_demangle",
  "gimli",
  "ittapi",
@@ -7980,7 +8019,7 @@ version = "13.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "7f323977cddf4a262d1b856366b665c5b4d01793c57b79fb42505b9fd9e61e5b"
 dependencies = [
- "cfg-if 1.0.0",
+ "cfg-if",
  "libc",
  "windows-sys 0.48.0",
 ]
@@ -7993,7 +8032,7 @@ checksum = "29e26461bba043f73cb4183f4ce0d606c0eaac112475867b11e5ea36fe1cac8e"
 dependencies = [
  "anyhow",
  "cc",
- "cfg-if 1.0.0",
+ "cfg-if",
  "encoding_rs",
  "indexmap 2.1.0",
  "libc",
@@ -8119,30 +8158,30 @@ dependencies = [
 
 [[package]]
 name = "wast"
-version = "68.0.0"
+version = "69.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7bf3081ac6bcb3a5b72a401693b3566feb529dc2b7e7b62ea544c8a30d0f4d05"
+checksum = "c1ee37317321afde358e4d7593745942c48d6d17e0e6e943704de9bbee121e7a"
 dependencies = [
  "leb128",
  "memchr",
  "unicode-width",
- "wasm-encoder 0.37.0",
+ "wasm-encoder 0.38.1",
 ]
 
 [[package]]
 name = "wat"
-version = "1.0.80"
+version = "1.0.82"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6fabe07d22a837b3bd5662ba9e980d73de115c040923659a1801934c7ccebe49"
+checksum = "aeb338ee8dee4d4cd05e6426683f21c5087dc7cfc8903e839ccf48d43332da3c"
 dependencies = [
- "wast 68.0.0",
+ "wast 69.0.1",
 ]
 
 [[package]]
 name = "web-sys"
-version = "0.3.65"
+version = "0.3.66"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5db499c5f66323272151db0e666cd34f78617522fb0c1604d31a27c50c206a85"
+checksum = "50c24a44ec86bb68fbecd1b3efed7e85ea5621b39b35ef2766b66cd984f8010f"
 dependencies = [
  "js-sys",
  "wasm-bindgen",
@@ -8177,18 +8216,9 @@ dependencies = [
 
 [[package]]
 name = "webpki-roots"
-version = "0.24.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b291546d5d9d1eab74f069c77749f2cb8504a12caa20f0f2de93ddbf6f411888"
-dependencies = [
- "rustls-webpki",
-]
-
-[[package]]
-name = "webpki-roots"
-version = "0.25.2"
+version = "0.25.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "14247bb57be4f377dfb94c72830b8ce8fc6beac03cf4bf7b9732eadd414123fc"
+checksum = "1778a42e8b3b90bff8d0f5032bf22250792889a5cdc752aa0020c84abe3aaf10"
 
 [[package]]
 name = "whoami"
@@ -8328,6 +8358,15 @@ dependencies = [
 ]
 
 [[package]]
+name = "windows-sys"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
+dependencies = [
+ "windows-targets 0.52.0",
+]
+
+[[package]]
 name = "windows-targets"
 version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -8358,6 +8397,21 @@ dependencies = [
 ]
 
 [[package]]
+name = "windows-targets"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd"
+dependencies = [
+ "windows_aarch64_gnullvm 0.52.0",
+ "windows_aarch64_msvc 0.52.0",
+ "windows_i686_gnu 0.52.0",
+ "windows_i686_msvc 0.52.0",
+ "windows_x86_64_gnu 0.52.0",
+ "windows_x86_64_gnullvm 0.52.0",
+ "windows_x86_64_msvc 0.52.0",
+]
+
+[[package]]
 name = "windows_aarch64_gnullvm"
 version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -8370,6 +8424,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
 
 [[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea"
+
+[[package]]
 name = "windows_aarch64_msvc"
 version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -8382,6 +8442,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
 
 [[package]]
+name = "windows_aarch64_msvc"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef"
+
+[[package]]
 name = "windows_i686_gnu"
 version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -8394,6 +8460,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
 
 [[package]]
+name = "windows_i686_gnu"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313"
+
+[[package]]
 name = "windows_i686_msvc"
 version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -8406,6 +8478,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
 
 [[package]]
+name = "windows_i686_msvc"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a"
+
+[[package]]
 name = "windows_x86_64_gnu"
 version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -8418,6 +8496,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
 
 [[package]]
+name = "windows_x86_64_gnu"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd"
+
+[[package]]
 name = "windows_x86_64_gnullvm"
 version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -8430,6 +8514,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
 
 [[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e"
+
+[[package]]
 name = "windows_x86_64_msvc"
 version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -8442,10 +8532,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
 
 [[package]]
+name = "windows_x86_64_msvc"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04"
+
+[[package]]
 name = "winnow"
-version = "0.5.19"
+version = "0.5.25"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "829846f3e3db426d4cee4510841b71a8e58aa2a76b1132579487ae430ccd9c7b"
+checksum = "b7e87b8dfbe3baffbe687eef2e164e32286eff31a5ee16463ce03d991643ec94"
 dependencies = [
  "memchr",
 ]
@@ -8456,18 +8552,42 @@ version = "0.50.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1"
 dependencies = [
- "cfg-if 1.0.0",
+ "cfg-if",
  "windows-sys 0.48.0",
 ]
 
 [[package]]
 name = "winx"
-version = "0.36.2"
+version = "0.36.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "357bb8e2932df531f83b052264b050b81ba0df90ee5a59b2d1d3949f344f81e5"
+checksum = "f9643b83820c0cd246ecabe5fa454dd04ba4fa67996369466d0747472d337346"
 dependencies = [
  "bitflags 2.4.1",
- "windows-sys 0.48.0",
+ "windows-sys 0.52.0",
+]
+
+[[package]]
+name = "wiremock"
+version = "0.6.0-rc.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "94819bffc61c498ea8219c8ba084523abd5465ccb0c11be4d9ebc9fa1fbc3617"
+dependencies = [
+ "assert-json-diff",
+ "async-trait",
+ "base64 0.21.5",
+ "deadpool",
+ "futures",
+ "http 1.0.0",
+ "http-body-util",
+ "hyper 1.1.0",
+ "hyper-util",
+ "log",
+ "once_cell",
+ "regex",
+ "serde",
+ "serde_json",
+ "tokio",
+ "url",
 ]
 
 [[package]]
@@ -8558,18 +8678,18 @@ dependencies = [
 
 [[package]]
 name = "zerocopy"
-version = "0.7.26"
+version = "0.7.31"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e97e415490559a91254a2979b4829267a57d2fcd741a98eee8b722fb57289aa0"
+checksum = "1c4061bedbb353041c12f413700357bec76df2c7e2ca8e4df8bac24c6bf68e3d"
 dependencies = [
  "zerocopy-derive",
 ]
 
 [[package]]
 name = "zerocopy-derive"
-version = "0.7.26"
+version = "0.7.31"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dd7e48ccf166952882ca8bd778a43502c64f33bf94c12ebe2a7f08e5a0f6689f"
+checksum = "b3c129550b3e6de3fd0ba67ba5c81818f9805e58b8d7fee80a3a59d2c9fc601a"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -8583,18 +8703,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d"
 
 [[package]]
-name = "zip"
-version = "0.6.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261"
-dependencies = [
- "byteorder",
- "crc32fast",
- "crossbeam-utils",
- "flate2",
-]
-
-[[package]]
 name = "zstd"
 version = "0.11.2+zstd.1.5.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
diff --git a/pkgs/development/tools/rust/cargo-shuttle/default.nix b/pkgs/development/tools/rust/cargo-shuttle/default.nix
index 9d0a0fc0ca08..befba6ffac56 100644
--- a/pkgs/development/tools/rust/cargo-shuttle/default.nix
+++ b/pkgs/development/tools/rust/cargo-shuttle/default.nix
@@ -10,18 +10,19 @@
 
 rustPlatform.buildRustPackage rec {
   pname = "cargo-shuttle";
-  version = "0.34.1";
+  version = "0.39.0";
 
   src = fetchFromGitHub {
     owner = "shuttle-hq";
     repo = "shuttle";
     rev = "v${version}";
-    hash = "sha256-SAad1GS092a9LBzlnf1UMLGwKsNBOgWP0gjoW2M0SH4=";
+    hash = "sha256-U6C6pUl6Re3fYt5KlBItpErboYXctsotunsUpWmZxiY=";
   };
 
   cargoLock = {
     lockFile = ./Cargo.lock;
     outputHashes = {
+      "async-posthog-0.2.3" = "sha256-V0f9+UKZkqh80p7UjINEbAW9y8cKBmJTRjAJZV3no1M=";
       "hyper-reverse-proxy-0.5.2-dev" = "sha256-R1ZXGgWvwHWRHmKX823QLqM6ZJW+tzWUXigKkAyI5OE=";
       "tokiotest-httpserver-0.2.1" = "sha256-IPUaglIDwCUoczCCnX+R1IBqtc0s8b8toKEL8zN3/i8=";
     };
diff --git a/pkgs/development/tools/rust/cargo-tauri/default.nix b/pkgs/development/tools/rust/cargo-tauri/default.nix
index d8c43627b2dc..870285879d76 100644
--- a/pkgs/development/tools/rust/cargo-tauri/default.nix
+++ b/pkgs/development/tools/rust/cargo-tauri/default.nix
@@ -17,20 +17,20 @@ let
 in
 rustPlatform.buildRustPackage rec {
   pname = "tauri";
-  version = "1.6.0";
+  version = "1.6.1";
 
   src = fetchFromGitHub {
     owner = "tauri-apps";
     repo = pname;
     rev = "tauri-v${version}";
-    hash = "sha256-0LKkGpbDT6bRzoggDmTmSB8UaT11OME7OXsr+M67WVU=";
+    hash = "sha256-P0/c9GTQRdErwE3/uuZpMqiTl/nFGSaHoWGRtBDjc8M=";
   };
 
   # Manually specify the sourceRoot since this crate depends on other crates in the workspace. Relevant info at
   # https://discourse.nixos.org/t/difficulty-using-buildrustpackage-with-a-src-containing-multiple-cargo-workspaces/10202
   sourceRoot = "${src.name}/tooling/cli";
 
-  cargoHash = "sha256-0GJrQQsHcl/7co2hSYHgBWX3NqJwbbnBAj3zdAjA4r8=";
+  cargoHash = "sha256-+uRjitfaSbjsO1yO5NL3gw+qjx4neiht3BDvWltogX0=";
 
   buildInputs = [ openssl ] ++ lib.optionals stdenv.isLinux [ glibc libsoup cairo gtk3 webkitgtk ]
     ++ lib.optionals stdenv.isDarwin [ CoreServices Security SystemConfiguration ];
diff --git a/pkgs/development/tools/rye/Cargo.lock b/pkgs/development/tools/rye/Cargo.lock
index 85583e506891..0b4ed0aab033 100644
--- a/pkgs/development/tools/rye/Cargo.lock
+++ b/pkgs/development/tools/rye/Cargo.lock
@@ -403,25 +403,6 @@ dependencies = [
 ]
 
 [[package]]
-name = "crossbeam-deque"
-version = "0.8.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d"
-dependencies = [
- "crossbeam-epoch",
- "crossbeam-utils",
-]
-
-[[package]]
-name = "crossbeam-epoch"
-version = "0.9.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
-dependencies = [
- "crossbeam-utils",
-]
-
-[[package]]
 name = "crossbeam-utils"
 version = "0.8.19"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -811,6 +792,16 @@ dependencies = [
 ]
 
 [[package]]
+name = "fslock"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "04412b8935272e3a9bae6f48c7bfff74c2911f60525404edfdd28e49884c3bfb"
+dependencies = [
+ "libc",
+ "winapi",
+]
+
+[[package]]
 name = "generic-array"
 version = "0.14.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1059,6 +1050,32 @@ dependencies = [
 ]
 
 [[package]]
+name = "insta"
+version = "1.35.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7c985c1bef99cf13c58fade470483d81a2bfe846ebde60ed28cc2dddec2df9e2"
+dependencies = [
+ "console",
+ "lazy_static",
+ "linked-hash-map",
+ "regex",
+ "serde",
+ "similar",
+ "yaml-rust",
+]
+
+[[package]]
+name = "insta-cmd"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1980f17994b79f75670aa90cfc8d35edc4aa248f16aa48b5e27835b080e452a2"
+dependencies = [
+ "insta",
+ "serde",
+ "serde_json",
+]
+
+[[package]]
 name = "instant"
 version = "0.1.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1153,6 +1170,12 @@ dependencies = [
 ]
 
 [[package]]
+name = "linked-hash-map"
+version = "0.5.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f"
+
+[[package]]
 name = "linux-raw-sys"
 version = "0.4.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1615,26 +1638,6 @@ dependencies = [
 ]
 
 [[package]]
-name = "rayon"
-version = "1.8.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fa7237101a77a10773db45d62004a272517633fbcc3df19d96455ede1122e051"
-dependencies = [
- "either",
- "rayon-core",
-]
-
-[[package]]
-name = "rayon-core"
-version = "1.12.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2"
-dependencies = [
- "crossbeam-deque",
- "crossbeam-utils",
-]
-
-[[package]]
 name = "redox_syscall"
 version = "0.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1792,7 +1795,7 @@ dependencies = [
 
 [[package]]
 name = "rye"
-version = "0.24.0"
+version = "0.27.0"
 dependencies = [
  "age",
  "anyhow",
@@ -1806,11 +1809,14 @@ dependencies = [
  "decompress",
  "dialoguer",
  "flate2",
+ "fslock",
  "git-testament",
  "globset",
  "hex",
  "home",
  "indicatif",
+ "insta",
+ "insta-cmd",
  "junction",
  "license",
  "memchr",
@@ -1837,7 +1843,6 @@ dependencies = [
  "toml_edit",
  "url",
  "walkdir",
- "whattheshell",
  "which",
  "winapi",
  "winreg",
@@ -2006,6 +2011,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
 
 [[package]]
+name = "similar"
+version = "2.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32fea41aca09ee824cc9724996433064c89f7777e60762749a4170a14abbfa21"
+
+[[package]]
 name = "slug"
 version = "0.1.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2101,7 +2112,6 @@ dependencies = [
  "libc",
  "ntapi",
  "once_cell",
- "rayon",
  "winapi",
 ]
 
@@ -2515,16 +2525,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1"
 
 [[package]]
-name = "whattheshell"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7c94d2698698cb1322e20292460fd158373af5fb2802afb6bea9ee17628efddb"
-dependencies = [
- "sysinfo",
- "thiserror",
-]
-
-[[package]]
 name = "which"
 version = "6.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2742,6 +2742,15 @@ dependencies = [
 ]
 
 [[package]]
+name = "yaml-rust"
+version = "0.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85"
+dependencies = [
+ "linked-hash-map",
+]
+
+[[package]]
 name = "zerocopy"
 version = "0.7.32"
 source = "registry+https://github.com/rust-lang/crates.io-index"
diff --git a/pkgs/development/tools/rye/default.nix b/pkgs/development/tools/rye/default.nix
index 3c625b1edb3e..fb7db7343a0b 100644
--- a/pkgs/development/tools/rye/default.nix
+++ b/pkgs/development/tools/rye/default.nix
@@ -12,13 +12,13 @@
 
 rustPlatform.buildRustPackage rec {
   pname = "rye";
-  version = "0.24.0";
+  version = "0.27.0";
 
   src = fetchFromGitHub {
     owner = "mitsuhiko";
     repo = "rye";
     rev = "refs/tags/${version}";
-    hash = "sha256-OiChd0qwgs3Wi4Xky27/99vBwaKNsq+4E+gpu5zwFqs=";
+    hash = "sha256-tqwjhA81UYCtZjz6X5tIZ91pDVPe4UU+sTKUIzmOHlM=";
   };
 
   cargoLock = {
@@ -53,6 +53,23 @@ rustPlatform.buildRustPackage rec {
 
   checkFlags = [
     "--skip=utils::test_is_inside_git_work_tree"
+
+    # The following require internet access to fetch a python binary
+    "--skip=test_add_and_sync_no_auto_sync"
+    "--skip=test_add_autosync"
+    "--skip=test_add_flask"
+    "--skip=test_add_from_find_links"
+    "--skip=test_basic_tool_behavior"
+    "--skip=test_config_empty"
+    "--skip=test_config_get_set_multiple"
+    "--skip=test_config_incompatible_format_and_show_path"
+    "--skip=test_config_show_path"
+    "--skip=test_empty_sync"
+    "--skip=test_fetch"
+    "--skip=test_init_default"
+    "--skip=test_init_lib"
+    "--skip=test_init_script"
+    "--skip=test_lint_and_format"
   ];
 
   meta = with lib; {
diff --git a/pkgs/development/tools/sentry-cli/default.nix b/pkgs/development/tools/sentry-cli/default.nix
index c962ea5b30de..be37733dfda3 100644
--- a/pkgs/development/tools/sentry-cli/default.nix
+++ b/pkgs/development/tools/sentry-cli/default.nix
@@ -1,6 +1,7 @@
 { rustPlatform
 , fetchFromGitHub
 , lib
+, installShellFiles
 , openssl
 , pkg-config
 , stdenv
@@ -24,10 +25,17 @@ rustPlatform.buildRustPackage rec {
   OPENSSL_NO_VENDOR = 1;
 
   buildInputs = [ openssl ] ++ lib.optionals stdenv.isDarwin [ CoreServices Security SystemConfiguration ];
-  nativeBuildInputs = [ pkg-config ];
+  nativeBuildInputs = [ installShellFiles pkg-config ];
 
   cargoHash = "sha256-MChhtWbwi5/1GMXxlKov8LrO+kp7D6u4u1lmEjZvyP8=";
 
+  postInstall = ''
+    installShellCompletion --cmd sentry-cli \
+        --bash <($out/bin/sentry-cli completions bash) \
+        --fish <($out/bin/sentry-cli completions fish) \
+        --zsh <($out/bin/sentry-cli completions zsh)
+  '';
+
   meta = with lib; {
     homepage = "https://docs.sentry.io/cli/";
     license = licenses.bsd3;
diff --git a/pkgs/development/tools/twilio-cli/default.nix b/pkgs/development/tools/twilio-cli/default.nix
index f862b036ac2b..032796e760ca 100644
--- a/pkgs/development/tools/twilio-cli/default.nix
+++ b/pkgs/development/tools/twilio-cli/default.nix
@@ -2,11 +2,11 @@
 
 stdenvNoCC.mkDerivation (finalAttrs: {
   pname = "twilio-cli";
-  version = "5.18.0";
+  version = "5.19.0";
 
   src = fetchzip {
     url = "https://twilio-cli-prod.s3.amazonaws.com/twilio-v${finalAttrs.version}/twilio-v${finalAttrs.version}.tar.gz";
-    hash = "sha256-PdfcNRRc2LmYpS5p8y5rfP8vW9z8u72kK7RMu18tsVs=";
+    hash = "sha256-BU4ozZbBNtHdcyaxyvvZ966/FGydqbSnGxSSuky9LtM=";
   };
 
   buildInputs = [ nodejs-slim ];
diff --git a/pkgs/games/shattered-pixel-dungeon/summoning-pixel-dungeon.nix b/pkgs/games/shattered-pixel-dungeon/summoning-pixel-dungeon.nix
index 488110684c09..5e7ed1b817e0 100644
--- a/pkgs/games/shattered-pixel-dungeon/summoning-pixel-dungeon.nix
+++ b/pkgs/games/shattered-pixel-dungeon/summoning-pixel-dungeon.nix
@@ -18,7 +18,7 @@ callPackage ./generic.nix rec {
 
   patches = [(substitute {
     src = ./disable-git-version.patch;
-    replacements = [ "--subst-var-by" "version" version ];
+    substitutions = [ "--subst-var-by" "version" version ];
   })];
 
   depsHash = "sha256-0P/BcjNnbDN25DguRcCyzPuUG7bouxEx1ySodIbSwvg=";
diff --git a/pkgs/games/unnethack/default.nix b/pkgs/games/unnethack/default.nix
index af402a7de935..f328b8c01eed 100644
--- a/pkgs/games/unnethack/default.nix
+++ b/pkgs/games/unnethack/default.nix
@@ -33,6 +33,11 @@ stdenv.mkDerivation rec {
     })
   ];
 
+  # Fails at startup due to off-by-one:
+  #   https://github.com/NixOS/nixpkgs/issues/292113#issuecomment-1969989058
+  # TODO: drop it once 6.x branch releases.
+  hardeningDisable = [ "fortify3" ];
+
   # Fails the build occasionally due to missing buid depends:
   #   ./../sys/unix/unixmain.c:9:10: fatal error: date.h: No such file or directory
   # TODO: remove once upstream issue is fixed:
diff --git a/pkgs/kde/default.nix b/pkgs/kde/default.nix
new file mode 100644
index 000000000000..02c8650e6ec6
--- /dev/null
+++ b/pkgs/kde/default.nix
@@ -0,0 +1,84 @@
+{
+  lib,
+  generateSplicesForMkScope,
+  makeScopeWithSplicing',
+  fetchurl,
+  fetchFromGitLab,
+  libsForQt5,
+  qt6Packages,
+  cmark,
+  gpgme,
+  taglib,
+  wayland-protocols,
+  wayland,
+  zxing-cpp,
+}: let
+  allPackages = self: let
+    frameworks = import ./frameworks {inherit (self) callPackage;};
+    gear = import ./gear {inherit (self) callPackage;};
+    plasma = import ./plasma {inherit (self) callPackage;};
+
+    sets = ["gear" "frameworks" "plasma"];
+
+    loadUrls = set: lib.importJSON (./generated/sources + "/${set}.json");
+    allUrls = lib.attrsets.mergeAttrsList (map loadUrls sets);
+
+    sources = lib.mapAttrs (_: v:
+      (fetchurl {
+        inherit (v) url hash;
+      })
+      // {inherit (v) version;})
+    allUrls;
+  in (
+    qt6Packages
+    // frameworks
+    // gear
+    // plasma
+    // {
+      inherit sources;
+
+      mkKdeDerivation = self.callPackage (import ./lib/mk-kde-derivation.nix self) {};
+
+      # THIRD PARTY
+      inherit
+        cmark
+        gpgme
+        taglib
+        wayland
+        wayland-protocols
+        zxing-cpp
+        ;
+
+      # Alias to match metadata
+      kquickimageeditor = self.kquickimageedit;
+
+      # Alias because it's just data
+      plasma-wayland-protocols = libsForQt5.plasma-wayland-protocols;
+
+      selenium-webdriver-at-spi = null; # Used for integration tests that we don't run, stub
+      # Not ported to Qt6 yet
+      kdevelop-pg-qt = null;
+      okteta = null;
+      libmediawiki = null;
+
+      alpaka = self.callPackage ./misc/alpaka {};
+      kdiagram = self.callPackage ./misc/kdiagram {};
+      kdsoap-ws-discovery-client = self.callPackage ./misc/kdsoap-ws-discovery-client {};
+      kirigami-addons = self.callPackage ./misc/kirigami-addons {};
+      kio-fuse = self.callPackage ./misc/kio-fuse {};
+      ktextaddons = self.callPackage ./misc/ktextaddons {};
+      kunifiedpush = self.callPackage ./misc/kunifiedpush {};
+      kweathercore = self.callPackage ./misc/kweathercore {};
+      mpvqt = self.callPackage ./misc/mpvqt {};
+      oxygen-icons = self.callPackage ./misc/oxygen-icons {};
+      phonon = self.callPackage ./misc/phonon {};
+      phonon-vlc = self.callPackage ./misc/phonon-vlc {};
+      polkit-qt-1 = self.callPackage ./misc/polkit-qt-1 {};
+      pulseaudio-qt = self.callPackage ./misc/pulseaudio-qt {};
+    }
+  );
+in
+  makeScopeWithSplicing' {
+    otherSplices = generateSplicesForMkScope "kdePackages";
+    f = allPackages;
+  }
diff --git a/pkgs/kde/frameworks/attica/default.nix b/pkgs/kde/frameworks/attica/default.nix
new file mode 100644
index 000000000000..05b5c1e59be9
--- /dev/null
+++ b/pkgs/kde/frameworks/attica/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "attica";
+}
diff --git a/pkgs/kde/frameworks/baloo/default.nix b/pkgs/kde/frameworks/baloo/default.nix
new file mode 100644
index 000000000000..517e5285a4e0
--- /dev/null
+++ b/pkgs/kde/frameworks/baloo/default.nix
@@ -0,0 +1,10 @@
+{
+  mkKdeDerivation,
+  qtdeclarative,
+  lmdb,
+}:
+mkKdeDerivation {
+  pname = "baloo";
+
+  extraBuildInputs = [qtdeclarative lmdb];
+}
diff --git a/pkgs/kde/frameworks/bluez-qt/default.nix b/pkgs/kde/frameworks/bluez-qt/default.nix
new file mode 100644
index 000000000000..3bccb4309af7
--- /dev/null
+++ b/pkgs/kde/frameworks/bluez-qt/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qtdeclarative,
+}:
+mkKdeDerivation {
+  pname = "bluez-qt";
+
+  extraBuildInputs = [qtdeclarative];
+}
diff --git a/pkgs/kde/frameworks/breeze-icons/default.nix b/pkgs/kde/frameworks/breeze-icons/default.nix
new file mode 100644
index 000000000000..103903c04cb4
--- /dev/null
+++ b/pkgs/kde/frameworks/breeze-icons/default.nix
@@ -0,0 +1,16 @@
+{
+  mkKdeDerivation,
+  python3,
+  libxml2,
+}:
+mkKdeDerivation {
+  pname = "breeze-icons";
+
+  extraNativeBuildInputs = [
+    (python3.withPackages (ps: [ps.lxml]))
+    libxml2
+  ];
+
+  # lots of icons, takes forever, does absolutely nothing
+  dontStrip = true;
+}
diff --git a/pkgs/kde/frameworks/default.nix b/pkgs/kde/frameworks/default.nix
new file mode 100644
index 000000000000..302be8ad3eba
--- /dev/null
+++ b/pkgs/kde/frameworks/default.nix
@@ -0,0 +1,74 @@
+{callPackage}: {
+  attica = callPackage ./attica {};
+  baloo = callPackage ./baloo {};
+  bluez-qt = callPackage ./bluez-qt {};
+  breeze-icons = callPackage ./breeze-icons {};
+  extra-cmake-modules = callPackage ./extra-cmake-modules {};
+  frameworkintegration = callPackage ./frameworkintegration {};
+  kapidox = callPackage ./kapidox {};
+  karchive = callPackage ./karchive {};
+  kauth = callPackage ./kauth {};
+  kbookmarks = callPackage ./kbookmarks {};
+  kcalendarcore = callPackage ./kcalendarcore {};
+  kcmutils = callPackage ./kcmutils {};
+  kcodecs = callPackage ./kcodecs {};
+  kcolorscheme = callPackage ./kcolorscheme {};
+  kcompletion = callPackage ./kcompletion {};
+  kconfig = callPackage ./kconfig {};
+  kconfigwidgets = callPackage ./kconfigwidgets {};
+  kcontacts = callPackage ./kcontacts {};
+  kcoreaddons = callPackage ./kcoreaddons {};
+  kcrash = callPackage ./kcrash {};
+  kdav = callPackage ./kdav {};
+  kdbusaddons = callPackage ./kdbusaddons {};
+  kdeclarative = callPackage ./kdeclarative {};
+  kded = callPackage ./kded {};
+  kdesu = callPackage ./kdesu {};
+  kdnssd = callPackage ./kdnssd {};
+  kdoctools = callPackage ./kdoctools {};
+  kfilemetadata = callPackage ./kfilemetadata {};
+  kglobalaccel = callPackage ./kglobalaccel {};
+  kguiaddons = callPackage ./kguiaddons {};
+  kholidays = callPackage ./kholidays {};
+  ki18n = callPackage ./ki18n {};
+  kiconthemes = callPackage ./kiconthemes {};
+  kidletime = callPackage ./kidletime {};
+  kimageformats = callPackage ./kimageformats {};
+  kio = callPackage ./kio {};
+  kirigami = callPackage ./kirigami {};
+  kitemmodels = callPackage ./kitemmodels {};
+  kitemviews = callPackage ./kitemviews {};
+  kjobwidgets = callPackage ./kjobwidgets {};
+  knewstuff = callPackage ./knewstuff {};
+  knotifications = callPackage ./knotifications {};
+  knotifyconfig = callPackage ./knotifyconfig {};
+  kpackage = callPackage ./kpackage {};
+  kparts = callPackage ./kparts {};
+  kpeople = callPackage ./kpeople {};
+  kplotting = callPackage ./kplotting {};
+  kpty = callPackage ./kpty {};
+  kquickcharts = callPackage ./kquickcharts {};
+  krunner = callPackage ./krunner {};
+  kservice = callPackage ./kservice {};
+  kstatusnotifieritem = callPackage ./kstatusnotifieritem {};
+  ksvg = callPackage ./ksvg {};
+  ktexteditor = callPackage ./ktexteditor {};
+  ktexttemplate = callPackage ./ktexttemplate {};
+  ktextwidgets = callPackage ./ktextwidgets {};
+  kunitconversion = callPackage ./kunitconversion {};
+  kuserfeedback = callPackage ./kuserfeedback {};
+  kwallet = callPackage ./kwallet {};
+  kwidgetsaddons = callPackage ./kwidgetsaddons {};
+  kwindowsystem = callPackage ./kwindowsystem {};
+  kxmlgui = callPackage ./kxmlgui {};
+  modemmanager-qt = callPackage ./modemmanager-qt {};
+  networkmanager-qt = callPackage ./networkmanager-qt {};
+  prison = callPackage ./prison {};
+  purpose = callPackage ./purpose {};
+  qqc2-desktop-style = callPackage ./qqc2-desktop-style {};
+  solid = callPackage ./solid {};
+  sonnet = callPackage ./sonnet {};
+  syndication = callPackage ./syndication {};
+  syntax-highlighting = callPackage ./syntax-highlighting {};
+  threadweaver = callPackage ./threadweaver {};
+}
diff --git a/pkgs/kde/frameworks/extra-cmake-modules/default.nix b/pkgs/kde/frameworks/extra-cmake-modules/default.nix
new file mode 100644
index 000000000000..0a06cf4a8772
--- /dev/null
+++ b/pkgs/kde/frameworks/extra-cmake-modules/default.nix
@@ -0,0 +1,8 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "extra-cmake-modules";
+
+  outputs = ["out"];
+
+  setupHook = ./ecm-hook.sh;
+}
diff --git a/pkgs/kde/frameworks/extra-cmake-modules/ecm-hook.sh b/pkgs/kde/frameworks/extra-cmake-modules/ecm-hook.sh
new file mode 100644
index 000000000000..b6c50059868f
--- /dev/null
+++ b/pkgs/kde/frameworks/extra-cmake-modules/ecm-hook.sh
@@ -0,0 +1,128 @@
+# shellcheck shell=bash
+# Variables we use here are set by the stdenv, no use complaining about them
+# shellcheck disable=SC2164
+
+ecmEnvHook() {
+    addToSearchPath XDG_DATA_DIRS "$1/share"
+    addToSearchPath XDG_CONFIG_DIRS "$1/etc/xdg"
+}
+addEnvHooks "$targetOffset" ecmEnvHook
+
+ecmPostHook() {
+    # Because we need to use absolute paths here, we must set *all* the paths.
+    # Keep this in sync with https://github.com/KDE/extra-cmake-modules/blob/master/kde-modules/KDEInstallDirs6.cmake
+    if [ "$(uname)" = "Darwin" ]; then
+        cmakeFlags+=" -DKDE_INSTALL_BUNDLEDIR=${!outputBin}/Applications/KDE"
+    fi
+
+    cmakeFlags+=" -DKDE_INSTALL_EXECROOTDIR=${!outputBin}"
+    cmakeFlags+=" -DKDE_INSTALL_BINDIR=${!outputBin}/bin"
+    cmakeFlags+=" -DKDE_INSTALL_SBINDIR=${!outputBin}/sbin"
+    cmakeFlags+=" -DKDE_INSTALL_LIBDIR=${!outputLib}/lib"
+    cmakeFlags+=" -DKDE_INSTALL_LIBEXECDIR=${!outputLib}/libexec"
+    cmakeFlags+=" -DKDE_INSTALL_CMAKEPACKAGEDIR=${!outputDev}/lib/cmake"
+
+    if [ -n "${qtPluginPrefix-}" ]; then
+        cmakeFlags+=" -DKDE_INSTALL_QTPLUGINDIR=${!outputBin}/$qtPluginPrefix"
+        cmakeFlags+=" -DKDE_INSTALL_PLUGINDIR=${!outputBin}/$qtPluginPrefix"
+    fi
+
+    if [ -n "${qtQmlPrefix-}" ]; then
+        cmakeFlags+=" -DKDE_INSTALL_QMLDIR=${!outputBin}/$qtQmlPrefix"
+    fi
+
+    cmakeFlags+=" -DKDE_INSTALL_INCLUDEDIR=${!outputInclude}/include"
+    cmakeFlags+=" -DKDE_INSTALL_LOCALSTATEDIR=/var"
+    cmakeFlags+=" -DKDE_INSTALL_SHAREDSTATEDIR=/com"  # ???
+    cmakeFlags+=" -DKDE_INSTALL_DATAROOTDIR=${!outputBin}/share"
+    cmakeFlags+=" -DKDE_INSTALL_DATADIR=${!outputBin}/share"
+    cmakeFlags+=" -DKDE_INSTALL_DOCBUNDLEDIR=${!outputBin}/share/doc/HTML"
+    cmakeFlags+=" -DKDE_INSTALL_KCFGDIR=${!outputBin}/share/config.kcfg"
+    cmakeFlags+=" -DKDE_INSTALL_KCONFUPDATEDIR=${!outputBin}/share/kconf_update"
+    cmakeFlags+=" -DKDE_INSTALL_KAPPTEMPLATESDIR=${!outputDev}/share/kdevappwizard/templates"
+    cmakeFlags+=" -DKDE_INSTALL_KFILETEMPLATESDIR=${!outputDev}/share/kdevfiletemplates/templates"
+    cmakeFlags+=" -DKDE_INSTALL_KXMLGUIDIR=${!outputBin}/share/kxmlgui6"
+    cmakeFlags+=" -DKDE_INSTALL_KNOTIFYRCDIR=${!outputBin}/share/knotifications6"
+    cmakeFlags+=" -DKDE_INSTALL_ICONDIR=${!outputBin}/share/icons"
+    cmakeFlags+=" -DKDE_INSTALL_LOCALEDIR=${!outputLib}/share/locale"
+    cmakeFlags+=" -DKDE_INSTALL_SOUNDDIR=${!outputBin}/share/sounds"
+    cmakeFlags+=" -DKDE_INSTALL_TEMPLATEDIR=${!outputBin}/share/templates"
+    cmakeFlags+=" -DKDE_INSTALL_WALLPAPERDIR=${!outputBin}/share/wallpapers"
+    cmakeFlags+=" -DKDE_INSTALL_APPDIR=${!outputBin}/share/applications"
+    cmakeFlags+=" -DKDE_INSTALL_DESKTOPDIR=${!outputBin}/share/desktop-directories"
+    cmakeFlags+=" -DKDE_INSTALL_MIMEDIR=${!outputBin}/share/mime/packages"
+    cmakeFlags+=" -DKDE_INSTALL_METAINFODIR=${!outputBin}/share/appdata"
+    cmakeFlags+=" -DKDE_INSTALL_QTQCHDIR=${!outputLib}/share/doc/qch"
+    cmakeFlags+=" -DKDE_INSTALL_QCHDIR=${!outputLib}/share/doc/qch"
+    cmakeFlags+=" -DKDE_INSTALL_MANDIR=${!outputBin}/share/man"
+    cmakeFlags+=" -DKDE_INSTALL_INFODIR=${!outputBin}/share/info"
+    cmakeFlags+=" -DKDE_INSTALL_DBUSDIR=${!outputBin}/share/dbus-1"
+    cmakeFlags+=" -DKDE_INSTALL_DBUSINTERFACEDIR=${!outputBin}/share/dbus-1/interfaces"
+    cmakeFlags+=" -DKDE_INSTALL_DBUSSERVICEDIR=${!outputBin}/share/dbus-1/services"
+    cmakeFlags+=" -DKDE_INSTALL_DBUSSYSTEMSERVICEDIR=${!outputBin}/share/dbus-1/system-services"
+    cmakeFlags+=" -DKDE_INSTALL_SYSCONFDIR=${!outputBin}/etc"
+    cmakeFlags+=" -DKDE_INSTALL_CONFDIR=${!outputBin}/etc/xdg"
+    cmakeFlags+=" -DKDE_INSTALL_AUTOSTARTDIR=${!outputBin}/etc/xdg/autostart"
+    cmakeFlags+=" -DKDE_INSTALL_LOGGINGCATEGORIESDIR=${!outputLib}/share/qlogging-categories6"
+    cmakeFlags+=" -DKDE_INSTALL_SYSTEMDUNITDIR=${!outputBin}/lib/systemd"
+    cmakeFlags+=" -DKDE_INSTALL_SYSTEMDUSERUNITDIR=${!outputBin}/share/systemd/user"
+}
+postHooks+=(ecmPostHook)
+
+xdgDataSubdirs=( \
+    "config.kcfg" "kconf_update" "knotifications6" "icons" "locale" "sounds" "templates" \
+    "wallpapers" "applications" "desktop-directories" "mime" "appdata" "dbus-1" \
+)
+
+# ecmHostPathsSeen is an associative array of the paths that have already been
+# seen by ecmHostPathHook.
+declare -gA ecmHostPathsSeen
+
+ecmHostPathIsNotSeen() {
+    if [[ -n "${ecmHostPathsSeen["$1"]:-}" ]]; then
+        # The path has been seen before.
+        return 1
+    else
+        # The path has not been seen before.
+        # Now it is seen, so record it.
+        ecmHostPathsSeen["$1"]=1
+        return 0
+    fi
+}
+
+ecmHostPathHook() {
+    ecmHostPathIsNotSeen "$1" || return 0
+
+    local xdgConfigDir="$1/etc/xdg"
+    if [ -d "$xdgConfigDir" ]
+    then
+        qtWrapperArgs+=(--prefix XDG_CONFIG_DIRS : "$xdgConfigDir")
+    fi
+
+    for xdgDataSubdir in "${xdgDataSubdirs[@]}"
+    do
+        if [ -d "$1/share/$xdgDataSubdir" ]
+        then
+            qtWrapperArgs+=(--prefix XDG_DATA_DIRS : "$1/share")
+            break
+        fi
+    done
+
+    local manDir="$1/man"
+    if [ -d "$manDir" ]
+    then
+        qtWrapperArgs+=(--prefix MANPATH : "$manDir")
+    fi
+
+    local infoDir="$1/info"
+    if [ -d "$infoDir" ]
+    then
+        qtWrapperArgs+=(--prefix INFOPATH : "$infoDir")
+    fi
+
+    if [ -d "$1/dbus-1" ]
+    then
+        propagatedUserEnvPkgs+=" $1"
+    fi
+}
+addEnvHooks "$targetOffset" ecmHostPathHook
diff --git a/pkgs/kde/frameworks/frameworkintegration/default.nix b/pkgs/kde/frameworks/frameworkintegration/default.nix
new file mode 100644
index 000000000000..3607c115c301
--- /dev/null
+++ b/pkgs/kde/frameworks/frameworkintegration/default.nix
@@ -0,0 +1,11 @@
+{
+  mkKdeDerivation,
+  pkg-config,
+  packagekit-qt,
+}:
+mkKdeDerivation {
+  pname = "frameworkintegration";
+
+  extraNativeBuildInputs = [pkg-config];
+  extraBuildInputs = [packagekit-qt];
+}
diff --git a/pkgs/kde/frameworks/kapidox/default.nix b/pkgs/kde/frameworks/kapidox/default.nix
new file mode 100644
index 000000000000..2544e7921f87
--- /dev/null
+++ b/pkgs/kde/frameworks/kapidox/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kapidox";
+}
diff --git a/pkgs/kde/frameworks/karchive/default.nix b/pkgs/kde/frameworks/karchive/default.nix
new file mode 100644
index 000000000000..fe124e1187d1
--- /dev/null
+++ b/pkgs/kde/frameworks/karchive/default.nix
@@ -0,0 +1,12 @@
+{
+  mkKdeDerivation,
+  qttools,
+  pkg-config,
+  xz,
+}:
+mkKdeDerivation {
+  pname = "karchive";
+
+  extraNativeBuildInputs = [qttools pkg-config];
+  extraBuildInputs = [xz];
+}
diff --git a/pkgs/kde/frameworks/kauth/default.nix b/pkgs/kde/frameworks/kauth/default.nix
new file mode 100644
index 000000000000..df033770a303
--- /dev/null
+++ b/pkgs/kde/frameworks/kauth/default.nix
@@ -0,0 +1,13 @@
+{
+  mkKdeDerivation,
+  qttools,
+}:
+mkKdeDerivation {
+  pname = "kauth";
+
+  # Late resolve paths so things end up in their own prefix
+  # FIXME(later): discuss with upstream
+  patches = [./fix-paths.patch];
+
+  extraNativeBuildInputs = [qttools];
+}
diff --git a/pkgs/kde/frameworks/kauth/fix-paths.patch b/pkgs/kde/frameworks/kauth/fix-paths.patch
new file mode 100644
index 000000000000..6444a7610c47
--- /dev/null
+++ b/pkgs/kde/frameworks/kauth/fix-paths.patch
@@ -0,0 +1,17 @@
+diff --git a/KF6AuthConfig.cmake.in b/KF6AuthConfig.cmake.in
+index 4ee3f92..65a40d5 100644
+--- a/KF6AuthConfig.cmake.in
++++ b/KF6AuthConfig.cmake.in
+@@ -4,9 +4,9 @@ set(KAUTH_STUB_FILES_DIR "@PACKAGE_KDE_INSTALL_DATADIR_KF@/kauth/")
+ 
+ set(KAUTH_BACKEND_NAME "@KAUTH_BACKEND_NAME@")
+ set(KAUTH_HELPER_BACKEND_NAME "@KAUTH_HELPER_BACKEND_NAME@")
+-set(KAUTH_POLICY_FILES_INSTALL_DIR "@KAUTH_POLICY_FILES_INSTALL_DIR@")
+-set(KAUTH_HELPER_INSTALL_DIR "@KAUTH_HELPER_INSTALL_DIR@")
+-set(KAUTH_HELPER_INSTALL_ABSOLUTE_DIR "@KAUTH_HELPER_INSTALL_ABSOLUTE_DIR@")
++set(KAUTH_POLICY_FILES_INSTALL_DIR "${KDE_INSTALL_DATADIR}/polkit-1/actions")
++set(KAUTH_HELPER_INSTALL_DIR "${KDE_INSTALL_LIBEXECDIR}")
++set(KAUTH_HELPER_INSTALL_ABSOLUTE_DIR "${KDE_INSTALL_LIBEXECDIR}")
+ 
+ include(CMakeFindDependencyMacro)
+ 
diff --git a/pkgs/kde/frameworks/kbookmarks/default.nix b/pkgs/kde/frameworks/kbookmarks/default.nix
new file mode 100644
index 000000000000..ac9255e6f83d
--- /dev/null
+++ b/pkgs/kde/frameworks/kbookmarks/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qttools,
+}:
+mkKdeDerivation {
+  pname = "kbookmarks";
+
+  extraNativeBuildInputs = [qttools];
+}
diff --git a/pkgs/kde/frameworks/kcalendarcore/default.nix b/pkgs/kde/frameworks/kcalendarcore/default.nix
new file mode 100644
index 000000000000..c80117749e11
--- /dev/null
+++ b/pkgs/kde/frameworks/kcalendarcore/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  libical,
+}:
+mkKdeDerivation {
+  pname = "kcalendarcore";
+
+  extraBuildInputs = [libical];
+}
diff --git a/pkgs/kde/frameworks/kcmutils/default.nix b/pkgs/kde/frameworks/kcmutils/default.nix
new file mode 100644
index 000000000000..bb6ecb110ee0
--- /dev/null
+++ b/pkgs/kde/frameworks/kcmutils/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qtdeclarative,
+}:
+mkKdeDerivation {
+  pname = "kcmutils";
+
+  extraPropagatedBuildInputs = [qtdeclarative];
+}
diff --git a/pkgs/kde/frameworks/kcodecs/default.nix b/pkgs/kde/frameworks/kcodecs/default.nix
new file mode 100644
index 000000000000..409666658ddf
--- /dev/null
+++ b/pkgs/kde/frameworks/kcodecs/default.nix
@@ -0,0 +1,11 @@
+{
+  mkKdeDerivation,
+  qttools,
+  gperf,
+}:
+mkKdeDerivation {
+  pname = "kcodecs";
+
+  extraNativeBuildInputs = [qttools];
+  extraBuildInputs = [gperf];
+}
diff --git a/pkgs/kde/frameworks/kcolorscheme/default.nix b/pkgs/kde/frameworks/kcolorscheme/default.nix
new file mode 100644
index 000000000000..05f32ce574f3
--- /dev/null
+++ b/pkgs/kde/frameworks/kcolorscheme/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kcolorscheme";
+}
diff --git a/pkgs/kde/frameworks/kcompletion/default.nix b/pkgs/kde/frameworks/kcompletion/default.nix
new file mode 100644
index 000000000000..c07f274e08ee
--- /dev/null
+++ b/pkgs/kde/frameworks/kcompletion/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qttools,
+}:
+mkKdeDerivation {
+  pname = "kcompletion";
+
+  extraNativeBuildInputs = [qttools];
+}
diff --git a/pkgs/kde/frameworks/kconfig/default.nix b/pkgs/kde/frameworks/kconfig/default.nix
new file mode 100644
index 000000000000..b29a081524c7
--- /dev/null
+++ b/pkgs/kde/frameworks/kconfig/default.nix
@@ -0,0 +1,11 @@
+{
+  mkKdeDerivation,
+  qttools,
+  qtdeclarative,
+}:
+mkKdeDerivation {
+  pname = "kconfig";
+
+  extraNativeBuildInputs = [qttools];
+  extraPropagatedBuildInputs = [qtdeclarative];
+}
diff --git a/pkgs/kde/frameworks/kconfigwidgets/default.nix b/pkgs/kde/frameworks/kconfigwidgets/default.nix
new file mode 100644
index 000000000000..354972d005ae
--- /dev/null
+++ b/pkgs/kde/frameworks/kconfigwidgets/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qttools,
+}:
+mkKdeDerivation {
+  pname = "kconfigwidgets";
+
+  extraBuildInputs = [qttools];
+}
diff --git a/pkgs/kde/frameworks/kcontacts/default.nix b/pkgs/kde/frameworks/kcontacts/default.nix
new file mode 100644
index 000000000000..57e35a90a9ae
--- /dev/null
+++ b/pkgs/kde/frameworks/kcontacts/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kcontacts";
+}
diff --git a/pkgs/kde/frameworks/kcoreaddons/default.nix b/pkgs/kde/frameworks/kcoreaddons/default.nix
new file mode 100644
index 000000000000..12c6ae5d770b
--- /dev/null
+++ b/pkgs/kde/frameworks/kcoreaddons/default.nix
@@ -0,0 +1,12 @@
+{
+  mkKdeDerivation,
+  qttools,
+  shared-mime-info,
+  qtdeclarative,
+}:
+mkKdeDerivation {
+  pname = "kcoreaddons";
+
+  extraNativeBuildInputs = [qttools shared-mime-info];
+  extraBuildInputs = [qtdeclarative];
+}
diff --git a/pkgs/kde/frameworks/kcrash/default.nix b/pkgs/kde/frameworks/kcrash/default.nix
new file mode 100644
index 000000000000..b3ade8fd6763
--- /dev/null
+++ b/pkgs/kde/frameworks/kcrash/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kcrash";
+}
diff --git a/pkgs/kde/frameworks/kdav/default.nix b/pkgs/kde/frameworks/kdav/default.nix
new file mode 100644
index 000000000000..d53562fc9038
--- /dev/null
+++ b/pkgs/kde/frameworks/kdav/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kdav";
+}
diff --git a/pkgs/kde/frameworks/kdbusaddons/default.nix b/pkgs/kde/frameworks/kdbusaddons/default.nix
new file mode 100644
index 000000000000..f7d80a5746f3
--- /dev/null
+++ b/pkgs/kde/frameworks/kdbusaddons/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qttools,
+}:
+mkKdeDerivation {
+  pname = "kdbusaddons";
+
+  extraNativeBuildInputs = [qttools];
+}
diff --git a/pkgs/kde/frameworks/kdeclarative/default.nix b/pkgs/kde/frameworks/kdeclarative/default.nix
new file mode 100644
index 000000000000..8b05ec66b0f4
--- /dev/null
+++ b/pkgs/kde/frameworks/kdeclarative/default.nix
@@ -0,0 +1,11 @@
+{
+  mkKdeDerivation,
+  qtdeclarative,
+  spirv-tools,
+}:
+mkKdeDerivation {
+  pname = "kdeclarative";
+
+  extraNativeBuildInputs = [spirv-tools];
+  extraBuildInputs = [qtdeclarative];
+}
diff --git a/pkgs/kde/frameworks/kded/default.nix b/pkgs/kde/frameworks/kded/default.nix
new file mode 100644
index 000000000000..dc6fa84d5347
--- /dev/null
+++ b/pkgs/kde/frameworks/kded/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kded";
+}
diff --git a/pkgs/kde/frameworks/kdesu/default.nix b/pkgs/kde/frameworks/kdesu/default.nix
new file mode 100644
index 000000000000..ae7ed3a33c38
--- /dev/null
+++ b/pkgs/kde/frameworks/kdesu/default.nix
@@ -0,0 +1,7 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kdesu";
+
+  # Look for NixOS SUID wrapper first
+  patches = [./kdesu-search-for-wrapped-daemon-first.patch];
+}
diff --git a/pkgs/kde/frameworks/kdesu/kdesu-search-for-wrapped-daemon-first.patch b/pkgs/kde/frameworks/kdesu/kdesu-search-for-wrapped-daemon-first.patch
new file mode 100644
index 000000000000..1379707f02fe
--- /dev/null
+++ b/pkgs/kde/frameworks/kdesu/kdesu-search-for-wrapped-daemon-first.patch
@@ -0,0 +1,38 @@
+From 01af4d2a098e5819c09bca37568941dcd4b89d0b Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Jos=C3=A9=20Romildo=20Malaquias?= <malaquias@gmail.com>
+Date: Thu, 16 Jul 2020 13:21:42 -0300
+Subject: [PATCH] Search for the daemon first in /run/wrappers/bin
+
+If looking first in libexec, the eventually wrapped one in
+/run/wrappers/bin can not be found.
+---
+ src/client.cpp | 13 ++++++++-----
+ 1 file changed, 8 insertions(+), 5 deletions(-)
+
+diff --git a/src/client.cpp b/src/client.cpp
+index 44fbacd..6b5abf5 100644
+--- a/src/client.cpp
++++ b/src/client.cpp
+@@ -384,11 +384,14 @@ int KDEsuClient::stopServer()
+ 
+ static QString findDaemon()
+ {
+-    QString daemon = QFile::decodeName(KDE_INSTALL_FULL_LIBEXECDIR_KF "/kdesud");
+-    if (!QFile::exists(daemon)) { // if not in libexec, find it in PATH
+-        daemon = QStandardPaths::findExecutable(QStringLiteral("kdesud"));
+-        if (daemon.isEmpty()) {
+-            qCWarning(KSU_LOG) << "kdesud daemon not found.";
++    QString daemon = QFile::decodeName("/run/wrappers/bin/kdesud");
++    if (!QFile::exists(daemon)) { // if not in wrappers
++        daemon = QFile::decodeName(KDE_INSTALL_FULL_LIBEXECDIR_KF "/kdesud");
++        if (!QFile::exists(daemon)) { // if not in libexec, find it in PATH
++            daemon = QStandardPaths::findExecutable(QStringLiteral("kdesud"));
++            if (daemon.isEmpty()) {
++                qCWarning(KSU_LOG) << "kdesud daemon not found.";
++            }
+         }
+     }
+     return daemon;
+-- 
+2.27.0
+
diff --git a/pkgs/kde/frameworks/kdnssd/default.nix b/pkgs/kde/frameworks/kdnssd/default.nix
new file mode 100644
index 000000000000..3241dcf9c2fb
--- /dev/null
+++ b/pkgs/kde/frameworks/kdnssd/default.nix
@@ -0,0 +1,11 @@
+{
+  mkKdeDerivation,
+  qttools,
+  avahi,
+}:
+mkKdeDerivation {
+  pname = "kdnssd";
+
+  extraNativeBuildInputs = [qttools];
+  extraBuildInputs = [avahi];
+}
diff --git a/pkgs/kde/frameworks/kdoctools/default.nix b/pkgs/kde/frameworks/kdoctools/default.nix
new file mode 100644
index 000000000000..8e8341997a2b
--- /dev/null
+++ b/pkgs/kde/frameworks/kdoctools/default.nix
@@ -0,0 +1,18 @@
+{
+  mkKdeDerivation,
+  docbook_xml_dtd_45,
+  docbook-xsl-nons,
+  perl,
+  perlPackages,
+}:
+mkKdeDerivation {
+  pname = "kdoctools";
+
+  # lots of self-references, the output is pretty small (~5MB), not worth trying to untangle
+  outputs = ["out"];
+
+  # Perl could be used both at build time and at runtime.
+  extraNativeBuildInputs = [perl perlPackages.URI];
+  extraBuildInputs = [docbook_xml_dtd_45 docbook-xsl-nons];
+  extraPropagatedBuildInputs = [perl perlPackages.URI];
+}
diff --git a/pkgs/kde/frameworks/kfilemetadata/cmake-install-paths.patch b/pkgs/kde/frameworks/kfilemetadata/cmake-install-paths.patch
new file mode 100644
index 000000000000..3b3631fb3abe
--- /dev/null
+++ b/pkgs/kde/frameworks/kfilemetadata/cmake-install-paths.patch
@@ -0,0 +1,14 @@
+diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
+index 84cc68c..2e02194 100644
+--- a/src/CMakeLists.txt
++++ b/src/CMakeLists.txt
+@@ -85,7 +85,7 @@ install(TARGETS KF6FileMetaData EXPORT KF6FileMetaDataTargets ${KF_INSTALL_TARGE
+
+ install(EXPORT KF6FileMetaDataTargets
+         NAMESPACE KF6::
+-        DESTINATION ${KDE_INSTALL_LIBDIR}/cmake/KF6FileMetaData
++        DESTINATION ${KDE_INSTALL_FULL_CMAKEPACKAGEDIR}/KF6FileMetaData
+         FILE KF6FileMetaDataTargets.cmake)
+
+ install(FILES
+ 
\ No newline at end of file
diff --git a/pkgs/kde/frameworks/kfilemetadata/default.nix b/pkgs/kde/frameworks/kfilemetadata/default.nix
new file mode 100644
index 000000000000..0e9fd5489e7e
--- /dev/null
+++ b/pkgs/kde/frameworks/kfilemetadata/default.nix
@@ -0,0 +1,21 @@
+{
+  mkKdeDerivation,
+  pkg-config,
+  attr,
+  ebook_tools,
+  exiv2,
+  ffmpeg,
+  kconfig,
+  kdegraphics-mobipocket,
+  libappimage,
+}:
+mkKdeDerivation {
+  pname = "kfilemetadata";
+
+  # Fix installing cmake files into wrong directory
+  # FIXME(later): upstream
+  patches = [./cmake-install-paths.patch];
+
+  extraNativeBuildInputs = [pkg-config];
+  extraBuildInputs = [attr ebook_tools exiv2 ffmpeg kconfig kdegraphics-mobipocket libappimage];
+}
diff --git a/pkgs/kde/frameworks/kglobalaccel/default.nix b/pkgs/kde/frameworks/kglobalaccel/default.nix
new file mode 100644
index 000000000000..b7d5e627d64f
--- /dev/null
+++ b/pkgs/kde/frameworks/kglobalaccel/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qttools,
+}:
+mkKdeDerivation {
+  pname = "kglobalaccel";
+
+  extraNativeBuildInputs = [qttools];
+}
diff --git a/pkgs/kde/frameworks/kguiaddons/default.nix b/pkgs/kde/frameworks/kguiaddons/default.nix
new file mode 100644
index 000000000000..899786eefbda
--- /dev/null
+++ b/pkgs/kde/frameworks/kguiaddons/default.nix
@@ -0,0 +1,12 @@
+{
+  mkKdeDerivation,
+  qtwayland,
+  pkg-config,
+  wayland,
+}:
+mkKdeDerivation {
+  pname = "kguiaddons";
+
+  extraNativeBuildInputs = [pkg-config];
+  extraBuildInputs = [qtwayland wayland];
+}
diff --git a/pkgs/kde/frameworks/kholidays/default.nix b/pkgs/kde/frameworks/kholidays/default.nix
new file mode 100644
index 000000000000..07702734a06b
--- /dev/null
+++ b/pkgs/kde/frameworks/kholidays/default.nix
@@ -0,0 +1,11 @@
+{
+  mkKdeDerivation,
+  qttools,
+  qtdeclarative,
+}:
+mkKdeDerivation {
+  pname = "kholidays";
+
+  extraNativeBuildInputs = [qttools];
+  extraBuildInputs = [qtdeclarative];
+}
diff --git a/pkgs/kde/frameworks/ki18n/default.nix b/pkgs/kde/frameworks/ki18n/default.nix
new file mode 100644
index 000000000000..2a082a9dfe57
--- /dev/null
+++ b/pkgs/kde/frameworks/ki18n/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qtdeclarative,
+}:
+mkKdeDerivation {
+  pname = "ki18n";
+
+  extraBuildInputs = [qtdeclarative];
+}
diff --git a/pkgs/kde/frameworks/kiconthemes/default.nix b/pkgs/kde/frameworks/kiconthemes/default.nix
new file mode 100644
index 000000000000..378a3f7f87b7
--- /dev/null
+++ b/pkgs/kde/frameworks/kiconthemes/default.nix
@@ -0,0 +1,15 @@
+{
+  mkKdeDerivation,
+  qtdeclarative,
+  qtsvg,
+  qttools,
+}:
+mkKdeDerivation {
+  pname = "kiconthemes";
+
+  extraBuildInputs = [
+    qtdeclarative
+    qtsvg
+    qttools
+  ];
+}
diff --git a/pkgs/kde/frameworks/kidletime/default.nix b/pkgs/kde/frameworks/kidletime/default.nix
new file mode 100644
index 000000000000..8fd68f04ec14
--- /dev/null
+++ b/pkgs/kde/frameworks/kidletime/default.nix
@@ -0,0 +1,13 @@
+{
+  mkKdeDerivation,
+  qtwayland,
+  pkg-config,
+  wayland-protocols,
+  xorg,
+}:
+mkKdeDerivation {
+  pname = "kidletime";
+
+  extraNativeBuildInputs = [pkg-config];
+  extraBuildInputs = [qtwayland xorg.libXScrnSaver wayland-protocols];
+}
diff --git a/pkgs/kde/frameworks/kimageformats/default.nix b/pkgs/kde/frameworks/kimageformats/default.nix
new file mode 100644
index 000000000000..21c84cb56992
--- /dev/null
+++ b/pkgs/kde/frameworks/kimageformats/default.nix
@@ -0,0 +1,16 @@
+{
+  mkKdeDerivation,
+  pkg-config,
+  libheif,
+  libjxl,
+  libavif,
+  libraw,
+  openexr_3,
+}:
+mkKdeDerivation {
+  pname = "kimageformats";
+
+  extraCmakeFlags = ["-DKIMAGEFORMATS_HEIF=1"];
+  extraNativeBuildInputs = [pkg-config];
+  extraBuildInputs = [libheif libjxl libavif libraw openexr_3];
+}
diff --git a/pkgs/kde/frameworks/kio/0001-Remove-impure-smbd-search-path.patch b/pkgs/kde/frameworks/kio/0001-Remove-impure-smbd-search-path.patch
new file mode 100644
index 000000000000..e541f7a05e8d
--- /dev/null
+++ b/pkgs/kde/frameworks/kio/0001-Remove-impure-smbd-search-path.patch
@@ -0,0 +1,25 @@
+From af54a2a37655df26a33bc6783cb472c38f65322f Mon Sep 17 00:00:00 2001
+From: Thomas Tuegel <ttuegel@mailbox.org>
+Date: Sun, 28 Mar 2021 10:31:12 -0500
+Subject: [PATCH 1/2] Remove impure smbd search path
+
+---
+ src/core/ksambashare.cpp | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/core/ksambashare.cpp b/src/core/ksambashare.cpp
+index e810ce4..7cfb4e6 100644
+--- a/src/core/ksambashare.cpp
++++ b/src/core/ksambashare.cpp
+@@ -61,7 +61,7 @@ KSambaSharePrivate::~KSambaSharePrivate()
+ bool KSambaSharePrivate::isSambaInstalled()
+ {
+     const bool daemonExists =
+-        !QStandardPaths::findExecutable(QStringLiteral("smbd"), {QStringLiteral("/usr/sbin/"), QStringLiteral("/usr/local/sbin/")}).isEmpty();
++        !QStandardPaths::findExecutable(QStringLiteral("smbd")).isEmpty();
+     if (!daemonExists) {
+         qCDebug(KIO_CORE_SAMBASHARE) << "KSambaShare: Could not find smbd";
+     }
+-- 
+2.30.1
+
diff --git a/pkgs/kde/frameworks/kio/default.nix b/pkgs/kde/frameworks/kio/default.nix
new file mode 100644
index 000000000000..03c2da9e0f5a
--- /dev/null
+++ b/pkgs/kde/frameworks/kio/default.nix
@@ -0,0 +1,18 @@
+{
+  mkKdeDerivation,
+  qt5compat,
+  qttools,
+  acl,
+  attr,
+}:
+mkKdeDerivation {
+  pname = "kio";
+
+  patches = [
+    # Remove hardcoded smbd search path
+    # FIXME(later): discuss with upstream?
+    ./0001-Remove-impure-smbd-search-path.patch
+  ];
+
+  extraBuildInputs = [qt5compat qttools acl attr];
+}
diff --git a/pkgs/kde/frameworks/kirigami/default.nix b/pkgs/kde/frameworks/kirigami/default.nix
new file mode 100644
index 000000000000..ee33f2e7b81c
--- /dev/null
+++ b/pkgs/kde/frameworks/kirigami/default.nix
@@ -0,0 +1,14 @@
+{
+  mkKdeDerivation,
+  qtsvg,
+  qttools,
+  qtdeclarative,
+  qt5compat,
+}:
+mkKdeDerivation {
+  pname = "kirigami";
+
+  extraNativeBuildInputs = [qtsvg qttools];
+  extraBuildInputs = [qtdeclarative];
+  extraPropagatedBuildInputs = [qt5compat];
+}
diff --git a/pkgs/kde/frameworks/kitemmodels/default.nix b/pkgs/kde/frameworks/kitemmodels/default.nix
new file mode 100644
index 000000000000..22476d21c4e4
--- /dev/null
+++ b/pkgs/kde/frameworks/kitemmodels/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qtdeclarative,
+}:
+mkKdeDerivation {
+  pname = "kitemmodels";
+
+  extraBuildInputs = [qtdeclarative];
+}
diff --git a/pkgs/kde/frameworks/kitemviews/default.nix b/pkgs/kde/frameworks/kitemviews/default.nix
new file mode 100644
index 000000000000..b9831f05ea99
--- /dev/null
+++ b/pkgs/kde/frameworks/kitemviews/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qttools,
+}:
+mkKdeDerivation {
+  pname = "kitemviews";
+
+  extraNativeBuildInputs = [qttools];
+}
diff --git a/pkgs/kde/frameworks/kjobwidgets/default.nix b/pkgs/kde/frameworks/kjobwidgets/default.nix
new file mode 100644
index 000000000000..27e9720d84e1
--- /dev/null
+++ b/pkgs/kde/frameworks/kjobwidgets/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qttools,
+}:
+mkKdeDerivation {
+  pname = "kjobwidgets";
+
+  extraNativeBuildInputs = [qttools];
+}
diff --git a/pkgs/kde/frameworks/knewstuff/default.nix b/pkgs/kde/frameworks/knewstuff/default.nix
new file mode 100644
index 000000000000..934167daf055
--- /dev/null
+++ b/pkgs/kde/frameworks/knewstuff/default.nix
@@ -0,0 +1,16 @@
+{
+  mkKdeDerivation,
+  qtdeclarative,
+  qttools,
+  kcmutils,
+}:
+mkKdeDerivation {
+  pname = "knewstuff";
+
+  # Late resolve knsrcdir so other things install to their own prefix
+  # FIXME(later): upstream
+  patches = [./delay-resolving-knsrcdir.patch];
+
+  extraBuildInputs = [qtdeclarative qttools];
+  extraPropagatedBuildInputs = [kcmutils];
+}
diff --git a/pkgs/kde/frameworks/knewstuff/delay-resolving-knsrcdir.patch b/pkgs/kde/frameworks/knewstuff/delay-resolving-knsrcdir.patch
new file mode 100644
index 000000000000..15f85aa422fe
--- /dev/null
+++ b/pkgs/kde/frameworks/knewstuff/delay-resolving-knsrcdir.patch
@@ -0,0 +1,14 @@
+diff --git a/KF6NewStuffCoreConfig.cmake.in b/KF6NewStuffCoreConfig.cmake.in
+index d70f7132..f75e9fce 100644
+--- a/KF6NewStuffCoreConfig.cmake.in
++++ b/KF6NewStuffCoreConfig.cmake.in
+@@ -20,7 +20,7 @@ if (NOT @BUILD_SHARED_LIBS@)
+     endif()
+ endif()
+
+-set(KDE_INSTALL_KNSRCDIR "@KDE_INSTALL_DATADIR@/knsrcfiles")
++set(KDE_INSTALL_KNSRCDIR "${KDE_INSTALL_DATADIR}/knsrcfiles")
+
+ include("${CMAKE_CURRENT_LIST_DIR}/KF6NewStuffCoreTargets.cmake")
+ @PACKAGE_INCLUDE_CORE_QCHTARGETS@
+ 
\ No newline at end of file
diff --git a/pkgs/kde/frameworks/knotifications/default.nix b/pkgs/kde/frameworks/knotifications/default.nix
new file mode 100644
index 000000000000..232d4469f0e6
--- /dev/null
+++ b/pkgs/kde/frameworks/knotifications/default.nix
@@ -0,0 +1,12 @@
+{
+  mkKdeDerivation,
+  qttools,
+  qtdeclarative,
+  libcanberra,
+}:
+mkKdeDerivation {
+  pname = "knotifications";
+
+  extraNativeBuildInputs = [qttools];
+  extraBuildInputs = [qtdeclarative libcanberra];
+}
diff --git a/pkgs/kde/frameworks/knotifyconfig/default.nix b/pkgs/kde/frameworks/knotifyconfig/default.nix
new file mode 100644
index 000000000000..9c778a322b67
--- /dev/null
+++ b/pkgs/kde/frameworks/knotifyconfig/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  libcanberra,
+}:
+mkKdeDerivation {
+  pname = "knotifyconfig";
+
+  extraBuildInputs = [libcanberra];
+}
diff --git a/pkgs/kde/frameworks/kpackage/default.nix b/pkgs/kde/frameworks/kpackage/default.nix
new file mode 100644
index 000000000000..8f99e10047c0
--- /dev/null
+++ b/pkgs/kde/frameworks/kpackage/default.nix
@@ -0,0 +1,8 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kpackage";
+
+  # Follow symlinks when resolving packages
+  # FIXME(later): upstream
+  patches = [./follow-symlinks.patch];
+}
diff --git a/pkgs/kde/frameworks/kpackage/follow-symlinks.patch b/pkgs/kde/frameworks/kpackage/follow-symlinks.patch
new file mode 100644
index 000000000000..8f0af89e1666
--- /dev/null
+++ b/pkgs/kde/frameworks/kpackage/follow-symlinks.patch
@@ -0,0 +1,13 @@
+diff --git a/src/kpackage/packageloader.cpp b/src/kpackage/packageloader.cpp
+index 9dbd1f6..c50a6e5 100644
+--- a/src/kpackage/packageloader.cpp
++++ b/src/kpackage/packageloader.cpp
+@@ -128,7 +128,7 @@ QList<KPluginMetaData> PackageLoader::listPackages(const QString &packageFormat,
+     }
+
+     for (auto const &plugindir : std::as_const(paths)) {
+-        QDirIterator it(plugindir, QStringList{QStringLiteral("metadata.json")}, QDir::Files, QDirIterator::Subdirectories);
++        QDirIterator it(plugindir, QStringList{QStringLiteral("metadata.json")}, QDir::Files, QDirIterator::Subdirectories | QDirIterator::FollowSymlinks);
+         std::unordered_set<QString> dirs;
+         while (it.hasNext()) {
+             it.next();
diff --git a/pkgs/kde/frameworks/kparts/default.nix b/pkgs/kde/frameworks/kparts/default.nix
new file mode 100644
index 000000000000..547e8b1b016e
--- /dev/null
+++ b/pkgs/kde/frameworks/kparts/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kparts";
+}
diff --git a/pkgs/kde/frameworks/kpeople/default.nix b/pkgs/kde/frameworks/kpeople/default.nix
new file mode 100644
index 000000000000..18d56704c2d8
--- /dev/null
+++ b/pkgs/kde/frameworks/kpeople/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qtdeclarative,
+}:
+mkKdeDerivation {
+  pname = "kpeople";
+
+  extraBuildInputs = [qtdeclarative];
+}
diff --git a/pkgs/kde/frameworks/kplotting/default.nix b/pkgs/kde/frameworks/kplotting/default.nix
new file mode 100644
index 000000000000..b23c198fd879
--- /dev/null
+++ b/pkgs/kde/frameworks/kplotting/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qttools,
+}:
+mkKdeDerivation {
+  pname = "kplotting";
+
+  extraBuildInputs = [qttools];
+}
diff --git a/pkgs/kde/frameworks/kpty/default.nix b/pkgs/kde/frameworks/kpty/default.nix
new file mode 100644
index 000000000000..d60c2a5665f2
--- /dev/null
+++ b/pkgs/kde/frameworks/kpty/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kpty";
+}
diff --git a/pkgs/kde/frameworks/kquickcharts/default.nix b/pkgs/kde/frameworks/kquickcharts/default.nix
new file mode 100644
index 000000000000..305df6000403
--- /dev/null
+++ b/pkgs/kde/frameworks/kquickcharts/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qtdeclarative,
+}:
+mkKdeDerivation {
+  pname = "kquickcharts";
+
+  extraBuildInputs = [qtdeclarative];
+}
diff --git a/pkgs/kde/frameworks/krunner/default.nix b/pkgs/kde/frameworks/krunner/default.nix
new file mode 100644
index 000000000000..f817c1560c26
--- /dev/null
+++ b/pkgs/kde/frameworks/krunner/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  plasma-activities,
+}:
+mkKdeDerivation {
+  pname = "krunner";
+
+  extraBuildInputs = [plasma-activities];
+}
diff --git a/pkgs/kde/frameworks/kservice/default.nix b/pkgs/kde/frameworks/kservice/default.nix
new file mode 100644
index 000000000000..3da4fd1fdd75
--- /dev/null
+++ b/pkgs/kde/frameworks/kservice/default.nix
@@ -0,0 +1,10 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kservice";
+
+  patches = [
+    # follow symlinks when generating sycoca
+    # FIXME(later): upstream
+    ./qdiriterator-follow-symlinks.patch
+  ];
+}
diff --git a/pkgs/kde/frameworks/kservice/qdiriterator-follow-symlinks.patch b/pkgs/kde/frameworks/kservice/qdiriterator-follow-symlinks.patch
new file mode 100644
index 000000000000..fdd8b4d81a18
--- /dev/null
+++ b/pkgs/kde/frameworks/kservice/qdiriterator-follow-symlinks.patch
@@ -0,0 +1,13 @@
+diff --git a/src/sycoca/kbuildsycoca.cpp b/src/sycoca/kbuildsycoca.cpp
+index b125299..0682b90 100644
+--- a/src/sycoca/kbuildsycoca.cpp
++++ b/src/sycoca/kbuildsycoca.cpp
+@@ -207,7 +207,7 @@ bool KBuildSycoca::build()
+         const QStringList dirs = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, m_resourceSubdir, QStandardPaths::LocateDirectory);
+         qCDebug(SYCOCA) << "Looking for subdir" << m_resourceSubdir << "=>" << dirs;
+         for (const QString &dir : dirs) {
+-            QDirIterator it(dir, QDirIterator::Subdirectories);
++            QDirIterator it(dir, QDirIterator::Subdirectories | QDirIterator::FollowSymlinks);
+             while (it.hasNext()) {
+                 const QString filePath = it.next();
+                 Q_ASSERT(filePath.startsWith(dir)); // due to the line below...
diff --git a/pkgs/kde/frameworks/kstatusnotifieritem/default.nix b/pkgs/kde/frameworks/kstatusnotifieritem/default.nix
new file mode 100644
index 000000000000..bc3b255caaeb
--- /dev/null
+++ b/pkgs/kde/frameworks/kstatusnotifieritem/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qttools,
+}:
+mkKdeDerivation {
+  pname = "kstatusnotifieritem";
+
+  extraNativeBuildInputs = [qttools];
+}
diff --git a/pkgs/kde/frameworks/ksvg/default.nix b/pkgs/kde/frameworks/ksvg/default.nix
new file mode 100644
index 000000000000..82dbce5c0829
--- /dev/null
+++ b/pkgs/kde/frameworks/ksvg/default.nix
@@ -0,0 +1,10 @@
+{
+  mkKdeDerivation,
+  qtdeclarative,
+  qtsvg,
+}:
+mkKdeDerivation {
+  pname = "ksvg";
+
+  extraBuildInputs = [qtdeclarative qtsvg];
+}
diff --git a/pkgs/kde/frameworks/ktexteditor/default.nix b/pkgs/kde/frameworks/ktexteditor/default.nix
new file mode 100644
index 000000000000..9a666c4e6a61
--- /dev/null
+++ b/pkgs/kde/frameworks/ktexteditor/default.nix
@@ -0,0 +1,11 @@
+{
+  mkKdeDerivation,
+  qtdeclarative,
+  qtspeech,
+  editorconfig-core-c,
+}:
+mkKdeDerivation {
+  pname = "ktexteditor";
+
+  extraBuildInputs = [qtdeclarative qtspeech editorconfig-core-c];
+}
diff --git a/pkgs/kde/frameworks/ktexttemplate/default.nix b/pkgs/kde/frameworks/ktexttemplate/default.nix
new file mode 100644
index 000000000000..673a10863ac6
--- /dev/null
+++ b/pkgs/kde/frameworks/ktexttemplate/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qtdeclarative,
+}:
+mkKdeDerivation {
+  pname = "ktexttemplate";
+
+  extraBuildInputs = [qtdeclarative];
+}
diff --git a/pkgs/kde/frameworks/ktextwidgets/default.nix b/pkgs/kde/frameworks/ktextwidgets/default.nix
new file mode 100644
index 000000000000..a90de215c598
--- /dev/null
+++ b/pkgs/kde/frameworks/ktextwidgets/default.nix
@@ -0,0 +1,13 @@
+{
+  mkKdeDerivation,
+  qtspeech,
+  qttools,
+}:
+mkKdeDerivation {
+  pname = "ktextwidgets";
+
+  extraBuildInputs = [
+    qtspeech
+    qttools
+  ];
+}
diff --git a/pkgs/kde/frameworks/kunitconversion/default.nix b/pkgs/kde/frameworks/kunitconversion/default.nix
new file mode 100644
index 000000000000..1d7cb52566d4
--- /dev/null
+++ b/pkgs/kde/frameworks/kunitconversion/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kunitconversion";
+}
diff --git a/pkgs/kde/frameworks/kuserfeedback/default.nix b/pkgs/kde/frameworks/kuserfeedback/default.nix
new file mode 100644
index 000000000000..979362e6bfb8
--- /dev/null
+++ b/pkgs/kde/frameworks/kuserfeedback/default.nix
@@ -0,0 +1,12 @@
+{
+  mkKdeDerivation,
+  qttools,
+  qtsvg,
+}:
+mkKdeDerivation {
+  pname = "kuserfeedback";
+
+  # Disable server-side stuff we don't care about
+  extraCmakeFlags = ["-DENABLE_CONSOLE=0" "-DENABLE_CLI=0"];
+  extraNativeBuildInputs = [qttools qtsvg];
+}
diff --git a/pkgs/kde/frameworks/kwallet/default.nix b/pkgs/kde/frameworks/kwallet/default.nix
new file mode 100644
index 000000000000..3fffce1f3068
--- /dev/null
+++ b/pkgs/kde/frameworks/kwallet/default.nix
@@ -0,0 +1,10 @@
+{
+  mkKdeDerivation,
+  libgcrypt,
+  kdoctools,
+}:
+mkKdeDerivation {
+  pname = "kwallet";
+
+  extraBuildInputs = [libgcrypt kdoctools];
+}
diff --git a/pkgs/kde/frameworks/kwidgetsaddons/default.nix b/pkgs/kde/frameworks/kwidgetsaddons/default.nix
new file mode 100644
index 000000000000..09dfb3228d05
--- /dev/null
+++ b/pkgs/kde/frameworks/kwidgetsaddons/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qttools,
+}:
+mkKdeDerivation {
+  pname = "kwidgetsaddons";
+
+  extraNativeBuildInputs = [qttools];
+}
diff --git a/pkgs/kde/frameworks/kwindowsystem/default.nix b/pkgs/kde/frameworks/kwindowsystem/default.nix
new file mode 100644
index 000000000000..711638cb106c
--- /dev/null
+++ b/pkgs/kde/frameworks/kwindowsystem/default.nix
@@ -0,0 +1,14 @@
+{
+  mkKdeDerivation,
+  qttools,
+  qtdeclarative,
+  qtwayland,
+  pkg-config,
+  wayland,
+}:
+mkKdeDerivation {
+  pname = "kwindowsystem";
+
+  extraNativeBuildInputs = [qttools pkg-config];
+  extraBuildInputs = [qtdeclarative qtwayland wayland];
+}
diff --git a/pkgs/kde/frameworks/kxmlgui/default.nix b/pkgs/kde/frameworks/kxmlgui/default.nix
new file mode 100644
index 000000000000..64734cde5af6
--- /dev/null
+++ b/pkgs/kde/frameworks/kxmlgui/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qttools,
+}:
+mkKdeDerivation {
+  pname = "kxmlgui";
+
+  extraBuildInputs = [qttools];
+}
diff --git a/pkgs/kde/frameworks/modemmanager-qt/default.nix b/pkgs/kde/frameworks/modemmanager-qt/default.nix
new file mode 100644
index 000000000000..34a6f1954842
--- /dev/null
+++ b/pkgs/kde/frameworks/modemmanager-qt/default.nix
@@ -0,0 +1,11 @@
+{
+  mkKdeDerivation,
+  pkg-config,
+  modemmanager,
+}:
+mkKdeDerivation {
+  pname = "modemmanager-qt";
+
+  extraNativeBuildInputs = [pkg-config];
+  extraPropagatedBuildInputs = [modemmanager];
+}
diff --git a/pkgs/kde/frameworks/networkmanager-qt/default.nix b/pkgs/kde/frameworks/networkmanager-qt/default.nix
new file mode 100644
index 000000000000..bdec89a9ca1d
--- /dev/null
+++ b/pkgs/kde/frameworks/networkmanager-qt/default.nix
@@ -0,0 +1,13 @@
+{
+  mkKdeDerivation,
+  qtdeclarative,
+  pkg-config,
+  networkmanager,
+}:
+mkKdeDerivation {
+  pname = "networkmanager-qt";
+
+  extraNativeBuildInputs = [pkg-config];
+  extraBuildInputs = [qtdeclarative];
+  extraPropagatedBuildInputs = [networkmanager];
+}
diff --git a/pkgs/kde/frameworks/prison/default.nix b/pkgs/kde/frameworks/prison/default.nix
new file mode 100644
index 000000000000..6411be8a34cf
--- /dev/null
+++ b/pkgs/kde/frameworks/prison/default.nix
@@ -0,0 +1,12 @@
+{
+  mkKdeDerivation,
+  qtdeclarative,
+  qtmultimedia,
+  qrencode,
+  libdmtx,
+}:
+mkKdeDerivation {
+  pname = "prison";
+
+  extraBuildInputs = [qtdeclarative qtmultimedia qrencode libdmtx];
+}
diff --git a/pkgs/kde/frameworks/purpose/default.nix b/pkgs/kde/frameworks/purpose/default.nix
new file mode 100644
index 000000000000..8bf85ae19afe
--- /dev/null
+++ b/pkgs/kde/frameworks/purpose/default.nix
@@ -0,0 +1,13 @@
+{
+  mkKdeDerivation,
+  qtdeclarative,
+  kaccounts-integration,
+  kdeclarative,
+  prison,
+}:
+mkKdeDerivation {
+  pname = "purpose";
+
+  extraBuildInputs = [qtdeclarative];
+  extraPropagatedBuildInputs = [kaccounts-integration kdeclarative prison];
+}
diff --git a/pkgs/kde/frameworks/qqc2-desktop-style/default.nix b/pkgs/kde/frameworks/qqc2-desktop-style/default.nix
new file mode 100644
index 000000000000..13d7c9c92153
--- /dev/null
+++ b/pkgs/kde/frameworks/qqc2-desktop-style/default.nix
@@ -0,0 +1,11 @@
+{
+  mkKdeDerivation,
+  qtdeclarative,
+  sonnet,
+}:
+mkKdeDerivation {
+  pname = "qqc2-desktop-style";
+
+  extraBuildInputs = [qtdeclarative];
+  extraPropagatedBuildInputs = [sonnet];
+}
diff --git a/pkgs/kde/frameworks/solid/default.nix b/pkgs/kde/frameworks/solid/default.nix
new file mode 100644
index 000000000000..941422848058
--- /dev/null
+++ b/pkgs/kde/frameworks/solid/default.nix
@@ -0,0 +1,16 @@
+{
+  mkKdeDerivation,
+  qttools,
+  bison,
+  flex,
+  libimobiledevice,
+}:
+mkKdeDerivation {
+  pname = "solid";
+
+  # Also search /run/wrappers for mount/umount
+  patches = [./fix-search-path.patch];
+
+  extraNativeBuildInputs = [qttools bison flex];
+  extraBuildInputs = [libimobiledevice];
+}
diff --git a/pkgs/kde/frameworks/solid/fix-search-path.patch b/pkgs/kde/frameworks/solid/fix-search-path.patch
new file mode 100644
index 000000000000..010aa1f3efcc
--- /dev/null
+++ b/pkgs/kde/frameworks/solid/fix-search-path.patch
@@ -0,0 +1,17 @@
+diff --git a/src/solid/devices/backends/fstab/fstabhandling.cpp b/src/solid/devices/backends/fstab/fstabhandling.cpp
+index ac2a628..7ee46cc 100644
+--- a/src/solid/devices/backends/fstab/fstabhandling.cpp
++++ b/src/solid/devices/backends/fstab/fstabhandling.cpp
+@@ -275,7 +275,11 @@ bool Solid::Backends::Fstab::FstabHandling::callSystemCommand(const QString &com
+                                                               const QObject *receiver,
+                                                               std::function<void(QProcess *)> callback)
+ {
+-    static const QStringList searchPaths{QStringLiteral("/sbin"), QStringLiteral("/bin"), QStringLiteral("/usr/sbin"), QStringLiteral("/usr/bin")};
++    static const QStringList searchPaths{QStringLiteral("/run/wrappers/bin"),
++                                         QStringLiteral("/sbin"),
++                                         QStringLiteral("/bin"),
++                                         QStringLiteral("/usr/sbin"),
++                                         QStringLiteral("/usr/bin")};
+     static const QString joinedPaths = searchPaths.join(QLatin1Char(':'));
+     const QString exec = QStandardPaths::findExecutable(commandName, searchPaths);
+     if (exec.isEmpty()) {
diff --git a/pkgs/kde/frameworks/sonnet/default.nix b/pkgs/kde/frameworks/sonnet/default.nix
new file mode 100644
index 000000000000..d0775de9bb18
--- /dev/null
+++ b/pkgs/kde/frameworks/sonnet/default.nix
@@ -0,0 +1,14 @@
+{
+  mkKdeDerivation,
+  qtdeclarative,
+  qttools,
+  pkg-config,
+  aspell,
+  hunspell,
+}:
+mkKdeDerivation {
+  pname = "sonnet";
+
+  extraNativeBuildInputs = [qttools pkg-config];
+  extraBuildInputs = [qtdeclarative aspell hunspell];
+}
diff --git a/pkgs/kde/frameworks/syndication/default.nix b/pkgs/kde/frameworks/syndication/default.nix
new file mode 100644
index 000000000000..cec50a6777f7
--- /dev/null
+++ b/pkgs/kde/frameworks/syndication/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "syndication";
+}
diff --git a/pkgs/kde/frameworks/syntax-highlighting/default.nix b/pkgs/kde/frameworks/syntax-highlighting/default.nix
new file mode 100644
index 000000000000..4ce448e937d5
--- /dev/null
+++ b/pkgs/kde/frameworks/syntax-highlighting/default.nix
@@ -0,0 +1,12 @@
+{
+  mkKdeDerivation,
+  qtdeclarative,
+  qttools,
+  perl,
+}:
+mkKdeDerivation {
+  pname = "syntax-highlighting";
+
+  extraBuildInputs = [qtdeclarative];
+  extraNativeBuildInputs = [qttools perl];
+}
diff --git a/pkgs/kde/frameworks/threadweaver/default.nix b/pkgs/kde/frameworks/threadweaver/default.nix
new file mode 100644
index 000000000000..9da07c2af2ac
--- /dev/null
+++ b/pkgs/kde/frameworks/threadweaver/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "threadweaver";
+}
diff --git a/pkgs/kde/gear/akonadi-calendar-tools/default.nix b/pkgs/kde/gear/akonadi-calendar-tools/default.nix
new file mode 100644
index 000000000000..bc863c026709
--- /dev/null
+++ b/pkgs/kde/gear/akonadi-calendar-tools/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "akonadi-calendar-tools";
+}
diff --git a/pkgs/kde/gear/akonadi-calendar/default.nix b/pkgs/kde/gear/akonadi-calendar/default.nix
new file mode 100644
index 000000000000..ffa28766a4e1
--- /dev/null
+++ b/pkgs/kde/gear/akonadi-calendar/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "akonadi-calendar";
+}
diff --git a/pkgs/kde/gear/akonadi-contacts/default.nix b/pkgs/kde/gear/akonadi-contacts/default.nix
new file mode 100644
index 000000000000..b8c1c5bf92cc
--- /dev/null
+++ b/pkgs/kde/gear/akonadi-contacts/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "akonadi-contacts";
+}
diff --git a/pkgs/kde/gear/akonadi-import-wizard/default.nix b/pkgs/kde/gear/akonadi-import-wizard/default.nix
new file mode 100644
index 000000000000..191944a9e90d
--- /dev/null
+++ b/pkgs/kde/gear/akonadi-import-wizard/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "akonadi-import-wizard";
+}
diff --git a/pkgs/kde/gear/akonadi-mime/default.nix b/pkgs/kde/gear/akonadi-mime/default.nix
new file mode 100644
index 000000000000..8796f7220134
--- /dev/null
+++ b/pkgs/kde/gear/akonadi-mime/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  shared-mime-info,
+}:
+mkKdeDerivation {
+  pname = "akonadi-mime";
+
+  extraNativeBuildInputs = [shared-mime-info];
+}
diff --git a/pkgs/kde/gear/akonadi-notes/default.nix b/pkgs/kde/gear/akonadi-notes/default.nix
new file mode 100644
index 000000000000..a1cd161a510f
--- /dev/null
+++ b/pkgs/kde/gear/akonadi-notes/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "akonadi-notes";
+}
diff --git a/pkgs/kde/gear/akonadi-search/default.nix b/pkgs/kde/gear/akonadi-search/default.nix
new file mode 100644
index 000000000000..87f743f86c30
--- /dev/null
+++ b/pkgs/kde/gear/akonadi-search/default.nix
@@ -0,0 +1,33 @@
+{
+  mkKdeDerivation,
+  sources,
+  corrosion,
+  xapian,
+  rustPlatform,
+  cargo,
+  rustc,
+  # provided as callPackage input to enable easier overrides through overlays
+  cargoHash ? "sha256-euUaB+QCwwwPjrUq+3NHt0hjDSW5gch8MwS57KmtIWI=",
+}:
+mkKdeDerivation rec {
+  pname = "akonadi-search";
+  inherit (sources.${pname}) version;
+
+  cargoRoot = "agent/rs/htmlparser";
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    # include version in the name so we invalidate the FOD
+    name = "${pname}-${version}";
+    src = sources.${pname};
+    sourceRoot = "${pname}-${version}/${cargoRoot}";
+    hash = cargoHash;
+  };
+
+  extraNativeBuildInputs = [
+    rustPlatform.cargoSetupHook
+    cargo
+    rustc
+  ];
+
+  extraBuildInputs = [corrosion xapian];
+}
diff --git a/pkgs/kde/gear/akonadi/default.nix b/pkgs/kde/gear/akonadi/default.nix
new file mode 100644
index 000000000000..20fd1f54b1ec
--- /dev/null
+++ b/pkgs/kde/gear/akonadi/default.nix
@@ -0,0 +1,16 @@
+{
+  mkKdeDerivation,
+  qttools,
+  accounts-qt,
+  kaccounts-integration,
+  shared-mime-info,
+  xz,
+}:
+mkKdeDerivation {
+  pname = "akonadi";
+
+  # FIXME(later): investigate nixpkgs patches
+
+  extraNativeBuildInputs = [qttools shared-mime-info];
+  extraBuildInputs = [kaccounts-integration accounts-qt xz];
+}
diff --git a/pkgs/kde/gear/akonadiconsole/default.nix b/pkgs/kde/gear/akonadiconsole/default.nix
new file mode 100644
index 000000000000..4820faea5705
--- /dev/null
+++ b/pkgs/kde/gear/akonadiconsole/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  xapian,
+}:
+mkKdeDerivation {
+  pname = "akonadiconsole";
+
+  extraBuildInputs = [xapian];
+}
diff --git a/pkgs/kde/gear/akregator/default.nix b/pkgs/kde/gear/akregator/default.nix
new file mode 100644
index 000000000000..4d52e4947b78
--- /dev/null
+++ b/pkgs/kde/gear/akregator/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qtwebengine,
+}:
+mkKdeDerivation {
+  pname = "akregator";
+
+  extraBuildInputs = [qtwebengine];
+}
diff --git a/pkgs/kde/gear/alligator/default.nix b/pkgs/kde/gear/alligator/default.nix
new file mode 100644
index 000000000000..bf3a4fb53b9d
--- /dev/null
+++ b/pkgs/kde/gear/alligator/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "alligator";
+}
diff --git a/pkgs/kde/gear/analitza/default.nix b/pkgs/kde/gear/analitza/default.nix
new file mode 100644
index 000000000000..318c0b648279
--- /dev/null
+++ b/pkgs/kde/gear/analitza/default.nix
@@ -0,0 +1,14 @@
+{
+  mkKdeDerivation,
+  qt5compat,
+  qtsvg,
+  qttools,
+  qtdeclarative,
+  eigen,
+}:
+mkKdeDerivation {
+  pname = "analitza";
+
+  extraNativeBuildInputs = [qt5compat qtsvg qttools];
+  extraBuildInputs = [qtdeclarative eigen];
+}
diff --git a/pkgs/kde/gear/angelfish/default.nix b/pkgs/kde/gear/angelfish/default.nix
new file mode 100644
index 000000000000..133509e78b7a
--- /dev/null
+++ b/pkgs/kde/gear/angelfish/default.nix
@@ -0,0 +1,32 @@
+{
+  mkKdeDerivation,
+  sources,
+  qtsvg,
+  qtwebengine,
+  corrosion,
+  rustPlatform,
+  cargo,
+  rustc,
+  # provided as callPackage input to enable easier overrides through overlays
+  cargoHash ? "sha256-kkoLWJvPx1Hq+MQkPgTffrTFYgVlVfKdmJq5ExAW1NE=",
+  qcoro,
+}:
+mkKdeDerivation rec {
+  pname = "angelfish";
+  inherit (sources.${pname}) version;
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    # include version in the name so we invalidate the FOD
+    name = "${pname}-${version}";
+    src = sources.${pname};
+    hash = cargoHash;
+  };
+
+  extraNativeBuildInputs = [
+    rustPlatform.cargoSetupHook
+    cargo
+    rustc
+  ];
+
+  extraBuildInputs = [corrosion qtsvg qtwebengine qcoro];
+}
diff --git a/pkgs/kde/gear/arianna/default.nix b/pkgs/kde/gear/arianna/default.nix
new file mode 100644
index 000000000000..d3a63bc19455
--- /dev/null
+++ b/pkgs/kde/gear/arianna/default.nix
@@ -0,0 +1,21 @@
+{
+  mkKdeDerivation,
+  qthttpserver,
+  qtsvg,
+  qtwebchannel,
+  qtwebengine,
+  kitemmodels,
+  kquickcharts,
+}:
+mkKdeDerivation {
+  pname = "arianna";
+
+  extraBuildInputs = [
+    qthttpserver
+    qtsvg
+    qtwebchannel
+    qtwebengine
+    kitemmodels
+    kquickcharts
+  ];
+}
diff --git a/pkgs/kde/gear/ark/default.nix b/pkgs/kde/gear/ark/default.nix
new file mode 100644
index 000000000000..ae443c21cf84
--- /dev/null
+++ b/pkgs/kde/gear/ark/default.nix
@@ -0,0 +1,10 @@
+{
+  mkKdeDerivation,
+  libarchive,
+  libzip,
+}:
+mkKdeDerivation {
+  pname = "ark";
+
+  extraBuildInputs = [libarchive libzip];
+}
diff --git a/pkgs/kde/gear/artikulate/default.nix b/pkgs/kde/gear/artikulate/default.nix
new file mode 100644
index 000000000000..c82db10260f7
--- /dev/null
+++ b/pkgs/kde/gear/artikulate/default.nix
@@ -0,0 +1,11 @@
+{
+  mkKdeDerivation,
+  qtmultimedia,
+}:
+mkKdeDerivation {
+  pname = "artikulate";
+
+  extraBuildInputs = [qtmultimedia];
+  # FIXME(qt5)
+  meta.broken = true;
+}
diff --git a/pkgs/kde/gear/audiocd-kio/default.nix b/pkgs/kde/gear/audiocd-kio/default.nix
new file mode 100644
index 000000000000..c2f5c2558826
--- /dev/null
+++ b/pkgs/kde/gear/audiocd-kio/default.nix
@@ -0,0 +1,24 @@
+{
+  lib,
+  mkKdeDerivation,
+  cdparanoia,
+  flac,
+  libogg,
+  libvorbis,
+  substituteAll,
+  lame,
+  opusTools,
+}:
+mkKdeDerivation {
+  pname = "audiocd-kio";
+
+  patches = [
+    (substituteAll {
+      src = ./encoder-paths.patch;
+      lame = lib.getExe lame;
+      opusenc = "${opusTools}/bin/opusenc";
+    })
+  ];
+
+  extraBuildInputs = [cdparanoia flac libogg libvorbis];
+}
diff --git a/pkgs/kde/gear/audiocd-kio/encoder-paths.patch b/pkgs/kde/gear/audiocd-kio/encoder-paths.patch
new file mode 100644
index 000000000000..c39835a8b1f3
--- /dev/null
+++ b/pkgs/kde/gear/audiocd-kio/encoder-paths.patch
@@ -0,0 +1,35 @@
+diff --git a/plugins/lame/encoderlame.cpp b/plugins/lame/encoderlame.cpp
+index 48d1d76..2643d6a 100644
+--- a/plugins/lame/encoderlame.cpp
++++ b/plugins/lame/encoderlame.cpp
+@@ -244,7 +244,7 @@ long EncoderLame::readInit(long /*size*/)
+ 
+     // -r raw/pcm
+     // -s 44.1 (because it is raw you have to specify this)
+-    *(d->currentEncodeProcess) << QStringLiteral("lame") << QStringLiteral("--verbose") << QStringLiteral("-r") << QStringLiteral("-s")
++    *(d->currentEncodeProcess) << QStringLiteral("@lame@") << QStringLiteral("--verbose") << QStringLiteral("-r") << QStringLiteral("-s")
+                                << QStringLiteral("44.1");
+     *(d->currentEncodeProcess) << args;
+     if (Settings::self()->id3_tag())
+diff --git a/plugins/opus/encoderopus.cpp b/plugins/opus/encoderopus.cpp
+index ef297fb..465bb3e 100644
+--- a/plugins/opus/encoderopus.cpp
++++ b/plugins/opus/encoderopus.cpp
+@@ -82,7 +82,7 @@ QWidget *EncoderOpus::getConfigureWidget(KConfigSkeleton **manager) const
+ bool EncoderOpus::init()
+ {
+     // Determine if opusenc is installed on the system or not.
+-    if (QStandardPaths::findExecutable(QStringLiteral("opusenc")).isEmpty())
++    if (QStandardPaths::findExecutable(QStringLiteral("@opusenc@")).isEmpty())
+         return false;
+ 
+     return true;
+@@ -140,7 +140,7 @@ long EncoderOpus::readInit(long /*size*/)
+ 
+     // --raw raw/pcm
+     // --raw-rate 44100 (because it is raw you have to specify this)
+-    *(d->currentEncodeProcess) << QStringLiteral("opusenc") << QStringLiteral("--raw") << QStringLiteral("--raw-rate") << QStringLiteral("44100");
++    *(d->currentEncodeProcess) << QStringLiteral("@opusenc@") << QStringLiteral("--raw") << QStringLiteral("--raw-rate") << QStringLiteral("44100");
+     *(d->currentEncodeProcess) << args;
+     *d->currentEncodeProcess << trackInfo;
+ 
diff --git a/pkgs/kde/gear/audiotube/default.nix b/pkgs/kde/gear/audiotube/default.nix
new file mode 100644
index 000000000000..60e646cd71c1
--- /dev/null
+++ b/pkgs/kde/gear/audiotube/default.nix
@@ -0,0 +1,53 @@
+{
+  mkKdeDerivation,
+  qtdeclarative,
+  qtmultimedia,
+  qtsvg,
+  extra-cmake-modules,
+  futuresql,
+  kcoreaddons,
+  kcrash,
+  ki18n,
+  kirigami-addons,
+  kirigami,
+  kwindowsystem,
+  purpose,
+  qcoro,
+  python3,
+}: let
+  ps = python3.pkgs;
+  pythonDeps = [
+    ps.yt-dlp
+    ps.ytmusicapi
+  ];
+in
+  mkKdeDerivation {
+    pname = "audiotube";
+
+    extraNativeBuildInputs = [
+      ps.pybind11
+    ];
+
+    extraBuildInputs =
+      [
+        qtdeclarative
+        qtmultimedia
+        qtsvg
+
+        extra-cmake-modules
+        futuresql
+        kirigami
+        kirigami-addons
+        kcoreaddons
+        ki18n
+        kcrash
+        kwindowsystem
+        purpose
+        qcoro
+      ]
+      ++ pythonDeps;
+
+    qtWrapperArgs = [
+      "--prefix PYTHONPATH : ${ps.makePythonPath pythonDeps}"
+    ];
+  }
diff --git a/pkgs/kde/gear/baloo-widgets/default.nix b/pkgs/kde/gear/baloo-widgets/default.nix
new file mode 100644
index 000000000000..ca638bef6074
--- /dev/null
+++ b/pkgs/kde/gear/baloo-widgets/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "baloo-widgets";
+}
diff --git a/pkgs/kde/gear/blinken/default.nix b/pkgs/kde/gear/blinken/default.nix
new file mode 100644
index 000000000000..ac5f4273ebd5
--- /dev/null
+++ b/pkgs/kde/gear/blinken/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qtsvg,
+}:
+mkKdeDerivation {
+  pname = "blinken";
+
+  extraBuildInputs = [qtsvg];
+}
diff --git a/pkgs/kde/gear/bomber/default.nix b/pkgs/kde/gear/bomber/default.nix
new file mode 100644
index 000000000000..a0e2ea97428c
--- /dev/null
+++ b/pkgs/kde/gear/bomber/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  _7zz,
+}:
+mkKdeDerivation {
+  pname = "bomber";
+
+  extraNativeBuildInputs = [_7zz];
+}
diff --git a/pkgs/kde/gear/bovo/default.nix b/pkgs/kde/gear/bovo/default.nix
new file mode 100644
index 000000000000..bc48853616ef
--- /dev/null
+++ b/pkgs/kde/gear/bovo/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qtsvg,
+}:
+mkKdeDerivation {
+  pname = "bovo";
+
+  extraBuildInputs = [qtsvg];
+}
diff --git a/pkgs/kde/gear/calendarsupport/default.nix b/pkgs/kde/gear/calendarsupport/default.nix
new file mode 100644
index 000000000000..b6632a384d65
--- /dev/null
+++ b/pkgs/kde/gear/calendarsupport/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "calendarsupport";
+}
diff --git a/pkgs/kde/gear/calindori/default.nix b/pkgs/kde/gear/calindori/default.nix
new file mode 100644
index 000000000000..f0b21c7986a7
--- /dev/null
+++ b/pkgs/kde/gear/calindori/default.nix
@@ -0,0 +1,15 @@
+{
+  mkKdeDerivation,
+  qtsvg,
+  qqc2-desktop-style,
+}:
+mkKdeDerivation {
+  pname = "calindori";
+
+  extraBuildInputs = [
+    qtsvg
+    qqc2-desktop-style
+  ];
+  # FIXME(qt5)
+  meta.broken = true;
+}
diff --git a/pkgs/kde/gear/cantor/default.nix b/pkgs/kde/gear/cantor/default.nix
new file mode 100644
index 000000000000..42963aabbba0
--- /dev/null
+++ b/pkgs/kde/gear/cantor/default.nix
@@ -0,0 +1,11 @@
+{
+  mkKdeDerivation,
+  shared-mime-info,
+}:
+mkKdeDerivation {
+  pname = "cantor";
+
+  extraNativeBuildInputs = [shared-mime-info];
+  # FIXME(qt5)
+  meta.broken = true;
+}
diff --git a/pkgs/kde/gear/cervisia/default.nix b/pkgs/kde/gear/cervisia/default.nix
new file mode 100644
index 000000000000..d8546e9d8a30
--- /dev/null
+++ b/pkgs/kde/gear/cervisia/default.nix
@@ -0,0 +1,6 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "cervisia";
+  # FIXME(qt5)
+  meta.broken = true;
+}
diff --git a/pkgs/kde/gear/colord-kde/default.nix b/pkgs/kde/gear/colord-kde/default.nix
new file mode 100644
index 000000000000..adacf19ba9a3
--- /dev/null
+++ b/pkgs/kde/gear/colord-kde/default.nix
@@ -0,0 +1,12 @@
+{
+  mkKdeDerivation,
+  pkg-config,
+  lcms2,
+  xorg,
+}:
+mkKdeDerivation {
+  pname = "colord-kde";
+
+  extraNativeBuildInputs = [pkg-config];
+  extraBuildInputs = [lcms2 xorg.libXrandr];
+}
diff --git a/pkgs/kde/gear/default.nix b/pkgs/kde/gear/default.nix
new file mode 100644
index 000000000000..629711d72286
--- /dev/null
+++ b/pkgs/kde/gear/default.nix
@@ -0,0 +1,248 @@
+{callPackage}: {
+  akonadi = callPackage ./akonadi {};
+  akonadi-calendar = callPackage ./akonadi-calendar {};
+  akonadi-calendar-tools = callPackage ./akonadi-calendar-tools {};
+  akonadiconsole = callPackage ./akonadiconsole {};
+  akonadi-contacts = callPackage ./akonadi-contacts {};
+  akonadi-import-wizard = callPackage ./akonadi-import-wizard {};
+  akonadi-mime = callPackage ./akonadi-mime {};
+  akonadi-notes = callPackage ./akonadi-notes {};
+  akonadi-search = callPackage ./akonadi-search {};
+  akregator = callPackage ./akregator {};
+  alligator = callPackage ./alligator {};
+  analitza = callPackage ./analitza {};
+  angelfish = callPackage ./angelfish {};
+  arianna = callPackage ./arianna {};
+  ark = callPackage ./ark {};
+  artikulate = callPackage ./artikulate {};
+  audiocd-kio = callPackage ./audiocd-kio {};
+  audiotube = callPackage ./audiotube {};
+  baloo-widgets = callPackage ./baloo-widgets {};
+  blinken = callPackage ./blinken {};
+  bomber = callPackage ./bomber {};
+  bovo = callPackage ./bovo {};
+  calendarsupport = callPackage ./calendarsupport {};
+  calindori = callPackage ./calindori {};
+  cantor = callPackage ./cantor {};
+  cervisia = callPackage ./cervisia {};
+  colord-kde = callPackage ./colord-kde {};
+  dolphin = callPackage ./dolphin {};
+  dolphin-plugins = callPackage ./dolphin-plugins {};
+  dragon = callPackage ./dragon {};
+  elisa = callPackage ./elisa {};
+  eventviews = callPackage ./eventviews {};
+  falkon = callPackage ./falkon {};
+  ffmpegthumbs = callPackage ./ffmpegthumbs {};
+  filelight = callPackage ./filelight {};
+  ghostwriter = callPackage ./ghostwriter {};
+  granatier = callPackage ./granatier {};
+  grantlee-editor = callPackage ./grantlee-editor {};
+  grantleetheme = callPackage ./grantleetheme {};
+  gwenview = callPackage ./gwenview {};
+  incidenceeditor = callPackage ./incidenceeditor {};
+  isoimagewriter = callPackage ./isoimagewriter {};
+  itinerary = callPackage ./itinerary {};
+  juk = callPackage ./juk {};
+  k3b = callPackage ./k3b {};
+  kaccounts-integration = callPackage ./kaccounts-integration {};
+  kaccounts-providers = callPackage ./kaccounts-providers {};
+  kaddressbook = callPackage ./kaddressbook {};
+  kajongg = callPackage ./kajongg {};
+  kalarm = callPackage ./kalarm {};
+  kalgebra = callPackage ./kalgebra {};
+  kalk = callPackage ./kalk {};
+  kalzium = callPackage ./kalzium {};
+  kamera = callPackage ./kamera {};
+  kamoso = callPackage ./kamoso {};
+  kanagram = callPackage ./kanagram {};
+  kapman = callPackage ./kapman {};
+  kapptemplate = callPackage ./kapptemplate {};
+  kasts = callPackage ./kasts {};
+  kate = callPackage ./kate {};
+  katomic = callPackage ./katomic {};
+  kbackup = callPackage ./kbackup {};
+  kblackbox = callPackage ./kblackbox {};
+  kblocks = callPackage ./kblocks {};
+  kbounce = callPackage ./kbounce {};
+  kbreakout = callPackage ./kbreakout {};
+  kbruch = callPackage ./kbruch {};
+  kcachegrind = callPackage ./kcachegrind {};
+  kcalc = callPackage ./kcalc {};
+  kcalutils = callPackage ./kcalutils {};
+  kcharselect = callPackage ./kcharselect {};
+  kclock = callPackage ./kclock {};
+  kcolorchooser = callPackage ./kcolorchooser {};
+  kcron = callPackage ./kcron {};
+  kdebugsettings = callPackage ./kdebugsettings {};
+  kdeconnect-kde = callPackage ./kdeconnect-kde {};
+  kde-dev-scripts = callPackage ./kde-dev-scripts {};
+  kde-dev-utils = callPackage ./kde-dev-utils {};
+  kdeedu-data = callPackage ./kdeedu-data {};
+  kdegraphics-mobipocket = callPackage ./kdegraphics-mobipocket {};
+  kdegraphics-thumbnailers = callPackage ./kdegraphics-thumbnailers {};
+  kde-inotify-survey = callPackage ./kde-inotify-survey {};
+  kdenetwork-filesharing = callPackage ./kdenetwork-filesharing {};
+  kdenlive = callPackage ./kdenlive {};
+  kdepim-addons = callPackage ./kdepim-addons {};
+  kdepim-runtime = callPackage ./kdepim-runtime {};
+  kdesdk-kio = callPackage ./kdesdk-kio {};
+  kdesdk-thumbnailers = callPackage ./kdesdk-thumbnailers {};
+  kdevelop = callPackage ./kdevelop {};
+  kdev-php = callPackage ./kdev-php {};
+  kdev-python = callPackage ./kdev-python {};
+  kdf = callPackage ./kdf {};
+  kdialog = callPackage ./kdialog {};
+  kdiamond = callPackage ./kdiamond {};
+  keditbookmarks = callPackage ./keditbookmarks {};
+  keysmith = callPackage ./keysmith {};
+  kfind = callPackage ./kfind {};
+  kfourinline = callPackage ./kfourinline {};
+  kgeography = callPackage ./kgeography {};
+  kget = callPackage ./kget {};
+  kgoldrunner = callPackage ./kgoldrunner {};
+  kgpg = callPackage ./kgpg {};
+  khangman = callPackage ./khangman {};
+  khealthcertificate = callPackage ./khealthcertificate {};
+  khelpcenter = callPackage ./khelpcenter {};
+  kidentitymanagement = callPackage ./kidentitymanagement {};
+  kig = callPackage ./kig {};
+  kigo = callPackage ./kigo {};
+  killbots = callPackage ./killbots {};
+  kimagemapeditor = callPackage ./kimagemapeditor {};
+  kimap = callPackage ./kimap {};
+  kio-admin = callPackage ./kio-admin {};
+  kio-extras = callPackage ./kio-extras {};
+  kio-extras-kf5 = callPackage ./kio-extras-kf5 {};
+  kio-gdrive = callPackage ./kio-gdrive {};
+  kio-zeroconf = callPackage ./kio-zeroconf {};
+  kipi-plugins = callPackage ./kipi-plugins {};
+  kirigami-gallery = callPackage ./kirigami-gallery {};
+  kiriki = callPackage ./kiriki {};
+  kiten = callPackage ./kiten {};
+  kitinerary = callPackage ./kitinerary {};
+  kjournald = callPackage ./kjournald {};
+  kjumpingcube = callPackage ./kjumpingcube {};
+  kldap = callPackage ./kldap {};
+  kleopatra = callPackage ./kleopatra {};
+  klettres = callPackage ./klettres {};
+  klickety = callPackage ./klickety {};
+  klines = callPackage ./klines {};
+  kmag = callPackage ./kmag {};
+  kmahjongg = callPackage ./kmahjongg {};
+  kmail = callPackage ./kmail {};
+  kmail-account-wizard = callPackage ./kmail-account-wizard {};
+  kmailtransport = callPackage ./kmailtransport {};
+  kmbox = callPackage ./kmbox {};
+  kmime = callPackage ./kmime {};
+  kmines = callPackage ./kmines {};
+  kmix = callPackage ./kmix {};
+  kmousetool = callPackage ./kmousetool {};
+  kmouth = callPackage ./kmouth {};
+  kmplot = callPackage ./kmplot {};
+  knavalbattle = callPackage ./knavalbattle {};
+  knetwalk = callPackage ./knetwalk {};
+  knights = callPackage ./knights {};
+  knotes = callPackage ./knotes {};
+  koko = callPackage ./koko {};
+  kolf = callPackage ./kolf {};
+  kollision = callPackage ./kollision {};
+  kolourpaint = callPackage ./kolourpaint {};
+  kompare = callPackage ./kompare {};
+  kongress = callPackage ./kongress {};
+  konqueror = callPackage ./konqueror {};
+  konquest = callPackage ./konquest {};
+  konsole = callPackage ./konsole {};
+  kontact = callPackage ./kontact {};
+  kontactinterface = callPackage ./kontactinterface {};
+  kontrast = callPackage ./kontrast {};
+  konversation = callPackage ./konversation {};
+  kopeninghours = callPackage ./kopeninghours {};
+  korganizer = callPackage ./korganizer {};
+  kosmindoormap = callPackage ./kosmindoormap {};
+  kpat = callPackage ./kpat {};
+  kpimtextedit = callPackage ./kpimtextedit {};
+  kpkpass = callPackage ./kpkpass {};
+  kpmcore = callPackage ./kpmcore {};
+  kpublictransport = callPackage ./kpublictransport {};
+  kqtquickcharts = callPackage ./kqtquickcharts {};
+  krdc = callPackage ./krdc {};
+  krecorder = callPackage ./krecorder {};
+  kreversi = callPackage ./kreversi {};
+  krfb = callPackage ./krfb {};
+  kross-interpreters = callPackage ./kross-interpreters {};
+  kruler = callPackage ./kruler {};
+  ksanecore = callPackage ./ksanecore {};
+  kshisen = callPackage ./kshisen {};
+  ksirk = callPackage ./ksirk {};
+  ksmtp = callPackage ./ksmtp {};
+  ksnakeduel = callPackage ./ksnakeduel {};
+  kspaceduel = callPackage ./kspaceduel {};
+  ksquares = callPackage ./ksquares {};
+  ksudoku = callPackage ./ksudoku {};
+  ksystemlog = callPackage ./ksystemlog {};
+  kteatime = callPackage ./kteatime {};
+  ktimer = callPackage ./ktimer {};
+  ktnef = callPackage ./ktnef {};
+  ktorrent = callPackage ./ktorrent {};
+  ktouch = callPackage ./ktouch {};
+  ktrip = callPackage ./ktrip {};
+  ktuberling = callPackage ./ktuberling {};
+  kturtle = callPackage ./kturtle {};
+  kubrick = callPackage ./kubrick {};
+  kwalletmanager = callPackage ./kwalletmanager {};
+  kwave = callPackage ./kwave {};
+  kweather = callPackage ./kweather {};
+  kwordquiz = callPackage ./kwordquiz {};
+  libgravatar = callPackage ./libgravatar {};
+  libkcddb = callPackage ./libkcddb {};
+  libkcompactdisc = callPackage ./libkcompactdisc {};
+  libkdcraw = callPackage ./libkdcraw {};
+  libkdegames = callPackage ./libkdegames {};
+  libkdepim = callPackage ./libkdepim {};
+  libkeduvocdocument = callPackage ./libkeduvocdocument {};
+  libkexiv2 = callPackage ./libkexiv2 {};
+  libkgapi = callPackage ./libkgapi {};
+  libkipi = callPackage ./libkipi {};
+  libkleo = callPackage ./libkleo {};
+  libkmahjongg = callPackage ./libkmahjongg {};
+  libkomparediff2 = callPackage ./libkomparediff2 {};
+  libksane = callPackage ./libksane {};
+  libksieve = callPackage ./libksieve {};
+  libktorrent = callPackage ./libktorrent {};
+  lokalize = callPackage ./lokalize {};
+  lskat = callPackage ./lskat {};
+  mailcommon = callPackage ./mailcommon {};
+  mailimporter = callPackage ./mailimporter {};
+  marble = callPackage ./marble {};
+  markdownpart = callPackage ./markdownpart {};
+  mbox-importer = callPackage ./mbox-importer {};
+  merkuro = callPackage ./merkuro {};
+  messagelib = callPackage ./messagelib {};
+  mimetreeparser = callPackage ./mimetreeparser {};
+  minuet = callPackage ./minuet {};
+  neochat = callPackage ./neochat {};
+  okular = callPackage ./okular {};
+  palapeli = callPackage ./palapeli {};
+  parley = callPackage ./parley {};
+  partitionmanager = callPackage ./partitionmanager {};
+  picmi = callPackage ./picmi {};
+  pimcommon = callPackage ./pimcommon {};
+  pim-data-exporter = callPackage ./pim-data-exporter {};
+  pim-sieve-editor = callPackage ./pim-sieve-editor {};
+  plasmatube = callPackage ./plasmatube {};
+  poxml = callPackage ./poxml {};
+  qmlkonsole = callPackage ./qmlkonsole {};
+  rocs = callPackage ./rocs {};
+  signon-kwallet-extension = callPackage ./signon-kwallet-extension {};
+  skanlite = callPackage ./skanlite {};
+  skanpage = callPackage ./skanpage {};
+  spectacle = callPackage ./spectacle {};
+  step = callPackage ./step {};
+  svgpart = callPackage ./svgpart {};
+  sweeper = callPackage ./sweeper {};
+  telly-skout = callPackage ./telly-skout {};
+  tokodon = callPackage ./tokodon {};
+  umbrello = callPackage ./umbrello {};
+  yakuake = callPackage ./yakuake {};
+  zanshin = callPackage ./zanshin {};
+}
diff --git a/pkgs/kde/gear/dolphin-plugins/default.nix b/pkgs/kde/gear/dolphin-plugins/default.nix
new file mode 100644
index 000000000000..cc88d732389f
--- /dev/null
+++ b/pkgs/kde/gear/dolphin-plugins/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "dolphin-plugins";
+}
diff --git a/pkgs/kde/gear/dolphin/default.nix b/pkgs/kde/gear/dolphin/default.nix
new file mode 100644
index 000000000000..eb70e9c9d086
--- /dev/null
+++ b/pkgs/kde/gear/dolphin/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "dolphin";
+}
diff --git a/pkgs/kde/gear/dragon/default.nix b/pkgs/kde/gear/dragon/default.nix
new file mode 100644
index 000000000000..0b1900203c05
--- /dev/null
+++ b/pkgs/kde/gear/dragon/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "dragon";
+}
diff --git a/pkgs/kde/gear/elisa/default.nix b/pkgs/kde/gear/elisa/default.nix
new file mode 100644
index 000000000000..4f4437a5794c
--- /dev/null
+++ b/pkgs/kde/gear/elisa/default.nix
@@ -0,0 +1,10 @@
+{
+  mkKdeDerivation,
+  qtmultimedia,
+  vlc,
+}:
+mkKdeDerivation {
+  pname = "elisa";
+
+  extraBuildInputs = [qtmultimedia vlc];
+}
diff --git a/pkgs/kde/gear/eventviews/default.nix b/pkgs/kde/gear/eventviews/default.nix
new file mode 100644
index 000000000000..d9d0eeb7d798
--- /dev/null
+++ b/pkgs/kde/gear/eventviews/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "eventviews";
+}
diff --git a/pkgs/kde/gear/falkon/default.nix b/pkgs/kde/gear/falkon/default.nix
new file mode 100644
index 000000000000..3fb5a9e16dbb
--- /dev/null
+++ b/pkgs/kde/gear/falkon/default.nix
@@ -0,0 +1,14 @@
+{
+  mkKdeDerivation,
+  extra-cmake-modules,
+  qtwebchannel,
+  qtwebengine,
+  qttools,
+  python3Packages,
+}:
+mkKdeDerivation {
+  pname = "falkon";
+
+  extraNativeBuildInputs = [qttools qtwebchannel qtwebengine];
+  extraBuildInputs = [extra-cmake-modules qtwebchannel qtwebengine python3Packages.pyside6];
+}
diff --git a/pkgs/kde/gear/ffmpegthumbs/default.nix b/pkgs/kde/gear/ffmpegthumbs/default.nix
new file mode 100644
index 000000000000..62bd0e10378c
--- /dev/null
+++ b/pkgs/kde/gear/ffmpegthumbs/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  ffmpeg,
+}:
+mkKdeDerivation {
+  pname = "ffmpegthumbs";
+
+  extraBuildInputs = [ffmpeg];
+}
diff --git a/pkgs/kde/gear/filelight/default.nix b/pkgs/kde/gear/filelight/default.nix
new file mode 100644
index 000000000000..938cedda3af1
--- /dev/null
+++ b/pkgs/kde/gear/filelight/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "filelight";
+}
diff --git a/pkgs/kde/gear/ghostwriter/default.nix b/pkgs/kde/gear/ghostwriter/default.nix
new file mode 100644
index 000000000000..b3620992ee40
--- /dev/null
+++ b/pkgs/kde/gear/ghostwriter/default.nix
@@ -0,0 +1,17 @@
+{
+  mkKdeDerivation,
+  qtsvg,
+  qttools,
+  qtwebchannel,
+  qtwebengine,
+  qt5compat,
+  pkg-config,
+  hunspell,
+  kdoctools,
+}:
+mkKdeDerivation {
+  pname = "ghostwriter";
+
+  extraNativeBuildInputs = [pkg-config kdoctools];
+  extraBuildInputs = [qtsvg qttools qtwebchannel qtwebengine qt5compat hunspell];
+}
diff --git a/pkgs/kde/gear/granatier/default.nix b/pkgs/kde/gear/granatier/default.nix
new file mode 100644
index 000000000000..66a763a962fe
--- /dev/null
+++ b/pkgs/kde/gear/granatier/default.nix
@@ -0,0 +1,11 @@
+{
+  mkKdeDerivation,
+  _7zz,
+  qtsvg,
+}:
+mkKdeDerivation {
+  pname = "granatier";
+
+  extraNativeBuildInputs = [_7zz];
+  extraBuildInputs = [qtsvg];
+}
diff --git a/pkgs/kde/gear/grantlee-editor/default.nix b/pkgs/kde/gear/grantlee-editor/default.nix
new file mode 100644
index 000000000000..a80ea7d8b939
--- /dev/null
+++ b/pkgs/kde/gear/grantlee-editor/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qtwebengine,
+}:
+mkKdeDerivation {
+  pname = "grantlee-editor";
+
+  extraBuildInputs = [qtwebengine];
+}
diff --git a/pkgs/kde/gear/grantleetheme/default.nix b/pkgs/kde/gear/grantleetheme/default.nix
new file mode 100644
index 000000000000..5e21e92a54e5
--- /dev/null
+++ b/pkgs/kde/gear/grantleetheme/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "grantleetheme";
+}
diff --git a/pkgs/kde/gear/gwenview/default.nix b/pkgs/kde/gear/gwenview/default.nix
new file mode 100644
index 000000000000..0f9e64696e38
--- /dev/null
+++ b/pkgs/kde/gear/gwenview/default.nix
@@ -0,0 +1,32 @@
+{
+  mkKdeDerivation,
+  qtsvg,
+  qtwayland,
+  pkg-config,
+  cfitsio,
+  exiv2,
+  baloo,
+  kimageannotator,
+  lcms2,
+  libtiff,
+  wayland,
+  wayland-protocols,
+}:
+mkKdeDerivation {
+  pname = "gwenview";
+
+  extraNativeBuildInputs = [pkg-config];
+  extraBuildInputs = [
+    qtsvg
+    qtwayland
+
+    cfitsio
+    exiv2
+    baloo
+    kimageannotator
+    lcms2
+    libtiff
+    wayland
+    wayland-protocols
+  ];
+}
diff --git a/pkgs/kde/gear/incidenceeditor/default.nix b/pkgs/kde/gear/incidenceeditor/default.nix
new file mode 100644
index 000000000000..cf8c1e7857c4
--- /dev/null
+++ b/pkgs/kde/gear/incidenceeditor/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "incidenceeditor";
+}
diff --git a/pkgs/kde/gear/isoimagewriter/default.nix b/pkgs/kde/gear/isoimagewriter/default.nix
new file mode 100644
index 000000000000..daad31ea436b
--- /dev/null
+++ b/pkgs/kde/gear/isoimagewriter/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qgpgme,
+}:
+mkKdeDerivation {
+  pname = "isoimagewriter";
+
+  extraBuildInputs = [qgpgme];
+}
diff --git a/pkgs/kde/gear/itinerary/default.nix b/pkgs/kde/gear/itinerary/default.nix
new file mode 100644
index 000000000000..29c129132071
--- /dev/null
+++ b/pkgs/kde/gear/itinerary/default.nix
@@ -0,0 +1,17 @@
+{
+  mkKdeDerivation,
+  pkg-config,
+  qtlocation,
+  qtpositioning,
+  shared-mime-info,
+  libical,
+}:
+mkKdeDerivation {
+  pname = "itinerary";
+
+  # FIXME: this should really be fixed at ECM level somehow
+  patches = [./optional-runtime-dependencies.patch];
+
+  extraNativeBuildInputs = [pkg-config shared-mime-info];
+  extraBuildInputs = [qtlocation qtpositioning libical];
+}
diff --git a/pkgs/kde/gear/itinerary/optional-runtime-dependencies.patch b/pkgs/kde/gear/itinerary/optional-runtime-dependencies.patch
new file mode 100644
index 000000000000..004122fab4c8
--- /dev/null
+++ b/pkgs/kde/gear/itinerary/optional-runtime-dependencies.patch
@@ -0,0 +1,15 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 55ae3280..cac86220 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -85,8 +85,8 @@ ecm_find_qmlmodule(QtPositioning 6.0)
+ ecm_find_qmlmodule(org.kde.kitemmodels 5.245)
+ ecm_find_qmlmodule(org.kde.prison 5.245)
+ ecm_find_qmlmodule(org.kde.prison.scanner 5.245)
+-ecm_find_qmlmodule(org.kde.kosmindoormap 24.02 REQUIRED)
+-ecm_find_qmlmodule(org.kde.kopeninghours 24.02 REQUIRED)
++ecm_find_qmlmodule(org.kde.kosmindoormap 24.02)
++ecm_find_qmlmodule(org.kde.kopeninghours 24.02)
+ 
+ # runtime dependencies are build-time dependencies on Android
+ if (ANDROID)
diff --git a/pkgs/kde/gear/juk/default.nix b/pkgs/kde/gear/juk/default.nix
new file mode 100644
index 000000000000..dec454d2385b
--- /dev/null
+++ b/pkgs/kde/gear/juk/default.nix
@@ -0,0 +1,10 @@
+{
+  mkKdeDerivation,
+  qtsvg,
+  taglib,
+}:
+mkKdeDerivation {
+  pname = "juk";
+
+  extraBuildInputs = [qtsvg taglib];
+}
diff --git a/pkgs/kde/gear/k3b/default.nix b/pkgs/kde/gear/k3b/default.nix
new file mode 100644
index 000000000000..ab6b39a2f5e4
--- /dev/null
+++ b/pkgs/kde/gear/k3b/default.nix
@@ -0,0 +1,53 @@
+{
+  lib,
+  mkKdeDerivation,
+  pkg-config,
+  qtwebengine,
+  shared-mime-info,
+  libdvdread,
+  flac,
+  libmad,
+  libsndfile,
+  lame,
+  libvorbis,
+  libsamplerate,
+  cdrdao,
+  cdrtools,
+  dvdplusrwtools,
+  libburn,
+  normalize,
+  sox,
+  transcode,
+  vcdimager,
+}:
+mkKdeDerivation {
+  pname = "k3b";
+
+  extraNativeBuildInputs = [pkg-config shared-mime-info];
+
+  # FIXME: Musicbrainz 2.x???, musepack
+  extraBuildInputs = [
+    qtwebengine
+    libdvdread
+    flac
+    libmad
+    libsndfile
+    lame
+    libvorbis
+    libsamplerate
+  ];
+
+  qtWrapperArgs = [
+    "--prefix PATH ':' ${lib.makeBinPath [
+      cdrdao
+      cdrtools
+      dvdplusrwtools
+      libburn
+      normalize
+      sox
+      transcode
+      vcdimager
+      flac
+    ]}"
+  ];
+}
diff --git a/pkgs/kde/gear/kaccounts-integration/default.nix b/pkgs/kde/gear/kaccounts-integration/default.nix
new file mode 100644
index 000000000000..1b927d3e01ef
--- /dev/null
+++ b/pkgs/kde/gear/kaccounts-integration/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  intltool,
+}:
+mkKdeDerivation {
+  pname = "kaccounts-integration";
+
+  propagatedNativeBuildInputs = [intltool];
+}
diff --git a/pkgs/kde/gear/kaccounts-providers/default.nix b/pkgs/kde/gear/kaccounts-providers/default.nix
new file mode 100644
index 000000000000..6cd2fd7e3304
--- /dev/null
+++ b/pkgs/kde/gear/kaccounts-providers/default.nix
@@ -0,0 +1,12 @@
+{
+  mkKdeDerivation,
+  intltool,
+  qtdeclarative,
+  qtwebengine,
+}:
+mkKdeDerivation {
+  pname = "kaccounts-providers";
+
+  extraNativeBuildInputs = [intltool];
+  extraBuildInputs = [qtdeclarative qtwebengine];
+}
diff --git a/pkgs/kde/gear/kaddressbook/default.nix b/pkgs/kde/gear/kaddressbook/default.nix
new file mode 100644
index 000000000000..d4e2c5820038
--- /dev/null
+++ b/pkgs/kde/gear/kaddressbook/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kaddressbook";
+}
diff --git a/pkgs/kde/gear/kajongg/default.nix b/pkgs/kde/gear/kajongg/default.nix
new file mode 100644
index 000000000000..651ac3b3115a
--- /dev/null
+++ b/pkgs/kde/gear/kajongg/default.nix
@@ -0,0 +1,12 @@
+{
+  mkKdeDerivation,
+  qtsvg,
+  python3,
+}:
+mkKdeDerivation {
+  pname = "kajongg";
+
+  extraBuildInputs = [qtsvg python3 python3.pkgs.twisted];
+  # FIXME: completely horked, is actually a Python app, needs a lot of fixing
+  meta.broken = true;
+}
diff --git a/pkgs/kde/gear/kalarm/default.nix b/pkgs/kde/gear/kalarm/default.nix
new file mode 100644
index 000000000000..439f92206967
--- /dev/null
+++ b/pkgs/kde/gear/kalarm/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kalarm";
+}
diff --git a/pkgs/kde/gear/kalgebra/default.nix b/pkgs/kde/gear/kalgebra/default.nix
new file mode 100644
index 000000000000..89aaafc04c96
--- /dev/null
+++ b/pkgs/kde/gear/kalgebra/default.nix
@@ -0,0 +1,12 @@
+{
+  mkKdeDerivation,
+  qtsvg,
+  qtwebengine,
+  ncurses,
+  readline,
+}:
+mkKdeDerivation {
+  pname = "kalgebra";
+
+  extraBuildInputs = [qtsvg qtwebengine ncurses readline];
+}
diff --git a/pkgs/kde/gear/kalk/default.nix b/pkgs/kde/gear/kalk/default.nix
new file mode 100644
index 000000000000..b2cce371346e
--- /dev/null
+++ b/pkgs/kde/gear/kalk/default.nix
@@ -0,0 +1,25 @@
+{
+  mkKdeDerivation,
+  qtdeclarative,
+  qqc2-desktop-style,
+  kirigami-addons,
+  pkg-config,
+  bison,
+  flex,
+  gmp,
+  mpfr,
+  libqalculate,
+}:
+mkKdeDerivation {
+  pname = "kalk";
+
+  extraNativeBuildInputs = [pkg-config bison flex];
+  extraBuildInputs = [
+    qtdeclarative
+    qqc2-desktop-style
+    kirigami-addons
+    gmp
+    mpfr
+    libqalculate
+  ];
+}
diff --git a/pkgs/kde/gear/kalzium/default.nix b/pkgs/kde/gear/kalzium/default.nix
new file mode 100644
index 000000000000..7e46128dc967
--- /dev/null
+++ b/pkgs/kde/gear/kalzium/default.nix
@@ -0,0 +1,16 @@
+{
+  mkKdeDerivation,
+  pkg-config,
+  ocaml,
+  eigen,
+  openbabel,
+  qtsvg,
+  qtscxml,
+}:
+mkKdeDerivation {
+  pname = "kalzium";
+
+  # FIXME: look into how to make it find libfacile
+  extraNativeBuildInputs = [pkg-config ocaml];
+  extraBuildInputs = [eigen openbabel qtsvg qtscxml];
+}
diff --git a/pkgs/kde/gear/kamera/default.nix b/pkgs/kde/gear/kamera/default.nix
new file mode 100644
index 000000000000..3ab21c99f4ed
--- /dev/null
+++ b/pkgs/kde/gear/kamera/default.nix
@@ -0,0 +1,11 @@
+{
+  mkKdeDerivation,
+  pkg-config,
+  libgphoto2,
+}:
+mkKdeDerivation {
+  pname = "kamera";
+
+  extraNativeBuildInputs = [pkg-config];
+  extraBuildInputs = [libgphoto2];
+}
diff --git a/pkgs/kde/gear/kamoso/default.nix b/pkgs/kde/gear/kamoso/default.nix
new file mode 100644
index 000000000000..b83e193f3117
--- /dev/null
+++ b/pkgs/kde/gear/kamoso/default.nix
@@ -0,0 +1,6 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kamoso";
+  # FIXME(qt5)
+  meta.broken = true;
+}
diff --git a/pkgs/kde/gear/kanagram/default.nix b/pkgs/kde/gear/kanagram/default.nix
new file mode 100644
index 000000000000..4a12b6153e15
--- /dev/null
+++ b/pkgs/kde/gear/kanagram/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qtspeech,
+}:
+mkKdeDerivation {
+  pname = "kanagram";
+
+  extraBuildInputs = [qtspeech];
+}
diff --git a/pkgs/kde/gear/kapman/default.nix b/pkgs/kde/gear/kapman/default.nix
new file mode 100644
index 000000000000..2b3599ccd3f3
--- /dev/null
+++ b/pkgs/kde/gear/kapman/default.nix
@@ -0,0 +1,11 @@
+{
+  mkKdeDerivation,
+  _7zz,
+  qtsvg,
+}:
+mkKdeDerivation {
+  pname = "kapman";
+
+  extraNativeBuildInputs = [_7zz];
+  extraBuildInputs = [qtsvg];
+}
diff --git a/pkgs/kde/gear/kapptemplate/default.nix b/pkgs/kde/gear/kapptemplate/default.nix
new file mode 100644
index 000000000000..0559bc33e522
--- /dev/null
+++ b/pkgs/kde/gear/kapptemplate/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kapptemplate";
+}
diff --git a/pkgs/kde/gear/kasts/default.nix b/pkgs/kde/gear/kasts/default.nix
new file mode 100644
index 000000000000..94fa949a78d7
--- /dev/null
+++ b/pkgs/kde/gear/kasts/default.nix
@@ -0,0 +1,21 @@
+{
+  mkKdeDerivation,
+  qtsvg,
+  qtmultimedia,
+  pkg-config,
+  qqc2-desktop-style,
+  taglib,
+  libvlc,
+}:
+mkKdeDerivation {
+  pname = "kasts";
+
+  extraNativeBuildInputs = [pkg-config];
+  extraBuildInputs = [
+    qtsvg
+    qtmultimedia
+    qqc2-desktop-style
+    taglib
+    libvlc
+  ];
+}
diff --git a/pkgs/kde/gear/kate/default.nix b/pkgs/kde/gear/kate/default.nix
new file mode 100644
index 000000000000..044b7b35e8b5
--- /dev/null
+++ b/pkgs/kde/gear/kate/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kate";
+}
diff --git a/pkgs/kde/gear/katomic/default.nix b/pkgs/kde/gear/katomic/default.nix
new file mode 100644
index 000000000000..22ce4c19c216
--- /dev/null
+++ b/pkgs/kde/gear/katomic/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "katomic";
+}
diff --git a/pkgs/kde/gear/kbackup/default.nix b/pkgs/kde/gear/kbackup/default.nix
new file mode 100644
index 000000000000..aca459e19264
--- /dev/null
+++ b/pkgs/kde/gear/kbackup/default.nix
@@ -0,0 +1,12 @@
+{
+  mkKdeDerivation,
+  qt5compat,
+  libarchive,
+  shared-mime-info,
+}:
+mkKdeDerivation {
+  pname = "kbackup";
+
+  extraNativeBuildInputs = [shared-mime-info];
+  extraBuildInputs = [qt5compat libarchive];
+}
diff --git a/pkgs/kde/gear/kblackbox/default.nix b/pkgs/kde/gear/kblackbox/default.nix
new file mode 100644
index 000000000000..2aba074ac562
--- /dev/null
+++ b/pkgs/kde/gear/kblackbox/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qtsvg,
+}:
+mkKdeDerivation {
+  pname = "kblackbox";
+
+  extraBuildInputs = [qtsvg];
+}
diff --git a/pkgs/kde/gear/kblocks/default.nix b/pkgs/kde/gear/kblocks/default.nix
new file mode 100644
index 000000000000..e184971a9491
--- /dev/null
+++ b/pkgs/kde/gear/kblocks/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qtsvg,
+}:
+mkKdeDerivation {
+  pname = "kblocks";
+
+  extraBuildInputs = [qtsvg];
+}
diff --git a/pkgs/kde/gear/kbounce/default.nix b/pkgs/kde/gear/kbounce/default.nix
new file mode 100644
index 000000000000..d94cd2cbf351
--- /dev/null
+++ b/pkgs/kde/gear/kbounce/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qtsvg,
+}:
+mkKdeDerivation {
+  pname = "kbounce";
+
+  extraBuildInputs = [qtsvg];
+}
diff --git a/pkgs/kde/gear/kbreakout/default.nix b/pkgs/kde/gear/kbreakout/default.nix
new file mode 100644
index 000000000000..34e9e8435779
--- /dev/null
+++ b/pkgs/kde/gear/kbreakout/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  _7zz,
+}:
+mkKdeDerivation {
+  pname = "kbreakout";
+
+  extraNativeBuildInputs = [_7zz];
+}
diff --git a/pkgs/kde/gear/kbruch/default.nix b/pkgs/kde/gear/kbruch/default.nix
new file mode 100644
index 000000000000..ea034aa275b9
--- /dev/null
+++ b/pkgs/kde/gear/kbruch/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kbruch";
+}
diff --git a/pkgs/kde/gear/kcachegrind/default.nix b/pkgs/kde/gear/kcachegrind/default.nix
new file mode 100644
index 000000000000..9023492d1740
--- /dev/null
+++ b/pkgs/kde/gear/kcachegrind/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qttools,
+}:
+mkKdeDerivation {
+  pname = "kcachegrind";
+
+  extraNativeBuildInputs = [qttools];
+}
diff --git a/pkgs/kde/gear/kcalc/default.nix b/pkgs/kde/gear/kcalc/default.nix
new file mode 100644
index 000000000000..66bffedbb3c0
--- /dev/null
+++ b/pkgs/kde/gear/kcalc/default.nix
@@ -0,0 +1,13 @@
+{
+  mkKdeDerivation,
+  qt5compat,
+  gmp,
+  mpfr,
+  kdoctools,
+}:
+mkKdeDerivation {
+  pname = "kcalc";
+
+  extraNativeBuildInputs = [kdoctools];
+  extraBuildInputs = [qt5compat gmp mpfr];
+}
diff --git a/pkgs/kde/gear/kcalutils/default.nix b/pkgs/kde/gear/kcalutils/default.nix
new file mode 100644
index 000000000000..1b58cce9ff00
--- /dev/null
+++ b/pkgs/kde/gear/kcalutils/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kcalutils";
+}
diff --git a/pkgs/kde/gear/kcharselect/default.nix b/pkgs/kde/gear/kcharselect/default.nix
new file mode 100644
index 000000000000..1fffb87d32cd
--- /dev/null
+++ b/pkgs/kde/gear/kcharselect/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kcharselect";
+}
diff --git a/pkgs/kde/gear/kclock/default.nix b/pkgs/kde/gear/kclock/default.nix
new file mode 100644
index 000000000000..97db5fd92f0e
--- /dev/null
+++ b/pkgs/kde/gear/kclock/default.nix
@@ -0,0 +1,10 @@
+{
+  mkKdeDerivation,
+  qtsvg,
+  qtmultimedia,
+}:
+mkKdeDerivation {
+  pname = "kclock";
+
+  extraBuildInputs = [qtsvg qtmultimedia];
+}
diff --git a/pkgs/kde/gear/kcolorchooser/default.nix b/pkgs/kde/gear/kcolorchooser/default.nix
new file mode 100644
index 000000000000..5e82c5c2c36f
--- /dev/null
+++ b/pkgs/kde/gear/kcolorchooser/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kcolorchooser";
+}
diff --git a/pkgs/kde/gear/kcron/default.nix b/pkgs/kde/gear/kcron/default.nix
new file mode 100644
index 000000000000..b1707101d49f
--- /dev/null
+++ b/pkgs/kde/gear/kcron/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kcron";
+}
diff --git a/pkgs/kde/gear/kde-dev-scripts/default.nix b/pkgs/kde/gear/kde-dev-scripts/default.nix
new file mode 100644
index 000000000000..7e82f80b8114
--- /dev/null
+++ b/pkgs/kde/gear/kde-dev-scripts/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kde-dev-scripts";
+}
diff --git a/pkgs/kde/gear/kde-dev-utils/default.nix b/pkgs/kde/gear/kde-dev-utils/default.nix
new file mode 100644
index 000000000000..6efce8354eec
--- /dev/null
+++ b/pkgs/kde/gear/kde-dev-utils/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qttools,
+}:
+mkKdeDerivation {
+  pname = "kde-dev-utils";
+
+  extraBuildInputs = [qttools];
+}
diff --git a/pkgs/kde/gear/kde-inotify-survey/default.nix b/pkgs/kde/gear/kde-inotify-survey/default.nix
new file mode 100644
index 000000000000..810fa3984093
--- /dev/null
+++ b/pkgs/kde/gear/kde-inotify-survey/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kde-inotify-survey";
+}
diff --git a/pkgs/kde/gear/kdebugsettings/default.nix b/pkgs/kde/gear/kdebugsettings/default.nix
new file mode 100644
index 000000000000..47431c60aa2d
--- /dev/null
+++ b/pkgs/kde/gear/kdebugsettings/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kdebugsettings";
+}
diff --git a/pkgs/kde/gear/kdeconnect-kde/default.nix b/pkgs/kde/gear/kdeconnect-kde/default.nix
new file mode 100644
index 000000000000..fd8868cf41c2
--- /dev/null
+++ b/pkgs/kde/gear/kdeconnect-kde/default.nix
@@ -0,0 +1,20 @@
+{
+  mkKdeDerivation,
+  qtconnectivity,
+  qtmultimedia,
+  qtwayland,
+  pkg-config,
+  wayland,
+  wayland-protocols,
+  libfakekey,
+}:
+mkKdeDerivation {
+  pname = "kdeconnect-kde";
+
+  extraNativeBuildInputs = [pkg-config];
+  extraBuildInputs = [qtconnectivity qtmultimedia qtwayland wayland wayland-protocols libfakekey];
+
+  extraCmakeFlags = [
+    "-DQtWaylandScanner_EXECUTABLE=${qtwayland}/libexec/qtwaylandscanner"
+  ];
+}
diff --git a/pkgs/kde/gear/kdeedu-data/default.nix b/pkgs/kde/gear/kdeedu-data/default.nix
new file mode 100644
index 000000000000..74bc3921389c
--- /dev/null
+++ b/pkgs/kde/gear/kdeedu-data/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kdeedu-data";
+}
diff --git a/pkgs/kde/gear/kdegraphics-mobipocket/default.nix b/pkgs/kde/gear/kdegraphics-mobipocket/default.nix
new file mode 100644
index 000000000000..7636cbe1dd27
--- /dev/null
+++ b/pkgs/kde/gear/kdegraphics-mobipocket/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qt5compat,
+}:
+mkKdeDerivation {
+  pname = "kdegraphics-mobipocket";
+
+  extraBuildInputs = [qt5compat];
+}
diff --git a/pkgs/kde/gear/kdegraphics-thumbnailers/default.nix b/pkgs/kde/gear/kdegraphics-thumbnailers/default.nix
new file mode 100644
index 000000000000..bfb3ba1fc850
--- /dev/null
+++ b/pkgs/kde/gear/kdegraphics-thumbnailers/default.nix
@@ -0,0 +1,17 @@
+{
+  mkKdeDerivation,
+  substituteAll,
+  ghostscript,
+}:
+mkKdeDerivation {
+  pname = "kdegraphics-thumbnailers";
+
+  patches = [
+    # Hardcode patches to Ghostscript so PDF thumbnails work OOTB.
+    # Intentionally not doing the same for dvips because TeX is big.
+    (substituteAll {
+      gs = "${ghostscript}/bin/gs";
+      src = ./gs-paths.patch;
+    })
+  ];
+}
diff --git a/pkgs/kde/gear/kdegraphics-thumbnailers/gs-paths.patch b/pkgs/kde/gear/kdegraphics-thumbnailers/gs-paths.patch
new file mode 100644
index 000000000000..5aa4a8d7444c
--- /dev/null
+++ b/pkgs/kde/gear/kdegraphics-thumbnailers/gs-paths.patch
@@ -0,0 +1,22 @@
+diff --git a/ps/gscreator.cpp b/ps/gscreator.cpp
+index 5b84e49..cbb7c25 100644
+--- a/ps/gscreator.cpp
++++ b/ps/gscreator.cpp
+@@ -101,7 +101,7 @@ static const char *epsprolog =
+     "[ ] 0 setdash newpath false setoverprint false setstrokeadjust\n";
+ 
+ static const char * gsargs_ps[] = {
+-    "gs",
++    "@gs@",
+     "-sDEVICE=png16m",
+     "-sOutputFile=-",
+     "-dSAFER",
+@@ -120,7 +120,7 @@ static const char * gsargs_ps[] = {
+ };
+ 
+ static const char * gsargs_eps[] = {
+-    "gs",
++    "@gs@",
+     "-sDEVICE=png16m",
+     "-sOutputFile=-",
+     "-dSAFER",
diff --git a/pkgs/kde/gear/kdenetwork-filesharing/default.nix b/pkgs/kde/gear/kdenetwork-filesharing/default.nix
new file mode 100644
index 000000000000..a91dc2529503
--- /dev/null
+++ b/pkgs/kde/gear/kdenetwork-filesharing/default.nix
@@ -0,0 +1,14 @@
+{
+  mkKdeDerivation,
+  qtdeclarative,
+}:
+mkKdeDerivation {
+  pname = "kdenetwork-filesharing";
+
+  patches = [./smbd-path.patch];
+
+  extraBuildInputs = [qtdeclarative];
+
+  # We can't actually install samba via PackageKit, so let's not confuse users any more than we have to
+  extraCmakeFlags = ["-DSAMBA_INSTALL=OFF"];
+}
diff --git a/pkgs/kde/gear/kdenetwork-filesharing/smbd-path.patch b/pkgs/kde/gear/kdenetwork-filesharing/smbd-path.patch
new file mode 100644
index 000000000000..e6e4e73333a7
--- /dev/null
+++ b/pkgs/kde/gear/kdenetwork-filesharing/smbd-path.patch
@@ -0,0 +1,14 @@
+diff --git a/samba/filepropertiesplugin/sambausershareplugin.cpp b/samba/filepropertiesplugin/sambausershareplugin.cpp
+index d5c8d77..11c45d4 100644
+--- a/samba/filepropertiesplugin/sambausershareplugin.cpp
++++ b/samba/filepropertiesplugin/sambausershareplugin.cpp
+@@ -112,7 +112,8 @@ SambaUserSharePlugin::SambaUserSharePlugin(QObject *parent)
+ bool SambaUserSharePlugin::isSambaInstalled()
+ {
+     return QFile::exists(QStringLiteral("/usr/sbin/smbd"))
+-        || QFile::exists(QStringLiteral("/usr/local/sbin/smbd"));
++        || QFile::exists(QStringLiteral("/usr/local/sbin/smbd"))
++        || QFile::exists(QStringLiteral("/run/current-system/sw/bin/smbd"));
+ }
+ 
+ void SambaUserSharePlugin::showSambaStatus()
diff --git a/pkgs/kde/gear/kdenlive/default.nix b/pkgs/kde/gear/kdenlive/default.nix
new file mode 100644
index 000000000000..49643826b9e2
--- /dev/null
+++ b/pkgs/kde/gear/kdenlive/default.nix
@@ -0,0 +1,40 @@
+{
+  mkKdeDerivation,
+  substituteAll,
+  qtsvg,
+  qtmultimedia,
+  qtnetworkauth,
+  ffmpeg-full,
+  mediainfo,
+  mlt,
+  shared-mime-info,
+  libv4l,
+  frei0r,
+}:
+mkKdeDerivation {
+  pname = "kdenlive";
+
+  patches = [
+    (
+      substituteAll {
+        src = ./dependency-paths.patch;
+        inherit mediainfo mlt;
+        ffmpeg = ffmpeg-full;
+      }
+    )
+  ];
+
+  extraBuildInputs = [
+    qtsvg
+    qtmultimedia
+    qtnetworkauth
+
+    mlt
+    shared-mime-info
+    libv4l
+  ];
+
+  qtWrapperArgs = [
+    "--set FREI0R_PATH ${frei0r}/lib/frei0r-1"
+  ];
+}
diff --git a/pkgs/kde/gear/kdenlive/dependency-paths.patch b/pkgs/kde/gear/kdenlive/dependency-paths.patch
new file mode 100644
index 000000000000..7fd04bd5114d
--- /dev/null
+++ b/pkgs/kde/gear/kdenlive/dependency-paths.patch
@@ -0,0 +1,46 @@
+diff --git a/src/kdenlivesettings.kcfg b/src/kdenlivesettings.kcfg
+index 029849e5f..8befe4888 100644
+--- a/src/kdenlivesettings.kcfg
++++ b/src/kdenlivesettings.kcfg
+@@ -517,7 +517,7 @@
+   <group name="env">
+     <entry name="mltpath" type="Path">
+       <label>Mlt framework install path.</label>
+-      <default></default>
++      <default>@mlt@/share/mlt-7/profiles</default>
+     </entry>
+ 
+     <entry name="kdenliverendererpath" type="Path">
+@@ -527,27 +527,27 @@
+ 
+     <entry name="meltpath" type="Path">
+       <label>Mlt melt renderer install path.</label>
+-      <default></default>
++      <default>@mlt@/bin/melt</default>
+     </entry>
+ 
+     <entry name="ffmpegpath" type="Path">
+       <label>FFmpeg / Libav binary path.</label>
+-      <default></default>
++      <default>@ffmpeg@/bin/ffmpeg</default>
+     </entry>
+ 
+     <entry name="ffplaypath" type="Path">
+       <label>FFplay / avplay binary path.</label>
+-      <default></default>
++      <default>@ffmpeg@/bin/ffplay</default>
+     </entry>
+ 
+     <entry name="ffprobepath" type="Path">
+       <label>FFprobe / avprobe binary path.</label>
+-      <default></default>
++      <default>@ffmpeg@/bin/ffprobe</default>
+     </entry>
+ 
+     <entry name="mediainfopath" type="Path">
+       <label>mediaInfo binary path.</label>
+-      <default></default>
++      <default>@mediainfo@/bin/mediainfo</default>
+     </entry>
+ 
+     <entry name="processingthreads" type="Int">
diff --git a/pkgs/kde/gear/kdepim-addons/default.nix b/pkgs/kde/gear/kdepim-addons/default.nix
new file mode 100644
index 000000000000..66c24a91bdee
--- /dev/null
+++ b/pkgs/kde/gear/kdepim-addons/default.nix
@@ -0,0 +1,35 @@
+{
+  mkKdeDerivation,
+  sources,
+  rustPlatform,
+  cargo,
+  rustc,
+  corrosion,
+  discount,
+  alpaka,
+  # provided as callPackage input to enable easier overrides through overlays
+  cargoHash ? "sha256-z2W2TxyN6Ye+KUaqz5nPAG5zxeABu/UXWuz+XpDpNfc=",
+}:
+mkKdeDerivation rec {
+  pname = "kdepim-addons";
+
+  inherit (sources.${pname}) version;
+
+  cargoRoot = "plugins/webengineurlinterceptor/adblock";
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    # include version in the name so we invalidate the FOD
+    name = "${pname}-${version}";
+    src = sources.${pname};
+    sourceRoot = "${pname}-${version}/${cargoRoot}";
+    hash = cargoHash;
+  };
+
+  extraNativeBuildInputs = [
+    rustPlatform.cargoSetupHook
+    cargo
+    rustc
+  ];
+
+  extraBuildInputs = [corrosion discount alpaka];
+}
diff --git a/pkgs/kde/gear/kdepim-runtime/default.nix b/pkgs/kde/gear/kdepim-runtime/default.nix
new file mode 100644
index 000000000000..75c0d927ce80
--- /dev/null
+++ b/pkgs/kde/gear/kdepim-runtime/default.nix
@@ -0,0 +1,15 @@
+{
+  mkKdeDerivation,
+  shared-mime-info,
+  qtnetworkauth,
+  qtspeech,
+  qtwebengine,
+  cyrus_sasl,
+}:
+mkKdeDerivation {
+  pname = "kdepim-runtime";
+
+  extraNativeBuildInputs = [shared-mime-info];
+  # FIXME: libkolabxml, libetebase
+  extraBuildInputs = [qtnetworkauth qtspeech qtwebengine cyrus_sasl];
+}
diff --git a/pkgs/kde/gear/kdesdk-kio/default.nix b/pkgs/kde/gear/kdesdk-kio/default.nix
new file mode 100644
index 000000000000..24715d90f6c9
--- /dev/null
+++ b/pkgs/kde/gear/kdesdk-kio/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kdesdk-kio";
+}
diff --git a/pkgs/kde/gear/kdesdk-thumbnailers/default.nix b/pkgs/kde/gear/kdesdk-thumbnailers/default.nix
new file mode 100644
index 000000000000..727fff83b3d2
--- /dev/null
+++ b/pkgs/kde/gear/kdesdk-thumbnailers/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kdesdk-thumbnailers";
+}
diff --git a/pkgs/kde/gear/kdev-php/default.nix b/pkgs/kde/gear/kdev-php/default.nix
new file mode 100644
index 000000000000..79e34ab94b46
--- /dev/null
+++ b/pkgs/kde/gear/kdev-php/default.nix
@@ -0,0 +1,6 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kdev-php";
+  # FIXME(qt5)
+  meta.broken = true;
+}
diff --git a/pkgs/kde/gear/kdev-python/default.nix b/pkgs/kde/gear/kdev-python/default.nix
new file mode 100644
index 000000000000..91a52fc7226c
--- /dev/null
+++ b/pkgs/kde/gear/kdev-python/default.nix
@@ -0,0 +1,6 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kdev-python";
+  # FIXME(qt5)
+  meta.broken = true;
+}
diff --git a/pkgs/kde/gear/kdevelop/default.nix b/pkgs/kde/gear/kdevelop/default.nix
new file mode 100644
index 000000000000..c38d6f93681b
--- /dev/null
+++ b/pkgs/kde/gear/kdevelop/default.nix
@@ -0,0 +1,11 @@
+{
+  mkKdeDerivation,
+  extra-cmake-modules,
+}:
+mkKdeDerivation {
+  pname = "kdevelop";
+
+  extraBuildInputs = [extra-cmake-modules];
+  # FIXME(qt5)
+  meta.broken = true;
+}
diff --git a/pkgs/kde/gear/kdf/default.nix b/pkgs/kde/gear/kdf/default.nix
new file mode 100644
index 000000000000..8021e701cbaa
--- /dev/null
+++ b/pkgs/kde/gear/kdf/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kdf";
+}
diff --git a/pkgs/kde/gear/kdialog/default.nix b/pkgs/kde/gear/kdialog/default.nix
new file mode 100644
index 000000000000..2ef126650578
--- /dev/null
+++ b/pkgs/kde/gear/kdialog/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kdialog";
+}
diff --git a/pkgs/kde/gear/kdiamond/default.nix b/pkgs/kde/gear/kdiamond/default.nix
new file mode 100644
index 000000000000..a45a3c6f1093
--- /dev/null
+++ b/pkgs/kde/gear/kdiamond/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  _7zz,
+}:
+mkKdeDerivation {
+  pname = "kdiamond";
+
+  extraNativeBuildInputs = [_7zz];
+}
diff --git a/pkgs/kde/gear/keditbookmarks/default.nix b/pkgs/kde/gear/keditbookmarks/default.nix
new file mode 100644
index 000000000000..8eec9c76ec75
--- /dev/null
+++ b/pkgs/kde/gear/keditbookmarks/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "keditbookmarks";
+}
diff --git a/pkgs/kde/gear/keysmith/default.nix b/pkgs/kde/gear/keysmith/default.nix
new file mode 100644
index 000000000000..a468409ff182
--- /dev/null
+++ b/pkgs/kde/gear/keysmith/default.nix
@@ -0,0 +1,12 @@
+{
+  mkKdeDerivation,
+  qtsvg,
+  pkg-config,
+  libsodium,
+}:
+mkKdeDerivation {
+  pname = "keysmith";
+
+  extraNativeBuildInputs = [pkg-config];
+  extraBuildInputs = [qtsvg libsodium];
+}
diff --git a/pkgs/kde/gear/kfind/default.nix b/pkgs/kde/gear/kfind/default.nix
new file mode 100644
index 000000000000..c0216e301575
--- /dev/null
+++ b/pkgs/kde/gear/kfind/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qt5compat,
+}:
+mkKdeDerivation {
+  pname = "kfind";
+
+  extraBuildInputs = [qt5compat];
+}
diff --git a/pkgs/kde/gear/kfourinline/default.nix b/pkgs/kde/gear/kfourinline/default.nix
new file mode 100644
index 000000000000..5e1d6fba0ef0
--- /dev/null
+++ b/pkgs/kde/gear/kfourinline/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qtsvg,
+}:
+mkKdeDerivation {
+  pname = "kfourinline";
+
+  extraBuildInputs = [qtsvg];
+}
diff --git a/pkgs/kde/gear/kgeography/default.nix b/pkgs/kde/gear/kgeography/default.nix
new file mode 100644
index 000000000000..aa9f878bbb9b
--- /dev/null
+++ b/pkgs/kde/gear/kgeography/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kgeography";
+}
diff --git a/pkgs/kde/gear/kget/default.nix b/pkgs/kde/gear/kget/default.nix
new file mode 100644
index 000000000000..d6a4fadfd5d6
--- /dev/null
+++ b/pkgs/kde/gear/kget/default.nix
@@ -0,0 +1,10 @@
+{
+  mkKdeDerivation,
+  qgpgme,
+  libmms,
+}:
+mkKdeDerivation {
+  pname = "kget";
+
+  extraBuildInputs = [qgpgme libmms];
+}
diff --git a/pkgs/kde/gear/kgoldrunner/default.nix b/pkgs/kde/gear/kgoldrunner/default.nix
new file mode 100644
index 000000000000..8d303e07cac7
--- /dev/null
+++ b/pkgs/kde/gear/kgoldrunner/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  _7zz,
+}:
+mkKdeDerivation {
+  pname = "kgoldrunner";
+
+  extraNativeBuildInputs = [_7zz];
+}
diff --git a/pkgs/kde/gear/kgpg/default.nix b/pkgs/kde/gear/kgpg/default.nix
new file mode 100644
index 000000000000..65f9a55221b5
--- /dev/null
+++ b/pkgs/kde/gear/kgpg/default.nix
@@ -0,0 +1,11 @@
+{
+  mkKdeDerivation,
+  pkg-config,
+  gpgme,
+}:
+mkKdeDerivation {
+  pname = "kgpg";
+
+  extraNativeBuildInputs = [pkg-config];
+  extraBuildInputs = [gpgme];
+}
diff --git a/pkgs/kde/gear/khangman/default.nix b/pkgs/kde/gear/khangman/default.nix
new file mode 100644
index 000000000000..27da76e397e3
--- /dev/null
+++ b/pkgs/kde/gear/khangman/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qtsvg,
+}:
+mkKdeDerivation {
+  pname = "khangman";
+
+  extraBuildInputs = [qtsvg];
+}
diff --git a/pkgs/kde/gear/khealthcertificate/default.nix b/pkgs/kde/gear/khealthcertificate/default.nix
new file mode 100644
index 000000000000..6d5461bffc3c
--- /dev/null
+++ b/pkgs/kde/gear/khealthcertificate/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qtdeclarative,
+}:
+mkKdeDerivation {
+  pname = "khealthcertificate";
+
+  extraNativeBuildInputs = [qtdeclarative];
+}
diff --git a/pkgs/kde/gear/khelpcenter/default.nix b/pkgs/kde/gear/khelpcenter/default.nix
new file mode 100644
index 000000000000..d60e16e3c163
--- /dev/null
+++ b/pkgs/kde/gear/khelpcenter/default.nix
@@ -0,0 +1,10 @@
+{
+  mkKdeDerivation,
+  qtwebengine,
+  xapian,
+}:
+mkKdeDerivation {
+  pname = "khelpcenter";
+
+  extraBuildInputs = [qtwebengine xapian];
+}
diff --git a/pkgs/kde/gear/kidentitymanagement/default.nix b/pkgs/kde/gear/kidentitymanagement/default.nix
new file mode 100644
index 000000000000..c66c416fd7ce
--- /dev/null
+++ b/pkgs/kde/gear/kidentitymanagement/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qtdeclarative,
+}:
+mkKdeDerivation {
+  pname = "kidentitymanagement";
+
+  extraBuildInputs = [qtdeclarative];
+}
diff --git a/pkgs/kde/gear/kig/default.nix b/pkgs/kde/gear/kig/default.nix
new file mode 100644
index 000000000000..a3e4de99e6a8
--- /dev/null
+++ b/pkgs/kde/gear/kig/default.nix
@@ -0,0 +1,6 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kig";
+  # FIXME(qt5)
+  meta.broken = true;
+}
diff --git a/pkgs/kde/gear/kigo/default.nix b/pkgs/kde/gear/kigo/default.nix
new file mode 100644
index 000000000000..819fb69b0c0f
--- /dev/null
+++ b/pkgs/kde/gear/kigo/default.nix
@@ -0,0 +1,11 @@
+{
+  mkKdeDerivation,
+  _7zz,
+  qtsvg,
+}:
+mkKdeDerivation {
+  pname = "kigo";
+
+  extraNativeBuildInputs = [_7zz];
+  extraBuildInputs = [qtsvg];
+}
diff --git a/pkgs/kde/gear/killbots/default.nix b/pkgs/kde/gear/killbots/default.nix
new file mode 100644
index 000000000000..03dcdb0d31fe
--- /dev/null
+++ b/pkgs/kde/gear/killbots/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  _7zz,
+}:
+mkKdeDerivation {
+  pname = "killbots";
+
+  extraNativeBuildInputs = [_7zz];
+}
diff --git a/pkgs/kde/gear/kimagemapeditor/default.nix b/pkgs/kde/gear/kimagemapeditor/default.nix
new file mode 100644
index 000000000000..fa19f24cd34b
--- /dev/null
+++ b/pkgs/kde/gear/kimagemapeditor/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qtwebengine,
+}:
+mkKdeDerivation {
+  pname = "kimagemapeditor";
+
+  extraBuildInputs = [qtwebengine];
+}
diff --git a/pkgs/kde/gear/kimap/default.nix b/pkgs/kde/gear/kimap/default.nix
new file mode 100644
index 000000000000..d106166ec4a6
--- /dev/null
+++ b/pkgs/kde/gear/kimap/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  cyrus_sasl,
+}:
+mkKdeDerivation {
+  pname = "kimap";
+
+  extraBuildInputs = [cyrus_sasl];
+}
diff --git a/pkgs/kde/gear/kio-admin/default.nix b/pkgs/kde/gear/kio-admin/default.nix
new file mode 100644
index 000000000000..042253978983
--- /dev/null
+++ b/pkgs/kde/gear/kio-admin/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kio-admin";
+}
diff --git a/pkgs/kde/gear/kio-extras-kf5/default.nix b/pkgs/kde/gear/kio-extras-kf5/default.nix
new file mode 100644
index 000000000000..d92f7a61b8a2
--- /dev/null
+++ b/pkgs/kde/gear/kio-extras-kf5/default.nix
@@ -0,0 +1,62 @@
+{
+  stdenv,
+  sources,
+  kio-extras,
+  cmake,
+  libsForQt5,
+  samba,
+  libssh,
+  libmtp,
+  libimobiledevice,
+  gperf,
+  libtirpc,
+  openexr,
+  taglib,
+  libappimage,
+}:
+stdenv.mkDerivation rec {
+  pname = "kio-extras-kf5";
+  inherit (sources.${pname}) version;
+
+  src = sources.${pname};
+
+  nativeBuildInputs = with libsForQt5; [
+    cmake
+    extra-cmake-modules
+    wrapQtAppsHook
+  ];
+
+  buildInputs = with libsForQt5; [
+    qtbase
+
+    kactivities
+    kactivities-stats
+    karchive
+    kconfig
+    kconfigwidgets
+    kcoreaddons
+    kdbusaddons
+    kdnssd
+    kdoctools
+    kdsoap
+    kguiaddons
+    ki18n
+    kio
+    libkexiv2
+    phonon
+    solid
+    syntax-highlighting
+
+    samba
+    libssh
+    libmtp
+    libimobiledevice
+    gperf
+    libtirpc
+    openexr
+    taglib
+    libappimage
+  ];
+
+  meta = kio-extras.meta;
+}
diff --git a/pkgs/kde/gear/kio-extras/default.nix b/pkgs/kde/gear/kio-extras/default.nix
new file mode 100644
index 000000000000..b80f9175a5e9
--- /dev/null
+++ b/pkgs/kde/gear/kio-extras/default.nix
@@ -0,0 +1,45 @@
+{
+  mkKdeDerivation,
+  qt5compat,
+  qtsvg,
+  pkg-config,
+  libkexiv2,
+  samba,
+  libssh,
+  libmtp,
+  libimobiledevice,
+  gperf,
+  libtirpc,
+  openexr,
+  taglib,
+  shared-mime-info,
+  libappimage,
+  xorg,
+  kio,
+}:
+mkKdeDerivation {
+  pname = "kio-extras";
+
+  extraNativeBuildInputs = [pkg-config shared-mime-info];
+  extraBuildInputs = [
+    qt5compat
+    qtsvg
+    libkexiv2
+
+    samba
+    libssh
+    libmtp
+    libimobiledevice
+    gperf
+    libtirpc
+    openexr
+    taglib
+    libappimage
+    xorg.libXcursor
+  ];
+
+  postInstall = ''
+    substituteInPlace $out/share/dbus-1/services/org.kde.kmtpd5.service \
+      --replace-fail Exec=$out/libexec/kf6/kiod6 Exec=${kio}/libexec/kf6/kiod6
+  '';
+}
diff --git a/pkgs/kde/gear/kio-gdrive/default.nix b/pkgs/kde/gear/kio-gdrive/default.nix
new file mode 100644
index 000000000000..1c28dd3dcd10
--- /dev/null
+++ b/pkgs/kde/gear/kio-gdrive/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kio-gdrive";
+}
diff --git a/pkgs/kde/gear/kio-zeroconf/default.nix b/pkgs/kde/gear/kio-zeroconf/default.nix
new file mode 100644
index 000000000000..0b731162af83
--- /dev/null
+++ b/pkgs/kde/gear/kio-zeroconf/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kio-zeroconf";
+}
diff --git a/pkgs/kde/gear/kipi-plugins/default.nix b/pkgs/kde/gear/kipi-plugins/default.nix
new file mode 100644
index 000000000000..a0a074b86a97
--- /dev/null
+++ b/pkgs/kde/gear/kipi-plugins/default.nix
@@ -0,0 +1,6 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kipi-plugins";
+  # FIXME(qt5)
+  meta.broken = true;
+}
diff --git a/pkgs/kde/gear/kirigami-gallery/default.nix b/pkgs/kde/gear/kirigami-gallery/default.nix
new file mode 100644
index 000000000000..e3ff036ad5e8
--- /dev/null
+++ b/pkgs/kde/gear/kirigami-gallery/default.nix
@@ -0,0 +1,11 @@
+{
+  mkKdeDerivation,
+  qtsvg,
+}:
+mkKdeDerivation {
+  pname = "kirigami-gallery";
+
+  extraBuildInputs = [qtsvg];
+  # FIXME(qt5)
+  meta.broken = true;
+}
diff --git a/pkgs/kde/gear/kiriki/default.nix b/pkgs/kde/gear/kiriki/default.nix
new file mode 100644
index 000000000000..a8344ef973cb
--- /dev/null
+++ b/pkgs/kde/gear/kiriki/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kiriki";
+}
diff --git a/pkgs/kde/gear/kiten/default.nix b/pkgs/kde/gear/kiten/default.nix
new file mode 100644
index 000000000000..5f87c6c66b39
--- /dev/null
+++ b/pkgs/kde/gear/kiten/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kiten";
+}
diff --git a/pkgs/kde/gear/kitinerary/default.nix b/pkgs/kde/gear/kitinerary/default.nix
new file mode 100644
index 000000000000..de3f4ef00005
--- /dev/null
+++ b/pkgs/kde/gear/kitinerary/default.nix
@@ -0,0 +1,21 @@
+{
+  mkKdeDerivation,
+  qtsvg,
+  qtdeclarative,
+  shared-mime-info,
+  poppler,
+  libphonenumber,
+  protobuf,
+}:
+mkKdeDerivation {
+  pname = "kitinerary";
+
+  extraNativeBuildInputs = [shared-mime-info];
+  extraBuildInputs = [
+    qtsvg
+    qtdeclarative
+    poppler
+    libphonenumber
+    protobuf
+  ];
+}
diff --git a/pkgs/kde/gear/kjournald/default.nix b/pkgs/kde/gear/kjournald/default.nix
new file mode 100644
index 000000000000..d03e8b815ae4
--- /dev/null
+++ b/pkgs/kde/gear/kjournald/default.nix
@@ -0,0 +1,12 @@
+{
+  mkKdeDerivation,
+  qtdeclarative,
+  pkg-config,
+  systemd,
+}:
+mkKdeDerivation {
+  pname = "kjournald";
+
+  extraNativeBuildInputs = [pkg-config];
+  extraBuildInputs = [qtdeclarative systemd];
+}
diff --git a/pkgs/kde/gear/kjumpingcube/default.nix b/pkgs/kde/gear/kjumpingcube/default.nix
new file mode 100644
index 000000000000..c13ece29da89
--- /dev/null
+++ b/pkgs/kde/gear/kjumpingcube/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qtsvg,
+}:
+mkKdeDerivation {
+  pname = "kjumpingcube";
+
+  extraBuildInputs = [qtsvg];
+}
diff --git a/pkgs/kde/gear/kldap/default.nix b/pkgs/kde/gear/kldap/default.nix
new file mode 100644
index 000000000000..99c17b169147
--- /dev/null
+++ b/pkgs/kde/gear/kldap/default.nix
@@ -0,0 +1,10 @@
+{
+  mkKdeDerivation,
+  cyrus_sasl,
+  openldap,
+}:
+mkKdeDerivation {
+  pname = "kldap";
+
+  extraBuildInputs = [cyrus_sasl openldap];
+}
diff --git a/pkgs/kde/gear/kleopatra/default.nix b/pkgs/kde/gear/kleopatra/default.nix
new file mode 100644
index 000000000000..58d3f4b5a9cf
--- /dev/null
+++ b/pkgs/kde/gear/kleopatra/default.nix
@@ -0,0 +1,11 @@
+{
+  mkKdeDerivation,
+  shared-mime-info,
+  akonadi-mime,
+}:
+mkKdeDerivation {
+  pname = "kleopatra";
+
+  extraNativeBuildInputs = [shared-mime-info];
+  extraBuildInputs = [akonadi-mime];
+}
diff --git a/pkgs/kde/gear/klettres/default.nix b/pkgs/kde/gear/klettres/default.nix
new file mode 100644
index 000000000000..ecf58d98fc37
--- /dev/null
+++ b/pkgs/kde/gear/klettres/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qtsvg,
+}:
+mkKdeDerivation {
+  pname = "klettres";
+
+  extraBuildInputs = [qtsvg];
+}
diff --git a/pkgs/kde/gear/klickety/default.nix b/pkgs/kde/gear/klickety/default.nix
new file mode 100644
index 000000000000..0df68937124b
--- /dev/null
+++ b/pkgs/kde/gear/klickety/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "klickety";
+}
diff --git a/pkgs/kde/gear/klines/default.nix b/pkgs/kde/gear/klines/default.nix
new file mode 100644
index 000000000000..5399962382b0
--- /dev/null
+++ b/pkgs/kde/gear/klines/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "klines";
+}
diff --git a/pkgs/kde/gear/kmag/default.nix b/pkgs/kde/gear/kmag/default.nix
new file mode 100644
index 000000000000..24e6643b3b59
--- /dev/null
+++ b/pkgs/kde/gear/kmag/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kmag";
+}
diff --git a/pkgs/kde/gear/kmahjongg/default.nix b/pkgs/kde/gear/kmahjongg/default.nix
new file mode 100644
index 000000000000..9ad776f3c6f4
--- /dev/null
+++ b/pkgs/kde/gear/kmahjongg/default.nix
@@ -0,0 +1,13 @@
+{
+  mkKdeDerivation,
+  qtdeclarative,
+  qtsvg,
+  libkmahjongg,
+}:
+mkKdeDerivation {
+  pname = "kmahjongg";
+
+  extraBuildInputs = [qtdeclarative qtsvg];
+
+  qtWrapperArgs = ["--prefix XDG_DATA_DIRS : ${libkmahjongg}/share"];
+}
diff --git a/pkgs/kde/gear/kmail-account-wizard/default.nix b/pkgs/kde/gear/kmail-account-wizard/default.nix
new file mode 100644
index 000000000000..d030eabcce01
--- /dev/null
+++ b/pkgs/kde/gear/kmail-account-wizard/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kmail-account-wizard";
+}
diff --git a/pkgs/kde/gear/kmail/default.nix b/pkgs/kde/gear/kmail/default.nix
new file mode 100644
index 000000000000..f3f659fbaf5f
--- /dev/null
+++ b/pkgs/kde/gear/kmail/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kmail";
+}
diff --git a/pkgs/kde/gear/kmailtransport/default.nix b/pkgs/kde/gear/kmailtransport/default.nix
new file mode 100644
index 000000000000..cf1bf8c1b223
--- /dev/null
+++ b/pkgs/kde/gear/kmailtransport/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kmailtransport";
+}
diff --git a/pkgs/kde/gear/kmbox/default.nix b/pkgs/kde/gear/kmbox/default.nix
new file mode 100644
index 000000000000..ef840d3eda4d
--- /dev/null
+++ b/pkgs/kde/gear/kmbox/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kmbox";
+}
diff --git a/pkgs/kde/gear/kmime/default.nix b/pkgs/kde/gear/kmime/default.nix
new file mode 100644
index 000000000000..52e2b97da392
--- /dev/null
+++ b/pkgs/kde/gear/kmime/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kmime";
+}
diff --git a/pkgs/kde/gear/kmines/default.nix b/pkgs/kde/gear/kmines/default.nix
new file mode 100644
index 000000000000..32a8c179f0ec
--- /dev/null
+++ b/pkgs/kde/gear/kmines/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kmines";
+}
diff --git a/pkgs/kde/gear/kmix/default.nix b/pkgs/kde/gear/kmix/default.nix
new file mode 100644
index 000000000000..b83392baa7df
--- /dev/null
+++ b/pkgs/kde/gear/kmix/default.nix
@@ -0,0 +1,6 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kmix";
+  # FIXME(qt5)
+  meta.broken = true;
+}
diff --git a/pkgs/kde/gear/kmousetool/default.nix b/pkgs/kde/gear/kmousetool/default.nix
new file mode 100644
index 000000000000..8ba8615cbbe6
--- /dev/null
+++ b/pkgs/kde/gear/kmousetool/default.nix
@@ -0,0 +1,10 @@
+{
+  mkKdeDerivation,
+  qtmultimedia,
+  xorg,
+}:
+mkKdeDerivation {
+  pname = "kmousetool";
+
+  extraBuildInputs = [qtmultimedia xorg.libXt];
+}
diff --git a/pkgs/kde/gear/kmouth/default.nix b/pkgs/kde/gear/kmouth/default.nix
new file mode 100644
index 000000000000..75d044b1c686
--- /dev/null
+++ b/pkgs/kde/gear/kmouth/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qtspeech,
+}:
+mkKdeDerivation {
+  pname = "kmouth";
+
+  extraBuildInputs = [qtspeech];
+}
diff --git a/pkgs/kde/gear/kmplot/default.nix b/pkgs/kde/gear/kmplot/default.nix
new file mode 100644
index 000000000000..55f4a21d0e6a
--- /dev/null
+++ b/pkgs/kde/gear/kmplot/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qtsvg,
+}:
+mkKdeDerivation {
+  pname = "kmplot";
+
+  extraBuildInputs = [qtsvg];
+}
diff --git a/pkgs/kde/gear/knavalbattle/default.nix b/pkgs/kde/gear/knavalbattle/default.nix
new file mode 100644
index 000000000000..6a98a2826d1f
--- /dev/null
+++ b/pkgs/kde/gear/knavalbattle/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "knavalbattle";
+}
diff --git a/pkgs/kde/gear/knetwalk/default.nix b/pkgs/kde/gear/knetwalk/default.nix
new file mode 100644
index 000000000000..c77a714e5949
--- /dev/null
+++ b/pkgs/kde/gear/knetwalk/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  _7zz,
+}:
+mkKdeDerivation {
+  pname = "knetwalk";
+
+  extraNativeBuildInputs = [_7zz];
+}
diff --git a/pkgs/kde/gear/knights/default.nix b/pkgs/kde/gear/knights/default.nix
new file mode 100644
index 000000000000..1fa6519fe16e
--- /dev/null
+++ b/pkgs/kde/gear/knights/default.nix
@@ -0,0 +1,12 @@
+{
+  mkKdeDerivation,
+  qtsvg,
+  qtspeech,
+  _7zz,
+}:
+mkKdeDerivation {
+  pname = "knights";
+
+  extraNativeBuildInputs = [_7zz];
+  extraBuildInputs = [qtsvg qtspeech];
+}
diff --git a/pkgs/kde/gear/knotes/default.nix b/pkgs/kde/gear/knotes/default.nix
new file mode 100644
index 000000000000..bca10fcf13da
--- /dev/null
+++ b/pkgs/kde/gear/knotes/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "knotes";
+}
diff --git a/pkgs/kde/gear/koko/default.nix b/pkgs/kde/gear/koko/default.nix
new file mode 100644
index 000000000000..c2b42bc693e7
--- /dev/null
+++ b/pkgs/kde/gear/koko/default.nix
@@ -0,0 +1,46 @@
+{
+  fetchurl,
+  mkKdeDerivation,
+  pkg-config,
+  qtmultimedia,
+  qtpositioning,
+  qtsvg,
+  exiv2,
+  kirigami-addons,
+  kquickimageeditor,
+}: let
+  # URLs snapshotted through
+  # https://web.archive.org/save/$url
+  # Update when stale enough I guess?
+  admin1 = fetchurl {
+    url = "https://web.archive.org/web/20210714035424if_/http://download.geonames.org/export/dump/admin1CodesASCII.txt";
+    sha256 = "0r783yzajs26hvccdy4jv2v06xfgadx2g90fz3yn7lx8flz4nhwm";
+  };
+  admin2 = fetchurl {
+    url = "https://web.archive.org/web/20210714035427if_/http://download.geonames.org/export/dump/admin2Codes.txt";
+    sha256 = "1n5nzp3xblhr93rb1sadi5vfbw29slv5lc6cxq21h3x3cg0mwqh3";
+  };
+  cities1000 = fetchurl {
+    url = "https://web.archive.org/web/20210714035406if_/http://download.geonames.org/export/dump/cities1000.zip";
+    sha256 = "0cwbfff8gzci5zrahh6d53b9b3bfv1cbwlv0k6076531i1c7md9p";
+  };
+in
+  mkKdeDerivation {
+    pname = "koko";
+
+    prePatch = ''
+      ln -s ${admin1}     src/admin1CodesASCII.txt
+      ln -s ${admin2}     src/admin2Codes.txt
+      ln -s ${cities1000} src/cities1000.zip
+    '';
+
+    extraNativeBuildInputs = [pkg-config];
+    extraBuildInputs = [
+      qtmultimedia
+      qtpositioning
+      qtsvg
+      exiv2
+      kirigami-addons
+      kquickimageeditor
+    ];
+  }
diff --git a/pkgs/kde/gear/kolf/default.nix b/pkgs/kde/gear/kolf/default.nix
new file mode 100644
index 000000000000..94e170ae6d33
--- /dev/null
+++ b/pkgs/kde/gear/kolf/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kolf";
+}
diff --git a/pkgs/kde/gear/kollision/default.nix b/pkgs/kde/gear/kollision/default.nix
new file mode 100644
index 000000000000..325510cdf2ee
--- /dev/null
+++ b/pkgs/kde/gear/kollision/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kollision";
+}
diff --git a/pkgs/kde/gear/kolourpaint/default.nix b/pkgs/kde/gear/kolourpaint/default.nix
new file mode 100644
index 000000000000..d5dbacca3843
--- /dev/null
+++ b/pkgs/kde/gear/kolourpaint/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kolourpaint";
+}
diff --git a/pkgs/kde/gear/kompare/default.nix b/pkgs/kde/gear/kompare/default.nix
new file mode 100644
index 000000000000..93580fc90dbf
--- /dev/null
+++ b/pkgs/kde/gear/kompare/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kompare";
+}
diff --git a/pkgs/kde/gear/kongress/default.nix b/pkgs/kde/gear/kongress/default.nix
new file mode 100644
index 000000000000..8ac8807eb68e
--- /dev/null
+++ b/pkgs/kde/gear/kongress/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qtsvg,
+}:
+mkKdeDerivation {
+  pname = "kongress";
+
+  extraBuildInputs = [qtsvg];
+}
diff --git a/pkgs/kde/gear/konqueror/default.nix b/pkgs/kde/gear/konqueror/default.nix
new file mode 100644
index 000000000000..09093db5f358
--- /dev/null
+++ b/pkgs/kde/gear/konqueror/default.nix
@@ -0,0 +1,14 @@
+{
+  mkKdeDerivation,
+  qtwebengine,
+  hunspell,
+}:
+mkKdeDerivation {
+  pname = "konqueror";
+
+  extraBuildInputs = [qtwebengine hunspell];
+
+  extraCmakeFlags = [
+    "-DWebEngineDictConverter_EXECUTABLE=${qtwebengine}/libexec/qwebengine_convert_dict"
+  ];
+}
diff --git a/pkgs/kde/gear/konquest/default.nix b/pkgs/kde/gear/konquest/default.nix
new file mode 100644
index 000000000000..54bd2f6048dd
--- /dev/null
+++ b/pkgs/kde/gear/konquest/default.nix
@@ -0,0 +1,10 @@
+{
+  mkKdeDerivation,
+  qtscxml,
+  qtsvg,
+}:
+mkKdeDerivation {
+  pname = "konquest";
+
+  extraBuildInputs = [qtscxml qtsvg];
+}
diff --git a/pkgs/kde/gear/konsole/default.nix b/pkgs/kde/gear/konsole/default.nix
new file mode 100644
index 000000000000..8cd29b8a4f91
--- /dev/null
+++ b/pkgs/kde/gear/konsole/default.nix
@@ -0,0 +1,10 @@
+{
+  mkKdeDerivation,
+  qt5compat,
+  qtmultimedia,
+}:
+mkKdeDerivation {
+  pname = "konsole";
+
+  extraBuildInputs = [qt5compat qtmultimedia];
+}
diff --git a/pkgs/kde/gear/kontact/default.nix b/pkgs/kde/gear/kontact/default.nix
new file mode 100644
index 000000000000..fe258eea446b
--- /dev/null
+++ b/pkgs/kde/gear/kontact/default.nix
@@ -0,0 +1,23 @@
+{
+  mkKdeDerivation,
+  qtwebengine,
+  akregator,
+  kaddressbook,
+  kmail,
+  knotes,
+  korganizer,
+  zanshin,
+}:
+mkKdeDerivation {
+  pname = "kontact";
+
+  extraBuildInputs = [
+    qtwebengine
+    akregator
+    kaddressbook
+    kmail
+    knotes
+    korganizer
+    zanshin
+  ];
+}
diff --git a/pkgs/kde/gear/kontactinterface/default.nix b/pkgs/kde/gear/kontactinterface/default.nix
new file mode 100644
index 000000000000..4c7d6acab1ca
--- /dev/null
+++ b/pkgs/kde/gear/kontactinterface/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kontactinterface";
+}
diff --git a/pkgs/kde/gear/kontrast/default.nix b/pkgs/kde/gear/kontrast/default.nix
new file mode 100644
index 000000000000..60bf03534ba1
--- /dev/null
+++ b/pkgs/kde/gear/kontrast/default.nix
@@ -0,0 +1,10 @@
+{
+  mkKdeDerivation,
+  qtsvg,
+  qcoro,
+}:
+mkKdeDerivation {
+  pname = "kontrast";
+
+  extraBuildInputs = [qtsvg qcoro];
+}
diff --git a/pkgs/kde/gear/konversation/default.nix b/pkgs/kde/gear/konversation/default.nix
new file mode 100644
index 000000000000..d7d5d3c2fb89
--- /dev/null
+++ b/pkgs/kde/gear/konversation/default.nix
@@ -0,0 +1,11 @@
+{
+  mkKdeDerivation,
+  qttools,
+  qtmultimedia,
+  qt5compat,
+}:
+mkKdeDerivation {
+  pname = "konversation";
+
+  extraBuildInputs = [qtmultimedia qt5compat qttools];
+}
diff --git a/pkgs/kde/gear/kopeninghours/default.nix b/pkgs/kde/gear/kopeninghours/default.nix
new file mode 100644
index 000000000000..b315d765fb39
--- /dev/null
+++ b/pkgs/kde/gear/kopeninghours/default.nix
@@ -0,0 +1,20 @@
+{
+  mkKdeDerivation,
+  qtdeclarative,
+  bison,
+  flex,
+  boost,
+  python3,
+}:
+mkKdeDerivation {
+  pname = "kopeninghours";
+
+  extraNativeBuildInputs = [bison flex];
+  extraBuildInputs = [
+    qtdeclarative
+    (boost.override {
+      enablePython = true;
+      python = python3;
+    })
+  ];
+}
diff --git a/pkgs/kde/gear/korganizer/default.nix b/pkgs/kde/gear/korganizer/default.nix
new file mode 100644
index 000000000000..dfea744563e3
--- /dev/null
+++ b/pkgs/kde/gear/korganizer/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qttools,
+}:
+mkKdeDerivation {
+  pname = "korganizer";
+
+  extraBuildInputs = [qttools];
+}
diff --git a/pkgs/kde/gear/kosmindoormap/default.nix b/pkgs/kde/gear/kosmindoormap/default.nix
new file mode 100644
index 000000000000..11b5c5cef398
--- /dev/null
+++ b/pkgs/kde/gear/kosmindoormap/default.nix
@@ -0,0 +1,10 @@
+{
+  mkKdeDerivation,
+  bison,
+  flex,
+}:
+mkKdeDerivation {
+  pname = "kosmindoormap";
+
+  extraNativeBuildInputs = [bison flex];
+}
diff --git a/pkgs/kde/gear/kpat/default.nix b/pkgs/kde/gear/kpat/default.nix
new file mode 100644
index 000000000000..23b99dddb9f4
--- /dev/null
+++ b/pkgs/kde/gear/kpat/default.nix
@@ -0,0 +1,21 @@
+{
+  mkKdeDerivation,
+  qtsvg,
+  _7zz,
+  shared-mime-info,
+  black-hole-solver,
+  freecell-solver,
+  libkdegames,
+}:
+mkKdeDerivation {
+  pname = "kpat";
+
+  extraNativeBuildInputs = [_7zz shared-mime-info];
+  extraBuildInputs = [
+    qtsvg
+    black-hole-solver
+    freecell-solver
+  ];
+
+  qtWrapperArgs = ["--prefix XDG_DATA_DIRS : ${libkdegames}/share"];
+}
diff --git a/pkgs/kde/gear/kpimtextedit/default.nix b/pkgs/kde/gear/kpimtextedit/default.nix
new file mode 100644
index 000000000000..0c33280cc059
--- /dev/null
+++ b/pkgs/kde/gear/kpimtextedit/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qt5compat,
+}:
+mkKdeDerivation {
+  pname = "kpimtextedit";
+
+  extraBuildInputs = [qt5compat];
+}
diff --git a/pkgs/kde/gear/kpkpass/default.nix b/pkgs/kde/gear/kpkpass/default.nix
new file mode 100644
index 000000000000..a2f116f67d77
--- /dev/null
+++ b/pkgs/kde/gear/kpkpass/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  shared-mime-info,
+}:
+mkKdeDerivation {
+  pname = "kpkpass";
+
+  extraNativeBuildInputs = [shared-mime-info];
+}
diff --git a/pkgs/kde/gear/kpmcore/default.nix b/pkgs/kde/gear/kpmcore/default.nix
new file mode 100644
index 000000000000..9dfa4f3d6813
--- /dev/null
+++ b/pkgs/kde/gear/kpmcore/default.nix
@@ -0,0 +1,74 @@
+{
+  lib,
+  mkKdeDerivation,
+  writeText,
+  pkg-config,
+  cryptsetup,
+  lvm2,
+  mdadm,
+  smartmontools,
+  systemdMinimal,
+  util-linux,
+  btrfs-progs,
+  dosfstools,
+  e2fsprogs,
+  exfatprogs,
+  f2fs-tools,
+  fatresize,
+  hfsprogs,
+  jfsutils,
+  nilfs-utils,
+  ntfs3g,
+  reiser4progs,
+  reiserfsprogs,
+  udftools,
+  xfsprogs,
+  zfs,
+}: let
+  # https://github.com/KDE/kpmcore/blob/06f15334ecfbe871730a90dbe2b694ba060ee998/src/util/externalcommand_whitelist.h
+  runtimeDeps = [
+    cryptsetup
+    lvm2
+    mdadm
+    smartmontools
+    systemdMinimal
+    util-linux
+
+    btrfs-progs
+    dosfstools
+    e2fsprogs
+    exfatprogs
+    f2fs-tools
+    fatresize
+    hfsprogs
+    jfsutils
+    nilfs-utils
+    ntfs3g
+    reiser4progs
+    reiserfsprogs
+    udftools
+    xfsprogs
+    zfs
+
+    # FIXME: Missing command: hfsck hformat fsck.nilfs2 {fsck,mkfs,debugfs,tunefs}.ocfs2
+    # FIXME: audit to see if these are all still required
+  ];
+
+  trustedprefixes = writeText "kpmcore-trustedprefixes" (lib.concatStringsSep "\n" (map lib.getBin runtimeDeps));
+in
+  mkKdeDerivation {
+    pname = "kpmcore";
+
+    postPatch = ''
+      cp ${trustedprefixes} src/util/trustedprefixes
+    '';
+
+    preConfigure = ''
+      substituteInPlace src/util/CMakeLists.txt \
+        --replace \$\{POLKITQT-1_POLICY_FILES_INSTALL_DIR\} $out/share/polkit-1/actions
+      substituteInPlace src/backend/corebackend.cpp \
+        --replace /usr/share/polkit-1/actions/org.kde.kpmcore.externalcommand.policy $out/share/polkit-1/actions/org.kde.kpmcore.externalcommand.policy
+    '';
+
+    extraNativeBuildInputs = [pkg-config];
+  }
diff --git a/pkgs/kde/gear/kpublictransport/default.nix b/pkgs/kde/gear/kpublictransport/default.nix
new file mode 100644
index 000000000000..bc1a663b7762
--- /dev/null
+++ b/pkgs/kde/gear/kpublictransport/default.nix
@@ -0,0 +1,11 @@
+{
+  mkKdeDerivation,
+  qtdeclarative,
+  pkg-config,
+}:
+mkKdeDerivation {
+  pname = "kpublictransport";
+
+  extraNativeBuildInputs = [pkg-config];
+  extraBuildInputs = [qtdeclarative];
+}
diff --git a/pkgs/kde/gear/kqtquickcharts/default.nix b/pkgs/kde/gear/kqtquickcharts/default.nix
new file mode 100644
index 000000000000..682cd0531b7b
--- /dev/null
+++ b/pkgs/kde/gear/kqtquickcharts/default.nix
@@ -0,0 +1,6 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kqtquickcharts";
+  # FIXME(qt5)
+  meta.broken = true;
+}
diff --git a/pkgs/kde/gear/krdc/default.nix b/pkgs/kde/gear/krdc/default.nix
new file mode 100644
index 000000000000..75806e233b63
--- /dev/null
+++ b/pkgs/kde/gear/krdc/default.nix
@@ -0,0 +1,11 @@
+{
+  mkKdeDerivation,
+  libssh,
+  libvncserver,
+  freerdp,
+}:
+mkKdeDerivation {
+  pname = "krdc";
+
+  extraBuildInputs = [libssh libvncserver freerdp];
+}
diff --git a/pkgs/kde/gear/krecorder/default.nix b/pkgs/kde/gear/krecorder/default.nix
new file mode 100644
index 000000000000..d6553f4d1fcb
--- /dev/null
+++ b/pkgs/kde/gear/krecorder/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qtmultimedia,
+}:
+mkKdeDerivation {
+  pname = "krecorder";
+
+  extraBuildInputs = [qtmultimedia];
+}
diff --git a/pkgs/kde/gear/kreversi/default.nix b/pkgs/kde/gear/kreversi/default.nix
new file mode 100644
index 000000000000..8ad4233e1f1a
--- /dev/null
+++ b/pkgs/kde/gear/kreversi/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qtsvg,
+}:
+mkKdeDerivation {
+  pname = "kreversi";
+
+  extraBuildInputs = [qtsvg];
+}
diff --git a/pkgs/kde/gear/krfb/default.nix b/pkgs/kde/gear/krfb/default.nix
new file mode 100644
index 000000000000..03789537f63e
--- /dev/null
+++ b/pkgs/kde/gear/krfb/default.nix
@@ -0,0 +1,15 @@
+{
+  mkKdeDerivation,
+  qtwayland,
+  libvncserver,
+  xorg,
+}:
+mkKdeDerivation {
+  pname = "krfb";
+
+  extraCmakeFlags = [
+    "-DQtWaylandScanner_EXECUTABLE=${qtwayland}/libexec/qtwaylandscanner"
+  ];
+
+  extraBuildInputs = [qtwayland libvncserver xorg.libXdamage];
+}
diff --git a/pkgs/kde/gear/kross-interpreters/default.nix b/pkgs/kde/gear/kross-interpreters/default.nix
new file mode 100644
index 000000000000..4040fa401ef9
--- /dev/null
+++ b/pkgs/kde/gear/kross-interpreters/default.nix
@@ -0,0 +1,11 @@
+{
+  mkKdeDerivation,
+  extra-cmake-modules,
+}:
+mkKdeDerivation {
+  pname = "kross-interpreters";
+
+  extraBuildInputs = [extra-cmake-modules];
+  # FIXME(qt5)
+  meta.broken = true;
+}
diff --git a/pkgs/kde/gear/kruler/default.nix b/pkgs/kde/gear/kruler/default.nix
new file mode 100644
index 000000000000..311dcc3bd840
--- /dev/null
+++ b/pkgs/kde/gear/kruler/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kruler";
+}
diff --git a/pkgs/kde/gear/ksanecore/default.nix b/pkgs/kde/gear/ksanecore/default.nix
new file mode 100644
index 000000000000..7f7e63fb2caf
--- /dev/null
+++ b/pkgs/kde/gear/ksanecore/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  sane-backends,
+}:
+mkKdeDerivation {
+  pname = "ksanecore";
+
+  extraBuildInputs = [sane-backends];
+}
diff --git a/pkgs/kde/gear/kshisen/default.nix b/pkgs/kde/gear/kshisen/default.nix
new file mode 100644
index 000000000000..efa2b024d716
--- /dev/null
+++ b/pkgs/kde/gear/kshisen/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kshisen";
+}
diff --git a/pkgs/kde/gear/ksirk/default.nix b/pkgs/kde/gear/ksirk/default.nix
new file mode 100644
index 000000000000..5c4196a7aff0
--- /dev/null
+++ b/pkgs/kde/gear/ksirk/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qtmultimedia,
+}:
+mkKdeDerivation {
+  pname = "ksirk";
+
+  extraBuildInputs = [qtmultimedia];
+}
diff --git a/pkgs/kde/gear/ksmtp/default.nix b/pkgs/kde/gear/ksmtp/default.nix
new file mode 100644
index 000000000000..c098ddd49c81
--- /dev/null
+++ b/pkgs/kde/gear/ksmtp/default.nix
@@ -0,0 +1,10 @@
+{
+  mkKdeDerivation,
+  qt5compat,
+  cyrus_sasl,
+}:
+mkKdeDerivation {
+  pname = "ksmtp";
+
+  extraBuildInputs = [qt5compat cyrus_sasl];
+}
diff --git a/pkgs/kde/gear/ksnakeduel/default.nix b/pkgs/kde/gear/ksnakeduel/default.nix
new file mode 100644
index 000000000000..b741df477f33
--- /dev/null
+++ b/pkgs/kde/gear/ksnakeduel/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qtsvg,
+}:
+mkKdeDerivation {
+  pname = "ksnakeduel";
+
+  extraBuildInputs = [qtsvg];
+}
diff --git a/pkgs/kde/gear/kspaceduel/default.nix b/pkgs/kde/gear/kspaceduel/default.nix
new file mode 100644
index 000000000000..1f4272b5cac9
--- /dev/null
+++ b/pkgs/kde/gear/kspaceduel/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qtsvg,
+}:
+mkKdeDerivation {
+  pname = "kspaceduel";
+
+  extraBuildInputs = [qtsvg];
+}
diff --git a/pkgs/kde/gear/ksquares/default.nix b/pkgs/kde/gear/ksquares/default.nix
new file mode 100644
index 000000000000..683a64a5bf59
--- /dev/null
+++ b/pkgs/kde/gear/ksquares/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "ksquares";
+}
diff --git a/pkgs/kde/gear/ksudoku/default.nix b/pkgs/kde/gear/ksudoku/default.nix
new file mode 100644
index 000000000000..6f293bd26e1e
--- /dev/null
+++ b/pkgs/kde/gear/ksudoku/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qtsvg,
+}:
+mkKdeDerivation {
+  pname = "ksudoku";
+
+  extraBuildInputs = [qtsvg];
+}
diff --git a/pkgs/kde/gear/ksystemlog/default.nix b/pkgs/kde/gear/ksystemlog/default.nix
new file mode 100644
index 000000000000..604a52cc560b
--- /dev/null
+++ b/pkgs/kde/gear/ksystemlog/default.nix
@@ -0,0 +1,12 @@
+{
+  mkKdeDerivation,
+  pkg-config,
+  qt5compat,
+  audit,
+}:
+mkKdeDerivation {
+  pname = "ksystemlog";
+
+  extraNativeBuildInputs = [pkg-config];
+  extraBuildInputs = [qt5compat audit];
+}
diff --git a/pkgs/kde/gear/kteatime/default.nix b/pkgs/kde/gear/kteatime/default.nix
new file mode 100644
index 000000000000..81d20ec270be
--- /dev/null
+++ b/pkgs/kde/gear/kteatime/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kteatime";
+}
diff --git a/pkgs/kde/gear/ktimer/default.nix b/pkgs/kde/gear/ktimer/default.nix
new file mode 100644
index 000000000000..898b4a802e13
--- /dev/null
+++ b/pkgs/kde/gear/ktimer/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qt5compat,
+}:
+mkKdeDerivation {
+  pname = "ktimer";
+
+  extraBuildInputs = [qt5compat];
+}
diff --git a/pkgs/kde/gear/ktnef/default.nix b/pkgs/kde/gear/ktnef/default.nix
new file mode 100644
index 000000000000..7fcd568ade72
--- /dev/null
+++ b/pkgs/kde/gear/ktnef/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "ktnef";
+}
diff --git a/pkgs/kde/gear/ktorrent/default.nix b/pkgs/kde/gear/ktorrent/default.nix
new file mode 100644
index 000000000000..92e0646e696a
--- /dev/null
+++ b/pkgs/kde/gear/ktorrent/default.nix
@@ -0,0 +1,11 @@
+{
+  mkKdeDerivation,
+  qtwebengine,
+  taglib,
+  libmaxminddb,
+}:
+mkKdeDerivation {
+  pname = "ktorrent";
+
+  extraBuildInputs = [qtwebengine taglib libmaxminddb];
+}
diff --git a/pkgs/kde/gear/ktouch/default.nix b/pkgs/kde/gear/ktouch/default.nix
new file mode 100644
index 000000000000..7f744a9f79d5
--- /dev/null
+++ b/pkgs/kde/gear/ktouch/default.nix
@@ -0,0 +1,6 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "ktouch";
+  # FIXME(qt5)
+  meta.broken = true;
+}
diff --git a/pkgs/kde/gear/ktrip/default.nix b/pkgs/kde/gear/ktrip/default.nix
new file mode 100644
index 000000000000..87351e5e5490
--- /dev/null
+++ b/pkgs/kde/gear/ktrip/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "ktrip";
+}
diff --git a/pkgs/kde/gear/ktuberling/default.nix b/pkgs/kde/gear/ktuberling/default.nix
new file mode 100644
index 000000000000..5602ac870479
--- /dev/null
+++ b/pkgs/kde/gear/ktuberling/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qtmultimedia,
+}:
+mkKdeDerivation {
+  pname = "ktuberling";
+
+  extraBuildInputs = [qtmultimedia];
+}
diff --git a/pkgs/kde/gear/kturtle/default.nix b/pkgs/kde/gear/kturtle/default.nix
new file mode 100644
index 000000000000..f55f7e92a03a
--- /dev/null
+++ b/pkgs/kde/gear/kturtle/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qtsvg,
+}:
+mkKdeDerivation {
+  pname = "kturtle";
+
+  extraBuildInputs = [qtsvg];
+}
diff --git a/pkgs/kde/gear/kubrick/default.nix b/pkgs/kde/gear/kubrick/default.nix
new file mode 100644
index 000000000000..c8bedf44c2de
--- /dev/null
+++ b/pkgs/kde/gear/kubrick/default.nix
@@ -0,0 +1,10 @@
+{
+  mkKdeDerivation,
+  qtsvg,
+  libGLU,
+}:
+mkKdeDerivation {
+  pname = "kubrick";
+
+  extraBuildInputs = [qtsvg libGLU];
+}
diff --git a/pkgs/kde/gear/kwalletmanager/default.nix b/pkgs/kde/gear/kwalletmanager/default.nix
new file mode 100644
index 000000000000..72ebd76ffa3a
--- /dev/null
+++ b/pkgs/kde/gear/kwalletmanager/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kwalletmanager";
+}
diff --git a/pkgs/kde/gear/kwave/default.nix b/pkgs/kde/gear/kwave/default.nix
new file mode 100644
index 000000000000..1c0f82ac7b3d
--- /dev/null
+++ b/pkgs/kde/gear/kwave/default.nix
@@ -0,0 +1,6 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kwave";
+  # FIXME(qt5)
+  meta.broken = true;
+}
diff --git a/pkgs/kde/gear/kweather/default.nix b/pkgs/kde/gear/kweather/default.nix
new file mode 100644
index 000000000000..51d17a0a1e59
--- /dev/null
+++ b/pkgs/kde/gear/kweather/default.nix
@@ -0,0 +1,12 @@
+{
+  mkKdeDerivation,
+  qtsvg,
+  qtcharts,
+  qqc2-desktop-style,
+  kholidays,
+}:
+mkKdeDerivation {
+  pname = "kweather";
+
+  extraBuildInputs = [qtsvg qtcharts qqc2-desktop-style kholidays];
+}
diff --git a/pkgs/kde/gear/kwordquiz/default.nix b/pkgs/kde/gear/kwordquiz/default.nix
new file mode 100644
index 000000000000..82989919f6e0
--- /dev/null
+++ b/pkgs/kde/gear/kwordquiz/default.nix
@@ -0,0 +1,15 @@
+{
+  mkKdeDerivation,
+  qtsvg,
+  qtmultimedia,
+  qqc2-desktop-style,
+}:
+mkKdeDerivation {
+  pname = "kwordquiz";
+
+  extraBuildInputs = [
+    qtsvg
+    qtmultimedia
+    qqc2-desktop-style
+  ];
+}
diff --git a/pkgs/kde/gear/libgravatar/default.nix b/pkgs/kde/gear/libgravatar/default.nix
new file mode 100644
index 000000000000..ddbdfa6dc6c8
--- /dev/null
+++ b/pkgs/kde/gear/libgravatar/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "libgravatar";
+}
diff --git a/pkgs/kde/gear/libkcddb/default.nix b/pkgs/kde/gear/libkcddb/default.nix
new file mode 100644
index 000000000000..8325f19cedff
--- /dev/null
+++ b/pkgs/kde/gear/libkcddb/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  libmusicbrainz5,
+}:
+mkKdeDerivation {
+  pname = "libkcddb";
+
+  extraBuildInputs = [libmusicbrainz5];
+}
diff --git a/pkgs/kde/gear/libkcompactdisc/default.nix b/pkgs/kde/gear/libkcompactdisc/default.nix
new file mode 100644
index 000000000000..66615d3791d6
--- /dev/null
+++ b/pkgs/kde/gear/libkcompactdisc/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  alsa-lib,
+}:
+mkKdeDerivation {
+  pname = "libkcompactdisc";
+
+  extraBuildInputs = [alsa-lib];
+}
diff --git a/pkgs/kde/gear/libkdcraw/default.nix b/pkgs/kde/gear/libkdcraw/default.nix
new file mode 100644
index 000000000000..df6717b22ded
--- /dev/null
+++ b/pkgs/kde/gear/libkdcraw/default.nix
@@ -0,0 +1,11 @@
+{
+  mkKdeDerivation,
+  pkg-config,
+  libraw,
+}:
+mkKdeDerivation {
+  pname = "libkdcraw";
+
+  extraNativeBuildInputs = [pkg-config];
+  extraBuildInputs = [libraw];
+}
diff --git a/pkgs/kde/gear/libkdegames/default.nix b/pkgs/kde/gear/libkdegames/default.nix
new file mode 100644
index 000000000000..95a0265f0836
--- /dev/null
+++ b/pkgs/kde/gear/libkdegames/default.nix
@@ -0,0 +1,15 @@
+{
+  mkKdeDerivation,
+  _7zz,
+  svgcleaner,
+  qtdeclarative,
+  qtsvg,
+  openal,
+  libsndfile,
+}:
+mkKdeDerivation {
+  pname = "libkdegames";
+
+  extraNativeBuildInputs = [_7zz svgcleaner];
+  extraBuildInputs = [openal libsndfile qtdeclarative qtsvg];
+}
diff --git a/pkgs/kde/gear/libkdepim/default.nix b/pkgs/kde/gear/libkdepim/default.nix
new file mode 100644
index 000000000000..d682c45225eb
--- /dev/null
+++ b/pkgs/kde/gear/libkdepim/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qttools,
+}:
+mkKdeDerivation {
+  pname = "libkdepim";
+
+  extraNativeBuildInputs = [qttools];
+}
diff --git a/pkgs/kde/gear/libkeduvocdocument/default.nix b/pkgs/kde/gear/libkeduvocdocument/default.nix
new file mode 100644
index 000000000000..f67c4e0ba497
--- /dev/null
+++ b/pkgs/kde/gear/libkeduvocdocument/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "libkeduvocdocument";
+}
diff --git a/pkgs/kde/gear/libkexiv2/default.nix b/pkgs/kde/gear/libkexiv2/default.nix
new file mode 100644
index 000000000000..fa5cb7851ea2
--- /dev/null
+++ b/pkgs/kde/gear/libkexiv2/default.nix
@@ -0,0 +1,12 @@
+{
+  mkKdeDerivation,
+  qt5compat,
+  pkg-config,
+  exiv2,
+}:
+mkKdeDerivation {
+  pname = "libkexiv2";
+
+  extraBuildInputs = [qt5compat exiv2];
+  extraNativeBuildInputs = [pkg-config];
+}
diff --git a/pkgs/kde/gear/libkgapi/default.nix b/pkgs/kde/gear/libkgapi/default.nix
new file mode 100644
index 000000000000..87d3beb23c50
--- /dev/null
+++ b/pkgs/kde/gear/libkgapi/default.nix
@@ -0,0 +1,10 @@
+{
+  mkKdeDerivation,
+  qttools,
+  cyrus_sasl,
+}:
+mkKdeDerivation {
+  pname = "libkgapi";
+
+  extraBuildInputs = [qttools cyrus_sasl];
+}
diff --git a/pkgs/kde/gear/libkipi/default.nix b/pkgs/kde/gear/libkipi/default.nix
new file mode 100644
index 000000000000..965cf158a3dc
--- /dev/null
+++ b/pkgs/kde/gear/libkipi/default.nix
@@ -0,0 +1,6 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "libkipi";
+  # FIXME(qt5)
+  meta.broken = true;
+}
diff --git a/pkgs/kde/gear/libkleo/default.nix b/pkgs/kde/gear/libkleo/default.nix
new file mode 100644
index 000000000000..47cd88fee577
--- /dev/null
+++ b/pkgs/kde/gear/libkleo/default.nix
@@ -0,0 +1,12 @@
+{
+  mkKdeDerivation,
+  qt5compat,
+  boost,
+  qgpgme,
+}:
+mkKdeDerivation {
+  pname = "libkleo";
+
+  extraBuildInputs = [qt5compat boost];
+  extraPropagatedBuildInputs = [qgpgme];
+}
diff --git a/pkgs/kde/gear/libkmahjongg/default.nix b/pkgs/kde/gear/libkmahjongg/default.nix
new file mode 100644
index 000000000000..f411605318a2
--- /dev/null
+++ b/pkgs/kde/gear/libkmahjongg/default.nix
@@ -0,0 +1,12 @@
+{
+  mkKdeDerivation,
+  _7zz,
+  svgcleaner,
+  qtsvg,
+}:
+mkKdeDerivation {
+  pname = "libkmahjongg";
+
+  extraNativeBuildInputs = [_7zz svgcleaner];
+  extraBuildInputs = [qtsvg];
+}
diff --git a/pkgs/kde/gear/libkomparediff2/default.nix b/pkgs/kde/gear/libkomparediff2/default.nix
new file mode 100644
index 000000000000..43cccc19603f
--- /dev/null
+++ b/pkgs/kde/gear/libkomparediff2/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qt5compat,
+}:
+mkKdeDerivation {
+  pname = "libkomparediff2";
+
+  extraBuildInputs = [qt5compat];
+}
diff --git a/pkgs/kde/gear/libksane/default.nix b/pkgs/kde/gear/libksane/default.nix
new file mode 100644
index 000000000000..319d47b8b2d9
--- /dev/null
+++ b/pkgs/kde/gear/libksane/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "libksane";
+}
diff --git a/pkgs/kde/gear/libksieve/default.nix b/pkgs/kde/gear/libksieve/default.nix
new file mode 100644
index 000000000000..cec2f027b73d
--- /dev/null
+++ b/pkgs/kde/gear/libksieve/default.nix
@@ -0,0 +1,10 @@
+{
+  mkKdeDerivation,
+  qtwebengine,
+  cyrus_sasl,
+}:
+mkKdeDerivation {
+  pname = "libksieve";
+
+  extraBuildInputs = [qtwebengine cyrus_sasl];
+}
diff --git a/pkgs/kde/gear/libktorrent/default.nix b/pkgs/kde/gear/libktorrent/default.nix
new file mode 100644
index 000000000000..263cbb3cadb3
--- /dev/null
+++ b/pkgs/kde/gear/libktorrent/default.nix
@@ -0,0 +1,15 @@
+{
+  mkKdeDerivation,
+  doxygen,
+  qt5compat,
+  boost,
+  gmp,
+  libgcrypt,
+}:
+mkKdeDerivation {
+  pname = "libktorrent";
+
+  extraNativeBuildInputs = [doxygen];
+  extraBuildInputs = [qt5compat];
+  extraPropagatedBuildInputs = [boost gmp libgcrypt];
+}
diff --git a/pkgs/kde/gear/lokalize/default.nix b/pkgs/kde/gear/lokalize/default.nix
new file mode 100644
index 000000000000..a50845f258bb
--- /dev/null
+++ b/pkgs/kde/gear/lokalize/default.nix
@@ -0,0 +1,6 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "lokalize";
+  # FIXME(qt5)
+  meta.broken = true;
+}
diff --git a/pkgs/kde/gear/lskat/default.nix b/pkgs/kde/gear/lskat/default.nix
new file mode 100644
index 000000000000..e1b83925feb8
--- /dev/null
+++ b/pkgs/kde/gear/lskat/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qtsvg,
+}:
+mkKdeDerivation {
+  pname = "lskat";
+
+  extraBuildInputs = [qtsvg];
+}
diff --git a/pkgs/kde/gear/mailcommon/default.nix b/pkgs/kde/gear/mailcommon/default.nix
new file mode 100644
index 000000000000..44b2b283896e
--- /dev/null
+++ b/pkgs/kde/gear/mailcommon/default.nix
@@ -0,0 +1,10 @@
+{
+  mkKdeDerivation,
+  qtwebengine,
+  qttools,
+}:
+mkKdeDerivation {
+  pname = "mailcommon";
+
+  extraBuildInputs = [qtwebengine qttools];
+}
diff --git a/pkgs/kde/gear/mailimporter/default.nix b/pkgs/kde/gear/mailimporter/default.nix
new file mode 100644
index 000000000000..d43e0a2288f9
--- /dev/null
+++ b/pkgs/kde/gear/mailimporter/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "mailimporter";
+}
diff --git a/pkgs/kde/gear/marble/default.nix b/pkgs/kde/gear/marble/default.nix
new file mode 100644
index 000000000000..1f6e574ed312
--- /dev/null
+++ b/pkgs/kde/gear/marble/default.nix
@@ -0,0 +1,6 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "marble";
+  # FIXME(qt5)
+  meta.broken = true;
+}
diff --git a/pkgs/kde/gear/markdownpart/default.nix b/pkgs/kde/gear/markdownpart/default.nix
new file mode 100644
index 000000000000..e40b6d03f883
--- /dev/null
+++ b/pkgs/kde/gear/markdownpart/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "markdownpart";
+}
diff --git a/pkgs/kde/gear/mbox-importer/default.nix b/pkgs/kde/gear/mbox-importer/default.nix
new file mode 100644
index 000000000000..7d1a6730e84d
--- /dev/null
+++ b/pkgs/kde/gear/mbox-importer/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "mbox-importer";
+}
diff --git a/pkgs/kde/gear/merkuro/default.nix b/pkgs/kde/gear/merkuro/default.nix
new file mode 100644
index 000000000000..7ad2c3637f70
--- /dev/null
+++ b/pkgs/kde/gear/merkuro/default.nix
@@ -0,0 +1,10 @@
+{
+  mkKdeDerivation,
+  qtsvg,
+  libplasma,
+}:
+mkKdeDerivation {
+  pname = "merkuro";
+
+  extraBuildInputs = [qtsvg libplasma];
+}
diff --git a/pkgs/kde/gear/messagelib/default.nix b/pkgs/kde/gear/messagelib/default.nix
new file mode 100644
index 000000000000..47058be34826
--- /dev/null
+++ b/pkgs/kde/gear/messagelib/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qtwebengine,
+}:
+mkKdeDerivation {
+  pname = "messagelib";
+
+  extraPropagatedBuildInputs = [qtwebengine];
+}
diff --git a/pkgs/kde/gear/mimetreeparser/default.nix b/pkgs/kde/gear/mimetreeparser/default.nix
new file mode 100644
index 000000000000..3bebd8aee726
--- /dev/null
+++ b/pkgs/kde/gear/mimetreeparser/default.nix
@@ -0,0 +1,11 @@
+{
+  mkKdeDerivation,
+  qt5compat,
+  qtdeclarative,
+  qgpgme,
+}:
+mkKdeDerivation {
+  pname = "mimetreeparser";
+
+  extraBuildInputs = [qt5compat qtdeclarative qgpgme];
+}
diff --git a/pkgs/kde/gear/minuet/default.nix b/pkgs/kde/gear/minuet/default.nix
new file mode 100644
index 000000000000..bbfe47b2796f
--- /dev/null
+++ b/pkgs/kde/gear/minuet/default.nix
@@ -0,0 +1,11 @@
+{
+  mkKdeDerivation,
+  qtdeclarative,
+  qtsvg,
+  fluidsynth,
+}:
+mkKdeDerivation {
+  pname = "minuet";
+
+  extraBuildInputs = [qtdeclarative qtsvg fluidsynth];
+}
diff --git a/pkgs/kde/gear/neochat/default.nix b/pkgs/kde/gear/neochat/default.nix
new file mode 100644
index 000000000000..ac50d06db8c9
--- /dev/null
+++ b/pkgs/kde/gear/neochat/default.nix
@@ -0,0 +1,11 @@
+{
+  mkKdeDerivation,
+  qtlocation,
+  qtwebview,
+  kunifiedpush,
+}:
+mkKdeDerivation {
+  pname = "neochat";
+
+  extraBuildInputs = [qtlocation qtwebview kunifiedpush];
+}
diff --git a/pkgs/kde/gear/okular/default.nix b/pkgs/kde/gear/okular/default.nix
new file mode 100644
index 000000000000..4f2ad1f8e3b0
--- /dev/null
+++ b/pkgs/kde/gear/okular/default.nix
@@ -0,0 +1,30 @@
+{
+  mkKdeDerivation,
+  pkg-config,
+  qtspeech,
+  qtsvg,
+  poppler,
+  libtiff,
+  libspectre,
+  libzip,
+  djvulibre,
+  ebook_tools,
+  discount,
+}:
+mkKdeDerivation {
+  pname = "okular";
+
+  extraNativeBuildInputs = [pkg-config];
+  extraBuildInputs = [
+    qtspeech
+    qtsvg
+
+    poppler
+    libtiff
+    libspectre
+    libzip
+    djvulibre
+    ebook_tools
+    discount
+  ];
+}
diff --git a/pkgs/kde/gear/palapeli/default.nix b/pkgs/kde/gear/palapeli/default.nix
new file mode 100644
index 000000000000..01cc8774d06d
--- /dev/null
+++ b/pkgs/kde/gear/palapeli/default.nix
@@ -0,0 +1,11 @@
+{
+  mkKdeDerivation,
+  qtsvg,
+  shared-mime-info,
+}:
+mkKdeDerivation {
+  pname = "palapeli";
+
+  extraNativeBuildInputs = [shared-mime-info];
+  extraBuildInputs = [qtsvg];
+}
diff --git a/pkgs/kde/gear/parley/default.nix b/pkgs/kde/gear/parley/default.nix
new file mode 100644
index 000000000000..75f01c94e9d5
--- /dev/null
+++ b/pkgs/kde/gear/parley/default.nix
@@ -0,0 +1,11 @@
+{
+  mkKdeDerivation,
+  qtsvg,
+  qtmultimedia,
+  qtwebengine,
+}:
+mkKdeDerivation {
+  pname = "parley";
+
+  extraBuildInputs = [qtsvg qtmultimedia qtwebengine];
+}
diff --git a/pkgs/kde/gear/partitionmanager/default.nix b/pkgs/kde/gear/partitionmanager/default.nix
new file mode 100644
index 000000000000..1b3b06f8d68b
--- /dev/null
+++ b/pkgs/kde/gear/partitionmanager/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  kpmcore,
+}:
+mkKdeDerivation {
+  pname = "partitionmanager";
+
+  propagatedUserEnvPkgs = [kpmcore];
+}
diff --git a/pkgs/kde/gear/picmi/default.nix b/pkgs/kde/gear/picmi/default.nix
new file mode 100644
index 000000000000..a5dd853fba52
--- /dev/null
+++ b/pkgs/kde/gear/picmi/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qtsvg,
+}:
+mkKdeDerivation {
+  pname = "picmi";
+
+  extraBuildInputs = [qtsvg];
+}
diff --git a/pkgs/kde/gear/pim-data-exporter/default.nix b/pkgs/kde/gear/pim-data-exporter/default.nix
new file mode 100644
index 000000000000..da2097f46763
--- /dev/null
+++ b/pkgs/kde/gear/pim-data-exporter/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "pim-data-exporter";
+}
diff --git a/pkgs/kde/gear/pim-sieve-editor/default.nix b/pkgs/kde/gear/pim-sieve-editor/default.nix
new file mode 100644
index 000000000000..66df72016321
--- /dev/null
+++ b/pkgs/kde/gear/pim-sieve-editor/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "pim-sieve-editor";
+}
diff --git a/pkgs/kde/gear/pimcommon/default.nix b/pkgs/kde/gear/pimcommon/default.nix
new file mode 100644
index 000000000000..ddb467638c65
--- /dev/null
+++ b/pkgs/kde/gear/pimcommon/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qttools,
+}:
+mkKdeDerivation {
+  pname = "pimcommon";
+
+  extraBuildInputs = [qttools];
+}
diff --git a/pkgs/kde/gear/plasmatube/default.nix b/pkgs/kde/gear/plasmatube/default.nix
new file mode 100644
index 000000000000..db28e47c78c8
--- /dev/null
+++ b/pkgs/kde/gear/plasmatube/default.nix
@@ -0,0 +1,15 @@
+{
+  mkKdeDerivation,
+  qtquick3d,
+  qtsvg,
+  purpose,
+  pkg-config,
+  mpv,
+}:
+mkKdeDerivation {
+  pname = "plasmatube";
+
+  extraNativeBuildInputs = [pkg-config];
+  extraBuildInputs = [qtquick3d qtsvg mpv];
+  extraPropagatedBuildInputs = [purpose];
+}
diff --git a/pkgs/kde/gear/poxml/default.nix b/pkgs/kde/gear/poxml/default.nix
new file mode 100644
index 000000000000..3c22e5e4b1e9
--- /dev/null
+++ b/pkgs/kde/gear/poxml/default.nix
@@ -0,0 +1,6 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "poxml";
+  # FIXME(qt5)
+  meta.broken = true;
+}
diff --git a/pkgs/kde/gear/qmlkonsole/default.nix b/pkgs/kde/gear/qmlkonsole/default.nix
new file mode 100644
index 000000000000..c48dbad18204
--- /dev/null
+++ b/pkgs/kde/gear/qmlkonsole/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qtsvg,
+}:
+mkKdeDerivation {
+  pname = "qmlkonsole";
+
+  extraBuildInputs = [qtsvg];
+}
diff --git a/pkgs/kde/gear/rocs/default.nix b/pkgs/kde/gear/rocs/default.nix
new file mode 100644
index 000000000000..73e7143f8df0
--- /dev/null
+++ b/pkgs/kde/gear/rocs/default.nix
@@ -0,0 +1,11 @@
+{
+  mkKdeDerivation,
+  boost,
+}:
+mkKdeDerivation {
+  pname = "rocs";
+
+  extraBuildInputs = [boost];
+  # FIXME(qt5)
+  meta.broken = true;
+}
diff --git a/pkgs/kde/gear/signon-kwallet-extension/default.nix b/pkgs/kde/gear/signon-kwallet-extension/default.nix
new file mode 100644
index 000000000000..15900552d50f
--- /dev/null
+++ b/pkgs/kde/gear/signon-kwallet-extension/default.nix
@@ -0,0 +1,16 @@
+{
+  mkKdeDerivation,
+  pkg-config,
+  signond,
+}:
+mkKdeDerivation {
+  pname = "signon-kwallet-extension";
+
+  extraNativeBuildInputs = [pkg-config];
+  extraBuildInputs = [signond];
+
+  # NB: not actually broken, just makes it install to $out instead of $signon/lib/extensions
+  # This is useless without a wrapped signond.
+  # FIXME: wrap signond with SSO_EXTENSIONS_DIR=$wrapper/lib/extensions
+  extraCmakeFlags = ["-DINSTALL_BROKEN_SIGNON_EXTENSION=1"];
+}
diff --git a/pkgs/kde/gear/skanlite/default.nix b/pkgs/kde/gear/skanlite/default.nix
new file mode 100644
index 000000000000..c64594d3fd09
--- /dev/null
+++ b/pkgs/kde/gear/skanlite/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qt5compat,
+}:
+mkKdeDerivation {
+  pname = "skanlite";
+
+  extraBuildInputs = [qt5compat];
+}
diff --git a/pkgs/kde/gear/skanpage/default.nix b/pkgs/kde/gear/skanpage/default.nix
new file mode 100644
index 000000000000..a7352da8466c
--- /dev/null
+++ b/pkgs/kde/gear/skanpage/default.nix
@@ -0,0 +1,14 @@
+{
+  mkKdeDerivation,
+  tesseractLanguages ? [],
+  tesseract5,
+  leptonica,
+}:
+mkKdeDerivation {
+  pname = "skanpage";
+
+  extraBuildInputs = [
+    (tesseract5.override {enableLanguages = tesseractLanguages;})
+    leptonica
+  ];
+}
diff --git a/pkgs/kde/gear/spectacle/default.nix b/pkgs/kde/gear/spectacle/default.nix
new file mode 100644
index 000000000000..1b5539230cbd
--- /dev/null
+++ b/pkgs/kde/gear/spectacle/default.nix
@@ -0,0 +1,10 @@
+{
+  mkKdeDerivation,
+  qtwayland,
+  qtmultimedia,
+}:
+mkKdeDerivation {
+  pname = "spectacle";
+
+  extraBuildInputs = [qtwayland qtmultimedia];
+}
diff --git a/pkgs/kde/gear/step/default.nix b/pkgs/kde/gear/step/default.nix
new file mode 100644
index 000000000000..7e403a24d902
--- /dev/null
+++ b/pkgs/kde/gear/step/default.nix
@@ -0,0 +1,16 @@
+{
+  mkKdeDerivation,
+  qttools,
+  qtsvg,
+  pkg-config,
+  eigen,
+  shared-mime-info,
+  gsl,
+  libqalculate,
+}:
+mkKdeDerivation {
+  pname = "step";
+
+  extraNativeBuildInputs = [qttools qtsvg pkg-config shared-mime-info];
+  extraBuildInputs = [eigen gsl libqalculate];
+}
diff --git a/pkgs/kde/gear/svgpart/default.nix b/pkgs/kde/gear/svgpart/default.nix
new file mode 100644
index 000000000000..44f25d0312b1
--- /dev/null
+++ b/pkgs/kde/gear/svgpart/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qtsvg,
+}:
+mkKdeDerivation {
+  pname = "svgpart";
+
+  extraBuildInputs = [qtsvg];
+}
diff --git a/pkgs/kde/gear/sweeper/default.nix b/pkgs/kde/gear/sweeper/default.nix
new file mode 100644
index 000000000000..f914ce9574be
--- /dev/null
+++ b/pkgs/kde/gear/sweeper/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  plasma-activities-stats,
+}:
+mkKdeDerivation {
+  pname = "sweeper";
+
+  extraBuildInputs = [plasma-activities-stats];
+}
diff --git a/pkgs/kde/gear/telly-skout/default.nix b/pkgs/kde/gear/telly-skout/default.nix
new file mode 100644
index 000000000000..c19ecf6b42d7
--- /dev/null
+++ b/pkgs/kde/gear/telly-skout/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "telly-skout";
+}
diff --git a/pkgs/kde/gear/tokodon/default.nix b/pkgs/kde/gear/tokodon/default.nix
new file mode 100644
index 000000000000..464f354f41ed
--- /dev/null
+++ b/pkgs/kde/gear/tokodon/default.nix
@@ -0,0 +1,17 @@
+{
+  mkKdeDerivation,
+  pkg-config,
+  qtmultimedia,
+  qtsvg,
+  qtwebsockets,
+  qtwebview,
+  mpv,
+  kitemmodels,
+  sonnet,
+}:
+mkKdeDerivation {
+  pname = "tokodon";
+
+  extraNativeBuildInputs = [pkg-config];
+  extraBuildInputs = [qtmultimedia qtsvg qtwebsockets qtwebview mpv kitemmodels sonnet];
+}
diff --git a/pkgs/kde/gear/umbrello/default.nix b/pkgs/kde/gear/umbrello/default.nix
new file mode 100644
index 000000000000..6aca83a9e825
--- /dev/null
+++ b/pkgs/kde/gear/umbrello/default.nix
@@ -0,0 +1,6 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "umbrello";
+  # FIXME(qt5)
+  meta.broken = true;
+}
diff --git a/pkgs/kde/gear/yakuake/default.nix b/pkgs/kde/gear/yakuake/default.nix
new file mode 100644
index 000000000000..420ec08f670b
--- /dev/null
+++ b/pkgs/kde/gear/yakuake/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qtsvg,
+}:
+mkKdeDerivation {
+  pname = "yakuake";
+
+  extraBuildInputs = [qtsvg];
+}
diff --git a/pkgs/kde/gear/zanshin/default.nix b/pkgs/kde/gear/zanshin/default.nix
new file mode 100644
index 000000000000..357b6963ff09
--- /dev/null
+++ b/pkgs/kde/gear/zanshin/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  boost,
+}:
+mkKdeDerivation {
+  pname = "zanshin";
+
+  extraBuildInputs = [boost];
+}
diff --git a/pkgs/kde/generated/dependencies.json b/pkgs/kde/generated/dependencies.json
new file mode 100644
index 000000000000..57d3a96728ac
--- /dev/null
+++ b/pkgs/kde/generated/dependencies.json
@@ -0,0 +1,6133 @@
+{
+  "dependencies": {
+    "accessibility-inspector": [
+      "extra-cmake-modules",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "ki18n",
+      "kxmlgui",
+      "libqaccessibilityclient"
+    ],
+    "akonadi": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "kitemmodels",
+      "kwidgetsaddons",
+      "kxmlgui"
+    ],
+    "akonadi-calendar": [
+      "akonadi",
+      "akonadi-contacts",
+      "akonadi-mime",
+      "extra-cmake-modules",
+      "kcalendarcore",
+      "kcalutils",
+      "kcontacts",
+      "kdbusaddons",
+      "kidentitymanagement",
+      "kmailtransport",
+      "knotifications",
+      "messagelib"
+    ],
+    "akonadi-calendar-tools": [
+      "akonadi",
+      "akonadi-calendar",
+      "calendarsupport",
+      "extra-cmake-modules",
+      "kcalendarcore"
+    ],
+    "akonadi-contacts": [
+      "akonadi",
+      "extra-cmake-modules",
+      "grantleetheme",
+      "kcodecs",
+      "kcontacts",
+      "kmime",
+      "ktextaddons",
+      "ktexttemplate",
+      "prison"
+    ],
+    "akonadi-import-wizard": [
+      "akonadi",
+      "extra-cmake-modules",
+      "kcontacts",
+      "kidentitymanagement",
+      "kmailtransport",
+      "mailcommon",
+      "mailimporter",
+      "messagelib",
+      "pimcommon",
+      "qtkeychain"
+    ],
+    "akonadi-mime": [
+      "akonadi",
+      "extra-cmake-modules",
+      "kmime"
+    ],
+    "akonadi-notes": [
+      "akonadi",
+      "extra-cmake-modules",
+      "kmime"
+    ],
+    "akonadi-search": [
+      "akonadi",
+      "akonadi-mime",
+      "extra-cmake-modules",
+      "kcalendarcore",
+      "kcmutils",
+      "kcontacts",
+      "kmime",
+      "krunner",
+      "ktextaddons"
+    ],
+    "akonadiclient": [
+      "akonadi",
+      "akonadi-contacts",
+      "extra-cmake-modules",
+      "kcoreaddons",
+      "kdoctools",
+      "ki18n",
+      "kio",
+      "kmime"
+    ],
+    "akonadiconsole": [
+      "akonadi",
+      "akonadi-contacts",
+      "akonadi-mime",
+      "akonadi-search",
+      "calendarsupport",
+      "extra-cmake-modules",
+      "kcalendarcore",
+      "kcontacts",
+      "kimap",
+      "kmime",
+      "libkdepim",
+      "messagelib"
+    ],
+    "akregator": [
+      "extra-cmake-modules",
+      "grantleetheme",
+      "kcodecs",
+      "kontactinterface",
+      "kstatusnotifieritem",
+      "ktextaddons",
+      "kuserfeedback",
+      "libkdepim",
+      "messagelib",
+      "pimcommon"
+    ],
+    "alkimia": [
+      "extra-cmake-modules",
+      "kcompletion",
+      "kconfig",
+      "kcoreaddons",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "knewstuff",
+      "ktextwidgets",
+      "kxmlgui",
+      "libplasma"
+    ],
+    "alligator": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "ki18n",
+      "kirigami",
+      "kirigami-addons",
+      "syndication"
+    ],
+    "alpaka": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kguiaddons",
+      "ki18n",
+      "kirigami",
+      "kstatusnotifieritem",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "kxmlgui"
+    ],
+    "amarok": [
+      "attica",
+      "extra-cmake-modules",
+      "karchive",
+      "kcmutils",
+      "kcodecs",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdeclarative",
+      "kdnssd",
+      "kdoctools",
+      "kglobalaccel",
+      "kguiaddons",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "kirigami",
+      "knewstuff",
+      "knotifications",
+      "kpackage",
+      "ktexteditor",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "phonon",
+      "qca",
+      "solid",
+      "threadweaver"
+    ],
+    "amor": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "kdbusaddons",
+      "kdoctools",
+      "ki18n",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "kxmlgui"
+    ],
+    "analitza": [
+      "extra-cmake-modules"
+    ],
+    "angelfish": [
+      "extra-cmake-modules",
+      "futuresql",
+      "kconfig",
+      "kcoreaddons",
+      "kdbusaddons",
+      "ki18n",
+      "kirigami",
+      "kirigami-addons",
+      "knotifications",
+      "kwindowsystem",
+      "purpose",
+      "qqc2-desktop-style"
+    ],
+    "arianna": [
+      "baloo",
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "kdbusaddons",
+      "kfilemetadata",
+      "ki18n",
+      "kirigami",
+      "kirigami-addons",
+      "kquickcharts",
+      "kwindowsystem",
+      "qqc2-desktop-style"
+    ],
+    "ark": [
+      "extra-cmake-modules",
+      "karchive",
+      "kconfig",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "kfilemetadata",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "kparts",
+      "kpty",
+      "kservice",
+      "kwidgetsaddons",
+      "kwindowsystem"
+    ],
+    "arkade": [
+      "extra-cmake-modules",
+      "ki18n",
+      "kirigami",
+      "kpackage"
+    ],
+    "artikulate": [
+      "extra-cmake-modules",
+      "karchive",
+      "kconfig",
+      "kcrash",
+      "ki18n",
+      "kirigami",
+      "knewstuff"
+    ],
+    "atcore": [
+      "extra-cmake-modules"
+    ],
+    "atlantik": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdoctools",
+      "ki18n",
+      "kiconthemes",
+      "knotifications",
+      "knotifyconfig",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "libkdegames"
+    ],
+    "attica": [
+      "extra-cmake-modules"
+    ],
+    "audex": [
+      "extra-cmake-modules",
+      "kcmutils",
+      "kcompletion",
+      "kconfig",
+      "kcoreaddons",
+      "kcrash",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "ktextwidgets",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "libkcddb",
+      "solid"
+    ],
+    "audiocd-kio": [
+      "extra-cmake-modules",
+      "kcmutils",
+      "kconfig",
+      "kdoctools",
+      "ki18n",
+      "kio",
+      "libkcddb",
+      "libkcompactdisc"
+    ],
+    "aura-browser": [
+      "kcmutils",
+      "kcodecs",
+      "kcompletion",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kdeclarative",
+      "ki18n",
+      "kio",
+      "kjobwidgets",
+      "knotifications",
+      "kpackage",
+      "kservice",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "libplasma",
+      "plasma-workspace",
+      "solid"
+    ],
+    "baloo": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kfilemetadata",
+      "ki18n",
+      "kidletime",
+      "kio",
+      "solid"
+    ],
+    "baloo-widgets": [
+      "baloo",
+      "extra-cmake-modules",
+      "kconfig",
+      "kfilemetadata",
+      "ki18n",
+      "kio"
+    ],
+    "basket": [
+      "extra-cmake-modules",
+      "karchive",
+      "kcmutils",
+      "kcompletion",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "kfilemetadata",
+      "kglobalaccel",
+      "kguiaddons",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "knotifications",
+      "kparts",
+      "kservice",
+      "ktextwidgets",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "kxmlgui",
+      "phonon"
+    ],
+    "blinken": [
+      "extra-cmake-modules",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "kguiaddons",
+      "ki18n",
+      "kxmlgui",
+      "phonon"
+    ],
+    "bluedevil": [
+      "bluez-qt",
+      "extra-cmake-modules",
+      "kauth",
+      "kcmutils",
+      "kcodecs",
+      "kcompletion",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kdbusaddons",
+      "kdoctools",
+      "ki18n",
+      "kio",
+      "kitemviews",
+      "kjobwidgets",
+      "knotifications",
+      "kservice",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "kxmlgui",
+      "libplasma",
+      "solid"
+    ],
+    "bluez-qt": [
+      "extra-cmake-modules"
+    ],
+    "bomber": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "ki18n",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "libkdegames"
+    ],
+    "bovo": [
+      "extra-cmake-modules",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "ki18n",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "libkdegames"
+    ],
+    "breeze": [
+      "extra-cmake-modules",
+      "frameworkintegration",
+      "kcmutils",
+      "kcolorscheme",
+      "kconfig",
+      "kcoreaddons",
+      "kdecoration",
+      "kguiaddons",
+      "ki18n",
+      "kiconthemes",
+      "kirigami",
+      "kwindowsystem"
+    ],
+    "breeze-gtk": [
+      "breeze",
+      "extra-cmake-modules"
+    ],
+    "breeze-icons": [
+      "extra-cmake-modules"
+    ],
+    "breeze-plymouth": [
+      "extra-cmake-modules"
+    ],
+    "calendarsupport": [
+      "akonadi",
+      "akonadi-calendar",
+      "akonadi-notes",
+      "extra-cmake-modules",
+      "kcalendarcore",
+      "kcalutils",
+      "kholidays",
+      "kidentitymanagement",
+      "kmime",
+      "ktextaddons"
+    ],
+    "calindori": [
+      "extra-cmake-modules",
+      "kcalendarcore",
+      "kconfig",
+      "kcoreaddons",
+      "kdbusaddons",
+      "ki18n",
+      "kirigami",
+      "knotifications",
+      "kpeople"
+    ],
+    "calligra": [
+      "extra-cmake-modules",
+      "karchive",
+      "kcmutils",
+      "kcodecs",
+      "kcompletion",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdiagram",
+      "kdoctools",
+      "kguiaddons",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "kitemviews",
+      "kjobwidgets",
+      "knotifications",
+      "knotifyconfig",
+      "kparts",
+      "ktextwidgets",
+      "kwallet",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "kxmlgui",
+      "plasma-activities",
+      "sonnet",
+      "threadweaver"
+    ],
+    "calligraplan": [
+      "extra-cmake-modules",
+      "karchive",
+      "kcmutils",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kdbusaddons",
+      "kdiagram",
+      "kguiaddons",
+      "kholidays",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "kitemmodels",
+      "kitemviews",
+      "kjobwidgets",
+      "knotifications",
+      "kparts",
+      "ktextwidgets",
+      "kwallet",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "kxmlgui",
+      "plasma-activities",
+      "threadweaver"
+    ],
+    "cantor": [
+      "extra-cmake-modules",
+      "karchive",
+      "kcompletion",
+      "kconfig",
+      "kcoreaddons",
+      "kcrash",
+      "kdoctools",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "knewstuff",
+      "kparts",
+      "ktexteditor",
+      "ktextwidgets",
+      "kxmlgui",
+      "syntax-highlighting"
+    ],
+    "cervisia": [
+      "extra-cmake-modules",
+      "kdesu",
+      "kdoctools",
+      "ki18n",
+      "kiconthemes",
+      "kitemviews",
+      "knotifications",
+      "kparts",
+      "ktextwidgets",
+      "kwidgetsaddons"
+    ],
+    "choqok": [
+      "extra-cmake-modules",
+      "kcmutils",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kdoctools",
+      "kglobalaccel",
+      "ki18n",
+      "kio",
+      "knotifications",
+      "knotifyconfig",
+      "ktextwidgets",
+      "kwallet",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "purpose",
+      "sonnet"
+    ],
+    "codevis": [
+      "extra-cmake-modules",
+      "kcmutils",
+      "kcrash",
+      "kdoctools",
+      "ki18n",
+      "kiconthemes",
+      "knewstuff",
+      "ktexteditor",
+      "ktextwidgets",
+      "kuserfeedback",
+      "plasma-activities"
+    ],
+    "colord-kde": [
+      "extra-cmake-modules",
+      "kcmutils",
+      "kcoreaddons",
+      "kdbusaddons",
+      "ki18n",
+      "kitemmodels",
+      "kwidgetsaddons",
+      "kwindowsystem"
+    ],
+    "croutons": [
+      "extra-cmake-modules"
+    ],
+    "daykountdown": [
+      "extra-cmake-modules",
+      "kcoreaddons",
+      "ki18n",
+      "kio",
+      "kirigami",
+      "kwidgetsaddons"
+    ],
+    "digikam": [
+      "extra-cmake-modules",
+      "kcalendarcore",
+      "kconfig",
+      "kcoreaddons",
+      "ki18n",
+      "kiconthemes",
+      "kimageformats",
+      "kio",
+      "knotifications",
+      "knotifyconfig",
+      "kservice",
+      "kwindowsystem",
+      "kxmlgui",
+      "solid",
+      "threadweaver"
+    ],
+    "discover": [
+      "appstream-qt",
+      "attica",
+      "extra-cmake-modules",
+      "karchive",
+      "kauth",
+      "kcmutils",
+      "kcodecs",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "ki18n",
+      "kidletime",
+      "kio",
+      "kirigami-addons",
+      "knewstuff",
+      "knotifications",
+      "kservice",
+      "kstatusnotifieritem",
+      "kuserfeedback",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "kxmlgui",
+      "packagekit-qt",
+      "purpose",
+      "selenium-webdriver-at-spi"
+    ],
+    "dolphin": [
+      "baloo",
+      "baloo-widgets",
+      "extra-cmake-modules",
+      "kbookmarks",
+      "kcmutils",
+      "kcodecs",
+      "kcompletion",
+      "kconfig",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "kfilemetadata",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "kio-extras",
+      "knewstuff",
+      "knotifications",
+      "kparts",
+      "ktextwidgets",
+      "kuserfeedback",
+      "kwindowsystem",
+      "packagekit-qt",
+      "phonon",
+      "plasma-activities",
+      "solid"
+    ],
+    "dolphin-plugins": [
+      "dolphin",
+      "extra-cmake-modules",
+      "kcoreaddons",
+      "ki18n",
+      "kio",
+      "kservice",
+      "ktexteditor",
+      "ktextwidgets",
+      "kxmlgui",
+      "solid"
+    ],
+    "dragon": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "ki18n",
+      "kio",
+      "kjobwidgets",
+      "kparts",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "kxmlgui",
+      "phonon",
+      "solid"
+    ],
+    "drkonqi": [
+      "extra-cmake-modules",
+      "kauth",
+      "kcmutils",
+      "kcodecs",
+      "kconfig",
+      "kcoreaddons",
+      "kcrash",
+      "ki18n",
+      "kidletime",
+      "kio",
+      "kitemmodels",
+      "kjobwidgets",
+      "knotifications",
+      "kservice",
+      "kstatusnotifieritem",
+      "kwallet",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "solid",
+      "syntax-highlighting"
+    ],
+    "elf-dissector": [
+      "extra-cmake-modules"
+    ],
+    "elisa": [
+      "extra-cmake-modules",
+      "kcolorscheme",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kdbusaddons",
+      "kdoctools",
+      "kfilemetadata",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "kirigami",
+      "kxmlgui",
+      "qqc2-desktop-style"
+    ],
+    "eloquens": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "kdbusaddons",
+      "ki18n",
+      "kirigami"
+    ],
+    "eventviews": [
+      "akonadi",
+      "akonadi-calendar",
+      "calendarsupport",
+      "extra-cmake-modules",
+      "kcalendarcore",
+      "kcalutils",
+      "kconfigwidgets",
+      "kdiagram",
+      "kmime",
+      "libkdepim"
+    ],
+    "falkon": [
+      "karchive",
+      "kcoreaddons",
+      "kcrash",
+      "ki18n",
+      "kio",
+      "kwallet",
+      "purpose"
+    ],
+    "ffmpegthumbs": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kio"
+    ],
+    "fielding": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "kdbusaddons",
+      "ki18n",
+      "kirigami"
+    ],
+    "filelight": [
+      "extra-cmake-modules",
+      "kcoreaddons",
+      "kcrash",
+      "kdoctools",
+      "ki18n",
+      "kio",
+      "kirigami-addons",
+      "kxmlgui"
+    ],
+    "flatpak-kcm": [
+      "extra-cmake-modules",
+      "kcmutils",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "ki18n",
+      "kitemmodels"
+    ],
+    "frameworkintegration": [
+      "appstream-qt",
+      "extra-cmake-modules",
+      "kcolorscheme",
+      "kconfig",
+      "kconfigwidgets",
+      "kguiaddons",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "kitemviews",
+      "knewstuff",
+      "knotifications",
+      "kpackage",
+      "kwidgetsaddons",
+      "oxygen-icons"
+    ],
+    "francis": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "kdbusaddons",
+      "ki18n",
+      "kirigami",
+      "kirigami-addons",
+      "knotifications",
+      "kwindowsystem",
+      "qqc2-desktop-style"
+    ],
+    "futuresql": [
+      "extra-cmake-modules"
+    ],
+    "gcompris": [
+      "extra-cmake-modules"
+    ],
+    "ghostwriter": [
+      "extra-cmake-modules",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kxmlgui",
+      "sonnet"
+    ],
+    "glaxnimate": [
+      "extra-cmake-modules",
+      "karchive",
+      "kcompletion",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kxmlgui"
+    ],
+    "gpgme": [
+      "libgpg-error"
+    ],
+    "granatier": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "ki18n",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "libkdegames"
+    ],
+    "grantlee-editor": [
+      "akonadi-contacts",
+      "extra-cmake-modules",
+      "grantleetheme",
+      "kimap",
+      "ktextaddons",
+      "ktexttemplate",
+      "messagelib",
+      "pimcommon"
+    ],
+    "grantleetheme": [
+      "extra-cmake-modules",
+      "kcolorscheme",
+      "kguiaddons",
+      "ki18n",
+      "kiconthemes",
+      "knewstuff",
+      "ktexttemplate",
+      "kxmlgui"
+    ],
+    "gwenview": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "kdbusaddons",
+      "kdoctools",
+      "kglobalaccel",
+      "kguiaddons",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "kitemmodels",
+      "knewstuff",
+      "knotifications",
+      "kparts",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "kxmlgui",
+      "libkdcraw",
+      "phonon",
+      "plasma-activities",
+      "purpose",
+      "wayland",
+      "wayland-protocols"
+    ],
+    "haruna": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kfilemetadata",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "kirigami",
+      "mpvqt"
+    ],
+    "hash-o-matic": [
+      "extra-cmake-modules",
+      "kcolorscheme",
+      "kconfig",
+      "kcoreaddons",
+      "kdbusaddons",
+      "ki18n",
+      "kirigami",
+      "kwindowsystem",
+      "libkleo",
+      "qqc2-desktop-style"
+    ],
+    "heaptrack": [
+      "extra-cmake-modules",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kdiagram",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "kitemmodels",
+      "threadweaver"
+    ],
+    "incidenceeditor": [
+      "akonadi",
+      "akonadi-mime",
+      "calendarsupport",
+      "eventviews",
+      "extra-cmake-modules",
+      "kcalendarcore",
+      "kcalutils",
+      "kdiagram",
+      "kidentitymanagement",
+      "kldap",
+      "kmime",
+      "kpimtextedit",
+      "libkdepim",
+      "pimcommon"
+    ],
+    "index-fm": [
+      "extra-cmake-modules",
+      "ki18n",
+      "kio",
+      "knotifications",
+      "kservice",
+      "mauikit",
+      "mauikit-filebrowsing"
+    ],
+    "isoimagewriter": [
+      "extra-cmake-modules",
+      "karchive",
+      "kauth",
+      "kconfig",
+      "kcoreaddons",
+      "kcrash",
+      "ki18n",
+      "kiconthemes",
+      "kwidgetsaddons",
+      "solid"
+    ],
+    "itinerary": [
+      "extra-cmake-modules",
+      "karchive",
+      "kconfig",
+      "kcontacts",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kfilemetadata",
+      "khealthcertificate",
+      "kholidays",
+      "ki18n",
+      "kio",
+      "kirigami",
+      "kirigami-addons",
+      "kitemmodels",
+      "kitinerary",
+      "knotifications",
+      "kosmindoormap",
+      "kpkpass",
+      "kpublictransport",
+      "kunitconversion",
+      "kwindowsystem",
+      "libquotient",
+      "networkmanager-qt",
+      "prison",
+      "qqc2-desktop-style"
+    ],
+    "juk": [
+      "kcompletion",
+      "kconfig",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "kjobwidgets",
+      "knotifications",
+      "kstatusnotifieritem",
+      "ktextwidgets",
+      "kwallet",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "kxmlgui",
+      "phonon"
+    ],
+    "k3b": [
+      "extra-cmake-modules",
+      "karchive",
+      "kcmutils",
+      "kconfig",
+      "kcoreaddons",
+      "kdoctools",
+      "kfilemetadata",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "kjobwidgets",
+      "knewstuff",
+      "knotifications",
+      "knotifyconfig",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "libkcddb",
+      "solid"
+    ],
+    "kaccounts-integration": [
+      "accounts-qt",
+      "extra-cmake-modules",
+      "kcmutils",
+      "kcoreaddons",
+      "kdbusaddons",
+      "ki18n",
+      "kio",
+      "kwallet",
+      "qcoro",
+      "signond"
+    ],
+    "kaccounts-providers": [
+      "extra-cmake-modules",
+      "kaccounts-integration",
+      "ki18n",
+      "kio",
+      "kpackage"
+    ],
+    "kactivitymanagerd": [
+      "extra-cmake-modules",
+      "kauth",
+      "kcodecs",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kglobalaccel",
+      "ki18n",
+      "kio",
+      "kservice",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "kxmlgui"
+    ],
+    "kaddressbook": [
+      "akonadi",
+      "akonadi-contacts",
+      "akonadi-search",
+      "extra-cmake-modules",
+      "grantleetheme",
+      "kontactinterface",
+      "kuserfeedback",
+      "libkdepim",
+      "pimcommon"
+    ],
+    "kajongg": [
+      "extra-cmake-modules",
+      "kdoctools",
+      "ki18n",
+      "libkmahjongg"
+    ],
+    "kalarm": [
+      "akonadi",
+      "akonadi-contacts",
+      "akonadi-mime",
+      "extra-cmake-modules",
+      "kcalendarcore",
+      "kcalutils",
+      "kcodecs",
+      "kcompletion",
+      "kconfig",
+      "kconfigwidgets",
+      "kcontacts",
+      "kcrash",
+      "kdbusaddons",
+      "kglobalaccel",
+      "kguiaddons",
+      "kholidays",
+      "ki18n",
+      "kidentitymanagement",
+      "kio",
+      "kitemmodels",
+      "kjobwidgets",
+      "kmailtransport",
+      "kmime",
+      "knotifications",
+      "knotifyconfig",
+      "kservice",
+      "kstatusnotifieritem",
+      "ktextaddons",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "kxmlgui",
+      "phonon"
+    ],
+    "kalgebra": [
+      "analitza",
+      "extra-cmake-modules",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kdoctools",
+      "ki18n",
+      "kio",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "libplasma"
+    ],
+    "kalk": [
+      "extra-cmake-modules",
+      "kcoreaddons",
+      "ki18n",
+      "kirigami",
+      "kunitconversion"
+    ],
+    "kalm": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "kcrash",
+      "ki18n",
+      "kirigami",
+      "kirigami-addons"
+    ],
+    "kalternatives": [
+      "extra-cmake-modules",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "kwidgetsaddons"
+    ],
+    "kalzium": [
+      "extra-cmake-modules",
+      "karchive",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kdoctools",
+      "ki18n",
+      "kio",
+      "kitemviews",
+      "knewstuff",
+      "kplotting",
+      "ktextwidgets",
+      "kunitconversion",
+      "kwidgetsaddons",
+      "kxmlgui"
+    ],
+    "kamera": [
+      "extra-cmake-modules",
+      "kcmutils",
+      "kconfig",
+      "kconfigwidgets",
+      "kdoctools",
+      "ki18n",
+      "kio",
+      "kxmlgui"
+    ],
+    "kamoso": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kdoctools",
+      "ki18n",
+      "kio",
+      "knotifications",
+      "purpose"
+    ],
+    "kanagram": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdoctools",
+      "ki18n",
+      "kio",
+      "knewstuff",
+      "kxmlgui",
+      "libkeduvocdocument",
+      "sonnet"
+    ],
+    "kapidox": [
+      "extra-cmake-modules"
+    ],
+    "kapman": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "ki18n",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "libkdegames"
+    ],
+    "kapptemplate": [
+      "extra-cmake-modules",
+      "karchive",
+      "kcompletion",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kdoctools",
+      "ki18n",
+      "kio"
+    ],
+    "karchive": [
+      "extra-cmake-modules"
+    ],
+    "kasts": [
+      "extra-cmake-modules",
+      "kcolorscheme",
+      "kconfig",
+      "kcoreaddons",
+      "ki18n",
+      "kirigami",
+      "kirigami-addons",
+      "qtkeychain",
+      "syndication",
+      "threadweaver"
+    ],
+    "kasync": [
+      "extra-cmake-modules"
+    ],
+    "kate": [
+      "breeze-icons",
+      "extra-cmake-modules",
+      "kdoctools",
+      "ki18n",
+      "kiconthemes",
+      "knewstuff",
+      "ktexteditor",
+      "ktextwidgets",
+      "kuserfeedback"
+    ],
+    "katomic": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "ki18n",
+      "knewstuff",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "libkdegames"
+    ],
+    "kauth": [
+      "extra-cmake-modules",
+      "kcoreaddons",
+      "kwindowsystem",
+      "polkit-qt-1"
+    ],
+    "kbackup": [
+      "extra-cmake-modules",
+      "karchive",
+      "kconfig",
+      "kcoreaddons",
+      "kdoctools",
+      "kguiaddons",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "knotifications",
+      "kstatusnotifieritem",
+      "kwidgetsaddons",
+      "kxmlgui"
+    ],
+    "kbibtex": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "kcrash",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "kparts",
+      "ktexteditor",
+      "kwallet",
+      "kwidgetsaddons",
+      "kxmlgui"
+    ],
+    "kblackbox": [
+      "extra-cmake-modules",
+      "karchive",
+      "kconfig",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "ki18n",
+      "ktextwidgets",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "libkdegames"
+    ],
+    "kblocks": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "ki18n",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "libkdegames"
+    ],
+    "kbookmarks": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons"
+    ],
+    "kbounce": [
+      "extra-cmake-modules",
+      "kcolorscheme",
+      "kcompletion",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "ki18n",
+      "kio",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "libkdegames"
+    ],
+    "kbreakout": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "ki18n",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "libkdegames"
+    ],
+    "kbruch": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcrash",
+      "kdoctools",
+      "ki18n",
+      "kwidgetsaddons",
+      "kxmlgui"
+    ],
+    "kcachegrind": [
+      "extra-cmake-modules",
+      "karchive",
+      "kconfig",
+      "kcoreaddons",
+      "kdbusaddons",
+      "kdoctools",
+      "ki18n",
+      "kio",
+      "kwidgetsaddons",
+      "kxmlgui"
+    ],
+    "kcalc": [
+      "extra-cmake-modules",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kguiaddons",
+      "ki18n",
+      "knotifications",
+      "kxmlgui"
+    ],
+    "kcalendarcore": [
+      "extra-cmake-modules"
+    ],
+    "kcalutils": [
+      "breeze-icons",
+      "extra-cmake-modules",
+      "kcalendarcore",
+      "kidentitymanagement",
+      "ktexttemplate"
+    ],
+    "kcgroups": [
+      "extra-cmake-modules"
+    ],
+    "kcharselect": [
+      "extra-cmake-modules",
+      "kbookmarks",
+      "kcoreaddons",
+      "kcrash",
+      "kdoctools",
+      "ki18n",
+      "kwidgetsaddons",
+      "kxmlgui"
+    ],
+    "kclock": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "kdbusaddons",
+      "ki18n",
+      "kirigami",
+      "kirigami-addons",
+      "knotifications",
+      "kstatusnotifieritem",
+      "libplasma"
+    ],
+    "kcm-grub2": [
+      "extra-cmake-modules",
+      "kauth",
+      "kcmutils",
+      "ki18n",
+      "kio",
+      "packagekit-qt",
+      "solid"
+    ],
+    "kcmutils": [
+      "extra-cmake-modules",
+      "kcoreaddons",
+      "ki18n",
+      "kio",
+      "kirigami",
+      "kitemviews",
+      "kxmlgui"
+    ],
+    "kcodecs": [
+      "extra-cmake-modules"
+    ],
+    "kcolorchooser": [
+      "extra-cmake-modules",
+      "ki18n",
+      "kxmlgui"
+    ],
+    "kcolorscheme": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kguiaddons",
+      "ki18n"
+    ],
+    "kcompletion": [
+      "extra-cmake-modules",
+      "kcodecs",
+      "kconfig",
+      "kwidgetsaddons"
+    ],
+    "kconfig": [
+      "extra-cmake-modules"
+    ],
+    "kconfigwidgets": [
+      "extra-cmake-modules",
+      "kcodecs",
+      "kcolorscheme",
+      "kconfig",
+      "kcoreaddons",
+      "kguiaddons",
+      "ki18n",
+      "kwidgetsaddons"
+    ],
+    "kcontacts": [
+      "extra-cmake-modules",
+      "kcodecs",
+      "kconfig",
+      "kcoreaddons",
+      "ki18n"
+    ],
+    "kcoreaddons": [
+      "extra-cmake-modules"
+    ],
+    "kcrash": [
+      "extra-cmake-modules",
+      "kcoreaddons"
+    ],
+    "kcron": [
+      "extra-cmake-modules",
+      "kcmutils",
+      "kconfigwidgets",
+      "kdoctools",
+      "ki18n",
+      "kio"
+    ],
+    "kdav": [
+      "extra-cmake-modules",
+      "kio"
+    ],
+    "kdav2": [
+      "extra-cmake-modules",
+      "kcoreaddons"
+    ],
+    "kdb": [
+      "extra-cmake-modules",
+      "kcoreaddons"
+    ],
+    "kdbusaddons": [
+      "extra-cmake-modules"
+    ],
+    "kde-cli-tools": [
+      "extra-cmake-modules",
+      "kauth",
+      "kcmutils",
+      "kcodecs",
+      "kcompletion",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kdesu",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "kjobwidgets",
+      "kparts",
+      "kpty",
+      "kservice",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "solid"
+    ],
+    "kde-dev-scripts": [
+      "extra-cmake-modules",
+      "kdoctools"
+    ],
+    "kde-dev-utils": [
+      "extra-cmake-modules",
+      "kcoreaddons",
+      "ki18n",
+      "kio",
+      "kparts",
+      "kwidgetsaddons"
+    ],
+    "kde-gtk-config": [
+      "extra-cmake-modules",
+      "kauth",
+      "kcodecs",
+      "kcolorscheme",
+      "kconfig",
+      "kcoreaddons",
+      "kdbusaddons",
+      "kdecoration",
+      "kguiaddons",
+      "kwidgetsaddons",
+      "kwindowsystem"
+    ],
+    "kde-inotify-survey": [
+      "extra-cmake-modules",
+      "kauth",
+      "kcodecs",
+      "kcompletion",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdeclarative",
+      "ki18n",
+      "kidletime",
+      "kio",
+      "kjobwidgets",
+      "knotifications",
+      "kservice",
+      "kwallet",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "solid",
+      "syntax-highlighting"
+    ],
+    "kdebugsettings": [
+      "extra-cmake-modules",
+      "kcompletion",
+      "kconfig",
+      "kcoreaddons",
+      "kdbusaddons",
+      "ki18n",
+      "kitemviews",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "selenium-webdriver-at-spi"
+    ],
+    "kdeclarative": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kglobalaccel",
+      "kguiaddons",
+      "ki18n",
+      "kwidgetsaddons"
+    ],
+    "kdeconnect-kde": [
+      "extra-cmake-modules",
+      "kcmutils",
+      "kconfig",
+      "kcontacts",
+      "kcoreaddons",
+      "kdbusaddons",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "kirigami",
+      "kirigami-addons",
+      "kitemmodels",
+      "knotifications",
+      "kpackage",
+      "kpeople",
+      "kservice",
+      "kstatusnotifieritem",
+      "kwindowsystem",
+      "modemmanager-qt",
+      "plasma-wayland-protocols",
+      "pulseaudio-qt",
+      "qqc2-desktop-style",
+      "solid"
+    ],
+    "kdecoration": [
+      "extra-cmake-modules",
+      "ki18n"
+    ],
+    "kded": [
+      "extra-cmake-modules",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "ki18n",
+      "kservice"
+    ],
+    "kdeedu-data": [
+      "extra-cmake-modules"
+    ],
+    "kdegraphics-mobipocket": [
+      "extra-cmake-modules"
+    ],
+    "kdegraphics-thumbnailers": [
+      "extra-cmake-modules",
+      "karchive",
+      "kdegraphics-mobipocket",
+      "kio",
+      "libkdcraw",
+      "libkexiv2"
+    ],
+    "kdenetwork-filesharing": [
+      "extra-cmake-modules",
+      "kcompletion",
+      "kcoreaddons",
+      "ki18n",
+      "kio",
+      "kwidgetsaddons",
+      "packagekit-qt",
+      "qcoro"
+    ],
+    "kdenlive": [
+      "breeze-icons",
+      "extra-cmake-modules",
+      "karchive",
+      "kbookmarks",
+      "kcompletion",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kfilemetadata",
+      "kguiaddons",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "kitemviews",
+      "kjobwidgets",
+      "knewstuff",
+      "knotifications",
+      "knotifyconfig",
+      "kplotting",
+      "kservice",
+      "ktextwidgets",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "purpose"
+    ],
+    "kdepim-addons": [
+      "akonadi",
+      "akonadi-calendar",
+      "akonadi-contacts",
+      "akonadi-import-wizard",
+      "akonadi-notes",
+      "calendarsupport",
+      "eventviews",
+      "extra-cmake-modules",
+      "grantleetheme",
+      "incidenceeditor",
+      "kaddressbook",
+      "kcalendarcore",
+      "kcalutils",
+      "kconfig",
+      "kcontacts",
+      "kdbusaddons",
+      "kdeclarative",
+      "kguiaddons",
+      "kholidays",
+      "kiconthemes",
+      "kidentitymanagement",
+      "kimap",
+      "kio",
+      "kitinerary",
+      "kmailtransport",
+      "kparts",
+      "kpimtextedit",
+      "kpkpass",
+      "ktextaddons",
+      "ktexttemplate",
+      "ktnef",
+      "kxmlgui",
+      "libgravatar",
+      "libkdepim",
+      "libkleo",
+      "libksieve",
+      "mailcommon",
+      "mailimporter",
+      "messagelib",
+      "pimcommon",
+      "prison"
+    ],
+    "kdepim-runtime": [
+      "akonadi",
+      "akonadi-calendar",
+      "akonadi-contacts",
+      "akonadi-mime",
+      "akonadi-notes",
+      "extra-cmake-modules",
+      "kcalendarcore",
+      "kcalutils",
+      "kcmutils",
+      "kcodecs",
+      "kconfig",
+      "kconfigwidgets",
+      "kcontacts",
+      "kdav",
+      "kidentitymanagement",
+      "kimap",
+      "kio",
+      "kitemmodels",
+      "kldap",
+      "kmailtransport",
+      "kmbox",
+      "kmime",
+      "knotifications",
+      "knotifyconfig",
+      "ktextaddons",
+      "ktextwidgets",
+      "kwindowsystem",
+      "libkgapi",
+      "qtkeychain"
+    ],
+    "kdeplasma-addons": [
+      "attica",
+      "extra-cmake-modules",
+      "kauth",
+      "kcmutils",
+      "kcodecs",
+      "kcompletion",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kglobalaccel",
+      "kholidays",
+      "ki18n",
+      "kio",
+      "kirigami-addons",
+      "kjobwidgets",
+      "knewstuff",
+      "knotifications",
+      "kpackage",
+      "krunner",
+      "kservice",
+      "kunitconversion",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "libplasma",
+      "plasma-nano",
+      "plasma-workspace",
+      "plasma5support",
+      "selenium-webdriver-at-spi",
+      "solid",
+      "sonnet"
+    ],
+    "kdesdk-kio": [
+      "extra-cmake-modules",
+      "ki18n",
+      "kio"
+    ],
+    "kdesdk-thumbnailers": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "ki18n",
+      "kio"
+    ],
+    "kdesu": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "kpty"
+    ],
+    "kdesvn": [
+      "extra-cmake-modules",
+      "kbookmarks",
+      "kcodecs",
+      "kcompletion",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kdbusaddons",
+      "kdoctools",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "kitemviews",
+      "kjobwidgets",
+      "knotifications",
+      "kparts",
+      "kservice",
+      "ktextwidgets",
+      "kwallet",
+      "kwidgetsaddons",
+      "kxmlgui"
+    ],
+    "kdev-css": [
+      "extra-cmake-modules",
+      "kdevelop",
+      "kdevelop-pg-qt",
+      "ki18n",
+      "ktexteditor"
+    ],
+    "kdev-embedded": [
+      "extra-cmake-modules",
+      "kdevelop",
+      "ki18n",
+      "kitemmodels",
+      "knewstuff",
+      "ktexteditor",
+      "threadweaver"
+    ],
+    "kdev-executebrowser": [
+      "extra-cmake-modules",
+      "kdevelop",
+      "ki18n",
+      "kitemmodels",
+      "ktexteditor"
+    ],
+    "kdev-krazy2": [
+      "extra-cmake-modules",
+      "kdevelop",
+      "ki18n",
+      "kitemmodels",
+      "ktexteditor",
+      "threadweaver"
+    ],
+    "kdev-mercurial": [
+      "extra-cmake-modules",
+      "kdevelop",
+      "ki18n"
+    ],
+    "kdev-php": [
+      "extra-cmake-modules",
+      "kcmutils",
+      "kdevelop",
+      "kdevelop-pg-qt",
+      "ki18n",
+      "ktexteditor",
+      "threadweaver"
+    ],
+    "kdev-python": [
+      "extra-cmake-modules",
+      "kdevelop",
+      "ki18n",
+      "ktexteditor",
+      "threadweaver"
+    ],
+    "kdev-ruby": [
+      "extra-cmake-modules",
+      "kdevelop",
+      "ki18n",
+      "ktexteditor"
+    ],
+    "kdev-upload": [
+      "extra-cmake-modules",
+      "kcmutils",
+      "kdevelop",
+      "ki18n",
+      "kio",
+      "kitemmodels",
+      "ktexteditor"
+    ],
+    "kdev-valgrind": [
+      "extra-cmake-modules",
+      "kdevelop",
+      "ki18n",
+      "kitemmodels",
+      "ktexteditor"
+    ],
+    "kdev-verapp": [
+      "extra-cmake-modules",
+      "kdevelop",
+      "ki18n",
+      "ktexteditor"
+    ],
+    "kdev-xdebug": [
+      "extra-cmake-modules",
+      "kdev-executebrowser",
+      "kdevelop",
+      "ki18n",
+      "kitemmodels",
+      "ktexteditor"
+    ],
+    "kdevelop": [
+      "kdevelop-pg-qt",
+      "kitemmodels",
+      "knotifyconfig",
+      "ktexteditor",
+      "libkomparediff2",
+      "libksysguard",
+      "okteta",
+      "threadweaver"
+    ],
+    "kdevelop-pg-qt": [
+      "extra-cmake-modules"
+    ],
+    "kdf": [
+      "extra-cmake-modules",
+      "kcmutils",
+      "kconfig",
+      "kcoreaddons",
+      "kdoctools",
+      "kio",
+      "kjobwidgets",
+      "knotifications",
+      "kstatusnotifieritem",
+      "kwidgetsaddons",
+      "kxmlgui"
+    ],
+    "kdiagram": [
+      "extra-cmake-modules"
+    ],
+    "kdialog": [
+      "extra-cmake-modules",
+      "kdbusaddons",
+      "kguiaddons",
+      "kiconthemes",
+      "kio",
+      "knotifications",
+      "ktextwidgets",
+      "kwindowsystem"
+    ],
+    "kdiamond": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "ki18n",
+      "knotifications",
+      "knotifyconfig",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "libkdegames"
+    ],
+    "kdiff3": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "kcrash",
+      "kdoctools",
+      "ki18n",
+      "kio",
+      "kparts",
+      "kwidgetsaddons",
+      "kxmlgui"
+    ],
+    "kdnssd": [
+      "extra-cmake-modules"
+    ],
+    "kdoctools": [
+      "extra-cmake-modules",
+      "karchive",
+      "ki18n"
+    ],
+    "kdsoap-ws-discovery-client": [
+      "extra-cmake-modules",
+      "kdsoap"
+    ],
+    "keditbookmarks": [
+      "extra-cmake-modules",
+      "kbookmarks",
+      "kcodecs",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kdoctools",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "kparts",
+      "kwidgetsaddons",
+      "kwindowsystem"
+    ],
+    "keurocalc": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kdoctools",
+      "ki18n",
+      "kio",
+      "kwidgetsaddons",
+      "kxmlgui"
+    ],
+    "kexi": [
+      "breeze",
+      "breeze-icons",
+      "extra-cmake-modules",
+      "karchive",
+      "kcodecs",
+      "kcompletion",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdb",
+      "kdoctools",
+      "kguiaddons",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "kitemviews",
+      "kproperty",
+      "kreport",
+      "ktexteditor",
+      "ktextwidgets",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "marble"
+    ],
+    "keysmith": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kdbusaddons",
+      "kguiaddons",
+      "ki18n",
+      "kirigami",
+      "kwidgetsaddons",
+      "kwindowsystem"
+    ],
+    "kfilemetadata": [
+      "extra-cmake-modules",
+      "karchive",
+      "kcoreaddons",
+      "ki18n",
+      "poppler",
+      "taglib"
+    ],
+    "kfind": [
+      "extra-cmake-modules",
+      "karchive",
+      "kcoreaddons",
+      "kdoctools",
+      "kfilemetadata",
+      "ki18n",
+      "kio",
+      "kwidgetsaddons",
+      "kxmlgui"
+    ],
+    "kfloppy": [
+      "extra-cmake-modules",
+      "kcompletion",
+      "kcoreaddons",
+      "kcrash",
+      "kdoctools",
+      "ki18n",
+      "kwidgetsaddons",
+      "kxmlgui"
+    ],
+    "kfourinline": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdnssd",
+      "kdoctools",
+      "ki18n",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "libkdegames"
+    ],
+    "kgamma": [
+      "extra-cmake-modules",
+      "kcmutils",
+      "kconfig",
+      "kconfigwidgets",
+      "kdoctools",
+      "ki18n"
+    ],
+    "kgeography": [
+      "extra-cmake-modules",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdoctools",
+      "ki18n",
+      "kiconthemes",
+      "kitemviews",
+      "kwidgetsaddons",
+      "kxmlgui"
+    ],
+    "kgeotag": [
+      "extra-cmake-modules",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdoctools",
+      "ki18n",
+      "kxmlgui",
+      "libkexiv2",
+      "marble"
+    ],
+    "kget": [
+      "extra-cmake-modules",
+      "kcmutils",
+      "kcompletion",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "kitemviews",
+      "knotifications",
+      "knotifyconfig",
+      "kservice",
+      "kstatusnotifieritem",
+      "kwallet",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "kxmlgui",
+      "libktorrent"
+    ],
+    "kglobalaccel": [
+      "extra-cmake-modules"
+    ],
+    "kglobalacceld": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kglobalaccel",
+      "kio",
+      "kjobwidgets",
+      "kservice",
+      "kwindowsystem"
+    ],
+    "kgoldrunner": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "ki18n",
+      "kio",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "libkdegames"
+    ],
+    "kgpg": [
+      "akonadi-contacts",
+      "extra-cmake-modules",
+      "karchive",
+      "kcodecs",
+      "kconfigwidgets",
+      "kcontacts",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "kguiaddons",
+      "ki18n",
+      "kio",
+      "kjobwidgets",
+      "knotifications",
+      "kservice",
+      "kstatusnotifieritem",
+      "ktextwidgets",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "kxmlgui"
+    ],
+    "kgraphviewer": [
+      "extra-cmake-modules",
+      "kcoreaddons",
+      "kdoctools",
+      "ki18n",
+      "kparts",
+      "kwidgetsaddons"
+    ],
+    "kguiaddons": [
+      "extra-cmake-modules",
+      "plasma-wayland-protocols",
+      "wayland"
+    ],
+    "khangman": [
+      "extra-cmake-modules",
+      "kcompletion",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdoctools",
+      "ki18n",
+      "kio",
+      "knewstuff",
+      "knotifications",
+      "libkeduvocdocument"
+    ],
+    "khealthcertificate": [
+      "extra-cmake-modules",
+      "karchive",
+      "kcodecs",
+      "ki18n"
+    ],
+    "khelpcenter": [
+      "extra-cmake-modules",
+      "karchive",
+      "kbookmarks",
+      "kconfig",
+      "kcoreaddons",
+      "kdoctools",
+      "ki18n",
+      "kio",
+      "kservice",
+      "ktexttemplate",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "kxmlgui"
+    ],
+    "khipu": [
+      "analitza",
+      "extra-cmake-modules",
+      "kcoreaddons",
+      "kdoctools",
+      "kguiaddons",
+      "ki18n",
+      "kitemmodels",
+      "kitemviews",
+      "knewstuff",
+      "kwidgetsaddons",
+      "kxmlgui"
+    ],
+    "kholidays": [
+      "extra-cmake-modules"
+    ],
+    "ki18n": [
+      "extra-cmake-modules"
+    ],
+    "kiconthemes": [
+      "extra-cmake-modules",
+      "karchive",
+      "kcolorscheme",
+      "kconfigwidgets",
+      "ki18n",
+      "kwidgetsaddons"
+    ],
+    "kid3": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kio",
+      "kwidgetsaddons",
+      "kxmlgui"
+    ],
+    "kidentitymanagement": [
+      "extra-cmake-modules",
+      "kirigami-addons",
+      "kpimtextedit",
+      "ktextaddons"
+    ],
+    "kidletime": [
+      "extra-cmake-modules",
+      "plasma-wayland-protocols",
+      "wayland",
+      "wayland-protocols"
+    ],
+    "kig": [
+      "extra-cmake-modules",
+      "karchive",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdoctools",
+      "ki18n",
+      "kiconthemes",
+      "kparts",
+      "ktexteditor",
+      "kxmlgui"
+    ],
+    "kigo": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "ki18n",
+      "kio",
+      "knewstuff",
+      "ktextwidgets",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "libkdegames"
+    ],
+    "kile": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "kguiaddons",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "kparts",
+      "ktexteditor",
+      "kwindowsystem",
+      "kxmlgui",
+      "okular"
+    ],
+    "killbots": [
+      "extra-cmake-modules",
+      "kcompletion",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "ki18n",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "libkdegames"
+    ],
+    "kimageformats": [
+      "extra-cmake-modules",
+      "karchive"
+    ],
+    "kimagemapeditor": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "kguiaddons",
+      "ki18n",
+      "kparts",
+      "kwidgetsaddons",
+      "kxmlgui"
+    ],
+    "kimap": [
+      "extra-cmake-modules",
+      "kcoreaddons",
+      "ki18n",
+      "kio",
+      "kmime"
+    ],
+    "kinfocenter": [
+      "extra-cmake-modules",
+      "kauth",
+      "kcmutils",
+      "kcodecs",
+      "kcompletion",
+      "kconfig",
+      "kcoreaddons",
+      "ki18n",
+      "kio",
+      "kjobwidgets",
+      "kservice",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "plasma-systemmonitor",
+      "selenium-webdriver-at-spi",
+      "solid",
+      "systemsettings",
+      "xdg-desktop-portal-kde"
+    ],
+    "kio": [
+      "extra-cmake-modules",
+      "karchive",
+      "kauth",
+      "kbookmarks",
+      "kcolorscheme",
+      "kcompletion",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "kguiaddons",
+      "ki18n",
+      "kiconthemes",
+      "kitemviews",
+      "kjobwidgets",
+      "knotifications",
+      "kservice",
+      "kwallet",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "solid"
+    ],
+    "kio-admin": [
+      "extra-cmake-modules",
+      "kio",
+      "polkit-qt-1"
+    ],
+    "kio-extras": [
+      "extra-cmake-modules",
+      "karchive",
+      "kcmutils",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kdbusaddons",
+      "kdnssd",
+      "kdoctools",
+      "kdsoap",
+      "kdsoap-ws-discovery-client",
+      "kguiaddons",
+      "ki18n",
+      "kio",
+      "libkexiv2",
+      "phonon",
+      "plasma-activities",
+      "plasma-activities-stats",
+      "qcoro",
+      "solid",
+      "syntax-highlighting"
+    ],
+    "kio-fuse": [
+      "extra-cmake-modules",
+      "kcoreaddons",
+      "kio"
+    ],
+    "kio-gdrive": [
+      "extra-cmake-modules",
+      "kdoctools",
+      "ki18n",
+      "kio",
+      "libkgapi",
+      "purpose",
+      "qtkeychain"
+    ],
+    "kio-gopher": [
+      "extra-cmake-modules",
+      "kdoctools",
+      "ki18n",
+      "kiconthemes",
+      "kio"
+    ],
+    "kio-s3": [
+      "extra-cmake-modules",
+      "kdoctools",
+      "ki18n",
+      "kio"
+    ],
+    "kio-stash": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kdbusaddons",
+      "ki18n",
+      "kio"
+    ],
+    "kio-zeroconf": [
+      "extra-cmake-modules",
+      "kdbusaddons",
+      "kdnssd",
+      "ki18n",
+      "kio"
+    ],
+    "kipi-plugins": [
+      "extra-cmake-modules",
+      "kconfig",
+      "ki18n",
+      "kio",
+      "kwindowsystem",
+      "kxmlgui",
+      "libkipi",
+      "libmediawiki"
+    ],
+    "kirigami": [
+      "extra-cmake-modules"
+    ],
+    "kirigami-addons": [
+      "extra-cmake-modules",
+      "ki18n",
+      "kirigami"
+    ],
+    "kirigami-gallery": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kirigami",
+      "kitemmodels"
+    ],
+    "kiriki": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "ki18n",
+      "kiconthemes",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "libkdegames"
+    ],
+    "kirogi": [
+      "extra-cmake-modules",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdnssd",
+      "ki18n",
+      "kirigami",
+      "kirigami-addons"
+    ],
+    "kitemmodels": [
+      "extra-cmake-modules"
+    ],
+    "kitemviews": [
+      "extra-cmake-modules"
+    ],
+    "kiten": [
+      "extra-cmake-modules",
+      "karchive",
+      "kcompletion",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdoctools",
+      "ki18n",
+      "kio",
+      "kxmlgui"
+    ],
+    "kitinerary": [
+      "extra-cmake-modules",
+      "kcalendarcore",
+      "kcodecs",
+      "kcontacts",
+      "ki18n",
+      "kmime",
+      "kpkpass",
+      "zxing-cpp"
+    ],
+    "kitinerary-workbench": [
+      "extra-cmake-modules",
+      "kio",
+      "kitinerary",
+      "ktexteditor"
+    ],
+    "kjobwidgets": [
+      "extra-cmake-modules",
+      "kcoreaddons",
+      "knotifications",
+      "kwidgetsaddons"
+    ],
+    "kjots": [
+      "akonadi",
+      "akonadi-notes",
+      "extra-cmake-modules",
+      "kbookmarks",
+      "kcmutils",
+      "kconfig",
+      "kconfigwidgets",
+      "kio",
+      "kmime",
+      "kontactinterface",
+      "kparts",
+      "kpimtextedit",
+      "ktextaddons",
+      "ktexttemplate",
+      "kxmlgui"
+    ],
+    "kjournald": [
+      "extra-cmake-modules",
+      "kcoreaddons",
+      "ki18n"
+    ],
+    "kjumpingcube": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "ki18n",
+      "kio",
+      "kjobwidgets",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "libkdegames"
+    ],
+    "kldap": [
+      "extra-cmake-modules",
+      "kdoctools",
+      "ki18n",
+      "kio",
+      "qtkeychain"
+    ],
+    "kleopatra": [
+      "extra-cmake-modules",
+      "kcmutils",
+      "kcodecs",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "ki18n",
+      "kiconthemes",
+      "kidentitymanagement",
+      "kio",
+      "kitemmodels",
+      "kmailtransport",
+      "kmime",
+      "kstatusnotifieritem",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "kxmlgui",
+      "libkleo",
+      "mimetreeparser"
+    ],
+    "klettres": [
+      "extra-cmake-modules",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdoctools",
+      "ki18n",
+      "knewstuff",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "phonon"
+    ],
+    "klevernotes": [
+      "extra-cmake-modules",
+      "kcolorscheme",
+      "kconfig",
+      "kcoreaddons",
+      "ki18n",
+      "kio",
+      "kirigami",
+      "kirigami-addons",
+      "qqc2-desktop-style"
+    ],
+    "klickety": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "ki18n",
+      "kio",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "libkdegames"
+    ],
+    "klimbgrades": [
+      "extra-cmake-modules",
+      "kconfig",
+      "ki18n",
+      "kirigami",
+      "kirigami-addons"
+    ],
+    "klines": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "ki18n",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "libkdegames"
+    ],
+    "kmag": [
+      "extra-cmake-modules",
+      "kdoctools",
+      "ki18n",
+      "kio",
+      "kxmlgui",
+      "libqaccessibilityclient"
+    ],
+    "kmahjongg": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "ki18n",
+      "knewstuff",
+      "kxmlgui",
+      "libkdegames",
+      "libkmahjongg"
+    ],
+    "kmail": [
+      "akonadi",
+      "akonadi-contacts",
+      "akonadi-mime",
+      "akonadi-search",
+      "extra-cmake-modules",
+      "kbookmarks",
+      "kcalendarcore",
+      "kcalutils",
+      "kcmutils",
+      "kconfig",
+      "kconfigwidgets",
+      "kcontacts",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "kguiaddons",
+      "ki18n",
+      "kiconthemes",
+      "kidentitymanagement",
+      "kio",
+      "kitemviews",
+      "kjobwidgets",
+      "kldap",
+      "kmailtransport",
+      "kmime",
+      "knotifications",
+      "knotifyconfig",
+      "kontactinterface",
+      "kparts",
+      "kpimtextedit",
+      "kservice",
+      "kstatusnotifieritem",
+      "ktextaddons",
+      "ktextwidgets",
+      "ktnef",
+      "kuserfeedback",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "kxmlgui",
+      "libgravatar",
+      "libkdepim",
+      "libkleo",
+      "libksieve",
+      "mailcommon",
+      "messagelib",
+      "pimcommon",
+      "qtkeychain",
+      "sonnet"
+    ],
+    "kmail-account-wizard": [
+      "akonadi",
+      "extra-cmake-modules",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "ki18n",
+      "kidentitymanagement",
+      "kmailtransport",
+      "kmime"
+    ],
+    "kmailtransport": [
+      "extra-cmake-modules",
+      "ksmtp",
+      "libkgapi",
+      "qtkeychain"
+    ],
+    "kmbox": [
+      "extra-cmake-modules",
+      "kmime"
+    ],
+    "kmenuedit": [
+      "extra-cmake-modules",
+      "kdbusaddons",
+      "kdoctools",
+      "kglobalaccel",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "kitemviews",
+      "kwindowsystem",
+      "kxmlgui",
+      "sonnet"
+    ],
+    "kmime": [
+      "extra-cmake-modules",
+      "kcodecs",
+      "ki18n"
+    ],
+    "kmines": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "ki18n",
+      "ktextwidgets",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "libkdegames"
+    ],
+    "kmix": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kconfigwidgets",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "kglobalaccel",
+      "ki18n",
+      "knotifications",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "kxmlgui",
+      "solid"
+    ],
+    "kmoretools": [
+      "extra-cmake-modules",
+      "ki18n",
+      "kio",
+      "kjobwidgets",
+      "kwidgetsaddons"
+    ],
+    "kmousetool": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kdbusaddons",
+      "kdoctools",
+      "ki18n",
+      "kiconthemes",
+      "kstatusnotifieritem",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "kxmlgui",
+      "phonon"
+    ],
+    "kmouth": [
+      "extra-cmake-modules",
+      "kcompletion",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdoctools",
+      "ki18n",
+      "kio",
+      "kwidgetsaddons",
+      "kxmlgui"
+    ],
+    "kmplot": [
+      "extra-cmake-modules",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "kguiaddons",
+      "ki18n",
+      "kparts",
+      "ktextwidgets",
+      "kwidgetsaddons"
+    ],
+    "kmymoney": [
+      "akonadi",
+      "alkimia",
+      "extra-cmake-modules",
+      "kcmutils",
+      "kcompletion",
+      "kconfig",
+      "kcontacts",
+      "kcoreaddons",
+      "kdiagram",
+      "kguiaddons",
+      "kholidays",
+      "ki18n",
+      "kiconthemes",
+      "kidentitymanagement",
+      "kio",
+      "kitemmodels",
+      "kitemviews",
+      "ktextwidgets",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "kxmlgui"
+    ],
+    "knavalbattle": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdnssd",
+      "kdoctools",
+      "ki18n",
+      "ktextwidgets",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "libkdegames"
+    ],
+    "knetwalk": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "ki18n",
+      "ktextwidgets",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "libkdegames"
+    ],
+    "knewstuff": [
+      "attica",
+      "extra-cmake-modules",
+      "karchive",
+      "kconfig",
+      "kcoreaddons",
+      "ki18n",
+      "kirigami",
+      "kpackage",
+      "kwidgetsaddons",
+      "syndication"
+    ],
+    "knights": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "ki18n",
+      "kio",
+      "kplotting",
+      "ksvg",
+      "ktextwidgets",
+      "kwallet",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "libkdegames",
+      "libplasma"
+    ],
+    "knotes": [
+      "akonadi",
+      "akonadi-notes",
+      "akonadi-search",
+      "extra-cmake-modules",
+      "grantleetheme",
+      "kcalutils",
+      "kcmutils",
+      "kcompletion",
+      "kconfig",
+      "kcoreaddons",
+      "kcrash",
+      "kdnssd",
+      "kdoctools",
+      "kglobalaccel",
+      "kiconthemes",
+      "kitemmodels",
+      "kitemviews",
+      "kmime",
+      "knewstuff",
+      "knotifications",
+      "knotifyconfig",
+      "kontactinterface",
+      "kparts",
+      "kstatusnotifieritem",
+      "ktextaddons",
+      "ktexttemplate",
+      "ktextwidgets",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "kxmlgui",
+      "pimcommon"
+    ],
+    "knotifications": [
+      "extra-cmake-modules",
+      "kconfig"
+    ],
+    "knotifyconfig": [
+      "extra-cmake-modules",
+      "ki18n",
+      "kio",
+      "knotifications",
+      "kxmlgui",
+      "phonon"
+    ],
+    "kodaskanna": [
+      "extra-cmake-modules",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "ki18n",
+      "kio",
+      "kwidgetsaddons",
+      "purpose"
+    ],
+    "koko": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "kdbusaddons",
+      "kdeclarative",
+      "kfilemetadata",
+      "kguiaddons",
+      "ki18n",
+      "kio",
+      "kirigami",
+      "knotifications",
+      "kquickimageeditor",
+      "purpose"
+    ],
+    "kolf": [
+      "extra-cmake-modules",
+      "kcompletion",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "ki18n",
+      "kio",
+      "ktextwidgets",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "libkdegames"
+    ],
+    "kollision": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "ki18n",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "libkdegames"
+    ],
+    "kolorfill": [
+      "extra-cmake-modules",
+      "kirigami"
+    ],
+    "kolourpaint": [
+      "extra-cmake-modules",
+      "kdoctools",
+      "kguiaddons",
+      "ki18n",
+      "kio",
+      "kjobwidgets",
+      "ktextwidgets",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "libksane"
+    ],
+    "kommit": [
+      "dolphin",
+      "extra-cmake-modules",
+      "kcoreaddons",
+      "kdoctools",
+      "ki18n",
+      "kio",
+      "ktexteditor",
+      "ktextwidgets",
+      "kxmlgui",
+      "syntax-highlighting"
+    ],
+    "kompare": [
+      "extra-cmake-modules",
+      "kcodecs",
+      "kconfig",
+      "kcoreaddons",
+      "kdoctools",
+      "kiconthemes",
+      "kjobwidgets",
+      "kparts",
+      "ktexteditor",
+      "kwidgetsaddons",
+      "libkomparediff2"
+    ],
+    "kongress": [
+      "extra-cmake-modules",
+      "kcalendarcore",
+      "kconfig",
+      "kcoreaddons",
+      "kdbusaddons",
+      "ki18n",
+      "kirigami",
+      "knotifications"
+    ],
+    "konqueror": [
+      "extra-cmake-modules",
+      "karchive",
+      "kcmutils",
+      "kcrash",
+      "kdbusaddons",
+      "kdesu",
+      "kdoctools",
+      "kguiaddons",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "kparts",
+      "kwindowsystem",
+      "plasma-activities"
+    ],
+    "konquest": [
+      "extra-cmake-modules",
+      "kcolorscheme",
+      "kconfig",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "kguiaddons",
+      "ki18n",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "libkdegames"
+    ],
+    "konsole": [
+      "extra-cmake-modules",
+      "kbookmarks",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "kglobalaccel",
+      "kguiaddons",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "knewstuff",
+      "knotifications",
+      "knotifyconfig",
+      "kparts",
+      "kpty",
+      "kservice",
+      "ktextwidgets",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "kxmlgui"
+    ],
+    "kontact": [
+      "extra-cmake-modules",
+      "grantleetheme",
+      "kontactinterface",
+      "ktexttemplate",
+      "libkdepim",
+      "pimcommon"
+    ],
+    "kontactinterface": [
+      "extra-cmake-modules",
+      "kcoreaddons",
+      "ki18n",
+      "kparts",
+      "kwindowsystem",
+      "kxmlgui"
+    ],
+    "kontrast": [
+      "extra-cmake-modules",
+      "futuresql",
+      "kcoreaddons",
+      "kdoctools",
+      "ki18n",
+      "kirigami",
+      "kirigami-addons"
+    ],
+    "konversation": [
+      "extra-cmake-modules",
+      "karchive",
+      "kbookmarks",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "kglobalaccel",
+      "ki18n",
+      "kidletime",
+      "kio",
+      "kitemviews",
+      "knewstuff",
+      "knotifications",
+      "knotifyconfig",
+      "kparts",
+      "kstatusnotifieritem",
+      "kwallet",
+      "kwidgetsaddons",
+      "kwindowsystem"
+    ],
+    "kooka": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kdoctools",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "kservice",
+      "ktextwidgets",
+      "kwidgetsaddons",
+      "sonnet"
+    ],
+    "kookbook": [
+      "extra-cmake-modules"
+    ],
+    "kopeninghours": [
+      "extra-cmake-modules",
+      "kholidays",
+      "ki18n"
+    ],
+    "kopete": [
+      "extra-cmake-modules",
+      "kcmutils",
+      "kconfig",
+      "kcontacts",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdnssd",
+      "kdoctools",
+      "ki18n",
+      "kidentitymanagement",
+      "knotifyconfig",
+      "kparts",
+      "ktexteditor",
+      "kwallet",
+      "libkleo",
+      "phonon"
+    ],
+    "korganizer": [
+      "akonadi",
+      "akonadi-calendar",
+      "akonadi-contacts",
+      "akonadi-notes",
+      "calendarsupport",
+      "eventviews",
+      "extra-cmake-modules",
+      "incidenceeditor",
+      "kcalendarcore",
+      "kcalutils",
+      "kcmutils",
+      "kconfig",
+      "kconfigwidgets",
+      "kcontacts",
+      "kcoreaddons",
+      "kcrash",
+      "kdiagram",
+      "kdoctools",
+      "kholidays",
+      "ki18n",
+      "kiconthemes",
+      "kidentitymanagement",
+      "kitemviews",
+      "kjobwidgets",
+      "kldap",
+      "kmailtransport",
+      "kmime",
+      "knewstuff",
+      "kontactinterface",
+      "kparts",
+      "kuserfeedback",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "kxmlgui",
+      "libkdepim",
+      "pimcommon"
+    ],
+    "kosmindoormap": [
+      "extra-cmake-modules",
+      "ki18n",
+      "kirigami",
+      "kirigami-addons",
+      "kopeninghours",
+      "kpublictransport",
+      "kservice"
+    ],
+    "kpackage": [
+      "extra-cmake-modules",
+      "karchive",
+      "kcoreaddons",
+      "kdoctools",
+      "ki18n"
+    ],
+    "kparts": [
+      "extra-cmake-modules",
+      "kio",
+      "knotifications",
+      "kxmlgui"
+    ],
+    "kpat": [
+      "extra-cmake-modules",
+      "kio",
+      "libkdegames"
+    ],
+    "kpeople": [
+      "extra-cmake-modules",
+      "kcontacts",
+      "kcoreaddons",
+      "ki18n",
+      "kitemviews",
+      "kwidgetsaddons"
+    ],
+    "kpeoplevcard": [
+      "extra-cmake-modules",
+      "kcontacts",
+      "kcoreaddons",
+      "ki18n",
+      "kpeople"
+    ],
+    "kphotoalbum": [
+      "karchive",
+      "kcompletion",
+      "kconfig",
+      "kcoreaddons",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "kjobwidgets",
+      "ktextwidgets",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "libkdcraw",
+      "marble",
+      "phonon",
+      "purpose"
+    ],
+    "kpimtextedit": [
+      "extra-cmake-modules",
+      "kcodecs",
+      "kconfig",
+      "kcoreaddons",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "ktextaddons",
+      "ktexttemplate",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "sonnet",
+      "syntax-highlighting"
+    ],
+    "kpipewire": [
+      "extra-cmake-modules",
+      "kcoreaddons",
+      "ki18n",
+      "plasma-wayland-protocols",
+      "wayland"
+    ],
+    "kpkpass": [
+      "extra-cmake-modules",
+      "karchive"
+    ],
+    "kplotting": [
+      "extra-cmake-modules"
+    ],
+    "kpmcore": [
+      "extra-cmake-modules",
+      "kcoreaddons",
+      "ki18n",
+      "kwidgetsaddons",
+      "polkit-qt-1"
+    ],
+    "kproperty": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "kguiaddons",
+      "kwidgetsaddons"
+    ],
+    "kpty": [
+      "extra-cmake-modules",
+      "kcoreaddons",
+      "ki18n"
+    ],
+    "kpublictransport": [
+      "extra-cmake-modules",
+      "ki18n",
+      "networkmanager-qt"
+    ],
+    "kqtquickcharts": [
+      "extra-cmake-modules"
+    ],
+    "kquickcharts": [
+      "extra-cmake-modules"
+    ],
+    "kquickimageeditor": [
+      "extra-cmake-modules"
+    ],
+    "krdc": [
+      "extra-cmake-modules",
+      "kbookmarks",
+      "kcmutils",
+      "kcompletion",
+      "kconfig",
+      "kdnssd",
+      "ki18n",
+      "kiconthemes",
+      "knotifications",
+      "knotifyconfig",
+      "kstatusnotifieritem",
+      "kwallet",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "kxmlgui",
+      "plasma-activities"
+    ],
+    "krecorder": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "ki18n",
+      "kirigami",
+      "kirigami-addons",
+      "kwindowsystem"
+    ],
+    "kregexpeditor": [
+      "extra-cmake-modules",
+      "kconfigwidgets",
+      "kcrash",
+      "kdoctools",
+      "ki18n",
+      "kiconthemes",
+      "kservice",
+      "ktextwidgets",
+      "kwidgetsaddons",
+      "kxmlgui"
+    ],
+    "krename": [
+      "extra-cmake-modules",
+      "karchive",
+      "kcompletion",
+      "kconfig",
+      "kcoreaddons",
+      "kcrash",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "kitemviews",
+      "kjobwidgets",
+      "kservice",
+      "kwidgetsaddons",
+      "kxmlgui"
+    ],
+    "kreport": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "kguiaddons",
+      "kproperty",
+      "kwidgetsaddons"
+    ],
+    "kreversi": [
+      "extra-cmake-modules",
+      "kcolorscheme",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "ki18n",
+      "kio",
+      "kjobwidgets",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "libkdegames"
+    ],
+    "krfb": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdnssd",
+      "kdoctools",
+      "ki18n",
+      "knotifications",
+      "kpipewire",
+      "kstatusnotifieritem",
+      "kwallet",
+      "kwayland",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "kxmlgui",
+      "plasma-wayland-protocols"
+    ],
+    "kronometer": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "kcrash",
+      "kdoctools",
+      "ki18n",
+      "kwidgetsaddons",
+      "kxmlgui"
+    ],
+    "kruler": [
+      "extra-cmake-modules",
+      "kdoctools",
+      "ki18n",
+      "knotifications",
+      "kstatusnotifieritem",
+      "kwindowsystem",
+      "kxmlgui"
+    ],
+    "krunner": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "ki18n",
+      "kitemmodels",
+      "threadweaver"
+    ],
+    "krusader": [
+      "extra-cmake-modules",
+      "karchive",
+      "kbookmarks",
+      "kcodecs",
+      "kcompletion",
+      "kconfig",
+      "kcoreaddons",
+      "kdoctools",
+      "kguiaddons",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "kitemviews",
+      "knotifications",
+      "kparts",
+      "ktextwidgets",
+      "kwallet",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "kxmlgui",
+      "solid"
+    ],
+    "ksanecore": [
+      "extra-cmake-modules",
+      "ki18n"
+    ],
+    "kscreen": [
+      "extra-cmake-modules",
+      "kauth",
+      "kcmutils",
+      "kcodecs",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kdbusaddons",
+      "kglobalaccel",
+      "ki18n",
+      "kpackage",
+      "kservice",
+      "ksvg",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "kxmlgui",
+      "layer-shell-qt",
+      "libkscreen",
+      "libplasma"
+    ],
+    "kscreenlocker": [
+      "extra-cmake-modules",
+      "kauth",
+      "kcmutils",
+      "kcodecs",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kglobalaccel",
+      "ki18n",
+      "kidletime",
+      "knotifications",
+      "kservice",
+      "ksvg",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "kxmlgui",
+      "layer-shell-qt",
+      "libkscreen",
+      "libplasma",
+      "wayland"
+    ],
+    "kseexpr": [
+      "extra-cmake-modules",
+      "ki18n"
+    ],
+    "kservice": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "kdoctools",
+      "ki18n"
+    ],
+    "kshisen": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "ki18n",
+      "kxmlgui",
+      "libkdegames",
+      "libkmahjongg"
+    ],
+    "ksirk": [
+      "extra-cmake-modules",
+      "kcompletion",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdoctools",
+      "ki18n",
+      "kio",
+      "knewstuff",
+      "kwallet",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "libkdegames"
+    ],
+    "ksmtp": [
+      "extra-cmake-modules",
+      "kcoreaddons",
+      "ki18n",
+      "kio"
+    ],
+    "ksnakeduel": [
+      "extra-cmake-modules",
+      "kcompletion",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "kguiaddons",
+      "ki18n",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "libkdegames"
+    ],
+    "kspaceduel": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "ki18n",
+      "kxmlgui",
+      "libkdegames"
+    ],
+    "ksquares": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "ki18n",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "libkdegames"
+    ],
+    "ksshaskpass": [
+      "extra-cmake-modules",
+      "kcoreaddons",
+      "kdoctools",
+      "ki18n",
+      "kwallet",
+      "kwidgetsaddons"
+    ],
+    "kstatusnotifieritem": [
+      "extra-cmake-modules",
+      "kwindowsystem"
+    ],
+    "ksudoku": [
+      "extra-cmake-modules",
+      "karchive",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdoctools",
+      "kguiaddons",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "kjobwidgets",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "libkdegames"
+    ],
+    "ksvg": [
+      "extra-cmake-modules",
+      "karchive",
+      "kcolorscheme",
+      "kconfig",
+      "kcoreaddons",
+      "kguiaddons",
+      "kirigami"
+    ],
+    "ksystemlog": [
+      "extra-cmake-modules",
+      "karchive",
+      "kcompletion",
+      "kconfig",
+      "kcoreaddons",
+      "kdoctools",
+      "ki18n",
+      "kio",
+      "kitemviews",
+      "ktextwidgets",
+      "kwidgetsaddons",
+      "kxmlgui"
+    ],
+    "ksystemstats": [
+      "extra-cmake-modules",
+      "kcoreaddons",
+      "kio",
+      "libksysguard",
+      "solid"
+    ],
+    "kteatime": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcrash",
+      "kdoctools",
+      "ki18n",
+      "kiconthemes",
+      "knotifications",
+      "knotifyconfig",
+      "ktextwidgets",
+      "kxmlgui"
+    ],
+    "ktechlab": [
+      "ktexteditor"
+    ],
+    "ktextaddons": [
+      "breeze-icons",
+      "extra-cmake-modules",
+      "karchive",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "ki18n",
+      "kio",
+      "qtkeychain",
+      "sonnet",
+      "syntax-highlighting"
+    ],
+    "ktexteditor": [
+      "breeze-icons",
+      "extra-cmake-modules",
+      "karchive",
+      "kauth",
+      "kconfig",
+      "kguiaddons",
+      "ki18n",
+      "kio",
+      "kjobwidgets",
+      "kparts",
+      "ktextwidgets",
+      "kxmlgui",
+      "sonnet",
+      "syntax-highlighting"
+    ],
+    "ktexttemplate": [
+      "extra-cmake-modules"
+    ],
+    "ktextwidgets": [
+      "extra-cmake-modules",
+      "kcompletion",
+      "kconfig",
+      "kconfigwidgets",
+      "ki18n",
+      "kwidgetsaddons",
+      "sonnet"
+    ],
+    "ktimer": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kdbusaddons",
+      "kdoctools",
+      "ki18n",
+      "kio",
+      "knotifications",
+      "kstatusnotifieritem",
+      "kwidgetsaddons"
+    ],
+    "ktimetracker": [
+      "extra-cmake-modules",
+      "kcalendarcore",
+      "kcmutils",
+      "kconfig",
+      "kconfigwidgets",
+      "kdbusaddons",
+      "kdoctools",
+      "ki18n",
+      "kidletime",
+      "kio",
+      "kjobwidgets",
+      "knotifications",
+      "kstatusnotifieritem",
+      "ktextwidgets",
+      "kwindowsystem",
+      "kxmlgui"
+    ],
+    "ktnef": [
+      "extra-cmake-modules",
+      "kcalendarcore",
+      "kcalutils",
+      "kcontacts"
+    ],
+    "ktorrent": [
+      "extra-cmake-modules",
+      "karchive",
+      "kcmutils",
+      "kcompletion",
+      "kcrash",
+      "kdnssd",
+      "kglobalaccel",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "kitemviews",
+      "knotifications",
+      "knotifyconfig",
+      "kparts",
+      "kplotting",
+      "kstatusnotifieritem",
+      "ktextwidgets",
+      "kxmlgui",
+      "libktorrent",
+      "phonon",
+      "solid",
+      "syndication"
+    ],
+    "ktouch": [
+      "extra-cmake-modules",
+      "kcmutils",
+      "kcompletion",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kdoctools",
+      "ki18n",
+      "kiconthemes",
+      "kitemviews",
+      "ktextwidgets",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "kxmlgui"
+    ],
+    "ktrip": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcontacts",
+      "kcoreaddons",
+      "ki18n",
+      "kirigami",
+      "kirigami-addons",
+      "kpublictransport",
+      "qqc2-desktop-style"
+    ],
+    "ktuberling": [
+      "extra-cmake-modules",
+      "kcompletion",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "ki18n",
+      "kio",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "libkdegames"
+    ],
+    "kturtle": [
+      "extra-cmake-modules",
+      "kcoreaddons",
+      "kcrash",
+      "kdoctools",
+      "ki18n",
+      "kio",
+      "knewstuff",
+      "ktextwidgets",
+      "kxmlgui"
+    ],
+    "kubrick": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdoctools",
+      "ki18n",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "libkdegames"
+    ],
+    "kunifiedpush": [
+      "extra-cmake-modules",
+      "kcmutils",
+      "kcoreaddons",
+      "kservice"
+    ],
+    "kunitconversion": [
+      "extra-cmake-modules",
+      "kconfig",
+      "ki18n"
+    ],
+    "kup": [
+      "extra-cmake-modules",
+      "kcmutils",
+      "kconfig",
+      "kcoreaddons",
+      "kdbusaddons",
+      "ki18n",
+      "kidletime",
+      "kjobwidgets",
+      "knotifications",
+      "kwidgetsaddons",
+      "libplasma",
+      "plasma5support",
+      "solid"
+    ],
+    "kuserfeedback": [
+      "extra-cmake-modules"
+    ],
+    "kwallet": [
+      "extra-cmake-modules",
+      "gpgme",
+      "kcolorscheme",
+      "kconfig",
+      "kcoreaddons",
+      "kdbusaddons",
+      "ki18n",
+      "kiconthemes",
+      "knotifications",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "qca"
+    ],
+    "kwallet-pam": [
+      "extra-cmake-modules",
+      "kwallet"
+    ],
+    "kwalletmanager": [
+      "extra-cmake-modules",
+      "karchive",
+      "kauth",
+      "kcmutils",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "ki18n",
+      "kio",
+      "kstatusnotifieritem",
+      "kwallet",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "kxmlgui"
+    ],
+    "kwave": [
+      "extra-cmake-modules",
+      "karchive",
+      "kcompletion",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "ktextwidgets",
+      "kwidgetsaddons",
+      "kxmlgui"
+    ],
+    "kwayland": [
+      "extra-cmake-modules",
+      "plasma-wayland-protocols",
+      "wayland",
+      "wayland-protocols"
+    ],
+    "kweather": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "ki18n",
+      "kirigami",
+      "kirigami-addons",
+      "knotifications",
+      "kweathercore",
+      "libplasma"
+    ],
+    "kweathercore": [
+      "extra-cmake-modules",
+      "kholidays",
+      "ki18n"
+    ],
+    "kwidgetsaddons": [
+      "extra-cmake-modules"
+    ],
+    "kwin": [
+      "breeze",
+      "breeze-icons",
+      "extra-cmake-modules",
+      "kcmutils",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdeclarative",
+      "kdecoration",
+      "kdoctools",
+      "kglobalaccel",
+      "kglobalacceld",
+      "ki18n",
+      "kidletime",
+      "kirigami",
+      "knewstuff",
+      "knotifications",
+      "kpackage",
+      "kpipewire",
+      "kscreenlocker",
+      "kservice",
+      "ksvg",
+      "kwayland",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "kxmlgui",
+      "libplasma",
+      "libqaccessibilityclient",
+      "plasma-activities",
+      "plasma-wayland-protocols",
+      "wayland",
+      "wayland-protocols"
+    ],
+    "kwindowsystem": [
+      "extra-cmake-modules",
+      "plasma-wayland-protocols",
+      "wayland",
+      "wayland-protocols"
+    ],
+    "kwordquiz": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcrash",
+      "kdoctools",
+      "ki18n",
+      "kirigami-addons",
+      "knewstuff",
+      "libkeduvocdocument"
+    ],
+    "kwrited": [
+      "extra-cmake-modules",
+      "kcoreaddons",
+      "kdbusaddons",
+      "ki18n",
+      "knotifications",
+      "kpty"
+    ],
+    "kxmlgui": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kconfigwidgets",
+      "kglobalaccel",
+      "ki18n",
+      "kiconthemes",
+      "kitemviews",
+      "ktextwidgets",
+      "kwidgetsaddons"
+    ],
+    "kxstitch": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kconfigwidgets",
+      "kguiaddons",
+      "ki18n",
+      "kio",
+      "ktextwidgets",
+      "kwidgetsaddons",
+      "kxmlgui"
+    ],
+    "labplot": [
+      "extra-cmake-modules",
+      "karchive",
+      "kconfig",
+      "kcoreaddons",
+      "kcrash",
+      "kdoctools",
+      "kguiaddons",
+      "ki18n",
+      "kitemviews",
+      "knewstuff",
+      "kparts",
+      "ktexteditor",
+      "kuserfeedback",
+      "kwidgetsaddons",
+      "kxmlgui"
+    ],
+    "latte-dock": [
+      "extra-cmake-modules",
+      "karchive",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdeclarative",
+      "kdoctools",
+      "kglobalaccel",
+      "kguiaddons",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "kirigami",
+      "knewstuff",
+      "knotifications",
+      "kwayland",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "kxmlgui",
+      "libplasma",
+      "plasma-activities",
+      "plasma-workspace"
+    ],
+    "layer-shell-qt": [
+      "extra-cmake-modules",
+      "wayland",
+      "wayland-protocols"
+    ],
+    "libgravatar": [
+      "extra-cmake-modules",
+      "pimcommon"
+    ],
+    "libkcddb": [
+      "extra-cmake-modules",
+      "kcmutils",
+      "kconfig",
+      "kconfigwidgets",
+      "kdoctools",
+      "ki18n",
+      "kio",
+      "kwidgetsaddons"
+    ],
+    "libkcompactdisc": [
+      "extra-cmake-modules",
+      "ki18n",
+      "phonon",
+      "solid"
+    ],
+    "libkdcraw": [
+      "extra-cmake-modules"
+    ],
+    "libkdegames": [
+      "extra-cmake-modules",
+      "karchive",
+      "kcolorscheme",
+      "kcompletion",
+      "kconfig",
+      "kconfigwidgets",
+      "kdnssd",
+      "kguiaddons",
+      "ki18n",
+      "kiconthemes",
+      "knewstuff",
+      "kxmlgui"
+    ],
+    "libkdepim": [
+      "extra-cmake-modules",
+      "kcompletion",
+      "ki18n",
+      "kwidgetsaddons"
+    ],
+    "libkeduvocdocument": [
+      "extra-cmake-modules",
+      "karchive",
+      "ki18n",
+      "kio"
+    ],
+    "libkexiv2": [
+      "extra-cmake-modules"
+    ],
+    "libkgapi": [
+      "extra-cmake-modules",
+      "kcalendarcore",
+      "kcontacts",
+      "kwallet"
+    ],
+    "libkipi": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kservice",
+      "kxmlgui"
+    ],
+    "libkleo": [
+      "extra-cmake-modules",
+      "kcodecs",
+      "kcolorscheme",
+      "kcompletion",
+      "kconfig",
+      "kcoreaddons",
+      "ki18n",
+      "kitemmodels",
+      "ktextaddons",
+      "kwidgetsaddons"
+    ],
+    "libkmahjongg": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "ki18n",
+      "kwidgetsaddons"
+    ],
+    "libkomparediff2": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "ki18n",
+      "kio",
+      "kxmlgui"
+    ],
+    "libksane": [
+      "extra-cmake-modules",
+      "ki18n",
+      "ksanecore",
+      "ktextwidgets",
+      "kwallet",
+      "kwidgetsaddons"
+    ],
+    "libkscreen": [
+      "extra-cmake-modules",
+      "plasma-wayland-protocols",
+      "wayland"
+    ],
+    "libksieve": [
+      "extra-cmake-modules",
+      "kidentitymanagement",
+      "kimap",
+      "kmailtransport",
+      "kmime",
+      "ktextaddons",
+      "libkdepim",
+      "pimcommon"
+    ],
+    "libksysguard": [
+      "extra-cmake-modules",
+      "kauth",
+      "kcodecs",
+      "kcompletion",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kglobalaccel",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "kjobwidgets",
+      "knewstuff",
+      "kpackage",
+      "kservice",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "solid"
+    ],
+    "libktorrent": [
+      "extra-cmake-modules",
+      "karchive",
+      "kcrash",
+      "ki18n",
+      "kio",
+      "solid"
+    ],
+    "libmediawiki": [
+      "extra-cmake-modules",
+      "kcoreaddons"
+    ],
+    "libplasma": [
+      "extra-cmake-modules",
+      "karchive",
+      "kcmutils",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kdbusaddons",
+      "kglobalaccel",
+      "kguiaddons",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "kirigami",
+      "knotifications",
+      "kpackage",
+      "kparts",
+      "ksvg",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "plasma-activities"
+    ],
+    "libqaccessibilityclient": [
+      "extra-cmake-modules"
+    ],
+    "libqmycroft": [
+      "extra-cmake-modules"
+    ],
+    "licensedigger": [
+      "extra-cmake-modules"
+    ],
+    "licentia": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "kdbusaddons",
+      "ki18n",
+      "kirigami",
+      "kitemmodels"
+    ],
+    "lokalize": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "ki18n",
+      "kio",
+      "knotifications",
+      "kxmlgui",
+      "sonnet"
+    ],
+    "lskat": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "kcrash",
+      "kdoctools",
+      "kguiaddons",
+      "ki18n",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "libkdegames"
+    ],
+    "mailcommon": [
+      "akonadi",
+      "akonadi-mime",
+      "extra-cmake-modules",
+      "karchive",
+      "kcodecs",
+      "kmailtransport",
+      "kmime",
+      "libkdepim",
+      "mailimporter",
+      "messagelib",
+      "pimcommon"
+    ],
+    "mailimporter": [
+      "akonadi",
+      "akonadi-mime",
+      "extra-cmake-modules",
+      "kmime",
+      "pimcommon"
+    ],
+    "marble": [
+      "extra-cmake-modules"
+    ],
+    "mark": [
+      "extra-cmake-modules",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kxmlgui"
+    ],
+    "markdownpart": [
+      "extra-cmake-modules",
+      "ki18n",
+      "kparts"
+    ],
+    "marknote": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "ki18n",
+      "kirigami"
+    ],
+    "massif-visualizer": [
+      "extra-cmake-modules",
+      "karchive",
+      "kconfig",
+      "kcoreaddons",
+      "kdiagram",
+      "kgraphviewer",
+      "ki18n",
+      "kio",
+      "kparts"
+    ],
+    "mauikit": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "ki18n",
+      "knotifications",
+      "kwindowsystem",
+      "mauiman"
+    ],
+    "mauikit-accounts": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "ki18n",
+      "kirigami",
+      "mauikit"
+    ],
+    "mauikit-calendar": [
+      "akonadi-calendar",
+      "akonadi-contacts",
+      "calendarsupport",
+      "eventviews",
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "ki18n",
+      "mauikit"
+    ],
+    "mauikit-documents": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "ki18n",
+      "mauikit"
+    ],
+    "mauikit-filebrowsing": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "ki18n",
+      "kio",
+      "mauikit"
+    ],
+    "mauikit-imagetools": [
+      "extra-cmake-modules",
+      "kcoreaddons",
+      "ki18n",
+      "kquickimageeditor",
+      "mauikit"
+    ],
+    "mauikit-terminal": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "ki18n",
+      "mauikit"
+    ],
+    "mauikit-texteditor": [
+      "extra-cmake-modules",
+      "kcoreaddons",
+      "ki18n",
+      "mauikit",
+      "syntax-highlighting"
+    ],
+    "mbox-importer": [
+      "akonadi",
+      "extra-cmake-modules",
+      "mailcommon",
+      "mailimporter"
+    ],
+    "merkuro": [
+      "akonadi",
+      "akonadi-calendar",
+      "extra-cmake-modules",
+      "kcalendarcore",
+      "kcalutils",
+      "kconfigwidgets",
+      "kcontacts",
+      "kdepim-runtime",
+      "kirigami",
+      "kirigami-addons",
+      "kmime",
+      "kwindowsystem",
+      "kxmlgui",
+      "mailcommon",
+      "mimetreeparser",
+      "qqc2-desktop-style"
+    ],
+    "messagelib": [
+      "akonadi",
+      "akonadi-contacts",
+      "akonadi-mime",
+      "akonadi-search",
+      "extra-cmake-modules",
+      "grantleetheme",
+      "kcolorscheme",
+      "kcontacts",
+      "kidentitymanagement",
+      "kmailtransport",
+      "kmbox",
+      "kmime",
+      "kpimtextedit",
+      "kservice",
+      "ktextaddons",
+      "ktexttemplate",
+      "libgravatar",
+      "libkdepim",
+      "libkleo",
+      "pimcommon",
+      "qca"
+    ],
+    "milou": [
+      "extra-cmake-modules",
+      "ki18n",
+      "krunner",
+      "libplasma"
+    ],
+    "mimetreeparser": [
+      "extra-cmake-modules",
+      "kcalendarcore",
+      "kmbox",
+      "kmime",
+      "kwidgetsaddons",
+      "libkleo"
+    ],
+    "minuet": [
+      "extra-cmake-modules",
+      "kcoreaddons",
+      "kcrash",
+      "kdoctools",
+      "ki18n"
+    ],
+    "modemmanager-qt": [
+      "extra-cmake-modules"
+    ],
+    "mpvqt": [
+      "extra-cmake-modules"
+    ],
+    "neochat": [
+      "cmark",
+      "extra-cmake-modules",
+      "kcolorscheme",
+      "kconfig",
+      "kcoreaddons",
+      "kdbusaddons",
+      "ki18n",
+      "kio",
+      "kirigami",
+      "kirigami-addons",
+      "kitemmodels",
+      "knotifications",
+      "kquickcharts",
+      "kquickimageeditor",
+      "kstatusnotifieritem",
+      "kwindowsystem",
+      "libquotient",
+      "prison",
+      "qcoro",
+      "qqc2-desktop-style",
+      "qtkeychain",
+      "selenium-webdriver-at-spi",
+      "sonnet",
+      "syntax-highlighting"
+    ],
+    "networkmanager-qt": [
+      "extra-cmake-modules"
+    ],
+    "notae": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "kdbusaddons",
+      "ki18n",
+      "kirigami",
+      "kirigami-addons",
+      "kwindowsystem",
+      "syntax-highlighting"
+    ],
+    "ocean-sound-theme": [
+      "extra-cmake-modules"
+    ],
+    "okteta": [
+      "extra-cmake-modules",
+      "kbookmarks",
+      "kcompletion",
+      "kconfigwidgets",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "ki18n",
+      "kio",
+      "kitemviews",
+      "knewstuff",
+      "kparts",
+      "kservice",
+      "kwidgetsaddons",
+      "kxmlgui"
+    ],
+    "okular": [
+      "breeze-icons",
+      "karchive",
+      "kbookmarks",
+      "kdegraphics-mobipocket",
+      "ki18n",
+      "kio",
+      "kparts",
+      "kpty",
+      "ktextwidgets",
+      "kxmlgui",
+      "libkexiv2",
+      "phonon",
+      "plasma-activities",
+      "purpose",
+      "threadweaver"
+    ],
+    "oxygen": [
+      "extra-cmake-modules",
+      "frameworkintegration",
+      "kcmutils",
+      "kcodecs",
+      "kcompletion",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kdecoration",
+      "kguiaddons",
+      "ki18n",
+      "kservice",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "libplasma"
+    ],
+    "oxygen-icons": [
+      "extra-cmake-modules"
+    ],
+    "oxygen-sounds": [
+      "extra-cmake-modules"
+    ],
+    "palapeli": [
+      "extra-cmake-modules",
+      "karchive",
+      "kcompletion",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdoctools",
+      "ki18n",
+      "kio",
+      "kitemviews",
+      "knotifications",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "libkdegames"
+    ],
+    "parley": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "kcrash",
+      "kdoctools",
+      "ki18n",
+      "kio",
+      "knewstuff",
+      "knotifications",
+      "ktextwidgets",
+      "kxmlgui",
+      "libkeduvocdocument",
+      "sonnet"
+    ],
+    "partitionmanager": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "ki18n",
+      "kio",
+      "kjobwidgets",
+      "kpmcore",
+      "kwidgetsaddons",
+      "kxmlgui"
+    ],
+    "perceptualcolor": [
+      "extra-cmake-modules"
+    ],
+    "peruse": [
+      "baloo",
+      "extra-cmake-modules",
+      "karchive",
+      "kconfig",
+      "kcoreaddons",
+      "kcrash",
+      "kdeclarative",
+      "kfilemetadata",
+      "kguiaddons",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "kirigami",
+      "kirigami-addons",
+      "knewstuff"
+    ],
+    "phonon": [
+      "extra-cmake-modules"
+    ],
+    "phonon-gstreamer": [
+      "phonon"
+    ],
+    "phonon-vlc": [
+      "extra-cmake-modules",
+      "phonon"
+    ],
+    "picmi": [
+      "extra-cmake-modules",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "ki18n",
+      "knewstuff",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "libkdegames"
+    ],
+    "pim-data-exporter": [
+      "akonadi",
+      "akonadi-notes",
+      "extra-cmake-modules",
+      "kcalendarcore",
+      "kcontacts",
+      "kidentitymanagement",
+      "kmailtransport",
+      "kmime",
+      "kstatusnotifieritem",
+      "ktextaddons",
+      "kuserfeedback",
+      "mailcommon",
+      "pimcommon"
+    ],
+    "pim-sieve-editor": [
+      "extra-cmake-modules",
+      "kimap",
+      "kmailtransport",
+      "kuserfeedback",
+      "kxmlgui",
+      "libksieve",
+      "pimcommon",
+      "qtkeychain"
+    ],
+    "pimcommon": [
+      "akonadi",
+      "akonadi-contacts",
+      "akonadi-search",
+      "extra-cmake-modules",
+      "kcalendarcore",
+      "kcmutils",
+      "kconfig",
+      "kcontacts",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "kguiaddons",
+      "ki18n",
+      "kiconthemes",
+      "kimap",
+      "kio",
+      "kitemviews",
+      "kjobwidgets",
+      "kldap",
+      "knotifications",
+      "knotifyconfig",
+      "kparts",
+      "kservice",
+      "ktextaddons",
+      "ktextwidgets",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "kxmlgui",
+      "libkdepim",
+      "purpose",
+      "sonnet"
+    ],
+    "plank-player": [
+      "kcmutils",
+      "kcodecs",
+      "kcompletion",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kdeclarative",
+      "ki18n",
+      "kio",
+      "kjobwidgets",
+      "knotifications",
+      "kservice",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "libplasma",
+      "plasma-workspace",
+      "solid"
+    ],
+    "plasma-activities": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "kwindowsystem"
+    ],
+    "plasma-activities-stats": [
+      "extra-cmake-modules",
+      "plasma-activities"
+    ],
+    "plasma-bigscreen": [
+      "kauth",
+      "kcmutils",
+      "kcodecs",
+      "kcompletion",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "ki18n",
+      "kio",
+      "kjobwidgets",
+      "knotifications",
+      "kpackage",
+      "kservice",
+      "ksvg",
+      "kwayland",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "libplasma",
+      "plasma-activities",
+      "plasma-activities-stats",
+      "plasma-workspace",
+      "plasma5support",
+      "solid"
+    ],
+    "plasma-browser-integration": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kfilemetadata",
+      "ki18n",
+      "kio",
+      "kjobwidgets",
+      "knotifications",
+      "krunner",
+      "kservice",
+      "kstatusnotifieritem",
+      "plasma-activities",
+      "plasma-workspace",
+      "purpose"
+    ],
+    "plasma-camera": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "ki18n",
+      "kirigami"
+    ],
+    "plasma-desktop": [
+      "attica",
+      "baloo",
+      "breeze",
+      "extra-cmake-modules",
+      "kactivitymanagerd",
+      "kauth",
+      "kcmutils",
+      "kcodecs",
+      "kcompletion",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kded",
+      "kfilemetadata",
+      "kglobalaccel",
+      "kguiaddons",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "kio-extras",
+      "kirigami-addons",
+      "kitemmodels",
+      "kitemviews",
+      "kjobwidgets",
+      "knewstuff",
+      "knotifications",
+      "knotifyconfig",
+      "kpackage",
+      "kparts",
+      "krunner",
+      "kservice",
+      "ktextwidgets",
+      "kunitconversion",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "kxmlgui",
+      "libksysguard",
+      "libplasma",
+      "packagekit-qt",
+      "plasma-activities",
+      "plasma-activities-stats",
+      "plasma-integration",
+      "plasma-workspace",
+      "powerdevil",
+      "qqc2-desktop-style",
+      "selenium-webdriver-at-spi",
+      "solid",
+      "sonnet",
+      "systemsettings",
+      "wayland",
+      "wayland-protocols"
+    ],
+    "plasma-dialer": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcontacts",
+      "kcoreaddons",
+      "kdbusaddons",
+      "ki18n",
+      "kio",
+      "kirigami",
+      "kirigami-addons",
+      "knotifications",
+      "kpeople",
+      "kwindowsystem",
+      "modemmanager-qt",
+      "wayland"
+    ],
+    "plasma-disks": [
+      "extra-cmake-modules",
+      "kauth",
+      "kcmutils",
+      "kcodecs",
+      "kconfig",
+      "kcoreaddons",
+      "kdbusaddons",
+      "ki18n",
+      "kio",
+      "knotifications",
+      "kservice",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "solid"
+    ],
+    "plasma-firewall": [
+      "extra-cmake-modules",
+      "kauth",
+      "kcmutils",
+      "kconfig",
+      "kcoreaddons",
+      "ki18n"
+    ],
+    "plasma-integration": [
+      "breeze",
+      "extra-cmake-modules",
+      "kcolorscheme",
+      "kconfig",
+      "kcoreaddons",
+      "kguiaddons",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "kjobwidgets",
+      "knotifications",
+      "kservice",
+      "kstatusnotifieritem",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "kxmlgui",
+      "wayland"
+    ],
+    "plasma-mobile": [
+      "bluedevil",
+      "bluez-qt",
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "ki18n",
+      "kio",
+      "kirigami-addons",
+      "kitemmodels",
+      "kjobwidgets",
+      "knotifications",
+      "kpackage",
+      "kservice",
+      "kwayland",
+      "kwin",
+      "kwindowsystem",
+      "libkscreen",
+      "libplasma",
+      "milou",
+      "modemmanager-qt",
+      "networkmanager-qt",
+      "plasma-nm",
+      "plasma-pa",
+      "plasma-workspace",
+      "qqc2-breeze-style"
+    ],
+    "plasma-nano": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "ki18n",
+      "kitemmodels",
+      "kservice",
+      "ksvg",
+      "kwayland",
+      "kwindowsystem",
+      "libplasma"
+    ],
+    "plasma-nm": [
+      "extra-cmake-modules",
+      "kauth",
+      "kcmutils",
+      "kcodecs",
+      "kcompletion",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kdbusaddons",
+      "ki18n",
+      "kio",
+      "kjobwidgets",
+      "knotifications",
+      "kpackage",
+      "kservice",
+      "ksvg",
+      "kwallet",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "libplasma",
+      "modemmanager-qt",
+      "networkmanager-qt",
+      "qcoro",
+      "solid"
+    ],
+    "plasma-pa": [
+      "extra-cmake-modules",
+      "kcmutils",
+      "kconfig",
+      "kcoreaddons",
+      "kdeclarative",
+      "kglobalaccel",
+      "ki18n",
+      "kirigami-addons",
+      "kpackage",
+      "kstatusnotifieritem",
+      "ksvg",
+      "libplasma",
+      "plasma-workspace",
+      "selenium-webdriver-at-spi"
+    ],
+    "plasma-pass": [
+      "extra-cmake-modules",
+      "ki18n",
+      "kitemmodels",
+      "libplasma",
+      "plasma5support"
+    ],
+    "plasma-phonebook": [
+      "extra-cmake-modules",
+      "kcontacts",
+      "kcoreaddons",
+      "ki18n",
+      "kirigami",
+      "kirigami-addons",
+      "kpeople"
+    ],
+    "plasma-remotecontrollers": [
+      "kcmutils",
+      "kcodecs",
+      "kcompletion",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "ki18n",
+      "kio",
+      "kjobwidgets",
+      "knotifications",
+      "kpackage",
+      "kservice",
+      "kstatusnotifieritem",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "libplasma",
+      "plasma-workspace",
+      "solid",
+      "wayland"
+    ],
+    "plasma-sdk": [
+      "extra-cmake-modules",
+      "karchive",
+      "kauth",
+      "kcmutils",
+      "kcodecs",
+      "kcompletion",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kdbusaddons",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "kitemmodels",
+      "kjobwidgets",
+      "kpackage",
+      "kparts",
+      "ksvg",
+      "ktexteditor",
+      "ktextwidgets",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "kxmlgui",
+      "libplasma",
+      "plasma5support",
+      "solid",
+      "sonnet",
+      "syntax-highlighting"
+    ],
+    "plasma-settings": [
+      "extra-cmake-modules",
+      "kauth",
+      "kconfig",
+      "kcoreaddons",
+      "kdbusaddons",
+      "ki18n",
+      "kio",
+      "kirigami-addons",
+      "kservice",
+      "libplasma",
+      "modemmanager-qt",
+      "networkmanager-qt",
+      "solid"
+    ],
+    "plasma-simplemenu": [
+      "extra-cmake-modules",
+      "ki18n",
+      "libplasma"
+    ],
+    "plasma-systemmonitor": [
+      "attica",
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "kdbusaddons",
+      "kglobalaccel",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "kirigami-addons",
+      "kitemmodels",
+      "knewstuff",
+      "kpackage",
+      "kservice",
+      "kwindowsystem",
+      "libksysguard"
+    ],
+    "plasma-thunderbolt": [
+      "extra-cmake-modules",
+      "kcmutils",
+      "kconfig",
+      "kcoreaddons",
+      "kdbusaddons",
+      "ki18n",
+      "knotifications",
+      "kservice"
+    ],
+    "plasma-vault": [
+      "extra-cmake-modules",
+      "kauth",
+      "kcodecs",
+      "kcompletion",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kdbusaddons",
+      "ki18n",
+      "kio",
+      "kitemmodels",
+      "kjobwidgets",
+      "kpackage",
+      "kservice",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "libksysguard",
+      "libplasma",
+      "networkmanager-qt",
+      "plasma-activities",
+      "solid"
+    ],
+    "plasma-wayland-protocols": [
+      "extra-cmake-modules"
+    ],
+    "plasma-welcome": [
+      "extra-cmake-modules",
+      "kcoreaddons",
+      "kdbusaddons",
+      "ki18n",
+      "kio",
+      "kirigami",
+      "kirigami-addons",
+      "kjobwidgets",
+      "knewstuff",
+      "knotifications",
+      "ksvg",
+      "kwindowsystem",
+      "libplasma"
+    ],
+    "plasma-workspace": [
+      "appstream-qt",
+      "attica",
+      "baloo",
+      "extra-cmake-modules",
+      "kauth",
+      "kbookmarks",
+      "kcmutils",
+      "kcodecs",
+      "kcompletion",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdeclarative",
+      "kded",
+      "kdesu",
+      "kfilemetadata",
+      "kglobalaccel",
+      "kglobalacceld",
+      "kguiaddons",
+      "kholidays",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "kio-extras",
+      "kirigami-addons",
+      "kitemmodels",
+      "kitemviews",
+      "kjobwidgets",
+      "knewstuff",
+      "knotifications",
+      "knotifyconfig",
+      "kpackage",
+      "kparts",
+      "kpipewire",
+      "kquickcharts",
+      "krunner",
+      "kscreenlocker",
+      "kservice",
+      "kstatusnotifieritem",
+      "ktexteditor",
+      "ktextwidgets",
+      "kunitconversion",
+      "kuserfeedback",
+      "kwallet",
+      "kwayland",
+      "kwidgetsaddons",
+      "kwin",
+      "kwindowsystem",
+      "kxmlgui",
+      "layer-shell-qt",
+      "libkexiv2",
+      "libkscreen",
+      "libksysguard",
+      "libplasma",
+      "milou",
+      "networkmanager-qt",
+      "packagekit-qt",
+      "phonon",
+      "plasma-activities",
+      "plasma-activities-stats",
+      "plasma-nano",
+      "plasma-wayland-protocols",
+      "plasma5support",
+      "polkit-qt-1",
+      "prison",
+      "qqc2-desktop-style",
+      "selenium-webdriver-at-spi",
+      "solid",
+      "sonnet",
+      "wayland",
+      "wayland-protocols"
+    ],
+    "plasma5support": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "ki18n",
+      "knotifications",
+      "kservice",
+      "libksysguard",
+      "libplasma",
+      "solid"
+    ],
+    "plasmatube": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "ki18n",
+      "kirigami",
+      "kirigami-addons",
+      "kitemmodels",
+      "mpvqt",
+      "purpose",
+      "qtkeychain"
+    ],
+    "plymouth-kcm": [
+      "extra-cmake-modules",
+      "karchive",
+      "kauth",
+      "kcmutils",
+      "kcodecs",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "ki18n",
+      "kio",
+      "knewstuff",
+      "kservice",
+      "kwidgetsaddons",
+      "kxmlgui"
+    ],
+    "polkit-kde-agent-1": [
+      "extra-cmake-modules",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "ki18n",
+      "kwindowsystem",
+      "polkit-qt-1"
+    ],
+    "powerdevil": [
+      "extra-cmake-modules",
+      "kauth",
+      "kcmutils",
+      "kcodecs",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kglobalaccel",
+      "ki18n",
+      "kidletime",
+      "kio",
+      "kjobwidgets",
+      "knotifications",
+      "kservice",
+      "kwindowsystem",
+      "kxmlgui",
+      "libkscreen",
+      "plasma-activities",
+      "plasma-workspace",
+      "solid"
+    ],
+    "powerplant": [
+      "extra-cmake-modules",
+      "futuresql",
+      "kconfig",
+      "kcoreaddons",
+      "ki18n",
+      "kirigami",
+      "kirigami-addons",
+      "qqc2-desktop-style"
+    ],
+    "poxml": [
+      "extra-cmake-modules",
+      "kdoctools"
+    ],
+    "print-manager": [
+      "extra-cmake-modules",
+      "kcmutils",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kdbusaddons",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "kirigami",
+      "knotifications",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "libplasma"
+    ],
+    "prison": [
+      "extra-cmake-modules",
+      "zxing-cpp"
+    ],
+    "pulseaudio-qt": [
+      "extra-cmake-modules"
+    ],
+    "purpose": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "ki18n",
+      "kio",
+      "kirigami",
+      "kservice"
+    ],
+    "qmlkonsole": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "ki18n",
+      "kirigami",
+      "kirigami-addons",
+      "kpty",
+      "kwindowsystem"
+    ],
+    "qqc2-breeze-style": [
+      "extra-cmake-modules",
+      "kcodecs",
+      "kcolorscheme",
+      "kconfig",
+      "kcoreaddons",
+      "kguiaddons",
+      "kiconthemes",
+      "kirigami",
+      "kquickcharts"
+    ],
+    "qqc2-desktop-style": [
+      "extra-cmake-modules",
+      "kcolorscheme",
+      "kiconthemes",
+      "kirigami",
+      "sonnet"
+    ],
+    "qrca": [
+      "extra-cmake-modules",
+      "kcontacts",
+      "kcoreaddons",
+      "ki18n",
+      "kio",
+      "kirigami",
+      "knotifications",
+      "kservice",
+      "networkmanager-qt",
+      "prison",
+      "purpose"
+    ],
+    "raven": [
+      "akonadi",
+      "akonadi-contacts",
+      "akonadi-mime",
+      "extra-cmake-modules",
+      "kcmutils",
+      "kconfig",
+      "kcoreaddons",
+      "kdeclarative",
+      "ki18n",
+      "kio",
+      "kirigami",
+      "kirigami-addons",
+      "kitemmodels",
+      "kldap",
+      "kmailtransport",
+      "kmime",
+      "libkdepim",
+      "mailcommon",
+      "messagelib",
+      "pimcommon"
+    ],
+    "rkward": [
+      "extra-cmake-modules",
+      "karchive",
+      "kconfig",
+      "kcoreaddons",
+      "kcrash",
+      "kdoctools",
+      "ki18n",
+      "knotifications",
+      "kparts",
+      "ktexteditor",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "kxmlgui"
+    ],
+    "rocs": [
+      "extra-cmake-modules",
+      "karchive",
+      "kconfig",
+      "kcoreaddons",
+      "kcrash",
+      "kdoctools",
+      "ki18n",
+      "kitemviews",
+      "ktexteditor",
+      "kxmlgui"
+    ],
+    "rolisteam": [
+      "extra-cmake-modules"
+    ],
+    "rsibreak": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kconfigwidgets",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "ki18n",
+      "kidletime",
+      "knotifications",
+      "knotifyconfig",
+      "ktextwidgets",
+      "kwindowsystem",
+      "kxmlgui"
+    ],
+    "ruqola": [
+      "breeze-icons",
+      "extra-cmake-modules",
+      "karchive",
+      "kconfig",
+      "kcoreaddons",
+      "kdbusaddons",
+      "kdoctools",
+      "kguiaddons",
+      "ki18n",
+      "kiconthemes",
+      "kidletime",
+      "kio",
+      "kitemviews",
+      "knewstuff",
+      "knotifications",
+      "knotifyconfig",
+      "kstatusnotifieritem",
+      "ktextaddons",
+      "ktextwidgets",
+      "kuserfeedback",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "kxmlgui",
+      "prison",
+      "purpose",
+      "qtkeychain",
+      "selenium-webdriver-at-spi",
+      "sonnet",
+      "syntax-highlighting"
+    ],
+    "samba-mounter": [
+      "extra-cmake-modules",
+      "kauth",
+      "kcmutils",
+      "kconfig",
+      "ki18n",
+      "kio",
+      "solid"
+    ],
+    "sddm-kcm": [
+      "extra-cmake-modules",
+      "karchive",
+      "kauth",
+      "kcmutils",
+      "kcoreaddons",
+      "ki18n",
+      "kio",
+      "knewstuff",
+      "kservice"
+    ],
+    "selenium-webdriver-at-spi": [
+      "extra-cmake-modules",
+      "kpipewire",
+      "kwayland",
+      "kwin",
+      "kwindowsystem",
+      "wayland"
+    ],
+    "signon-kwallet-extension": [
+      "extra-cmake-modules",
+      "kwallet"
+    ],
+    "skanlite": [
+      "extra-cmake-modules",
+      "kcoreaddons",
+      "kdoctools",
+      "ki18n",
+      "kio",
+      "kxmlgui",
+      "libksane"
+    ],
+    "skanpage": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "kcrash",
+      "ki18n",
+      "kirigami",
+      "kquickimageeditor",
+      "ksanecore",
+      "kxmlgui",
+      "purpose"
+    ],
+    "skrooge": [
+      "extra-cmake-modules",
+      "karchive",
+      "kcompletion",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kdoctools",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "kitemviews",
+      "kjobwidgets",
+      "knewstuff",
+      "knotifyconfig",
+      "kparts",
+      "kwallet",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "kxmlgui",
+      "plasma-activities"
+    ],
+    "smaragd": [
+      "kconfig",
+      "kcoreaddons",
+      "kdecoration",
+      "ki18n",
+      "kwidgetsaddons"
+    ],
+    "smb4k": [
+      "extra-cmake-modules",
+      "kauth",
+      "kcompletion",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kdnssd",
+      "kdoctools",
+      "kdsoap",
+      "kdsoap-ws-discovery-client",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "kjobwidgets",
+      "knotifications",
+      "kstatusnotifieritem",
+      "kwallet",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "kxmlgui",
+      "libplasma",
+      "solid"
+    ],
+    "solid": [
+      "extra-cmake-modules"
+    ],
+    "sonnet": [
+      "extra-cmake-modules"
+    ],
+    "spacebar": [
+      "extra-cmake-modules",
+      "futuresql",
+      "kconfig",
+      "kcontacts",
+      "kcoreaddons",
+      "kdbusaddons",
+      "ki18n",
+      "kio",
+      "kirigami",
+      "kirigami-addons",
+      "knotifications",
+      "kpeople",
+      "modemmanager-qt",
+      "qcoro"
+    ],
+    "spectacle": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "kdbusaddons",
+      "kdoctools",
+      "kglobalaccel",
+      "kguiaddons",
+      "ki18n",
+      "kio",
+      "kirigami",
+      "knotifications",
+      "kpipewire",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "kxmlgui",
+      "layer-shell-qt",
+      "purpose",
+      "wayland"
+    ],
+    "step": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcrash",
+      "kdoctools",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "knewstuff",
+      "kplotting",
+      "ktextwidgets",
+      "kxmlgui"
+    ],
+    "subtitlecomposer": [
+      "breeze-icons",
+      "extra-cmake-modules",
+      "kcodecs",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "ki18n",
+      "kio",
+      "ktextwidgets",
+      "kwidgetsaddons",
+      "kxmlgui",
+      "sonnet"
+    ],
+    "svgpart": [
+      "extra-cmake-modules",
+      "kcoreaddons",
+      "ki18n",
+      "kparts"
+    ],
+    "sweeper": [
+      "extra-cmake-modules",
+      "kbookmarks",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "kcrash",
+      "kdoctools",
+      "ki18n",
+      "ktextwidgets",
+      "kxmlgui",
+      "plasma-activities-stats"
+    ],
+    "symboleditor": [
+      "extra-cmake-modules",
+      "kconfig",
+      "ki18n",
+      "kio",
+      "kwidgetsaddons",
+      "kxmlgui"
+    ],
+    "symmy": [
+      "extra-cmake-modules",
+      "kdoctools",
+      "ki18n",
+      "kio",
+      "kwidgetsaddons"
+    ],
+    "syndication": [
+      "extra-cmake-modules",
+      "kcodecs"
+    ],
+    "syntax-highlighting": [
+      "extra-cmake-modules"
+    ],
+    "systemdgenie": [
+      "extra-cmake-modules",
+      "kauth",
+      "kcrash",
+      "ki18n",
+      "kxmlgui"
+    ],
+    "systemsettings": [
+      "extra-cmake-modules",
+      "kcmutils",
+      "kconfig",
+      "kcrash",
+      "kdbusaddons",
+      "kdoctools",
+      "kguiaddons",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "kirigami",
+      "kitemmodels",
+      "kitemviews",
+      "knotifications",
+      "krunner",
+      "kservice",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "kxmlgui",
+      "plasma-activities"
+    ],
+    "tellico": [
+      "extra-cmake-modules",
+      "kcoreaddons",
+      "kcrash",
+      "kdoctools",
+      "kfilemetadata",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "kitemmodels",
+      "knewstuff",
+      "kparts",
+      "ktexteditor",
+      "kxmlgui",
+      "libkcddb",
+      "libksane"
+    ],
+    "telly-skout": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "kcrash",
+      "ki18n",
+      "kirigami",
+      "kirigami-addons"
+    ],
+    "threadweaver": [
+      "extra-cmake-modules"
+    ],
+    "toad": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "kdbusaddons",
+      "ki18n",
+      "kirigami",
+      "kirigami-addons",
+      "kitemmodels",
+      "kwindowsystem"
+    ],
+    "tokodon": [
+      "extra-cmake-modules",
+      "kcolorscheme",
+      "kconfig",
+      "kcoreaddons",
+      "kdbusaddons",
+      "ki18n",
+      "kio",
+      "kirigami",
+      "kirigami-addons",
+      "kitemmodels",
+      "knotifications",
+      "kunifiedpush",
+      "kwindowsystem",
+      "mpvqt",
+      "purpose",
+      "qqc2-desktop-style",
+      "qtkeychain",
+      "selenium-webdriver-at-spi"
+    ],
+    "trojita": [
+      "akonadi-contacts",
+      "extra-cmake-modules",
+      "sonnet"
+    ],
+    "umbrello": [
+      "extra-cmake-modules",
+      "karchive",
+      "kcompletion",
+      "kconfig",
+      "kcoreaddons",
+      "kcrash",
+      "kdev-php",
+      "kdevelop",
+      "kdevelop-pg-qt",
+      "kdoctools",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "ktexteditor",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "kxmlgui"
+    ],
+    "upnp-lib-qt": [
+      "extra-cmake-modules",
+      "kdsoap"
+    ],
+    "vail": [
+      "extra-cmake-modules",
+      "kconfig",
+      "kcoreaddons",
+      "kdbusaddons",
+      "ki18n",
+      "kio",
+      "kirigami",
+      "kirigami-addons",
+      "knotifications",
+      "kwindowsystem",
+      "qqc2-desktop-style",
+      "qtkeychain"
+    ],
+    "vakzination": [
+      "kconfig",
+      "kcoreaddons",
+      "khealthcertificate",
+      "ki18n",
+      "kirigami",
+      "kitinerary",
+      "prison"
+    ],
+    "vvave": [
+      "extra-cmake-modules",
+      "kconfig",
+      "ki18n",
+      "kio",
+      "knotifications",
+      "mauikit",
+      "mauikit-accounts",
+      "mauikit-filebrowsing"
+    ],
+    "wacomtablet": [
+      "extra-cmake-modules",
+      "kcmutils",
+      "kconfig",
+      "kcoreaddons",
+      "kdbusaddons",
+      "kdoctools",
+      "kglobalaccel",
+      "ki18n",
+      "kio",
+      "knotifications",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "kxmlgui",
+      "libplasma",
+      "plasma5support"
+    ],
+    "washipad": [
+      "extra-cmake-modules"
+    ],
+    "xdg-desktop-portal-kde": [
+      "extra-cmake-modules",
+      "kauth",
+      "kcodecs",
+      "kcompletion",
+      "kconfig",
+      "kconfigwidgets",
+      "kcoreaddons",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "kirigami",
+      "kitemviews",
+      "kjobwidgets",
+      "knotifications",
+      "kservice",
+      "kstatusnotifieritem",
+      "kwayland",
+      "kwidgetsaddons",
+      "kwindowsystem",
+      "kxmlgui",
+      "solid",
+      "wayland",
+      "wayland-protocols"
+    ],
+    "xdg-portal-test-kde": [
+      "extra-cmake-modules",
+      "ki18n",
+      "kio",
+      "knotifications",
+      "kwayland"
+    ],
+    "xwaylandvideobridge": [
+      "extra-cmake-modules",
+      "kcoreaddons",
+      "ki18n",
+      "knotifications",
+      "kpipewire",
+      "kstatusnotifieritem",
+      "kwindowsystem"
+    ],
+    "yakuake": [
+      "extra-cmake-modules",
+      "karchive",
+      "kconfig",
+      "kcoreaddons",
+      "kcrash",
+      "kdbusaddons",
+      "kglobalaccel",
+      "ki18n",
+      "kiconthemes",
+      "kio",
+      "knewstuff",
+      "knotifications",
+      "knotifyconfig",
+      "kparts",
+      "kstatusnotifieritem",
+      "kwayland",
+      "kwidgetsaddons",
+      "kwindowsystem"
+    ],
+    "zanshin": [
+      "akonadi",
+      "akonadi-calendar",
+      "extra-cmake-modules",
+      "kcoreaddons",
+      "ki18n",
+      "kontactinterface",
+      "krunner",
+      "kwindowsystem"
+    ]
+  },
+  "version": "56eceecf"
+}
\ No newline at end of file
diff --git a/pkgs/kde/generated/licenses.json b/pkgs/kde/generated/licenses.json
new file mode 100644
index 000000000000..5b3e4359cf94
--- /dev/null
+++ b/pkgs/kde/generated/licenses.json
@@ -0,0 +1,2873 @@
+{
+  "akonadi": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-or-later",
+    "LicenseRef-KDE-Accepted-GPL",
+    "MIT"
+  ],
+  "akonadi-calendar": [
+    "BSD-2-Clause",
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "GPL-3.0-or-later",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-or-later",
+    "Qt-Commercial-exception-1.0"
+  ],
+  "akonadi-calendar-tools": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "Qt-Commercial-exception-1.0"
+  ],
+  "akonadi-contacts": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-or-later"
+  ],
+  "akonadi-import-wizard": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-or-later"
+  ],
+  "akonadi-mime": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "akonadi-notes": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "LGPL-2.0-or-later"
+  ],
+  "akonadi-search": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "akonadiconsole": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-or-later",
+    "LicenseRef-KDE-Accepted-GPL"
+  ],
+  "akregator": [
+    "BSD-2-Clause",
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-or-later",
+    "Qt-Commercial-exception-1.0"
+  ],
+  "alligator": [
+    "BSD-2-Clause",
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "GPL-3.0-or-later",
+    "LicenseRef-KDE-Accepted-GPL"
+  ],
+  "analitza": [
+    "BSD-2-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "angelfish": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL",
+    "MIT"
+  ],
+  "arianna": [
+    "BSD-2-Clause",
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-3.0-only",
+    "GPL-3.0-or-later",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LGPL-3.0-or-later",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL",
+    "MIT"
+  ],
+  "ark": [
+    "BSD-2-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "MIT"
+  ],
+  "artikulate": [
+    "BSD-2-Clause",
+    "CC-BY-SA-4.0",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LGPL-3.0-or-later",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL",
+    "MIT"
+  ],
+  "attica": [
+    "CC0-1.0",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "audiocd-kio": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "LGPL-3.0-or-later"
+  ],
+  "audiotube": [
+    "BSD-2-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.1-or-later",
+    "LicenseRef-KDE-Accepted-GPL"
+  ],
+  "baloo": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL",
+    "bzip2-1.0.6"
+  ],
+  "baloo-widgets": [
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-3.0-only",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "blinken": [
+    "CC0-1.0",
+    "GFDL-1.2-only",
+    "GPL-2.0-or-later",
+    "LicenseRef-SJFonts"
+  ],
+  "bluedevil": [
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "GPL-3.0-or-later",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "bluez-qt": [
+    "CC0-1.0",
+    "LGPL-2.1-only",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "bomber": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "LGPL-2.0-or-later"
+  ],
+  "bovo": [
+    "BSD-3-Clause",
+    "CC0-1.0"
+  ],
+  "breeze": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "MIT"
+  ],
+  "breeze-grub": [
+    "BSD-2-Clause",
+    "CC-BY-SA-4.0",
+    "Font-exception-2.0",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL"
+  ],
+  "breeze-gtk": [
+    "BSD-3-Clause",
+    "CC0-1.0"
+  ],
+  "breeze-icons": [
+    "CC0-1.0",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "breeze-plymouth": [
+    "BSD-2-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL"
+  ],
+  "calendarsupport": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.0-or-later",
+    "LicenseRef-KDE-Accepted-GPL",
+    "Qt-Commercial-exception-1.0"
+  ],
+  "calindori": [
+    "BSD-2-Clause",
+    "CC-BY-4.0",
+    "CC-BY-SA-4.0",
+    "CC0-1.0",
+    "GPL-3.0-or-later"
+  ],
+  "cantor": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL"
+  ],
+  "cervisia": [
+    "CC0-1.0"
+  ],
+  "colord-kde": [
+    "CC0-1.0",
+    "LGPL-3.0-or-later"
+  ],
+  "discover": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LGPL-3.0-or-later",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL",
+    "MIT"
+  ],
+  "dolphin": [
+    "BSD-2-Clause",
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "dolphin-plugins": [
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "MIT"
+  ],
+  "dragon": [
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL"
+  ],
+  "drkonqi": [
+    "BSD-2-Clause",
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LGPL-3.0-or-later",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "elisa": [
+    "BSD-2-Clause",
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-3.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LGPL-3.0-or-later",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "eventviews": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-or-later",
+    "Qt-Commercial-exception-1.0"
+  ],
+  "extra-cmake-modules": [
+    "BSD-2-Clause",
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "MIT"
+  ],
+  "falkon": [
+    "CC0-1.0"
+  ],
+  "ffmpegthumbs": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "filelight": [
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL"
+  ],
+  "flatpak-kcm": [
+    "BSD-2-Clause",
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.1-or-later",
+    "LicenseRef-KDE-Accepted-GPL"
+  ],
+  "frameworkintegration": [
+    "CC0-1.0",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "ghostwriter": [
+    "Apache-2.0",
+    "BSD-3-Clause",
+    "CC-BY-SA-4.0",
+    "CC0-1.0",
+    "GPL-3.0-or-later"
+  ],
+  "granatier": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-only"
+  ],
+  "grantlee-editor": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "grantleetheme": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-or-later"
+  ],
+  "gwenview": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.1-or-later"
+  ],
+  "incidenceeditor": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.0-or-later",
+    "LicenseRef-KDE-Accepted-GPL",
+    "Qt-Commercial-exception-1.0"
+  ],
+  "isoimagewriter": [
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "GPL-3.0-or-later"
+  ],
+  "itinerary": [
+    "Apache-2.0",
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "LGPL-2.0-or-later"
+  ],
+  "juk": [
+    "CC0-1.0"
+  ],
+  "k3b": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-or-later"
+  ],
+  "kaccounts-integration": [
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.0-or-later",
+    "LicenseRef-KDE-Accepted-GPL"
+  ],
+  "kaccounts-providers": [
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "GPL-3.0-or-later",
+    "LGPL-2.0-or-later"
+  ],
+  "kactivitymanagerd": [
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "kaddressbook": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-or-later",
+    "Qt-Commercial-exception-1.0"
+  ],
+  "kajongg": [
+    "CC0-1.0",
+    "GPL-2.0"
+  ],
+  "kalarm": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-or-later",
+    "Qt-Commercial-exception-1.0"
+  ],
+  "kalgebra": [
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "kalk": [
+    "BSD-2-Clause",
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "GPL-3.0-or-later"
+  ],
+  "kalzium": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-or-later"
+  ],
+  "kamera": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "kamoso": [
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-2.1-or-later"
+  ],
+  "kanagram": [
+    "CC0-1.0"
+  ],
+  "kapidox": [
+    "BSD-2-Clause",
+    "CC0-1.0",
+    "LGPL-3.0-or-later"
+  ],
+  "kapman": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "kapptemplate": [
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL"
+  ],
+  "karchive": [
+    "BSD-2-Clause",
+    "CC0-1.0",
+    "LGPL-2.0-or-later"
+  ],
+  "kasts": [
+    "BSD-2-Clause",
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "GPL-3.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LGPL-3.0-or-later",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "kate": [
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "MIT"
+  ],
+  "katomic": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "kauth": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "LGPL-2.1-or-later"
+  ],
+  "kbackup": [
+    "CC0-1.0"
+  ],
+  "kblackbox": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "kblocks": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "kbookmarks": [
+    "CC0-1.0",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "kbounce": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "LGPL-2.0-or-later"
+  ],
+  "kbreakout": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "kbruch": [
+    "CC0-1.0",
+    "GFDL-1.2-only",
+    "GPL-2.0-or-later"
+  ],
+  "kcachegrind": [
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-Qt-Commercial",
+    "Qt-LGPL-exception-1.1"
+  ],
+  "kcalc": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "kcalendarcore": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "LGPL-2.0-or-later",
+    "LGPL-3.0-or-later"
+  ],
+  "kcalutils": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-or-later"
+  ],
+  "kcharselect": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "kclock": [
+    "CC-BY-4.0",
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "GPL-3.0-or-later",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-or-later"
+  ],
+  "kcmutils": [
+    "BSD-2-Clause",
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "kcodecs": [
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-or-later",
+    "MIT",
+    "MPL-1.1"
+  ],
+  "kcolorchooser": [
+    "BSD-3-Clause",
+    "CC0-1.0"
+  ],
+  "kcolorscheme": [
+    "BSD-2-Clause",
+    "CC0-1.0",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "kcompletion": [
+    "CC0-1.0",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-or-later"
+  ],
+  "kconfig": [
+    "BSD-2-Clause",
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL",
+    "MIT"
+  ],
+  "kconfigwidgets": [
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "kcontacts": [
+    "CC0-1.0",
+    "LGPL-2.0-or-later"
+  ],
+  "kcoreaddons": [
+    "BSD-2-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL",
+    "LicenseRef-Qt-Commercial",
+    "MPL-1.1",
+    "Qt-LGPL-exception-1.1"
+  ],
+  "kcrash": [
+    "CC0-1.0",
+    "LGPL-2.0-or-later"
+  ],
+  "kcron": [
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "kdav": [
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-or-later"
+  ],
+  "kdbusaddons": [
+    "CC0-1.0",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "kde-cli-tools": [
+    "Artistic-2.0",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL",
+    "MIT"
+  ],
+  "kde-dev-scripts": [
+    "BSD-2-Clause",
+    "CC0-1.0"
+  ],
+  "kde-dev-utils": [
+    "CC0-1.0",
+    "LGPL-2.0-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "kde-gtk-config": [
+    "BSD-2-Clause",
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL"
+  ],
+  "kde-inotify-survey": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "FSFAP",
+    "GPL-2.0-only",
+    "GPL-3.0-only",
+    "LGPL-2.1-or-later",
+    "LicenseRef-KDE-Accepted-GPL"
+  ],
+  "kdebugsettings": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "LGPL-2.0-or-later"
+  ],
+  "kdeclarative": [
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-3.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-or-later",
+    "LicenseRef-KDE-Accepted-GPL",
+    "MIT"
+  ],
+  "kdeconnect-kde": [
+    "Apache-2.0",
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "GPL-3.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL",
+    "MIT"
+  ],
+  "kdecoration": [
+    "CC0-1.0",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "kded": [
+    "CC0-1.0",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later"
+  ],
+  "kdeedu-data": [
+    "CC0-1.0"
+  ],
+  "kdegraphics-mobipocket": [
+    "CC0-1.0"
+  ],
+  "kdegraphics-thumbnailers": [
+    "CC0-1.0"
+  ],
+  "kdenetwork-filesharing": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "kdenlive": [
+    "Apache-2.0",
+    "BSD-2-Clause",
+    "BSD-3-Clause",
+    "BSL-1.0",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-3.0-only",
+    "GPL-3.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL",
+    "MIT"
+  ],
+  "kdepim-addons": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL",
+    "Qt-Commercial-exception-1.0"
+  ],
+  "kdepim-runtime": [
+    "AGPL-3.0-or-later",
+    "BSD-2-Clause",
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "GPL-3.0-or-later",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LGPL-3.0-or-later",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "kdeplasma-addons": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "GPL-3.0-or-later",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LGPL-3.0-or-later",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL",
+    "MIT"
+  ],
+  "kdesdk-kio": [
+    "CC0-1.0"
+  ],
+  "kdesdk-thumbnailers": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL"
+  ],
+  "kdesu": [
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "kdev-php": [
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LicenseRef-KDE-Accepted-GPL"
+  ],
+  "kdev-python": [
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LicenseRef-KDE-Accepted-GPL",
+    "MIT"
+  ],
+  "kdevelop": [
+    "Apache-2.0",
+    "BSD-2-Clause",
+    "BSD-3-Clause",
+    "BSL-1.0",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "GPL-3.0-or-later",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL",
+    "LicenseRef-MIT-KDevelop-Ideal",
+    "LicenseRef-Qt-Commercial",
+    "LicenseRef-Qt-LGPL-exception-1.0",
+    "MIT",
+    "Qt-GPL-exception-1.0"
+  ],
+  "kdf": [
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "kdialog": [
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "kdiamond": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "kdnssd": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "LGPL-2.0-or-later"
+  ],
+  "kdoctools": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "keditbookmarks": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later"
+  ],
+  "keysmith": [
+    "BSD-2-Clause",
+    "BSD-3-Clause",
+    "CC-BY-SA-4.0",
+    "CC0-1.0",
+    "GPL-3.0-or-later"
+  ],
+  "kfilemetadata": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "LGPL-2.1-only",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "kfind": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "kfourinline": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "kgamma": [
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "kgeography": [
+    "CC0-1.0"
+  ],
+  "kget": [
+    "BSD-3-Clause",
+    "CC0-1.0"
+  ],
+  "kglobalaccel": [
+    "CC0-1.0",
+    "LGPL-2.0-or-later"
+  ],
+  "kglobalacceld": [
+    "CC0-1.0",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "kgoldrunner": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "kgpg": [
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL"
+  ],
+  "kguiaddons": [
+    "BSD-2-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "khangman": [
+    "BSD-2-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.1-or-later",
+    "LicenseRef-KDE-Accepted-GPL"
+  ],
+  "khealthcertificate": [
+    "Apache-2.0",
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "LGPL-2.0-or-later",
+    "MIT",
+    "W3C-20150513"
+  ],
+  "khelpcenter": [
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only"
+  ],
+  "kholidays": [
+    "BSD-2-Clause",
+    "Bison-exception-2.2",
+    "CC0-1.0",
+    "GPL-3.0-or-later",
+    "LGPL-2.0-or-later"
+  ],
+  "ki18n": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL",
+    "ODbL-1.0"
+  ],
+  "kiconthemes": [
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "kidentitymanagement": [
+    "BSD-2-Clause",
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "kidletime": [
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL",
+    "MIT"
+  ],
+  "kig": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.1-or-later",
+    "LicenseRef-KDE-Accepted-GPL"
+  ],
+  "kigo": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL"
+  ],
+  "killbots": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "kimageformats": [
+    "BSD-2-Clause",
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "kimagemapeditor": [
+    "CC0-1.0"
+  ],
+  "kimap": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later"
+  ],
+  "kinfocenter": [
+    "BSD-2-Clause",
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "FSFAP",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL",
+    "MIT"
+  ],
+  "kio": [
+    "BSD-2-Clause",
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "kio-admin": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "FSFAP",
+    "GPL-2.0-only",
+    "GPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL"
+  ],
+  "kio-extras": [
+    "BSD-2-Clause",
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL",
+    "MIT"
+  ],
+  "kio-extras-kf5": [
+    "BSD-2-Clause",
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "GPL-3.0-or-later",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL",
+    "MIT"
+  ],
+  "kio-gdrive": [
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "GPL-3.0-or-later",
+    "LGPL-2.1-or-later",
+    "LicenseRef-KDE-Accepted-GPL"
+  ],
+  "kio-zeroconf": [
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-only"
+  ],
+  "kipi-plugins": [
+    "CC0-1.0"
+  ],
+  "kirigami": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "FSFAP",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL",
+    "MIT"
+  ],
+  "kirigami-gallery": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "LGPL-2.0"
+  ],
+  "kiriki": [
+    "BSD-3-Clause",
+    "CC0-1.0"
+  ],
+  "kitemmodels": [
+    "CC0-1.0",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-2.1-or-later"
+  ],
+  "kitemviews": [
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later"
+  ],
+  "kiten": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-or-later",
+    "LicenseRef-EDRDG"
+  ],
+  "kitinerary": [
+    "BSD-2-Clause",
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "LGPL-2.0-or-later",
+    "ODbL-1.0"
+  ],
+  "kjobwidgets": [
+    "CC0-1.0",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later"
+  ],
+  "kjournald": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "LGPL-2.1-or-later",
+    "MIT"
+  ],
+  "kjumpingcube": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "kldap": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "LGPL-2.0-or-later",
+    "MIT"
+  ],
+  "kleopatra": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "klettres": [
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-only"
+  ],
+  "klickety": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "klines": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "kmag": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GFDL-1.2-only",
+    "GPL-2.0-or-later"
+  ],
+  "kmahjongg": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "kmail": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LicenseRef-KDE-Accepted-GPL",
+    "Qt-Commercial-exception-1.0"
+  ],
+  "kmail-account-wizard": [
+    "BSD-2-Clause",
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "LGPL-2.0-or-later"
+  ],
+  "kmailtransport": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-or-later"
+  ],
+  "kmbox": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later"
+  ],
+  "kmenuedit": [
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later"
+  ],
+  "kmime": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later"
+  ],
+  "kmines": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "kmix": [
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "kmousetool": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "kmouth": [
+    "BSD-3-Clause",
+    "CC0-1.0"
+  ],
+  "kmplot": [
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "knavalbattle": [
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "knetwalk": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "knewstuff": [
+    "BSD-2-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-3.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "knights": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL"
+  ],
+  "knotes": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL",
+    "Qt-Commercial-exception-1.0"
+  ],
+  "knotifications": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "knotifyconfig": [
+    "CC0-1.0",
+    "LGPL-2.0-only"
+  ],
+  "koko": [
+    "BSD-3-Clause",
+    "CC-BY-4.0",
+    "CC0-1.0",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "kolf": [
+    "CC0-1.0"
+  ],
+  "kollision": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "kolourpaint": [
+    "CC0-1.0"
+  ],
+  "kompare": [
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL"
+  ],
+  "kongress": [
+    "BSD-2-Clause",
+    "BSD-3-Clause",
+    "CC-BY-SA-4.0",
+    "CC0-1.0",
+    "GPL-3.0-or-later"
+  ],
+  "konqueror": [
+    "BSD-2-Clause",
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL",
+    "LicenseRef-Qt-Commercial",
+    "LicenseRef-Qt-exception",
+    "Qt-GPL-exception-1.0"
+  ],
+  "konquest": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "konsole": [
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "MIT"
+  ],
+  "kontact": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "Qt-Commercial-exception-1.0"
+  ],
+  "kontactinterface": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "kontrast": [
+    "BSD-2-Clause",
+    "BSD-3-Clause",
+    "CC-BY-SA-4.0",
+    "CC0-1.0",
+    "GPL-3.0-only",
+    "GPL-3.0-or-later"
+  ],
+  "konversation": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.0-or-later",
+    "LicenseRef-KDE-Accepted-GPL"
+  ],
+  "kopeninghours": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "LGPL-2.0-or-later"
+  ],
+  "korganizer": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL",
+    "Qt-Commercial-exception-1.0"
+  ],
+  "kosmindoormap": [
+    "BSD-2-Clause",
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "LGPL-2.0-or-later",
+    "MIT",
+    "ODbL-1.0"
+  ],
+  "kpackage": [
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-or-later"
+  ],
+  "kparts": [
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "kpat": [
+    "BSD-2-Clause",
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "kpeople": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "LGPL-2.1-or-later"
+  ],
+  "kpimtextedit": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-3.0-only",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "kpipewire": [
+    "Apache-2.0",
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "kpkpass": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "LGPL-2.0-or-later"
+  ],
+  "kplotting": [
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-or-later"
+  ],
+  "kpmcore": [
+    "CC-BY-4.0",
+    "CC0-1.0",
+    "GPL-3.0-or-later",
+    "MIT"
+  ],
+  "kpty": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-or-later"
+  ],
+  "kpublictransport": [
+    "BSD-2-Clause",
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "LGPL-2.0-or-later",
+    "MIT",
+    "ODbL-1.0"
+  ],
+  "kqtquickcharts": [
+    "BSD-3-Clause",
+    "CC0-1.0"
+  ],
+  "kquickcharts": [
+    "BSD-2-Clause",
+    "CC0-1.0",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL",
+    "MIT"
+  ],
+  "krdc": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "krecorder": [
+    "BSD-3-Clause",
+    "CC-BY-4.0",
+    "CC0-1.0",
+    "GPL-3.0-or-later"
+  ],
+  "kreversi": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-only"
+  ],
+  "krfb": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "kross-interpreters": [
+    "CC0-1.0"
+  ],
+  "kruler": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "krunner": [
+    "BSD-2-Clause",
+    "CC0-1.0",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "ksanecore": [
+    "BSD-2-Clause",
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "kscreen": [
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.0-or-later",
+    "LicenseRef-KDE-Accepted-GPL"
+  ],
+  "kscreenlocker": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.1-only",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "kservice": [
+    "CC0-1.0",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "kshisen": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "ksirk": [
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "ksmtp": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-or-later"
+  ],
+  "ksnakeduel": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "kspaceduel": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "ksquares": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "ksshaskpass": [
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "kstatusnotifieritem": [
+    "CC0-1.0",
+    "LGPL-2.0-or-later"
+  ],
+  "ksudoku": [
+    "BSD-3-Clause",
+    "CC0-1.0"
+  ],
+  "ksvg": [
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-or-later"
+  ],
+  "ksystemlog": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "ksystemstats": [
+    "BSD-2-Clause",
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL"
+  ],
+  "kteatime": [
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "ktexteditor": [
+    "BSD-2-Clause",
+    "CC0-1.0",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "MIT"
+  ],
+  "ktexttemplate": [
+    "CC0-1.0",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-or-later"
+  ],
+  "ktextwidgets": [
+    "CC0-1.0",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "ktimer": [
+    "BSD-3-Clause",
+    "CC0-1.0"
+  ],
+  "ktnef": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "LGPL-2.0-or-later"
+  ],
+  "ktorrent": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "Qt-Commercial-exception-1.0"
+  ],
+  "ktouch": [
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-or-later"
+  ],
+  "ktrip": [
+    "BSD-2-Clause",
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-3.0-only",
+    "LGPL-2.0-or-later",
+    "LicenseRef-KDE-Accepted-GPL"
+  ],
+  "ktuberling": [
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "kturtle": [
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later"
+  ],
+  "kubrick": [
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "kunitconversion": [
+    "CC0-1.0",
+    "LGPL-2.0-or-later"
+  ],
+  "kuserfeedback": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "MIT"
+  ],
+  "kwallet": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-or-later"
+  ],
+  "kwallet-pam": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "LGPL-2.1-or-later"
+  ],
+  "kwalletmanager": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LicenseRef-KDE-Accepted-GPL"
+  ],
+  "kwave": [
+    "BSD-2-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "kwayland": [
+    "CC0-1.0",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL",
+    "MIT"
+  ],
+  "kwayland-integration": [
+    "CC0-1.0",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "kweather": [
+    "Apache-2.0",
+    "BSD-3-Clause",
+    "CC-BY-4.0",
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.1-or-later"
+  ],
+  "kwidgetsaddons": [
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LGPL-3.0-or-later",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "kwin": [
+    "BSD-2-Clause",
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL",
+    "MIT"
+  ],
+  "kwindowsystem": [
+    "CC0-1.0",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL",
+    "MIT"
+  ],
+  "kwordquiz": [
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "GPL-3.0-or-later",
+    "LGPL-2.0-or-later"
+  ],
+  "kwrited": [
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "kxmlgui": [
+    "BSD-2-Clause",
+    "CC0-1.0",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "layer-shell-qt": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "LGPL-3.0-or-later",
+    "MIT"
+  ],
+  "libgravatar": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "LGPL-2.0-or-later"
+  ],
+  "libkcddb": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-or-later"
+  ],
+  "libkcompactdisc": [
+    "CC0-1.0"
+  ],
+  "libkdcraw": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "libkdegames": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "ICS",
+    "LGPL-2.0-only"
+  ],
+  "libkdepim": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-or-later",
+    "Qt-Commercial-exception-1.0"
+  ],
+  "libkeduvocdocument": [
+    "BSD-1-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "libkexiv2": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "libkgapi": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "libkipi": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "libkleo": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GCC-exception-3.1",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-or-later",
+    "LGPL-2.0-or-later"
+  ],
+  "libkmahjongg": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "libkomparediff2": [
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-or-later"
+  ],
+  "libksane": [
+    "CC0-1.0",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "libkscreen": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.1-or-later",
+    "LicenseRef-KDE-Accepted-GPL"
+  ],
+  "libksieve": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-or-later"
+  ],
+  "libksysguard": [
+    "BSD-2-Clause",
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "libktorrent": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "MIT"
+  ],
+  "libplasma": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL",
+    "LicenseRef-Qt-Commercial",
+    "Qt-LGPL-exception-1.1"
+  ],
+  "lokalize": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.1-or-later",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-Qt-Commercial-exception-1.0"
+  ],
+  "lskat": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later"
+  ],
+  "mailcommon": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "mailimporter": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.0-or-later",
+    "LicenseRef-KDE-Accepted-GPL"
+  ],
+  "marble": [
+    "Apache-2.0",
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-3.0-only",
+    "GPL-3.0-or-later",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LicenseRef-Qt-Commercial",
+    "MIT",
+    "Qt-LGPL-exception-1.1"
+  ],
+  "markdownpart": [
+    "CC0-1.0",
+    "LGPL-2.1-or-later"
+  ],
+  "mbox-importer": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "merkuro": [
+    "BSD-2-Clause",
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "GPL-3.0-or-later",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LGPL-3.0-or-later",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL",
+    "LicenseRef-Qt-Commercial-exception-1.0"
+  ],
+  "messagelib": [
+    "BSD-3-Clause",
+    "BSL-1.0",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL",
+    "Qt-Commercial-exception-1.0"
+  ],
+  "milou": [
+    "BSD-2-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-3.0-only",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "mimetreeparser": [
+    "BSD-2-Clause",
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "FSFULLR",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "minuet": [
+    "CC0-1.0"
+  ],
+  "modemmanager-qt": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-3.0-only",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "neochat": [
+    "BSD-2-Clause",
+    "BSD-3-Clause",
+    "CC-BY-SA-4.0",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "GPL-3.0-or-later",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL",
+    "MIT"
+  ],
+  "networkmanager-qt": [
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-3.0-only",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "ocean-sound-theme": [
+    "BSD-2-Clause",
+    "CC-BY-SA-4.0",
+    "CC0-1.0"
+  ],
+  "okular": [
+    "BSD-2-Clause",
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "GPL-3.0-or-later",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LicenseRef-KDE-Accepted-GPL",
+    "MIT",
+    "X11"
+  ],
+  "oxygen": [
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL",
+    "MIT"
+  ],
+  "oxygen-sounds": [
+    "BSD-2-Clause",
+    "CC-BY-3.0",
+    "CC0-1.0",
+    "LGPL-3.0-or-later"
+  ],
+  "palapeli": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-or-later"
+  ],
+  "parley": [
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.1-or-later",
+    "LicenseRef-KDE-Accepted-GPL"
+  ],
+  "partitionmanager": [
+    "CC-BY-4.0",
+    "CC0-1.0",
+    "GFDL-1.2-or-later",
+    "GPL-3.0-or-later",
+    "LGPL-3.0-or-later",
+    "MIT"
+  ],
+  "picmi": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "pim-data-exporter": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-or-later"
+  ],
+  "pim-sieve-editor": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-or-later"
+  ],
+  "pimcommon": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.0-or-later",
+    "LicenseRef-KDE-Accepted-GPL"
+  ],
+  "plasma-activities": [
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL",
+    "MIT"
+  ],
+  "plasma-activities-stats": [
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "plasma-browser-integration": [
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "GPL-3.0-or-later",
+    "MIT"
+  ],
+  "plasma-desktop": [
+    "BSD-2-Clause",
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL",
+    "MIT"
+  ],
+  "plasma-disks": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "FSFAP",
+    "GPL-2.0-only",
+    "GPL-3.0-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "plasma-firewall": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "FSFAP",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "GPL-3.0-or-later",
+    "LicenseRef-KDE-Accepted-GPL"
+  ],
+  "plasma-integration": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-3.0-only",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL",
+    "LicenseRef-KFQF-Accepted-GPL",
+    "LicenseRef-Qt-Commercial"
+  ],
+  "plasma-mobile": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "GPL-3.0-or-later",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL",
+    "MIT"
+  ],
+  "plasma-nano": [
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-or-later",
+    "MIT"
+  ],
+  "plasma-nm": [
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "plasma-pa": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "GPL-3.0-or-later",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "plasma-sdk": [
+    "BSD-2-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later"
+  ],
+  "plasma-systemmonitor": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-3.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LGPL-3.0-or-later",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "plasma-thunderbolt": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL"
+  ],
+  "plasma-vault": [
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-3.0-only",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "plasma-welcome": [
+    "BSD-2-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL"
+  ],
+  "plasma-workspace": [
+    "BSD-2-Clause",
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LGPL-3.0-or-later",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL",
+    "MIT",
+    "None"
+  ],
+  "plasma-workspace-wallpapers": [],
+  "plasma5support": [
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-or-later"
+  ],
+  "plasmatube": [
+    "CC-BY-SA-4.0",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-3.0-only",
+    "GPL-3.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "plymouth-kcm": [
+    "BSD-2-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "polkit-kde-agent-1": [
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-or-later"
+  ],
+  "powerdevil": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.0-only",
+    "LGPL-2.1-only",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "poxml": [
+    "CC0-1.0"
+  ],
+  "print-manager": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "prison": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "MIT"
+  ],
+  "purpose": [
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-or-later"
+  ],
+  "qmlkonsole": [
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-or-later"
+  ],
+  "qqc2-breeze-style": [
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL",
+    "LicenseRef-KFQF-Accepted-GPL"
+  ],
+  "qqc2-desktop-style": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL",
+    "LicenseRef-KFQF-Accepted-GPL",
+    "LicenseRef-Qt-Commercial"
+  ],
+  "rocs": [
+    "BSD-2-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "sddm-kcm": [
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL"
+  ],
+  "signon-kwallet-extension": [
+    "CC0-1.0"
+  ],
+  "skanlite": [
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL"
+  ],
+  "skanpage": [
+    "BSD-2-Clause",
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL"
+  ],
+  "solid": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "LGPL-2.1-only",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "sonnet": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-or-later"
+  ],
+  "spectacle": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "step": [
+    "BSD-2-Clause",
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "svgpart": [
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later"
+  ],
+  "sweeper": [
+    "CC0-1.0",
+    "LGPL-2.1-or-later"
+  ],
+  "syndication": [
+    "BSD-2-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-or-later",
+    "Qt-Commercial-exception-1.0"
+  ],
+  "syntax-highlighting": [
+    "BSD-2-Clause",
+    "BSD-3-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "MIT"
+  ],
+  "systemsettings": [
+    "BSD-2-Clause",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "GPL-3.0-or-later",
+    "LGPL-2.0-only",
+    "LGPL-2.1-or-later",
+    "LicenseRef-KDE-Accepted-GPL"
+  ],
+  "telly-skout": [
+    "BSD-2-Clause",
+    "CC0-1.0",
+    "LGPL-2.1-or-later"
+  ],
+  "threadweaver": [
+    "CC0-1.0",
+    "LGPL-2.0-or-later"
+  ],
+  "tokodon": [
+    "BSD-2-Clause",
+    "BSD-3-Clause",
+    "BSL-1.0",
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "GPL-3.0-or-later",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-2.1-or-later",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "LicenseRef-KDE-Accepted-LGPL"
+  ],
+  "umbrello": [
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-2.0-or-later",
+    "GPL-3.0-only",
+    "GPL-3.0-or-later",
+    "LGPL-2.0-only",
+    "LGPL-2.0-or-later",
+    "LicenseRef-KDE-Accepted-GPL"
+  ],
+  "wacomtablet": [],
+  "xdg-desktop-portal-kde": [
+    "BSD-2-Clause",
+    "CC0-1.0",
+    "GPL-2.0-or-later",
+    "LGPL-2.0-or-later",
+    "LGPL-2.1-only",
+    "LGPL-3.0-only",
+    "LicenseRef-KDE-Accepted-LGPL",
+    "MIT"
+  ],
+  "yakuake": [
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL"
+  ],
+  "zanshin": [
+    "CC0-1.0",
+    "GPL-2.0-only",
+    "GPL-3.0-only",
+    "LicenseRef-KDE-Accepted-GPL",
+    "MIT"
+  ]
+}
diff --git a/pkgs/kde/generated/projects.json b/pkgs/kde/generated/projects.json
new file mode 100644
index 000000000000..e534519b216a
--- /dev/null
+++ b/pkgs/kde/generated/projects.json
@@ -0,0 +1,8078 @@
+{
+  ".github": {
+    "description": "Please see https://docs.github.com/en/communities/setting-up-your-project-for-healthy-contributions/creating-a-default-community-health-file for more information",
+    "name": ".github",
+    "project_path": "sysadmin/.github",
+    "repo_path": "sysadmin/.github"
+  },
+  "abakus": {
+    "description": "Simple, keyboard-driven calculator",
+    "name": "abakus",
+    "project_path": "playground/utils/abakus",
+    "repo_path": "utilities/abakus"
+  },
+  "about-distro": {
+    "description": "Moved to KInfoCenter source.",
+    "name": "about-distro",
+    "project_path": "unmaintained/about-distro",
+    "repo_path": "unmaintained/about-distro"
+  },
+  "accessibility-inspector": {
+    "description": "Inspect your application accessibility tree",
+    "name": "accessibility-inspector",
+    "project_path": "extragear/accessibility/accessibility-inspector",
+    "repo_path": "accessibility/accessibility-inspector"
+  },
+  "accounts-qt": {
+    "description": null,
+    "name": "accounts-qt",
+    "project_path": "third-party/libaccounts-qt",
+    "repo_path": null
+  },
+  "activities-support": {
+    "description": "Plugins for 3rd party applications to be able to support activities and Share Like Connect.",
+    "name": "activities-support",
+    "project_path": "unmaintained/activities-support",
+    "repo_path": "unmaintained/activities-support"
+  },
+  "akademy-badges": {
+    "description": "Conference badge generation tooling",
+    "name": "akademy-badges",
+    "project_path": "community/akademy-badges",
+    "repo_path": "websites/akademy-badges"
+  },
+  "akademy-checkin": {
+    "description": "Conference check-in management system",
+    "name": "akademy-checkin",
+    "project_path": "community/akademy-checkin",
+    "repo_path": "websites/akademy-checkin"
+  },
+  "aki": {
+    "description": "Extensive IRC client for KDE4.",
+    "name": "aki",
+    "project_path": "unmaintained/aki",
+    "repo_path": "unmaintained/aki"
+  },
+  "akonadi": {
+    "description": "Cross-desktop storage service for PIM data providing concurrent access",
+    "name": "akonadi",
+    "project_path": "kde/pim/akonadi",
+    "repo_path": "pim/akonadi"
+  },
+  "akonadi-airsync": {
+    "description": "Akonadi Resource to download emails from MS Exchange servers",
+    "name": "akonadi-airsync",
+    "project_path": "playground/pim/akonadi-airsync",
+    "repo_path": "pim/akonadi-airsync"
+  },
+  "akonadi-calendar": {
+    "description": "Akonadi calendar integration",
+    "name": "akonadi-calendar",
+    "project_path": "kde/pim/akonadi-calendar",
+    "repo_path": "pim/akonadi-calendar"
+  },
+  "akonadi-calendar-tools": {
+    "description": "Console applications and utilities for managing calendars in Akonadi",
+    "name": "akonadi-calendar-tools",
+    "project_path": "kde/pim/akonadi-calendar-tools",
+    "repo_path": "pim/akonadi-calendar-tools"
+  },
+  "akonadi-contacts": {
+    "description": "Libraries and daemons to implement Contact Management in Akonadi",
+    "name": "akonadi-contacts",
+    "project_path": "kde/pim/akonadi-contacts",
+    "repo_path": "pim/akonadi-contacts"
+  },
+  "akonadi-exchange": {
+    "description": "Akonadi plugin for Exchange groupware functionality",
+    "name": "akonadi-exchange",
+    "project_path": "playground/pim/akonadi-exchange",
+    "repo_path": "pim/akonadi-exchange"
+  },
+  "akonadi-facebook": {
+    "description": "Makes events, contacts, notes and messages from Facebook available in KDE.",
+    "name": "akonadi-facebook",
+    "project_path": "unmaintained/akonadi-facebook",
+    "repo_path": "unmaintained/akonadi-facebook"
+  },
+  "akonadi-git-resource": {
+    "description": "Akonadi Git Resource allows you to see your commits in kmail.",
+    "name": "akonadi-git-resource",
+    "project_path": "unmaintained/akonadi-git-resource",
+    "repo_path": "unmaintained/akonadi-git-resource"
+  },
+  "akonadi-google-applets": {
+    "description": "Plasma applets for Akonadi google resources",
+    "name": "akonadi-google-applets",
+    "project_path": "unmaintained/akonadi-google-applets",
+    "repo_path": "unmaintained/akonadi-google-applets"
+  },
+  "akonadi-googledata-resource": {
+    "description": "It hosts 2 resources for akonadi that enables KDE-PIM apps to sync/edit/add/delete entries (either contacts or calendar events) from a google account.",
+    "name": "akonadi-googledata-resource",
+    "project_path": "unmaintained/akonadi-googledata-resource",
+    "repo_path": "unmaintained/akonadi-googledata-resource"
+  },
+  "akonadi-import-wizard": {
+    "description": "Assistant to import external PIM data into Akonadi for use in KDE PIM apps",
+    "name": "akonadi-import-wizard",
+    "project_path": "kde/pim/akonadi-import-wizard",
+    "repo_path": "pim/akonadi-import-wizard"
+  },
+  "akonadi-mime": {
+    "description": "Helpers to make working with emails through Akonadi easier",
+    "name": "akonadi-mime",
+    "project_path": "kde/pim/akonadi-mime",
+    "repo_path": "pim/akonadi-mime"
+  },
+  "akonadi-notes": {
+    "description": "Libraries and daemons to implement note management in Akonadi",
+    "name": "akonadi-notes",
+    "project_path": "kde/pim/akonadi-notes",
+    "repo_path": "pim/akonadi-notes"
+  },
+  "akonadi-phabricator-resource": {
+    "description": "Synchronize your Phabricator tasks with KOrganizer",
+    "name": "akonadi-phabricator-resource",
+    "project_path": "playground/pim/akonadi-phabricator-resource",
+    "repo_path": "pim/akonadi-phabricator-resource"
+  },
+  "akonadi-search": {
+    "description": "Libraries and daemons to implement searching in Akonadi",
+    "name": "akonadi-search",
+    "project_path": "kde/pim/akonadi-search",
+    "repo_path": "pim/akonadi-search"
+  },
+  "akonadi-sugarcrm": {
+    "description": "Accessing the addressbook of a SugarCRM web service",
+    "name": "akonadi-sugarcrm",
+    "project_path": "unmaintained/akonadi-sugarcrm",
+    "repo_path": "unmaintained/akonadi-sugarcrm"
+  },
+  "akonadi-vkontakte": {
+    "description": "Makes contacts, notes and messages from VKontakte.ru social network available in KDE.",
+    "name": "akonadi-vkontakte",
+    "project_path": "unmaintained/akonadi-vkontakte",
+    "repo_path": "unmaintained/akonadi-vkontakte"
+  },
+  "akonadiclient": {
+    "description": "Command-line interface to Akonadi",
+    "name": "akonadiclient",
+    "project_path": "playground/pim/akonadiclient",
+    "repo_path": "pim/akonadiclient"
+  },
+  "akonadiconsole": {
+    "description": "Application for debugging Akonadi Resources",
+    "name": "akonadiconsole",
+    "project_path": "kde/pim/akonadiconsole",
+    "repo_path": "pim/akonadiconsole"
+  },
+  "akregator": {
+    "description": "RSS Feed Reader",
+    "name": "akregator",
+    "project_path": "kde/pim/akregator",
+    "repo_path": "pim/akregator"
+  },
+  "akunambol": {
+    "description": "Akunambol is a KDE SyncML client for your Akonadi Storage. a.k.a, it synchronizes your data with another device.",
+    "name": "akunambol",
+    "project_path": "unmaintained/akunambol",
+    "repo_path": "unmaintained/akunambol"
+  },
+  "alkimia": {
+    "description": "Library used by KDE finance applications",
+    "name": "alkimia",
+    "project_path": "extragear/office/alkimia",
+    "repo_path": "office/alkimia"
+  },
+  "alligator": {
+    "description": "Kirigami-based RSS reader",
+    "name": "alligator",
+    "project_path": "extragear/network/alligator",
+    "repo_path": "network/alligator"
+  },
+  "alpaka": {
+    "description": "Kirigami client for Ollama",
+    "name": "alpaka",
+    "project_path": "playground/utils/alpaka",
+    "repo_path": "utilities/alpaka"
+  },
+  "amarok": {
+    "description": "Powerful music player that lets you rediscover your music",
+    "name": "amarok",
+    "project_path": "extragear/multimedia/amarok",
+    "repo_path": "multimedia/amarok"
+  },
+  "amarok-history": {
+    "description": "Amarok history",
+    "name": "amarok-history",
+    "project_path": "extragear/multimedia/amarok/amarok-history",
+    "repo_path": "historical/amarok-history"
+  },
+  "amor": {
+    "description": "Amusing Misuse of Resources animation that sits on top of the curent window.",
+    "name": "amor",
+    "project_path": "playground/games/amor",
+    "repo_path": "games/amor"
+  },
+  "analitza": {
+    "description": "Library that lets you add mathematical features to your program",
+    "name": "analitza",
+    "project_path": "kde/kdeedu/analitza",
+    "repo_path": "education/analitza"
+  },
+  "android-builder": {
+    "description": "Build environment and SDK for cross-building KDE applications for Android.",
+    "name": "android-builder",
+    "project_path": "unmaintained/android-builder",
+    "repo_path": "unmaintained/android-builder"
+  },
+  "android-qt": {
+    "description": "Android port of Qt Framework",
+    "name": "android-qt",
+    "project_path": "unmaintained/necessitas/android-qt",
+    "repo_path": "unmaintained/android-qt"
+  },
+  "android-qt-creator": {
+    "description": "Android port of Qt Creator IDE",
+    "name": "android-qt-creator",
+    "project_path": "unmaintained/necessitas/android-qt-creator",
+    "repo_path": "unmaintained/android-qt-creator"
+  },
+  "android-qt-mobility": {
+    "description": "Android port of Qt Mobility",
+    "name": "android-qt-mobility",
+    "project_path": "unmaintained/necessitas/android-qt-mobility",
+    "repo_path": "unmaintained/android-qt-mobility"
+  },
+  "android-qt-ndk": {
+    "description": "NDK repository for the Android port of Qt.",
+    "name": "android-qt-ndk",
+    "project_path": "unmaintained/necessitas/android-qt-ndk",
+    "repo_path": "unmaintained/android-qt-ndk"
+  },
+  "android-qt5-qtbase": {
+    "description": "Android Qt5 QtBase module",
+    "name": "android-qt5-qtbase",
+    "project_path": "unmaintained/necessitas/android-qt5-qtbase",
+    "repo_path": "unmaintained/android-qt5-qtbase"
+  },
+  "android-qtwebkit": {
+    "description": "QtWebkit port to Android",
+    "name": "android-qtwebkit",
+    "project_path": "unmaintained/necessitas/android-qtwebkit",
+    "repo_path": "unmaintained/android-qtwebkit"
+  },
+  "angelfish": {
+    "description": "Web browser for Plasma Mobile",
+    "name": "angelfish",
+    "project_path": "extragear/base/angelfish",
+    "repo_path": "network/angelfish"
+  },
+  "apper": {
+    "description": "Package management application using PackageKit",
+    "name": "apper",
+    "project_path": "extragear/sysadmin/apper",
+    "repo_path": "system/apper"
+  },
+  "appimage-packaging": {
+    "description": "Recipes and other materials needed to create application AppImages",
+    "name": "appimage-packaging",
+    "project_path": "playground/packaging/appimage-packaging",
+    "repo_path": "packaging/appimage-packaging"
+  },
+  "appmenu-runner": {
+    "description": "AppMenu runner that allows to quickly find any action exported in AppMenu",
+    "name": "appmenu-runner",
+    "project_path": "unmaintained/appmenu-runner",
+    "repo_path": "unmaintained/appmenu-runner"
+  },
+  "appstream-qt": {
+    "description": null,
+    "name": "appstream-qt",
+    "project_path": "third-party/appstream",
+    "repo_path": null
+  },
+  "appstream-runner": {
+    "description": "KRunner plugin for looking up the search into the software database to suggest software that wasn't found.",
+    "name": "appstream-runner",
+    "project_path": "unmaintained/appstream-runner",
+    "repo_path": "unmaintained/appstream-runner"
+  },
+  "arca": {
+    "description": "Maui Archiver for compressed files",
+    "name": "arca",
+    "project_path": "playground/base/arca",
+    "repo_path": "maui/arca"
+  },
+  "arianna": {
+    "description": "EPub Reader for mobile devices",
+    "name": "arianna",
+    "project_path": "extragear/graphics/arianna",
+    "repo_path": "graphics/arianna"
+  },
+  "ark": {
+    "description": "File archiver by KDE",
+    "name": "ark",
+    "project_path": "kde/kdeutils/ark",
+    "repo_path": "utilities/ark"
+  },
+  "arkade": {
+    "description": "Collection of Arcade games developed in Kirigami",
+    "name": "arkade",
+    "project_path": "playground/games/arkade",
+    "repo_path": "games/arkade"
+  },
+  "artikulate": {
+    "description": "Pronunciation trainer to improve your skills by listening to native speakers",
+    "name": "artikulate",
+    "project_path": "kde/kdeedu/artikulate",
+    "repo_path": "education/artikulate"
+  },
+  "artikulate-data": {
+    "description": "Artikulate course data files",
+    "name": "artikulate-data",
+    "project_path": "playground/edu/artikulate-data",
+    "repo_path": "education/artikulate-data"
+  },
+  "assemblygen": {
+    "description": "A tool that generates .NET/mono assemblies from SMOKE libraries.",
+    "name": "assemblygen",
+    "project_path": "unmaintained/assemblygen",
+    "repo_path": "unmaintained/assemblygen"
+  },
+  "asynqt": {
+    "description": "Framework which provides convenience methods that make QFuture actually useful",
+    "name": "asynqt",
+    "project_path": "playground/libs/asynqt",
+    "repo_path": "libraries/asynqt"
+  },
+  "atcore": {
+    "description": "Library for connection and management of 3D printers (Atelier Core)",
+    "name": "atcore",
+    "project_path": "extragear/base/atcore",
+    "repo_path": "libraries/atcore"
+  },
+  "atcore-cli": {
+    "description": "Open Source 3D Printing Host - CLI Interface",
+    "name": "atcore-cli",
+    "project_path": "playground/base/atcore-cli",
+    "repo_path": "utilities/atcore-cli"
+  },
+  "atelier": {
+    "description": "Desktop interface to control 3D printers powered by AtCore",
+    "name": "atelier",
+    "project_path": "playground/base/atelier",
+    "repo_path": "utilities/atelier"
+  },
+  "atlantik": {
+    "description": "Atlantik Game",
+    "name": "atlantik",
+    "project_path": "playground/games/atlantik",
+    "repo_path": "games/atlantik"
+  },
+  "attica": {
+    "description": "Attica is a Qt library that implements the Open Collaboration Services API.\n\nMailing list: https://lists.freedesktop.org/mailman/listinfo/ocs\nInternet Relay Chat: #ocs@freenode",
+    "name": "attica",
+    "project_path": "frameworks/attica",
+    "repo_path": "frameworks/attica"
+  },
+  "audex": {
+    "description": "Tool for ripping compact discs",
+    "name": "audex",
+    "project_path": "playground/multimedia/audex",
+    "repo_path": "multimedia/audex"
+  },
+  "audiocd-kio": {
+    "description": "KIO worker for accessing audio CDs",
+    "name": "audiocd-kio",
+    "project_path": "kde/kdemultimedia/audiocd-kio",
+    "repo_path": "multimedia/audiocd-kio"
+  },
+  "audiotube": {
+    "description": "Client for YouTube Music",
+    "name": "audiotube",
+    "project_path": "extragear/multimedia/audiotube",
+    "repo_path": "multimedia/audiotube"
+  },
+  "aura-browser": {
+    "description": "Browser for a fully immersed Big Screen experience allowing you to navigate the world wide web using just your remote control",
+    "name": "aura-browser",
+    "project_path": "kde/workspace/aura-browser",
+    "repo_path": "plasma/aura-browser"
+  },
+  "automoc": {
+    "description": "Automoc",
+    "name": "automoc",
+    "project_path": "kdesupport/automoc",
+    "repo_path": "unmaintained/automoc"
+  },
+  "babe": {
+    "description": "Babe Media Player",
+    "name": "babe",
+    "project_path": "unmaintained/babe",
+    "repo_path": "unmaintained/babe"
+  },
+  "baloo": {
+    "description": "Baloo is a framework for searching and managing metadata.",
+    "name": "baloo",
+    "project_path": "frameworks/baloo",
+    "repo_path": "frameworks/baloo"
+  },
+  "baloo-widgets": {
+    "description": "Widgets for Baloo",
+    "name": "baloo-widgets",
+    "project_path": "kde/applications/baloo-widgets",
+    "repo_path": "libraries/baloo-widgets"
+  },
+  "bangarang": {
+    "description": "",
+    "name": "bangarang",
+    "project_path": "playground/multimedia/bangarang",
+    "repo_path": "unmaintained/bangarang"
+  },
+  "basket": {
+    "description": "Notes and to-dos organizer",
+    "name": "basket",
+    "project_path": "playground/utils/basket",
+    "repo_path": "utilities/basket"
+  },
+  "bigscreen-application-launcher-skill": {
+    "description": "Voice application launcher skill for Plasma Bigscreen",
+    "name": "bigscreen-application-launcher-skill",
+    "project_path": "playground/utils/bigscreen-application-launcher-skill",
+    "repo_path": "plasma-bigscreen/bigscreen-application-launcher-skill"
+  },
+  "bigscreen-debos-image-rpi4": {
+    "description": "Recipes and other materials needed to build a Plasma Bigscreen image for Raspberry Pi4 devices, using DebOS",
+    "name": "bigscreen-debos-image-rpi4",
+    "project_path": "playground/utils/bigscreen-debos-image-rpi4",
+    "repo_path": "plasma-bigscreen/bigscreen-debos-image-rpi4"
+  },
+  "bigscreen-image-settings": {
+    "description": "Recipes and other materials needed to build Plasma Bigscreen images",
+    "name": "bigscreen-image-settings",
+    "project_path": "playground/utils/bigscreen-image-settings",
+    "repo_path": "plasma-bigscreen/bigscreen-image-settings"
+  },
+  "bigscreen-platform-skill": {
+    "description": "Platform control skill for Plasma Bigscreen, providing Window Management Features for Voice Applications on Bigscreen Platform",
+    "name": "bigscreen-platform-skill",
+    "project_path": "playground/utils/bigscreen-platform-skill",
+    "repo_path": "plasma-bigscreen/bigscreen-platform-skill"
+  },
+  "binschema": {
+    "description": "Code generator that produces code to read Microsoft Office files",
+    "name": "binschema",
+    "project_path": "playground/libs/binschema",
+    "repo_path": "libraries/binschema"
+  },
+  "blinken": {
+    "description": "Memory Enhancement Game",
+    "name": "blinken",
+    "project_path": "kde/kdeedu/blinken",
+    "repo_path": "education/blinken"
+  },
+  "blogilo": {
+    "description": "Application to create, edit and update your blog content.",
+    "name": "blogilo",
+    "project_path": "unmaintained/blogilo",
+    "repo_path": "unmaintained/blogilo"
+  },
+  "bluedevil": {
+    "description": "Bluedevil adds Bluetooth capabilities to KDE Plasma",
+    "name": "bluedevil",
+    "project_path": "kde/workspace/bluedevil",
+    "repo_path": "plasma/bluedevil"
+  },
+  "bluez-qt": {
+    "description": "Qt wrapper for Bluez 5 DBus API",
+    "name": "bluez-qt",
+    "project_path": "frameworks/bluez-qt",
+    "repo_path": "frameworks/bluez-qt"
+  },
+  "bodega-client": {
+    "description": "Library and client applications for the Make Play Live content store.",
+    "name": "bodega-client",
+    "project_path": "unmaintained/bodega-client",
+    "repo_path": "unmaintained/bodega-client"
+  },
+  "bodega-server": {
+    "description": "Server and content importers for the Bodega content system.",
+    "name": "bodega-server",
+    "project_path": "unmaintained/bodega-server",
+    "repo_path": "unmaintained/bodega-server"
+  },
+  "bodega-webapp-client": {
+    "description": "A web application client for the Bodega Content System",
+    "name": "bodega-webapp-client",
+    "project_path": "unmaintained/bodega-webapp-client",
+    "repo_path": "unmaintained/bodega-webapp-client"
+  },
+  "bodega-webapp-manager": {
+    "description": "Web application to manage an instance of Bodega Server",
+    "name": "bodega-webapp-manager",
+    "project_path": "unmaintained/bodega-webapp-manager",
+    "repo_path": "unmaintained/bodega-webapp-manager"
+  },
+  "bomber": {
+    "description": "Bomber is a single player arcade game",
+    "name": "bomber",
+    "project_path": "kde/kdegames/bomber",
+    "repo_path": "games/bomber"
+  },
+  "bonsai": {
+    "description": "Mobile Git repository manager",
+    "name": "bonsai",
+    "project_path": "playground/base/bonsai",
+    "repo_path": "maui/bonsai"
+  },
+  "bookmanager": {
+    "description": "A simple E-book manager and viewer.",
+    "name": "bookmanager",
+    "project_path": "unmaintained/bookmanager",
+    "repo_path": "unmaintained/bookmanager"
+  },
+  "bovo": {
+    "description": "Bovo is a Gomoku like game for two players",
+    "name": "bovo",
+    "project_path": "kde/kdegames/bovo",
+    "repo_path": "games/bovo"
+  },
+  "breeze": {
+    "description": "Artwork, styles and assets for the Breeze visual style for the Plasma Desktop",
+    "name": "breeze",
+    "project_path": "kde/workspace/breeze",
+    "repo_path": "plasma/breeze"
+  },
+  "breeze-grub": {
+    "description": "GRUB theme for the Breeze visual style for the Plasma Desktop",
+    "name": "breeze-grub",
+    "project_path": "kde/workspace/breeze-grub",
+    "repo_path": "plasma/breeze-grub"
+  },
+  "breeze-gtk": {
+    "description": "Breeze widget theme for GTK 2 and 3",
+    "name": "breeze-gtk",
+    "project_path": "kde/workspace/breeze-gtk",
+    "repo_path": "plasma/breeze-gtk"
+  },
+  "breeze-icons": {
+    "description": "Breeze icon theme.",
+    "name": "breeze-icons",
+    "project_path": "frameworks/breeze-icons",
+    "repo_path": "frameworks/breeze-icons"
+  },
+  "breeze-plymouth": {
+    "description": "Plymouth theme for the Breeze visual style for the Plasma Desktop",
+    "name": "breeze-plymouth",
+    "project_path": "kde/workspace/breeze-plymouth",
+    "repo_path": "plasma/breeze-plymouth"
+  },
+  "brooklyn": {
+    "description": "Protocol independent software which forwards messages between various chat services.",
+    "name": "brooklyn",
+    "project_path": "playground/utils/brookyln",
+    "repo_path": "unmaintained/brooklyn"
+  },
+  "brprint3d": {
+    "description": "Printer Host Open Source to 3D Printing",
+    "name": "brprint3d",
+    "project_path": "unmaintained/brprint3d",
+    "repo_path": "unmaintained/brprint3d"
+  },
+  "brun": {
+    "description": "Maui Calculator app",
+    "name": "brun",
+    "project_path": "playground/base/brun",
+    "repo_path": "maui/brun"
+  },
+  "buho": {
+    "description": "Task and Note Keeper",
+    "name": "buho",
+    "project_path": "playground/base/buho",
+    "repo_path": "maui/buho"
+  },
+  "cagibi": {
+    "description": "Experimental cache/proxy system for SSDP (Simple Service Discovery Protocol, used as service/device discovery system in UPnP).",
+    "name": "cagibi",
+    "project_path": "unmaintained/cagibi",
+    "repo_path": "unmaintained/cagibi"
+  },
+  "calamares-bigscreen-branding": {
+    "description": "Plasma Bigscreen branding and customization for Calamares",
+    "name": "calamares-bigscreen-branding",
+    "project_path": "playground/utils/calamares-bigscreen-branding",
+    "repo_path": "plasma-bigscreen/calamares-bigscreen-branding"
+  },
+  "calendarsupport": {
+    "description": "Library that provides calendar support for PIM",
+    "name": "calendarsupport",
+    "project_path": "kde/pim/calendarsupport",
+    "repo_path": "pim/calendarsupport"
+  },
+  "calindori": {
+    "description": "Calendar for Plasma Mobile",
+    "name": "calindori",
+    "project_path": "extragear/pim/calindori",
+    "repo_path": "plasma-mobile/calindori"
+  },
+  "calligra": {
+    "description": "Office and graphic art suite by KDE",
+    "name": "calligra",
+    "project_path": "calligra/calligra",
+    "repo_path": "office/calligra"
+  },
+  "calligra-history": {
+    "description": "The home of inactive branches for Calligra Suite.",
+    "name": "calligra-history",
+    "project_path": "calligra/calligra-history",
+    "repo_path": "historical/calligra-history"
+  },
+  "calligraplan": {
+    "description": "Project management application",
+    "name": "calligraplan",
+    "project_path": "calligra/calligraplan",
+    "repo_path": "office/calligraplan"
+  },
+  "cantor": {
+    "description": "Front end to powerful mathematics and statistics packages",
+    "name": "cantor",
+    "project_path": "kde/kdeedu/cantor",
+    "repo_path": "education/cantor"
+  },
+  "cervisia": {
+    "description": "GUI for CVS",
+    "name": "cervisia",
+    "project_path": "kde/kdesdk/cervisia",
+    "repo_path": "sdk/cervisia"
+  },
+  "chocolatey-packaging": {
+    "description": "Packaging information necessary to generate Chocolatey.org packages",
+    "name": "chocolatey-packaging",
+    "project_path": "playground/devtools/chocolatey-packaging",
+    "repo_path": "packaging/chocolatey-packaging"
+  },
+  "choqok": {
+    "description": "Microblogging client by KDE",
+    "name": "choqok",
+    "project_path": "extragear/network/choqok",
+    "repo_path": "network/choqok"
+  },
+  "cirkuit": {
+    "description": "KDE interface for LaTeX graphic tools (such as TikZ, Gnuplot, Circuit Macros) to produce publication-ready pictures.\n\nPlease use \"bugs.kde.org\":https://bugs.kde.org/wizard.cgi?package=cirkuit&kbugreport=1 to file bug reports and wishes.",
+    "name": "cirkuit",
+    "project_path": "unmaintained/cirkuit",
+    "repo_path": "unmaintained/cirkuit"
+  },
+  "clazy": {
+    "description": "Qt-oriented static code analyzer based on the Clang framework",
+    "name": "clazy",
+    "project_path": "extragear/sdk/clazy",
+    "repo_path": "sdk/clazy"
+  },
+  "cmark": {
+    "description": null,
+    "name": "cmark",
+    "project_path": "third-party/cmark",
+    "repo_path": null
+  },
+  "cmetronome": {
+    "description": "Command line metronome",
+    "name": "cmetronome",
+    "project_path": "playground/utils/cmetronome",
+    "repo_path": "unmaintained/cmetronome"
+  },
+  "cocoon": {
+    "description": "A GUI for Git.",
+    "name": "cocoon",
+    "project_path": "playground/sdk/cocoon",
+    "repo_path": "unmaintained/cocoon"
+  },
+  "codevis": {
+    "description": "Codevis is an analysis and visualization tool designed to assist in code maintenance for C++ codebases.",
+    "name": "codevis",
+    "project_path": "playground/sdk/codevis",
+    "repo_path": "sdk/codevis"
+  },
+  "colibri": {
+    "description": "Alternative notifications for KDE Plasma Desktop",
+    "name": "colibri",
+    "project_path": "unmaintained/colibri",
+    "repo_path": "unmaintained/colibri"
+  },
+  "colord-kde": {
+    "description": "Provides interfaces and session daemon to colord",
+    "name": "colord-kde",
+    "project_path": "playground/graphics/colord-kde",
+    "repo_path": "graphics/colord-kde"
+  },
+  "confine": {
+    "description": "Replacement to the KIOSK tool",
+    "name": "confine",
+    "project_path": "playground/utils/confine",
+    "repo_path": "utilities/confine"
+  },
+  "conquirere": {
+    "description": "Nepomuk powered research tool.",
+    "name": "conquirere",
+    "project_path": "unmaintained/conquirere",
+    "repo_path": "unmaintained/conquirere"
+  },
+  "contour": {
+    "description": "A new and innovative usage paradigm for mobile devices",
+    "name": "contour",
+    "project_path": "unmaintained/contour",
+    "repo_path": "unmaintained/contour"
+  },
+  "craft": {
+    "description": "Open source meta build system and package manager",
+    "name": "craft",
+    "project_path": "kdesupport/craft",
+    "repo_path": "packaging/craft"
+  },
+  "craft-blueprints-community": {
+    "description": "Project build blueprints for Craft not related to KDE software",
+    "name": "craft-blueprints-community",
+    "project_path": "kdesupport/craft-blueprints-community",
+    "repo_path": "packaging/craft-blueprints-community"
+  },
+  "craft-blueprints-kde": {
+    "description": "Project build blueprints for Craft \u2014 the meta build system and package manager",
+    "name": "craft-blueprints-kde",
+    "project_path": "kdesupport/craft-blueprints-kde",
+    "repo_path": "packaging/craft-blueprints-kde"
+  },
+  "craftmaster": {
+    "description": "Orchestrate multiple Craft instance configurations",
+    "name": "craftmaster",
+    "project_path": "kdesupport/craftmaster",
+    "repo_path": "packaging/craftmaster"
+  },
+  "croutons": {
+    "description": "Library for asynchronous Qt, including QML-friendly futures and C++20 coroutine integration",
+    "name": "croutons",
+    "project_path": "extragear/libs/croutons",
+    "repo_path": "libraries/croutons"
+  },
+  "cutehmi": {
+    "description": "Open-source HMI (Human Machine Interface) software written in C++ and QML",
+    "name": "cutehmi",
+    "project_path": "playground/base/cutehmi",
+    "repo_path": "sdk/cutehmi"
+  },
+  "cutepaste": {
+    "description": "Client application for paste.kde.org written in Qt",
+    "name": "cutepaste",
+    "project_path": "unmaintained/cutepaste",
+    "repo_path": "unmaintained/cutepaste"
+  },
+  "cxx11-cmake-modules": {
+    "description": "CMake modules for detecting C++11 features supported by the compiler",
+    "name": "cxx11-cmake-modules",
+    "project_path": "playground/base/cxx11-cmake-modules",
+    "repo_path": "libraries/cxx11-cmake-modules"
+  },
+  "daykountdown": {
+    "description": "A simple date countdown app written for KDE Plasma, using Kirigami.",
+    "name": "daykountdown",
+    "project_path": "playground/utilities/daykountdown",
+    "repo_path": "utilities/daykountdown"
+  },
+  "declarative-plasmoids": {
+    "description": "a repository for developing declarative plasmoids for the plasma desktop and mobile",
+    "name": "declarative-plasmoids",
+    "project_path": "unmaintained/declarative-plasmoids",
+    "repo_path": "unmaintained/declarative-plasmoids"
+  },
+  "dekorator": {
+    "description": "KWin plugin to support pixmap decorations in KDE",
+    "name": "dekorator",
+    "project_path": "unmaintained/dekorator",
+    "repo_path": "unmaintained/dekorator"
+  },
+  "dferry": {
+    "description": "D-Bus library and tools",
+    "name": "dferry",
+    "project_path": "playground/sdk/dferry",
+    "repo_path": "sdk/dferry"
+  },
+  "digikam": {
+    "description": "digiKam is an advanced open-source digital photo management application that runs on Linux, Windows, and MacOS. The application provides a comprehensive set of tools for importing, managing, editing, and sharing photos and raw files.",
+    "name": "digikam",
+    "project_path": "extragear/graphics/digikam",
+    "repo_path": "graphics/digikam"
+  },
+  "digikam-doc": {
+    "description": "Documentation for the digiKam photo management application",
+    "name": "digikam-doc",
+    "project_path": "extragear/graphics/digikam/digikam-doc",
+    "repo_path": "documentation/digikam-doc"
+  },
+  "digikam-software-compilation": {
+    "description": "Advanced digital photo management application by KDE, which makes importing and organizing digital photos a 'snap'.",
+    "name": "digikam-software-compilation",
+    "project_path": "unmaintained/digikam-software-compilation",
+    "repo_path": "unmaintained/digikam-software-compilation"
+  },
+  "digikam-test-data": {
+    "description": "Data required to support running unit tests for digiKam",
+    "name": "digikam-test-data",
+    "project_path": "extragear/graphics/digikam-test-data",
+    "repo_path": "graphics/digikam-test-data"
+  },
+  "discover": {
+    "description": "KDE and Plasma resources management GUI",
+    "name": "discover",
+    "project_path": "kde/workspace/discover",
+    "repo_path": "plasma/discover"
+  },
+  "distro-release-notifier": {
+    "description": "",
+    "name": "distro-release-notifier",
+    "project_path": "playground/base/distro-release-notifier",
+    "repo_path": "system/distro-release-notifier"
+  },
+  "docker-neon-all": {
+    "description": "Docker packaging environment for KDE Neon, including everything",
+    "name": "docker-neon-all",
+    "project_path": "playground/packaging/docker-neon-all",
+    "repo_path": "packaging/docker-neon-all"
+  },
+  "documentation-develop-kde-org": {
+    "description": "Hugo based website containing tutorials and other articles useful for KDE Development",
+    "name": "documentation-develop-kde-org",
+    "project_path": "documentation/develop-kde-org",
+    "repo_path": "documentation/develop-kde-org"
+  },
+  "documentation-docs-kdenlive-org": {
+    "description": "Documentation for Kdenlive",
+    "name": "documentation-docs-kdenlive-org",
+    "project_path": "documentation/docs-kdenlive-org",
+    "repo_path": "documentation/docs-kdenlive-org"
+  },
+  "dolphin": {
+    "description": "File manager by KDE",
+    "name": "dolphin",
+    "project_path": "kde/applications/dolphin",
+    "repo_path": "system/dolphin"
+  },
+  "dolphin-plugins": {
+    "description": "Plugins for Dolphin",
+    "name": "dolphin-plugins",
+    "project_path": "kde/kdesdk/dolphin-plugins",
+    "repo_path": "sdk/dolphin-plugins"
+  },
+  "doxyqml": {
+    "description": "Doxygen filter to allow generation of API Documentation for QML",
+    "name": "doxyqml",
+    "project_path": "playground/sdk/doxyqml",
+    "repo_path": "sdk/doxyqml"
+  },
+  "dragon": {
+    "description": "Multimedia player with the focus on simplicity, not features",
+    "name": "dragon",
+    "project_path": "kde/kdemultimedia/dragon",
+    "repo_path": "multimedia/dragon"
+  },
+  "drkonqi": {
+    "description": "Crash handler for KDE software",
+    "name": "drkonqi",
+    "project_path": "kde/workspace/drkonqi",
+    "repo_path": "plasma/drkonqi"
+  },
+  "drkonqi-pk-debug-installer": {
+    "description": "PackageKit based debug package installer (for debian-like distros) for DrKonqi",
+    "name": "drkonqi-pk-debug-installer",
+    "project_path": "playground/base/drkonqi-pk-debug-installer",
+    "repo_path": "system/drkonqi-pk-debug-installer"
+  },
+  "dummy": {
+    "description": "Systems testing repository",
+    "name": "dummy",
+    "project_path": "sysadmin/dummy",
+    "repo_path": "sysadmin/dummy"
+  },
+  "ebookreader": {
+    "description": "This project aims at providing a cross-platform e-book reader adapted for touch screens by using Qt/QML for its frontend and okular core library for its backend",
+    "name": "ebookreader",
+    "project_path": "unmaintained/ebookreader",
+    "repo_path": "unmaintained/ebookreader"
+  },
+  "elf-dissector": {
+    "description": "Tools for inspecting, analyzing and optimizing ELF files",
+    "name": "elf-dissector",
+    "project_path": "extragear/sdk/elf-dissector",
+    "repo_path": "sdk/elf-dissector"
+  },
+  "elisa": {
+    "description": "Simple music player aiming to provide a nice experience for its users",
+    "name": "elisa",
+    "project_path": "kde/kdemultimedia/elisa",
+    "repo_path": "multimedia/elisa"
+  },
+  "eloquens": {
+    "description": "Generate the lorem ipsum text",
+    "name": "eloquens",
+    "project_path": "kdereview/eloquens",
+    "repo_path": "sdk/eloquens"
+  },
+  "emerge": {
+    "description": "Stub - this project has been renamed",
+    "name": "emerge",
+    "project_path": "unmaintained/emerge",
+    "repo_path": "unmaintained/emerge"
+  },
+  "emerge-history": {
+    "description": "complete svn history of emerge",
+    "name": "emerge-history",
+    "project_path": "kdesupport/emerge-history",
+    "repo_path": "unmaintained/emerge-history"
+  },
+  "eventviews": {
+    "description": "Library for displaying and creating events and calendars",
+    "name": "eventviews",
+    "project_path": "kde/pim/eventviews",
+    "repo_path": "pim/eventviews"
+  },
+  "extra-cmake-modules": {
+    "description": "Extra modules and scripts for CMake.",
+    "name": "extra-cmake-modules",
+    "project_path": "frameworks/extra-cmake-modules",
+    "repo_path": "frameworks/extra-cmake-modules"
+  },
+  "eyeos-style": {
+    "description": "KStyle for EyeOS",
+    "name": "eyeos-style",
+    "project_path": "playground/base/eyeos-style",
+    "repo_path": "unmaintained/eyeos-style"
+  },
+  "falkon": {
+    "description": "Cross-platform Qt-based web browser",
+    "name": "falkon",
+    "project_path": "extragear/network/falkon",
+    "repo_path": "network/falkon"
+  },
+  "ffmpegthumbs": {
+    "description": "FFmpeg-based thumbnail creator for video files",
+    "name": "ffmpegthumbs",
+    "project_path": "kde/kdemultimedia/ffmpegthumbs",
+    "repo_path": "multimedia/ffmpegthumbs"
+  },
+  "fielding": {
+    "description": "A simple REST API testing tool",
+    "name": "fielding",
+    "project_path": "playground/utils/fielding",
+    "repo_path": "utilities/fielding"
+  },
+  "filelight": {
+    "description": "Quickly visualize your disk space usage",
+    "name": "filelight",
+    "project_path": "kde/kdeutils/filelight",
+    "repo_path": "utilities/filelight"
+  },
+  "flatpak-kcm": {
+    "description": "Flatpak Permissions Management KCM",
+    "name": "flatpak-kcm",
+    "project_path": "kde/workspace/flatpak-kcm",
+    "repo_path": "plasma/flatpak-kcm"
+  },
+  "flatpak-kde-applications": {
+    "description": "Flatpak packaging files for some KDE Applications",
+    "name": "flatpak-kde-applications",
+    "project_path": "playground/packaging/flatpak-kde-applications",
+    "repo_path": "packaging/flatpak-kde-applications"
+  },
+  "flatpak-kde-runtime": {
+    "description": "Files to generate a repository with org.kde.Platform and Sdk",
+    "name": "flatpak-kde-runtime",
+    "project_path": "playground/packaging/flatpak-kde-runtime",
+    "repo_path": "packaging/flatpak-kde-runtime"
+  },
+  "flickr-runner": {
+    "description": "Flickr",
+    "name": "flickr-runner",
+    "project_path": "unmaintained/flickr-runner",
+    "repo_path": "unmaintained/flickr-runner"
+  },
+  "frameworkintegration": {
+    "description": "Framework providing components to allow applications to integrate with a KDE Workspace",
+    "name": "frameworkintegration",
+    "project_path": "frameworks/frameworkintegration",
+    "repo_path": "frameworks/frameworkintegration"
+  },
+  "francis": {
+    "description": "Track your time",
+    "name": "francis",
+    "project_path": "extragear/utils/francis",
+    "repo_path": "utilities/francis"
+  },
+  "futuresql": {
+    "description": "Non-blocking Qt database framework",
+    "name": "futuresql",
+    "project_path": "kdesupport/futuresql",
+    "repo_path": "libraries/futuresql"
+  },
+  "gcompris": {
+    "description": "High-quality educational software suite for children aged 2 to 10",
+    "name": "gcompris",
+    "project_path": "extragear/edu/gcompris",
+    "repo_path": "education/gcompris"
+  },
+  "gcompris-data": {
+    "description": "Data files for GCompris",
+    "name": "gcompris-data",
+    "project_path": "extragear/edu/gcompris-data",
+    "repo_path": "education/gcompris-data"
+  },
+  "gestures-kde": {
+    "description": "Handles gestures of multi touch input devices",
+    "name": "gestures-kde",
+    "project_path": "unmaintained/gestures-kde",
+    "repo_path": "unmaintained/gestures-kde"
+  },
+  "ghostwriter": {
+    "description": "Text editor for Markdown",
+    "name": "ghostwriter",
+    "project_path": "kde/office/ghostwriter",
+    "repo_path": "office/ghostwriter"
+  },
+  "ginkgo": {
+    "description": "Ginkgo is a generic resource navigator and editor for Nepomuk, the KDE semantic toolkit.",
+    "name": "ginkgo",
+    "project_path": "playground/utils/ginkgo",
+    "repo_path": "unmaintained/ginkgo"
+  },
+  "git-lab": {
+    "description": "Command-line client for GitLab",
+    "name": "git-lab",
+    "project_path": "playground/sdk/git-lab",
+    "repo_path": "sdk/git-lab"
+  },
+  "glaxnimate": {
+    "description": "Simple vector animation program.",
+    "name": "glaxnimate",
+    "project_path": "playground/graphics/glaxnimate",
+    "repo_path": "graphics/glaxnimate"
+  },
+  "gluon": {
+    "description": "An open framework for developing, playing and distributing games.",
+    "name": "gluon",
+    "project_path": "unmaintained/gluon",
+    "repo_path": "unmaintained/gluon"
+  },
+  "gluon-blocks": {
+    "description": "The first game for KDE/Gluon",
+    "name": "gluon-blocks",
+    "project_path": "unmaintained/gluon-blocks",
+    "repo_path": "unmaintained/gluon-blocks"
+  },
+  "gpgme": {
+    "description": null,
+    "name": "gpgme",
+    "project_path": "third-party/gpgme",
+    "repo_path": null
+  },
+  "gpgmepp": {
+    "description": "GPGME++ Library",
+    "name": "gpgmepp",
+    "project_path": "unmaintained/gpgmepp",
+    "repo_path": "unmaintained/gpgmepp"
+  },
+  "granatier": {
+    "description": "Granatier is a clone of the classic Bomberman game",
+    "name": "granatier",
+    "project_path": "kde/kdegames/granatier",
+    "repo_path": "games/granatier"
+  },
+  "grantlee-editor": {
+    "description": "Utilities and tools to manage themes in KDE PIM applications",
+    "name": "grantlee-editor",
+    "project_path": "kde/pim/grantlee-editor",
+    "repo_path": "pim/grantlee-editor"
+  },
+  "grantleetheme": {
+    "description": "Library that provides Grantlee theme support",
+    "name": "grantleetheme",
+    "project_path": "kde/pim/grantleetheme",
+    "repo_path": "pim/grantleetheme"
+  },
+  "gwenview": {
+    "description": "Image viewer by KDE",
+    "name": "gwenview",
+    "project_path": "kde/kdegraphics/gwenview",
+    "repo_path": "graphics/gwenview"
+  },
+  "haruna": {
+    "description": "Open source video player built with Qt/QML and libmpv.",
+    "name": "haruna",
+    "project_path": "kde/kdemultimedia/haruna",
+    "repo_path": "multimedia/haruna"
+  },
+  "hash-o-matic": {
+    "description": "Simple hash validator allowing to compare two files, generate the checksum of a file and verify if a hash matches a file.",
+    "name": "hash-o-matic",
+    "project_path": "kdereview/utils/hash-o-matic",
+    "repo_path": "utilities/hash-o-matic"
+  },
+  "heaptrack": {
+    "description": "A heap memory profiler for Linux",
+    "name": "heaptrack",
+    "project_path": "extragear/sdk/heaptrack",
+    "repo_path": "sdk/heaptrack"
+  },
+  "homebrew-kde": {
+    "description": "Homebrew formulas for building KDE software on macOS",
+    "name": "homebrew-kde",
+    "project_path": "playground/devtools/homebrew-kde",
+    "repo_path": "packaging/homebrew-kde"
+  },
+  "homerun": {
+    "description": "An application launcher for KDE Plasma desktop",
+    "name": "homerun",
+    "project_path": "unmaintained/homerun",
+    "repo_path": "unmaintained/homerun"
+  },
+  "ikona": {
+    "description": "Icon editing companion",
+    "name": "ikona",
+    "project_path": "extragear/sdk/ikona",
+    "repo_path": "sdk/ikona"
+  },
+  "incidenceeditor": {
+    "description": "Library that provides calendar incidence editor",
+    "name": "incidenceeditor",
+    "project_path": "kde/pim/incidenceeditor",
+    "repo_path": "pim/incidenceeditor"
+  },
+  "index-fm": {
+    "description": "Multi-platform file manager",
+    "name": "index-fm",
+    "project_path": "playground/base/index-fm",
+    "repo_path": "maui/index-fm"
+  },
+  "inqlude-client": {
+    "description": "Command-line client for inqlude.org",
+    "name": "inqlude-client",
+    "project_path": "playground/sdk/inqlude-client",
+    "repo_path": "sdk/inqlude-client"
+  },
+  "isoimagewriter": {
+    "description": "Program to write hybrid ISO files onto USB disks",
+    "name": "isoimagewriter",
+    "project_path": "extragear/utils/isoimagewriter",
+    "repo_path": "utilities/isoimagewriter"
+  },
+  "itinerary": {
+    "description": "Itinerary and boarding pass management application",
+    "name": "itinerary",
+    "project_path": "kde/pim/itinerary",
+    "repo_path": "pim/itinerary"
+  },
+  "jovie": {
+    "description": "Jovie is the KDE text to speech system application",
+    "name": "jovie",
+    "project_path": "unmaintained/jovie",
+    "repo_path": "unmaintained/jovie"
+  },
+  "jsmoke": {
+    "description": "Smoke bindings for QtScript.",
+    "name": "jsmoke",
+    "project_path": "unmaintained/jsmoke",
+    "repo_path": "unmaintained/jsmoke"
+  },
+  "juk": {
+    "description": "Audio jukebox app, supporting collections of MP3, Ogg Vorbis and FLAC audio files",
+    "name": "juk",
+    "project_path": "kde/kdemultimedia/juk",
+    "repo_path": "multimedia/juk"
+  },
+  "jungle": {
+    "description": "Jungle is an absolutely awesome video player for managing your videos (movies, tvshows, etc)",
+    "name": "jungle",
+    "project_path": "playground/multimedia/jungle",
+    "repo_path": "unmaintained/jungle"
+  },
+  "k3b": {
+    "description": "Full-featured CD/DVD/Blu-ray burning and ripping application",
+    "name": "k3b",
+    "project_path": "kde/kdemultimedia/k3b",
+    "repo_path": "multimedia/k3b"
+  },
+  "kaccessible": {
+    "description": "kaccessible implements a QAccessibleBridgePlugin to provide accessibility services like focus tracking and a screenreader.",
+    "name": "kaccessible",
+    "project_path": "unmaintained/kaccessible",
+    "repo_path": "unmaintained/kaccessible"
+  },
+  "kaccounts-integration": {
+    "description": "Online account management system and its Plasma integration components",
+    "name": "kaccounts-integration",
+    "project_path": "kde/kdenetwork/kaccounts-integration",
+    "repo_path": "network/kaccounts-integration"
+  },
+  "kaccounts-mobile": {
+    "description": "Collection of things for KAccounts targeted for Plasma Mobile",
+    "name": "kaccounts-mobile",
+    "project_path": "playground/mobile/kaccounts-mobile",
+    "repo_path": "plasma-mobile/kaccounts-mobile"
+  },
+  "kaccounts-providers": {
+    "description": "Online account providers for the KAccounts system",
+    "name": "kaccounts-providers",
+    "project_path": "kde/kdenetwork/kaccounts-providers",
+    "repo_path": "network/kaccounts-providers"
+  },
+  "kactivitymanagerd": {
+    "description": "System service to manage user's activities, track the usage patterns etc.",
+    "name": "kactivitymanagerd",
+    "project_path": "kde/workspace/kactivitymanagerd",
+    "repo_path": "plasma/kactivitymanagerd"
+  },
+  "kaddressbook": {
+    "description": "Address book application to manage your contacts",
+    "name": "kaddressbook",
+    "project_path": "kde/pim/kaddressbook",
+    "repo_path": "pim/kaddressbook"
+  },
+  "kaffeine": {
+    "description": "Media player with support for digital television (DVB-C/S/S2/T, ATSC, CI/CAM)",
+    "name": "kaffeine",
+    "project_path": "extragear/multimedia/kaffeine",
+    "repo_path": "multimedia/kaffeine"
+  },
+  "kaidan": {
+    "description": "Simple and user-friendly Jabber/XMPP client for every device and platform",
+    "name": "kaidan",
+    "project_path": "kdereview/kaidan",
+    "repo_path": "network/kaidan"
+  },
+  "kairo": {
+    "description": "Programmable timer",
+    "name": "kairo",
+    "project_path": "playground/utils/kairo",
+    "repo_path": "utilities/kairo"
+  },
+  "kajongg": {
+    "description": "Mah Jongg - the ancient Chinese board game for 4 players",
+    "name": "kajongg",
+    "project_path": "kde/kdegames/kajongg",
+    "repo_path": "games/kajongg"
+  },
+  "kalarm": {
+    "description": "Application to manage alarms and other timer-based alerts on the desktop",
+    "name": "kalarm",
+    "project_path": "kde/pim/kalarm",
+    "repo_path": "pim/kalarm"
+  },
+  "kalarmcal": {
+    "description": "Calendar support for KAlarm",
+    "name": "kalarmcal",
+    "project_path": "kde/pim/kalarmcal",
+    "repo_path": "pim/kalarmcal"
+  },
+  "kalgebra": {
+    "description": "2D and 3D Graph Calculator",
+    "name": "kalgebra",
+    "project_path": "kde/kdeedu/kalgebra",
+    "repo_path": "education/kalgebra"
+  },
+  "kalk": {
+    "description": "Kalk is a powerful cross-platform calculator application built with the [Kirigami framework](https://kde.org/products/kirigami/)",
+    "name": "kalk",
+    "project_path": "extragear/utils/kalk",
+    "repo_path": "utilities/kalk"
+  },
+  "kalm": {
+    "description": "Kalm can teach you different breathing techniques.",
+    "name": "kalm",
+    "project_path": "kdereview/kalm",
+    "repo_path": "utilities/kalm"
+  },
+  "kalternatives": {
+    "description": "Distribution alternatives configuration",
+    "name": "kalternatives",
+    "project_path": "playground/sysadmin/kalternatives",
+    "repo_path": "system/kalternatives"
+  },
+  "kalzium": {
+    "description": "Periodic Table of Elements",
+    "name": "kalzium",
+    "project_path": "kde/kdeedu/kalzium",
+    "repo_path": "education/kalzium"
+  },
+  "kamera": {
+    "description": "KDE integration for gphoto2 cameras",
+    "name": "kamera",
+    "project_path": "kde/kdegraphics/kamera",
+    "repo_path": "graphics/kamera"
+  },
+  "kamoso": {
+    "description": "Application to take pictures and videos with your webcam",
+    "name": "kamoso",
+    "project_path": "kde/kdemultimedia/kamoso",
+    "repo_path": "multimedia/kamoso"
+  },
+  "kanagram": {
+    "description": "Letter Order Game",
+    "name": "kanagram",
+    "project_path": "kde/kdeedu/kanagram",
+    "repo_path": "education/kanagram"
+  },
+  "kanalytics": {
+    "description": "KAnalytics provides a library and a set of tools to analyze system information and upload it to KDE servers.",
+    "name": "kanalytics",
+    "project_path": "playground/utils/kanalytics",
+    "repo_path": "unmaintained/kanalytics"
+  },
+  "kannasaver": {
+    "description": "A Screen Saver for Plasma showing Japanese Characters",
+    "name": "kannasaver",
+    "project_path": "unmaintained/kannasaver",
+    "repo_path": "unmaintained/kannasaver"
+  },
+  "kapa": {
+    "description": "KDE Advanced Personal Assistant",
+    "name": "kapa",
+    "project_path": "playground/base/kapa",
+    "repo_path": "unmaintained/kapa"
+  },
+  "kapidox": {
+    "description": "Frameworks API Documentation Tools",
+    "name": "kapidox",
+    "project_path": "frameworks/kapidox",
+    "repo_path": "frameworks/kapidox"
+  },
+  "kapman": {
+    "description": "Kapman is a clone of the well known game Pac-Man",
+    "name": "kapman",
+    "project_path": "kde/kdegames/kapman",
+    "repo_path": "games/kapman"
+  },
+  "kapptemplate": {
+    "description": "Factory for the easy creation of KDE/Qt components and programs",
+    "name": "kapptemplate",
+    "project_path": "kde/kdesdk/kapptemplate",
+    "repo_path": "sdk/kapptemplate"
+  },
+  "karchive": {
+    "description": "Qt addon providing access to numerous types of archives",
+    "name": "karchive",
+    "project_path": "frameworks/karchive",
+    "repo_path": "frameworks/karchive"
+  },
+  "kard": {
+    "description": "Memory-like game for kids",
+    "name": "kard",
+    "project_path": "playground/edu/kard",
+    "repo_path": "education/kard"
+  },
+  "kartesio": {
+    "description": "Calculate best fit curves with experimental points using regression or neural networks",
+    "name": "kartesio",
+    "project_path": "playground/edu/kartesio",
+    "repo_path": "education/kartesio"
+  },
+  "kasts": {
+    "description": "Kirigami-based podcast player",
+    "name": "kasts",
+    "project_path": "extragear/multimedia/kasts",
+    "repo_path": "multimedia/kasts"
+  },
+  "kasync": {
+    "description": "C++ library for controlling asynchronous tasks",
+    "name": "kasync",
+    "project_path": "playground/libs/kasync",
+    "repo_path": "libraries/kasync"
+  },
+  "kate": {
+    "description": "Modern text editor built on the KDE Frameworks and Qt",
+    "name": "kate",
+    "project_path": "kde/applications/kate",
+    "repo_path": "utilities/kate"
+  },
+  "katomic": {
+    "description": "Katomic is a fun and educational game built around molecular geometry",
+    "name": "katomic",
+    "project_path": "kde/kdegames/katomic",
+    "repo_path": "games/katomic"
+  },
+  "kaudiocreator": {
+    "description": "KAudioCreator is a program for ripping and encoding Audio-CDs, encoding files from disk.",
+    "name": "kaudiocreator",
+    "project_path": "unmaintained/kaudiocreator",
+    "repo_path": "unmaintained/kaudiocreator"
+  },
+  "kauth": {
+    "description": "KAuth",
+    "name": "kauth",
+    "project_path": "frameworks/kauth",
+    "repo_path": "frameworks/kauth"
+  },
+  "kbackup": {
+    "description": "Backup program with an easy-to-use interface",
+    "name": "kbackup",
+    "project_path": "kde/kdeutils/kbackup",
+    "repo_path": "utilities/kbackup"
+  },
+  "kbibtex": {
+    "description": "An editor for bibliographies used with LaTeX",
+    "name": "kbibtex",
+    "project_path": "extragear/office/kbibtex",
+    "repo_path": "office/kbibtex"
+  },
+  "kbibtex-testset": {
+    "description": "Testing data for KBibTex",
+    "name": "kbibtex-testset",
+    "project_path": "extragear/office/kbibtex-testset",
+    "repo_path": "office/kbibtex-testset"
+  },
+  "kblackbox": {
+    "description": "KBlackBox is a game of hide and seek played on a grid of boxes",
+    "name": "kblackbox",
+    "project_path": "kde/kdegames/kblackbox",
+    "repo_path": "games/kblackbox"
+  },
+  "kblocks": {
+    "description": "KBlocks is the classic falling blocks game",
+    "name": "kblocks",
+    "project_path": "kde/kdegames/kblocks",
+    "repo_path": "games/kblocks"
+  },
+  "kblog": {
+    "description": "Support for reading various blog feeds",
+    "name": "kblog",
+    "project_path": "kde/pim/kblog",
+    "repo_path": "pim/kblog"
+  },
+  "kbookmarks": {
+    "description": "KBookmarks",
+    "name": "kbookmarks",
+    "project_path": "frameworks/kbookmarks",
+    "repo_path": "frameworks/kbookmarks"
+  },
+  "kbounce": {
+    "description": "KBounce is a single player arcade game with the elements of puzzle",
+    "name": "kbounce",
+    "project_path": "kde/kdegames/kbounce",
+    "repo_path": "games/kbounce"
+  },
+  "kbreakout": {
+    "description": "KBreakOut is a Breakout-like game. Its objective is to destroy as many bricks as possible without losing the ball.",
+    "name": "kbreakout",
+    "project_path": "kde/kdegames/kbreakout",
+    "repo_path": "games/kbreakout"
+  },
+  "kbruch": {
+    "description": "Practice Fractions",
+    "name": "kbruch",
+    "project_path": "kde/kdeedu/kbruch",
+    "repo_path": "education/kbruch"
+  },
+  "kcachegrind": {
+    "description": "GUI to profilers such as Valgrind",
+    "name": "kcachegrind",
+    "project_path": "kde/kdesdk/kcachegrind",
+    "repo_path": "sdk/kcachegrind"
+  },
+  "kcalc": {
+    "description": "Calculator offering everything a scientific calculator does, and more",
+    "name": "kcalc",
+    "project_path": "kde/kdeutils/kcalc",
+    "repo_path": "utilities/kcalc"
+  },
+  "kcalendarcore": {
+    "description": "KCalendarCore - Library for Interfacing with Calendars",
+    "name": "kcalendarcore",
+    "project_path": "frameworks/kcalendarcore",
+    "repo_path": "frameworks/kcalendarcore"
+  },
+  "kcalutils": {
+    "description": "Library to assist working with calendars",
+    "name": "kcalutils",
+    "project_path": "kde/pim/kcalutils",
+    "repo_path": "pim/kcalutils"
+  },
+  "kcgroups": {
+    "description": "Library for easy access to running apps and their control groups resources",
+    "name": "kcgroups",
+    "project_path": "kdereview/kcgroups",
+    "repo_path": "libraries/kcgroups"
+  },
+  "kcharselect": {
+    "description": "Tool to select and copy special characters from all installed fonts",
+    "name": "kcharselect",
+    "project_path": "kde/kdeutils/kcharselect",
+    "repo_path": "utilities/kcharselect"
+  },
+  "kclock": {
+    "description": "Clock app for Plasma Mobile",
+    "name": "kclock",
+    "project_path": "extragear/utils/kclock",
+    "repo_path": "utilities/kclock"
+  },
+  "kcm-grub2": {
+    "description": "KDE Control Module for configuring the GRUB bootloader",
+    "name": "kcm-grub2",
+    "project_path": "extragear/sysadmin/kcm-grub2",
+    "repo_path": "system/kcm-grub2"
+  },
+  "kcm-userconfig": {
+    "description": "A System Settings module for managing users and groups on your system.",
+    "name": "kcm-userconfig",
+    "project_path": "playground/sysadmin/kcm-userconfig",
+    "repo_path": "unmaintained/kcm-userconfig"
+  },
+  "kcmgrub2": {
+    "description": "Kcm module that manages the most common settings of grub2",
+    "name": "kcmgrub2",
+    "project_path": "playground/sysadmin/kcmgrub2",
+    "repo_path": "unmaintained/kcmgrub2"
+  },
+  "kcmutils": {
+    "description": "Utilities for interacting with KCModules",
+    "name": "kcmutils",
+    "project_path": "frameworks/kcmutils",
+    "repo_path": "frameworks/kcmutils"
+  },
+  "kcodecs": {
+    "description": "KCodecs provide a collection of methods to manipulate strings using various encodings",
+    "name": "kcodecs",
+    "project_path": "frameworks/kcodecs",
+    "repo_path": "frameworks/kcodecs"
+  },
+  "kcolorchooser": {
+    "description": "A small utility to select a color",
+    "name": "kcolorchooser",
+    "project_path": "kde/kdegraphics/kcolorchooser",
+    "repo_path": "graphics/kcolorchooser"
+  },
+  "kcoloredit": {
+    "description": "KDE Color Palette Editor",
+    "name": "kcoloredit",
+    "project_path": "unmaintained/kcoloredit",
+    "repo_path": "unmaintained/kcoloredit"
+  },
+  "kcolorscheme": {
+    "description": "Classes to read and interact with KColorScheme",
+    "name": "kcolorscheme",
+    "project_path": "frameworks/kcolorscheme",
+    "repo_path": "frameworks/kcolorscheme"
+  },
+  "kcompletion": {
+    "description": "KCompletion",
+    "name": "kcompletion",
+    "project_path": "frameworks/kcompletion",
+    "repo_path": "frameworks/kcompletion"
+  },
+  "kconfig": {
+    "description": "KConfig",
+    "name": "kconfig",
+    "project_path": "frameworks/kconfig",
+    "repo_path": "frameworks/kconfig"
+  },
+  "kconfigwidgets": {
+    "description": "Widgets for KConfig",
+    "name": "kconfigwidgets",
+    "project_path": "frameworks/kconfigwidgets",
+    "repo_path": "frameworks/kconfigwidgets"
+  },
+  "kcontacts": {
+    "description": "KContacts - Library for working with contact information",
+    "name": "kcontacts",
+    "project_path": "frameworks/kcontacts",
+    "repo_path": "frameworks/kcontacts"
+  },
+  "kcoreaddons": {
+    "description": "KCoreAddons",
+    "name": "kcoreaddons",
+    "project_path": "frameworks/kcoreaddons",
+    "repo_path": "frameworks/kcoreaddons"
+  },
+  "kcrash": {
+    "description": "KCrash",
+    "name": "kcrash",
+    "project_path": "frameworks/kcrash",
+    "repo_path": "frameworks/kcrash"
+  },
+  "kcron": {
+    "description": "Task scheduler by KDE",
+    "name": "kcron",
+    "project_path": "kde/kdeadmin/kcron",
+    "repo_path": "system/kcron"
+  },
+  "kcwsh": {
+    "description": "This project provides a terminal wrapper, both abstracted and using a Qt based sample backend. It is used to make a windows port of konsole possible.",
+    "name": "kcwsh",
+    "project_path": "playground/base/kcwsh",
+    "repo_path": "unmaintained/kcwsh"
+  },
+  "kdav": {
+    "description": "DAV protocol implementation with KJobs",
+    "name": "kdav",
+    "project_path": "frameworks/kdav",
+    "repo_path": "frameworks/kdav"
+  },
+  "kdav2": {
+    "description": "DAV protocol implementation with KJobs",
+    "name": "kdav2",
+    "project_path": "playground/pim/kdav2",
+    "repo_path": "pim/kdav2"
+  },
+  "kdb": {
+    "description": "Database connectivity and creation framework for various database vendors",
+    "name": "kdb",
+    "project_path": "extragear/libs/kdb",
+    "repo_path": "libraries/kdb"
+  },
+  "kdbusaddons": {
+    "description": "KDBusAddons",
+    "name": "kdbusaddons",
+    "project_path": "frameworks/kdbusaddons",
+    "repo_path": "frameworks/kdbusaddons"
+  },
+  "kde-artwork-active": {
+    "description": "Themes, wallpapers and splash screens for Plasma Active",
+    "name": "kde-artwork-active",
+    "project_path": "unmaintained/kde-artwork-active",
+    "repo_path": "unmaintained/kde-artwork-active"
+  },
+  "kde-baseapps": {
+    "description": "Collection of applications used for file and Internet browsing.",
+    "name": "kde-baseapps",
+    "project_path": "unmaintained/kde-baseapps",
+    "repo_path": "unmaintained/kde-baseapps"
+  },
+  "kde-build-metadata": {
+    "description": "DEPRECATED - CONTENT MOVED TO https://invent.kde.org/sysadmin/repo-metadata/-/tree/master/dependencies",
+    "name": "kde-build-metadata",
+    "project_path": "kde-build-metadata",
+    "repo_path": "sysadmin/kde-build-metadata"
+  },
+  "kde-builder": {
+    "description": "Script to streamline the process of setting up and maintaining a development environment for KDE software.",
+    "name": "kde-builder",
+    "project_path": "playground/sdk/kde-builder",
+    "repo_path": "sdk/kde-builder"
+  },
+  "kde-cli-tools": {
+    "description": "Tools based on KDE Frameworks 5 to better interact with the system",
+    "name": "kde-cli-tools",
+    "project_path": "kde/workspace/kde-cli-tools",
+    "repo_path": "plasma/kde-cli-tools"
+  },
+  "kde-dev-scripts": {
+    "description": "Scripts and setting files useful during development of KDE software",
+    "name": "kde-dev-scripts",
+    "project_path": "kde/kdesdk/kde-dev-scripts",
+    "repo_path": "sdk/kde-dev-scripts"
+  },
+  "kde-dev-utils": {
+    "description": "Small utilities for developers using KDE/Qt libs/frameworks",
+    "name": "kde-dev-utils",
+    "project_path": "kde/kdesdk/kde-dev-utils",
+    "repo_path": "sdk/kde-dev-utils"
+  },
+  "kde-gtk-config": {
+    "description": "Syncs KDE settings to GTK applications",
+    "name": "kde-gtk-config",
+    "project_path": "kde/workspace/kde-gtk-config",
+    "repo_path": "plasma/kde-gtk-config"
+  },
+  "kde-inotify-survey": {
+    "description": "Tooling for monitoring inotify limits and informing the user when they have been or about to be reached.",
+    "name": "kde-inotify-survey",
+    "project_path": "extragear/system/kde-inotify-survey",
+    "repo_path": "system/kde-inotify-survey"
+  },
+  "kde-nomodeset": {
+    "description": "Safe Graphics Mode Startup Utility",
+    "name": "kde-nomodeset",
+    "project_path": "playground/base/kde-nomodeset",
+    "repo_path": "system/kde-nomodeset"
+  },
+  "kde-now": {
+    "description": "Google Now alternative for the Plasma Desktop",
+    "name": "kde-now",
+    "project_path": "playground/base/kde-now",
+    "repo_path": "unmaintained/kde-now"
+  },
+  "kde-ruleset": {
+    "description": "svn2git rules files and support scripts for KDE's SVN-to-Git migration",
+    "name": "kde-ruleset",
+    "project_path": "playground/sdk/kde-ruleset",
+    "repo_path": "sdk/kde-ruleset"
+  },
+  "kde-runtime": {
+    "description": "Plugins and applications necessary for the running of KDE applications.",
+    "name": "kde-runtime",
+    "project_path": "unmaintained/kde-runtime",
+    "repo_path": "unmaintained/kde-runtime"
+  },
+  "kde-vdg-extras": {
+    "description": "Colour schemes, avatars and other additional visual assets for KDE Software created by the KDE VDG",
+    "name": "kde-vdg-extras",
+    "project_path": "playground/artwork/kde-xdg-extras",
+    "repo_path": "plasma/kde-vdg-extras"
+  },
+  "kde-workspace": {
+    "description": "Provides the interface and basic tools for the KDE workspace.",
+    "name": "kde-workspace",
+    "project_path": "kde/kde-workspace",
+    "repo_path": "unmaintained/kde-workspace"
+  },
+  "kde1": {
+    "description": "Metamodule for the KDE 1 Release, adapted to run on modern systems",
+    "name": "kde1",
+    "project_path": "historical/kde1",
+    "repo_path": "historical/kde1"
+  },
+  "kde1-kdeadmin": {
+    "description": "Historical copy of the admin applications module of KDE 1, adapted to compile on modern systems (circa. 2016)",
+    "name": "kde1-kdeadmin",
+    "project_path": "historical/kde1-kdeadmin",
+    "repo_path": "historical/kde1-kdeadmin"
+  },
+  "kde1-kdebase": {
+    "description": "Historical copy of the base applications module of KDE 1, adapted to compile on modern systems (circa. 2016)",
+    "name": "kde1-kdebase",
+    "project_path": "historical/kde1-kdebase",
+    "repo_path": "historical/kde1-kdebase"
+  },
+  "kde1-kdegames": {
+    "description": "Historical copy of the gaming applications module of KDE 1, adapted to compile on modern systems (circa. 2016)",
+    "name": "kde1-kdegames",
+    "project_path": "historical/kde1-kdegames",
+    "repo_path": "historical/kde1-kdegames"
+  },
+  "kde1-kdegraphics": {
+    "description": "Historical copy of the graphics applications module of KDE 1, adapted to compile on modern systems (circa. 2016)",
+    "name": "kde1-kdegraphics",
+    "project_path": "historical/kde1-kdegraphics",
+    "repo_path": "historical/kde1-kdegraphics"
+  },
+  "kde1-kdelibs": {
+    "description": "Historical copy of the libraries module of KDE 1, adapted to compile on modern systems (circa. 2016)",
+    "name": "kde1-kdelibs",
+    "project_path": "historical/kde1-kdelibs",
+    "repo_path": "historical/kde1-kdelibs"
+  },
+  "kde1-kdemultimedia": {
+    "description": "Historical copy of the multimedia applications module of KDE 1, adapted to compile on modern systems (circa. 2016)",
+    "name": "kde1-kdemultimedia",
+    "project_path": "historical/kde1-kdemultimedia",
+    "repo_path": "historical/kde1-kdemultimedia"
+  },
+  "kde1-kdenetwork": {
+    "description": "Historical copy of the network applications module of KDE 1, adapted to compile on modern systems (circa. 2016)",
+    "name": "kde1-kdenetwork",
+    "project_path": "historical/kde1-kdenetwork",
+    "repo_path": "historical/kde1-kdenetwork"
+  },
+  "kde1-kdetoys": {
+    "description": "Historical copy of the toys module of KDE 1, adapted to compile on modern systems (circa. 2016)",
+    "name": "kde1-kdetoys",
+    "project_path": "historical/kde1-kdetoys",
+    "repo_path": "historical/kde1-kdetoys"
+  },
+  "kde1-kdeutils": {
+    "description": "Historical copy of the utility applications module of KDE 1, adapted to compile on modern systems (circa. 2016)",
+    "name": "kde1-kdeutils",
+    "project_path": "historical/kde1-kdeutils",
+    "repo_path": "historical/kde1-kdeutils"
+  },
+  "kde2": {
+    "description": "Metamodule for the KDE 2 Release, adapted to run on modern systems",
+    "name": "kde2",
+    "project_path": "historical/kde2",
+    "repo_path": "historical/kde2"
+  },
+  "kde2-kdelibs": {
+    "description": "Historical copy of the libraries module of KDE 2, adapted to compile on modern systems (circa. 2018)",
+    "name": "kde2-kdelibs",
+    "project_path": "historical/kde2-kdelibs",
+    "repo_path": "historical/kde2-kdelibs"
+  },
+  "kdeadmin-strigi-analyzers": {
+    "description": "Strigi analyzer for rpm files",
+    "name": "kdeadmin-strigi-analyzers",
+    "project_path": "unmaintained/kdeadmin-strigi-analyzers",
+    "repo_path": "unmaintained/kdeadmin-strigi-analyzers"
+  },
+  "kdebugsettings": {
+    "description": "Application to choose which QLoggingCategory are displayed",
+    "name": "kdebugsettings",
+    "project_path": "kde/kdeutils/kdebugsettings",
+    "repo_path": "utilities/kdebugsettings"
+  },
+  "kdeclarative": {
+    "description": "KDeclarative",
+    "name": "kdeclarative",
+    "project_path": "frameworks/kdeclarative",
+    "repo_path": "frameworks/kdeclarative"
+  },
+  "kdeconnect-android": {
+    "description": "Native Android port of the KDE Connect Qt app",
+    "name": "kdeconnect-android",
+    "project_path": "extragear/network/kdeconnect-android",
+    "repo_path": "network/kdeconnect-android"
+  },
+  "kdeconnect-ios": {
+    "description": "Native iOS port of KDE Connect",
+    "name": "kdeconnect-ios",
+    "project_path": "playground/network/kdeconnect-ios",
+    "repo_path": "network/kdeconnect-ios"
+  },
+  "kdeconnect-kde": {
+    "description": "Multi-platform app that allows your devices to communicate",
+    "name": "kdeconnect-kde",
+    "project_path": "kde/kdenetwork/kdeconnect-kde",
+    "repo_path": "network/kdeconnect-kde"
+  },
+  "kdeconnect-meta": {
+    "description": "Coordination for multi-platform applications that allows your devices to communicate",
+    "name": "kdeconnect-meta",
+    "project_path": "kde/kdenetwork/kdeconnect-meta",
+    "repo_path": "network/kdeconnect-meta"
+  },
+  "kdecoration": {
+    "description": "Plugin-based library to create window decorations",
+    "name": "kdecoration",
+    "project_path": "kde/workspace/kdecoration",
+    "repo_path": "plasma/kdecoration"
+  },
+  "kdecoration-viewer": {
+    "description": "Application that allows to preview a KDecoration plugin",
+    "name": "kdecoration-viewer",
+    "project_path": "playground/base/kdecoration-viewer",
+    "repo_path": "sdk/kdecoration-viewer"
+  },
+  "kded": {
+    "description": "KDE Daemon",
+    "name": "kded",
+    "project_path": "frameworks/kded",
+    "repo_path": "frameworks/kded"
+  },
+  "kdeedu-data": {
+    "description": "Shared icons, artwork and data files for educational applications",
+    "name": "kdeedu-data",
+    "project_path": "kde/kdeedu/kdeedu-data",
+    "repo_path": "education/kdeedu-data"
+  },
+  "kdeexamples": {
+    "description": "A collection of coding examples that provide practical demonstrations of the usage of KDE libraries and app development infrastructure.",
+    "name": "kdeexamples",
+    "project_path": "unmaintained/kdeexamples",
+    "repo_path": "unmaintained/kdeexamples"
+  },
+  "kdegraphics": {
+    "description": "Super-repository which holds the history of the kdegraphics toplevel files",
+    "name": "kdegraphics",
+    "project_path": "unmaintained/kdegraphics",
+    "repo_path": "unmaintained/kdegraphics"
+  },
+  "kdegraphics-mobipocket": {
+    "description": "A collection of plugins to handle mobipocket files",
+    "name": "kdegraphics-mobipocket",
+    "project_path": "kde/kdegraphics/kdegraphics-mobipocket",
+    "repo_path": "graphics/kdegraphics-mobipocket"
+  },
+  "kdegraphics-strigi-analyzer": {
+    "description": "Strigi analyzers for various graphics file formats",
+    "name": "kdegraphics-strigi-analyzer",
+    "project_path": "unmaintained/kdegraphics-strigi-analyzer",
+    "repo_path": "unmaintained/kdegraphics-strigi-analyzer"
+  },
+  "kdegraphics-thumbnailers": {
+    "description": "Thumbnailers for various graphics file formats",
+    "name": "kdegraphics-thumbnailers",
+    "project_path": "kde/kdegraphics/kdegraphics-thumbnailers",
+    "repo_path": "graphics/kdegraphics-thumbnailers"
+  },
+  "kdelibs": {
+    "description": "The KDE Library",
+    "name": "kdelibs",
+    "project_path": "unmaintained/kdelibs",
+    "repo_path": "unmaintained/kdelibs"
+  },
+  "kdelibs4support": {
+    "description": "KDE 4 Support",
+    "name": "kdelibs4support",
+    "project_path": "frameworks/kdelibs4support",
+    "repo_path": "frameworks/kdelibs4support"
+  },
+  "kdenetwork-filesharing": {
+    "description": "Samba file sharing plugin for file properties",
+    "name": "kdenetwork-filesharing",
+    "project_path": "kde/kdenetwork/kdenetwork-filesharing",
+    "repo_path": "network/kdenetwork-filesharing"
+  },
+  "kdenetwork-strigi-analyzers": {
+    "description": "Analyzer plugins for Strigi",
+    "name": "kdenetwork-strigi-analyzers",
+    "project_path": "unmaintained/kdenetwork-strigi-analyzers",
+    "repo_path": "unmaintained/kdenetwork-strigi-analyzers"
+  },
+  "kdenlive": {
+    "description": "Free and open source video editor, based on MLT Framework and KDE Frameworks 5",
+    "name": "kdenlive",
+    "project_path": "kde/kdemultimedia/kdenlive",
+    "repo_path": "multimedia/kdenlive"
+  },
+  "kdenlive-opentimelineio": {
+    "description": "OpenTimelineIO Adapter for Kdenlive",
+    "name": "kdenlive-opentimelineio",
+    "project_path": "playground/multimedia/kdenlive-opentimelineio",
+    "repo_path": "multimedia/kdenlive-opentimelineio"
+  },
+  "kdenlive-test-suite": {
+    "description": "Tooling, samples and other materials needed for testing Kdenlive functionality",
+    "name": "kdenlive-test-suite",
+    "project_path": "playground/multimedia/kdenlive-test-suite",
+    "repo_path": "multimedia/kdenlive-test-suite"
+  },
+  "kdepim": {
+    "description": "KDE's Personal Information Management suite",
+    "name": "kdepim",
+    "project_path": "unmaintained/kdepim",
+    "repo_path": "unmaintained/kdepim"
+  },
+  "kdepim-addons": {
+    "description": "Add-ons for KDE PIM apps (KMail, KAddressBook etc.)",
+    "name": "kdepim-addons",
+    "project_path": "kde/pim/kdepim-addons",
+    "repo_path": "pim/kdepim-addons"
+  },
+  "kdepim-apps-libs": {
+    "description": "This module contains mail-related libraries",
+    "name": "kdepim-apps-libs",
+    "project_path": "kde/pim/kdepim-apps-libs",
+    "repo_path": "pim/kdepim-apps-libs"
+  },
+  "kdepim-docker": {
+    "description": "Docker image for easy KDE PIM development",
+    "name": "kdepim-docker",
+    "project_path": "playground/pim/kdepim-docker",
+    "repo_path": "pim/kdepim-docker"
+  },
+  "kdepim-runtime": {
+    "description": "Akonadi agents and resources",
+    "name": "kdepim-runtime",
+    "project_path": "kde/pim/kdepim-runtime",
+    "repo_path": "pim/kdepim-runtime"
+  },
+  "kdepimlibs": {
+    "description": "KDE''s Personal Information Management Libraries",
+    "name": "kdepimlibs",
+    "project_path": "unmaintained/kdepimlibs",
+    "repo_path": "unmaintained/kdepimlibs"
+  },
+  "kdeplasma-addons": {
+    "description": "All kind of add-ons to improve your Plasma experience",
+    "name": "kdeplasma-addons",
+    "project_path": "kde/workspace/kdeplasma-addons",
+    "repo_path": "plasma/kdeplasma-addons"
+  },
+  "kdesdk-devenv-dependencies": {
+    "description": "Describes modules useful for development of KDE applications and Plasma",
+    "name": "kdesdk-devenv-dependencies",
+    "project_path": "playground/packaging/kdesdk-devenv-dependencies",
+    "repo_path": "packaging/kdesdk-devenv-dependencies"
+  },
+  "kdesdk-kio": {
+    "description": "KIO workers useful for software development",
+    "name": "kdesdk-kio",
+    "project_path": "kde/kdesdk/kdesdk-kio",
+    "repo_path": "sdk/kdesdk-kio"
+  },
+  "kdesdk-strigi-analyzers": {
+    "description": "Analyzer plugins for strigi",
+    "name": "kdesdk-strigi-analyzers",
+    "project_path": "unmaintained/kdesdk-strigi-analyzers",
+    "repo_path": "unmaintained/kdesdk-strigi-analyzers"
+  },
+  "kdesdk-thumbnailers": {
+    "description": "Plugins for the thumbnailing system",
+    "name": "kdesdk-thumbnailers",
+    "project_path": "kde/kdesdk/kdesdk-thumbnailers",
+    "repo_path": "sdk/kdesdk-thumbnailers"
+  },
+  "kdesignerplugin": {
+    "description": "KDesignerPlugin",
+    "name": "kdesignerplugin",
+    "project_path": "frameworks/kdesignerplugin",
+    "repo_path": "frameworks/kdesignerplugin"
+  },
+  "kdesrc-build": {
+    "description": "Script to streamline setting up and maintaining KDE software development environment",
+    "name": "kdesrc-build",
+    "project_path": "extragear/utils/kdesrc-build",
+    "repo_path": "sdk/kdesrc-build"
+  },
+  "kdesu": {
+    "description": "KDE Su",
+    "name": "kdesu",
+    "project_path": "frameworks/kdesu",
+    "repo_path": "frameworks/kdesu"
+  },
+  "kdesudo": {
+    "description": "Sudo GUI",
+    "name": "kdesudo",
+    "project_path": "unmaintained/kdesudo",
+    "repo_path": "unmaintained/kdesudo"
+  },
+  "kdesvn": {
+    "description": "Subversion client by KDE",
+    "name": "kdesvn",
+    "project_path": "extragear/sdk/kdesvn",
+    "repo_path": "sdk/kdesvn"
+  },
+  "kdev-cargo": {
+    "description": "Cargo language support for KDevelop",
+    "name": "kdev-cargo",
+    "project_path": "unmaintained/kdev-cargo",
+    "repo_path": "unmaintained/kdev-cargo"
+  },
+  "kdev-clang": {
+    "description": "Integrates Clang into KDevelop for C/C++/Objective-C language support.",
+    "name": "kdev-clang",
+    "project_path": "unmaintained/kdev-clang",
+    "repo_path": "unmaintained/kdev-clang"
+  },
+  "kdev-clang-tidy": {
+    "description": "KDevelop plugin for clang-tidy static analysis support",
+    "name": "kdev-clang-tidy",
+    "project_path": "unmaintained/kdev-clang-tidy",
+    "repo_path": "unmaintained/kdev-clang-tidy"
+  },
+  "kdev-control-flow-graph": {
+    "description": "KDevelop plugin that visualizes data from static code analysis in graphs",
+    "name": "kdev-control-flow-graph",
+    "project_path": "playground/devtools/plugins/kdev-control-flow-graph",
+    "repo_path": "kdevelop/kdev-control-flow-graph"
+  },
+  "kdev-cppcheck": {
+    "description": "cppcheck support for kdevelop",
+    "name": "kdev-cppcheck",
+    "project_path": "unmaintained/kdev-cppcheck",
+    "repo_path": "unmaintained/kdev-cppcheck"
+  },
+  "kdev-crossfire": {
+    "description": "KDevelop Debugger plugin for debugging JavaScript using crossfire",
+    "name": "kdev-crossfire",
+    "project_path": "unmaintained/kdev-crossfire",
+    "repo_path": "unmaintained/kdev-crossfire"
+  },
+  "kdev-css": {
+    "description": "KDevelop plugin for CSS language support",
+    "name": "kdev-css",
+    "project_path": "playground/devtools/plugins/kdev-css",
+    "repo_path": "kdevelop/kdev-css"
+  },
+  "kdev-embedded": {
+    "description": "Plugin for KDevelop to support the development of embedded systems",
+    "name": "kdev-embedded",
+    "project_path": "playground/devtools/plugins/kdev-embedded",
+    "repo_path": "kdevelop/kdev-embedded"
+  },
+  "kdev-executebrowser": {
+    "description": "KDevelop plugin that starts a script in a web browser",
+    "name": "kdev-executebrowser",
+    "project_path": "playground/devtools/plugins/kdev-executebrowser",
+    "repo_path": "kdevelop/kdev-executebrowser"
+  },
+  "kdev-go": {
+    "description": "Go language support for KDevelop",
+    "name": "kdev-go",
+    "project_path": "unmaintained/kdev-go",
+    "repo_path": "unmaintained/kdev-go"
+  },
+  "kdev-java": {
+    "description": "Java language support for KDevelop4",
+    "name": "kdev-java",
+    "project_path": "unmaintained/kdev-java",
+    "repo_path": "unmaintained/kdev-java"
+  },
+  "kdev-krazy2": {
+    "description": "A plugin for KDevelop to perform Krazy2 analysis",
+    "name": "kdev-krazy2",
+    "project_path": "playground/devtools/plugins/kdev-krazy2",
+    "repo_path": "kdevelop/kdev-krazy2"
+  },
+  "kdev-mercurial": {
+    "description": "Mercurial support plugin for KDevelop",
+    "name": "kdev-mercurial",
+    "project_path": "playground/devtools/plugins/kdev-mercurial",
+    "repo_path": "kdevelop/kdev-mercurial"
+  },
+  "kdev-perforce": {
+    "description": "A plugin for Kdevelop 4 that enables integration with Perforce",
+    "name": "kdev-perforce",
+    "project_path": "unmaintained/kdev-perforce",
+    "repo_path": "unmaintained/kdev-perforce"
+  },
+  "kdev-php": {
+    "description": "PHP Language Plugin for KDevelop",
+    "name": "kdev-php",
+    "project_path": "extragear/kdevelop/plugins/kdev-php",
+    "repo_path": "kdevelop/kdev-php"
+  },
+  "kdev-php-docs": {
+    "description": "PHP Documentation plugin for KDevelop/Quanta.",
+    "name": "kdev-php-docs",
+    "project_path": "unmaintained/kdev-php-docs",
+    "repo_path": "unmaintained/kdev-php-docs"
+  },
+  "kdev-php-formatter": {
+    "description": "KDevelop Plugin for PHPFormatter",
+    "name": "kdev-php-formatter",
+    "project_path": "unmaintained/kdev-php-formatter",
+    "repo_path": "unmaintained/kdev-php-formatter"
+  },
+  "kdev-python": {
+    "description": "KDevelop Python language support",
+    "name": "kdev-python",
+    "project_path": "extragear/kdevelop/plugins/kdev-python",
+    "repo_path": "kdevelop/kdev-python"
+  },
+  "kdev-qmake": {
+    "description": "Support for Qt's qmake build system.",
+    "name": "kdev-qmake",
+    "project_path": "unmaintained/kdev-qmake",
+    "repo_path": "unmaintained/kdev-qmake"
+  },
+  "kdev-qmljs": {
+    "description": "This plugin brings qml and JavaScript language support to KDevelop",
+    "name": "kdev-qmljs",
+    "project_path": "unmaintained/kdev-qmljs",
+    "repo_path": "unmaintained/kdev-qmljs"
+  },
+  "kdev-ruby": {
+    "description": "KDevelop plugin which provides Ruby language support",
+    "name": "kdev-ruby",
+    "project_path": "playground/devtools/plugins/kdev-ruby",
+    "repo_path": "kdevelop/kdev-ruby"
+  },
+  "kdev-rust": {
+    "description": "KDevelop plugin which provides Rust language support.",
+    "name": "kdev-rust",
+    "project_path": "unmaintained/kdev-rust",
+    "repo_path": "unmaintained/kdev-rust"
+  },
+  "kdev-sql": {
+    "description": "KDevelop Plugin for SQL Language Support",
+    "name": "kdev-sql",
+    "project_path": "unmaintained/kdev-sql",
+    "repo_path": "unmaintained/kdev-sql"
+  },
+  "kdev-upload": {
+    "description": "KDevelop plugin for uploading files to a remote server",
+    "name": "kdev-upload",
+    "project_path": "playground/devtools/plugins/kdev-upload",
+    "repo_path": "kdevelop/kdev-upload"
+  },
+  "kdev-valgrind": {
+    "description": "Plugin offering a full integration of the Valgrind suite into KDevelop",
+    "name": "kdev-valgrind",
+    "project_path": "playground/devtools/plugins/kdev-valgrind",
+    "repo_path": "kdevelop/kdev-valgrind"
+  },
+  "kdev-verapp": {
+    "description": "Verapp support plugin for KDevelop",
+    "name": "kdev-verapp",
+    "project_path": "playground/devtools/plugins/kdev-verapp",
+    "repo_path": "kdevelop/kdev-verapp"
+  },
+  "kdev-www": {
+    "description": "KDevelop website content.",
+    "name": "kdev-www",
+    "project_path": "unmaintained/kdev-www",
+    "repo_path": "unmaintained/kdev-www"
+  },
+  "kdev-xdebug": {
+    "description": "KDevelop debugger plugin for PHP using XDebug",
+    "name": "kdev-xdebug",
+    "project_path": "playground/devtools/plugins/kdev-xdebug",
+    "repo_path": "kdevelop/kdev-xdebug"
+  },
+  "kdev-xml": {
+    "description": "KDevelop Plugin for XML and HTML Language Support",
+    "name": "kdev-xml",
+    "project_path": "unmaintained/kdev-xml",
+    "repo_path": "unmaintained/kdev-xml"
+  },
+  "kdev-xtest": {
+    "description": "Implements the interface from the Veritas library for unit testing with QTestLib.",
+    "name": "kdev-xtest",
+    "project_path": "unmaintained/kdev-xtest",
+    "repo_path": "unmaintained/kdev-xtest"
+  },
+  "kdevelop": {
+    "description": "Cross-platform IDE for C, C++, Python, QML/JavaScript and PHP",
+    "name": "kdevelop",
+    "project_path": "extragear/kdevelop/kdevelop",
+    "repo_path": "kdevelop/kdevelop"
+  },
+  "kdevelop-pg-qt": {
+    "description": "KDevelop Parser Generator, used in the PHP language plugin and others",
+    "name": "kdevelop-pg-qt",
+    "project_path": "extragear/kdevelop/utilities/kdevelop-pg-qt",
+    "repo_path": "kdevelop/kdevelop-pg-qt"
+  },
+  "kdevplatform": {
+    "description": "The KDevelop Platform, supplying a framework to build IDE-like applications on top of it.",
+    "name": "kdevplatform",
+    "project_path": "unmaintained/kdevplatform",
+    "repo_path": "unmaintained/kdevplatform"
+  },
+  "kdewebkit": {
+    "description": "KDE Webkit",
+    "name": "kdewebkit",
+    "project_path": "frameworks/kdewebkit",
+    "repo_path": "frameworks/kdewebkit"
+  },
+  "kdewin": {
+    "description": "Library that provides supplementary tools to compile KDE applications on Windows - open merge requests to submit changes",
+    "name": "kdewin",
+    "project_path": "kdesupport/kdewin",
+    "repo_path": "packaging/kdewin"
+  },
+  "kdewin-installer": {
+    "description": "Installer for KDE applications on Windows",
+    "name": "kdewin-installer",
+    "project_path": "kdesupport/kdewin-installer",
+    "repo_path": "packaging/kdewin-installer"
+  },
+  "kdewin-tools": {
+    "description": "Supplementary tools which assist compiling KDE applications on Windows",
+    "name": "kdewin-tools",
+    "project_path": "kdesupport/kdewin-tools",
+    "repo_path": "packaging/kdewin-tools"
+  },
+  "kdf": {
+    "description": "Displays available storage devices and information about their usage",
+    "name": "kdf",
+    "project_path": "kde/kdeutils/kdf",
+    "repo_path": "utilities/kdf"
+  },
+  "kdgantt2": {
+    "description": "This lib provides gantt support",
+    "name": "kdgantt2",
+    "project_path": "unmaintained/kdgantt2",
+    "repo_path": "unmaintained/kdgantt2"
+  },
+  "kdiagram": {
+    "description": "Powerful libraries (KChart, KGantt) for creating business diagrams",
+    "name": "kdiagram",
+    "project_path": "extragear/graphics/kdiagram",
+    "repo_path": "graphics/kdiagram"
+  },
+  "kdialog": {
+    "description": "Tool to show nice dialog boxes from shell scripts",
+    "name": "kdialog",
+    "project_path": "kde/applications/kdialog",
+    "repo_path": "utilities/kdialog"
+  },
+  "kdiamond": {
+    "description": "KDiamond is a single player puzzle game",
+    "name": "kdiamond",
+    "project_path": "kde/kdegames/kdiamond",
+    "repo_path": "games/kdiamond"
+  },
+  "kdiff3": {
+    "description": "Utility for comparing and merging files and directories",
+    "name": "kdiff3",
+    "project_path": "extragear/utils/kdiff3",
+    "repo_path": "sdk/kdiff3"
+  },
+  "kdisksutilities": {
+    "description": "Disks management utilities",
+    "name": "kdisksutilities",
+    "project_path": "playground/sysadmin/kdisksutilities",
+    "repo_path": "system/kdisksutilities"
+  },
+  "kdnssd": {
+    "description": "KDNSSD Framework",
+    "name": "kdnssd",
+    "project_path": "frameworks/kdnssd",
+    "repo_path": "frameworks/kdnssd"
+  },
+  "kdoctools": {
+    "description": "KDocTools",
+    "name": "kdoctools",
+    "project_path": "frameworks/kdoctools",
+    "repo_path": "frameworks/kdoctools"
+  },
+  "kdocumentstore": {
+    "description": "Library to store QVariants and QVariantMaps",
+    "name": "kdocumentstore",
+    "project_path": "playground/libs/kdocumentstore",
+    "repo_path": "libraries/kdocumentstore"
+  },
+  "kdots": {
+    "description": "KDots is the simple implementation of the game of dots written with Qt Toolkit and KDELibs.\n\nThe purpose of Dots game is to catch your opponent's dots by placing your dots on the game board where the lines cross.",
+    "name": "kdots",
+    "project_path": "unmaintained/kdots",
+    "repo_path": "unmaintained/kdots"
+  },
+  "kdsoap": {
+    "description": null,
+    "name": "kdsoap",
+    "project_path": "third-party/kdsoap",
+    "repo_path": null
+  },
+  "kdsoap-ws-discovery-client": {
+    "description": "Library for finding WS-Discovery devices in the network using Qt5 and KDSoap.",
+    "name": "kdsoap-ws-discovery-client",
+    "project_path": "playground/libs/kdsoap-ws-discovery-client",
+    "repo_path": "libraries/kdsoap-ws-discovery-client"
+  },
+  "keditbookmarks": {
+    "description": "Bookmarks editor",
+    "name": "keditbookmarks",
+    "project_path": "kde/applications/keditbookmarks",
+    "repo_path": "utilities/keditbookmarks"
+  },
+  "kemoticons": {
+    "description": "KEmoticons",
+    "name": "kemoticons",
+    "project_path": "frameworks/kemoticons",
+    "repo_path": "frameworks/kemoticons"
+  },
+  "keurocalc": {
+    "description": "Utility to handle currency conversions between European currencies",
+    "name": "keurocalc",
+    "project_path": "extragear/utils/keurocalc",
+    "repo_path": "utilities/keurocalc"
+  },
+  "kexi": {
+    "description": "Visual database applications creator",
+    "name": "kexi",
+    "project_path": "calligra/kexi",
+    "repo_path": "office/kexi"
+  },
+  "keysmith": {
+    "description": "OTP client for Plasma Mobile and Desktop",
+    "name": "keysmith",
+    "project_path": "extragear/utils/keysmith",
+    "repo_path": "utilities/keysmith"
+  },
+  "kf5book": {
+    "description": "Repository for the development of the KDE Frameworks Cookbook",
+    "name": "kf5book",
+    "project_path": "books/kf5book",
+    "repo_path": "documentation/kf5book"
+  },
+  "kfilemetadata": {
+    "description": "A library for extracting file metadata",
+    "name": "kfilemetadata",
+    "project_path": "frameworks/kfilemetadata",
+    "repo_path": "frameworks/kfilemetadata"
+  },
+  "kfilereplace": {
+    "description": "Utility to assist with bulk file renaming",
+    "name": "kfilereplace",
+    "project_path": "unmaintained/kfilereplace",
+    "repo_path": "unmaintained/kfilereplace"
+  },
+  "kfind": {
+    "description": "File search utility by KDE",
+    "name": "kfind",
+    "project_path": "kde/applications/kfind",
+    "repo_path": "utilities/kfind"
+  },
+  "kfloppy": {
+    "description": "Graphical utility to format 3.5\" and 5.25\" floppy disks",
+    "name": "kfloppy",
+    "project_path": "kde/kdeutils/kfloppy",
+    "repo_path": "utilities/kfloppy"
+  },
+  "kfourinline": {
+    "description": "KFourInLine is a four-in-a-row game",
+    "name": "kfourinline",
+    "project_path": "kde/kdegames/kfourinline",
+    "repo_path": "games/kfourinline"
+  },
+  "kfritz": {
+    "description": "A KDE call monitor and frontend for users of AVMs Fritz!Box routers.\n\nYou can download source-tarballs from github, see below.",
+    "name": "kfritz",
+    "project_path": "unmaintained/kfritz",
+    "repo_path": "unmaintained/kfritz"
+  },
+  "kgamma": {
+    "description": "Adjust your monitor's gamma settings",
+    "name": "kgamma",
+    "project_path": "kde/workspace/kgamma",
+    "repo_path": "plasma/kgamma"
+  },
+  "kgeography": {
+    "description": "Geography Trainer",
+    "name": "kgeography",
+    "project_path": "kde/kdeedu/kgeography",
+    "repo_path": "education/kgeography"
+  },
+  "kgeotag": {
+    "description": "Photo geotagging program",
+    "name": "kgeotag",
+    "project_path": "extragear/graphics/kgeotag",
+    "repo_path": "graphics/kgeotag"
+  },
+  "kget": {
+    "description": "Download Manager",
+    "name": "kget",
+    "project_path": "kde/kdenetwork/kget",
+    "repo_path": "network/kget"
+  },
+  "kglobalaccel": {
+    "description": "KGlobalAccel",
+    "name": "kglobalaccel",
+    "project_path": "frameworks/kglobalaccel",
+    "repo_path": "frameworks/kglobalaccel"
+  },
+  "kglobalacceld": {
+    "description": "Daemon providing Global Keyboard Shortcut (Accelerator) functionality",
+    "name": "kglobalacceld",
+    "project_path": "playground/base/kglobalacceld",
+    "repo_path": "plasma/kglobalacceld"
+  },
+  "kgoldrunner": {
+    "description": "KGoldrunner is a game of action and puzzle solving",
+    "name": "kgoldrunner",
+    "project_path": "kde/kdegames/kgoldrunner",
+    "repo_path": "games/kgoldrunner"
+  },
+  "kgpg": {
+    "description": "Simple interface for GnuPG, a powerful encryption utility",
+    "name": "kgpg",
+    "project_path": "kde/kdeutils/kgpg",
+    "repo_path": "utilities/kgpg"
+  },
+  "kgraphviewer": {
+    "description": "GraphViz dot graph viewer",
+    "name": "kgraphviewer",
+    "project_path": "extragear/graphics/kgraphviewer",
+    "repo_path": "graphics/kgraphviewer"
+  },
+  "kguiaddons": {
+    "description": "KGuiAddons",
+    "name": "kguiaddons",
+    "project_path": "frameworks/kguiaddons",
+    "repo_path": "frameworks/kguiaddons"
+  },
+  "khangman": {
+    "description": "A hangman game",
+    "name": "khangman",
+    "project_path": "kde/kdeedu/khangman",
+    "repo_path": "education/khangman"
+  },
+  "khealthcertificate": {
+    "description": "Handling of digital vaccination, test and recovery certificates.",
+    "name": "khealthcertificate",
+    "project_path": "extragear/pim/khealthcertificate",
+    "repo_path": "pim/khealthcertificate"
+  },
+  "khelpcenter": {
+    "description": "Software documentation viewer",
+    "name": "khelpcenter",
+    "project_path": "kde/applications/khelpcenter",
+    "repo_path": "system/khelpcenter"
+  },
+  "khipu": {
+    "description": "Advanced mathematical function plotter",
+    "name": "khipu",
+    "project_path": "playground/edu/khipu",
+    "repo_path": "education/khipu"
+  },
+  "kholidays": {
+    "description": "KHolidays: Library to assist determining when holidays occur",
+    "name": "kholidays",
+    "project_path": "frameworks/kholidays",
+    "repo_path": "frameworks/kholidays"
+  },
+  "khotkeys": {
+    "description": "Trigger actions when certain keys are pressed",
+    "name": "khotkeys",
+    "project_path": "kde/workspace/khotkeys",
+    "repo_path": "plasma/khotkeys"
+  },
+  "khtml": {
+    "description": "KHtml",
+    "name": "khtml",
+    "project_path": "frameworks/khtml",
+    "repo_path": "frameworks/khtml"
+  },
+  "ki18n": {
+    "description": "Ki18n",
+    "name": "ki18n",
+    "project_path": "frameworks/ki18n",
+    "repo_path": "frameworks/ki18n"
+  },
+  "kiconthemes": {
+    "description": "KIconThemes",
+    "name": "kiconthemes",
+    "project_path": "frameworks/kiconthemes",
+    "repo_path": "frameworks/kiconthemes"
+  },
+  "kid3": {
+    "description": "Efficient audio tagger that supports a large variety of file formats",
+    "name": "kid3",
+    "project_path": "extragear/multimedia/kid3",
+    "repo_path": "multimedia/kid3"
+  },
+  "kidentitymanagement": {
+    "description": "Library to assist in handling user identities",
+    "name": "kidentitymanagement",
+    "project_path": "kde/pim/kidentitymanagement",
+    "repo_path": "pim/kidentitymanagement"
+  },
+  "kidletime": {
+    "description": "KIdleTime",
+    "name": "kidletime",
+    "project_path": "frameworks/kidletime",
+    "repo_path": "frameworks/kidletime"
+  },
+  "kig": {
+    "description": "Interactive Geometry",
+    "name": "kig",
+    "project_path": "kde/kdeedu/kig",
+    "repo_path": "education/kig"
+  },
+  "kigo": {
+    "description": "Kigo is an open-source implementation of the popular Go game",
+    "name": "kigo",
+    "project_path": "kde/kdegames/kigo",
+    "repo_path": "games/kigo"
+  },
+  "kije": {
+    "description": "QtQuick library with widgets for desktop-oriented QtQuick applications.",
+    "name": "kije",
+    "project_path": "playground/libs/kije",
+    "repo_path": "libraries/kije"
+  },
+  "kile": {
+    "description": "Integrated LaTeX Editing Environment",
+    "name": "kile",
+    "project_path": "extragear/office/kile",
+    "repo_path": "office/kile"
+  },
+  "killbots": {
+    "description": "Killbots is a simple game of evading killer robots",
+    "name": "killbots",
+    "project_path": "kde/kdegames/killbots",
+    "repo_path": "games/killbots"
+  },
+  "kimageformats": {
+    "description": "KImageFormats",
+    "name": "kimageformats",
+    "project_path": "frameworks/kimageformats",
+    "repo_path": "frameworks/kimageformats"
+  },
+  "kimagemapeditor": {
+    "description": "Generator of HTML image maps",
+    "name": "kimagemapeditor",
+    "project_path": "kde/kdewebdev/kimagemapeditor",
+    "repo_path": "graphics/kimagemapeditor"
+  },
+  "kimap": {
+    "description": "Library to assist working with IMAP servers",
+    "name": "kimap",
+    "project_path": "kde/pim/kimap",
+    "repo_path": "pim/kimap"
+  },
+  "kimap2": {
+    "description": "Next-generation IMAP library",
+    "name": "kimap2",
+    "project_path": "playground/pim/kimap2",
+    "repo_path": "pim/kimap2"
+  },
+  "kimono": {
+    "description": ".NET/Mono bindings for the KDE libraries.",
+    "name": "kimono",
+    "project_path": "kde/kdebindings/csharp/kimono",
+    "repo_path": "unmaintained/kimono"
+  },
+  "kimtoy": {
+    "description": "An input method frontend by KDE",
+    "name": "kimtoy",
+    "project_path": "unmaintained/kimtoy",
+    "repo_path": "unmaintained/kimtoy"
+  },
+  "kinfocenter": {
+    "description": "View information about your computer's hardware",
+    "name": "kinfocenter",
+    "project_path": "kde/workspace/kinfocenter",
+    "repo_path": "plasma/kinfocenter"
+  },
+  "kinit": {
+    "description": "KInit",
+    "name": "kinit",
+    "project_path": "frameworks/kinit",
+    "repo_path": "frameworks/kinit"
+  },
+  "kio": {
+    "description": "KIO",
+    "name": "kio",
+    "project_path": "frameworks/kio",
+    "repo_path": "frameworks/kio"
+  },
+  "kio-admin": {
+    "description": "Manage files as administrator using the admin:// KIO protocol.",
+    "name": "kio-admin",
+    "project_path": "extragear/sysadmin/kio-admin",
+    "repo_path": "system/kio-admin"
+  },
+  "kio-extras": {
+    "description": "Additional components to increase the functionality of KIO",
+    "name": "kio-extras",
+    "project_path": "kde/kdenetwork/kio-extras",
+    "repo_path": "network/kio-extras"
+  },
+  "kio-fuse": {
+    "description": "FUSE Interface for KIO",
+    "name": "kio-fuse",
+    "project_path": "extragear/base/kio-fuse",
+    "repo_path": "system/kio-fuse"
+  },
+  "kio-gdrive": {
+    "description": "KIO Slave to access Google Drive",
+    "name": "kio-gdrive",
+    "project_path": "kde/kdenetwork/kio-gdrive",
+    "repo_path": "network/kio-gdrive"
+  },
+  "kio-gopher": {
+    "description": "Gopher KIO Slave",
+    "name": "kio-gopher",
+    "project_path": "extragear/network/kio-gopher",
+    "repo_path": "network/kio-gopher"
+  },
+  "kio-mtp": {
+    "description": "Provides KIO Access to MTP devices using the mtp:/// protocol.",
+    "name": "kio-mtp",
+    "project_path": "unmaintained/kio-mtp",
+    "repo_path": "unmaintained/kio-mtp"
+  },
+  "kio-s3": {
+    "description": "KIO interface for Amazon Web Services S3 storage",
+    "name": "kio-s3",
+    "project_path": "extragear/network/kio-s3",
+    "repo_path": "network/kio-s3"
+  },
+  "kio-stash": {
+    "description": "Virtual folder to simplify file selection in non-contiguous folder trees",
+    "name": "kio-stash",
+    "project_path": "extragear/utils/kio-stash",
+    "repo_path": "utilities/kio-stash"
+  },
+  "kio-upnp-ms": {
+    "description": "KIO Slave for UPnP MediaServer devices",
+    "name": "kio-upnp-ms",
+    "project_path": "playground/base/kio-upnp-ms",
+    "repo_path": "network/kio-upnp-ms"
+  },
+  "kio-zeroconf": {
+    "description": "KIO worker to discover file systems by DNS-SD (zeroconf)",
+    "name": "kio-zeroconf",
+    "project_path": "kde/kdenetwork/kio-zeroconf",
+    "repo_path": "network/kio-zeroconf"
+  },
+  "kipi-plugins": {
+    "description": "Plugins extending KDE graphics apps, e.g. with import/export capabilities",
+    "name": "kipi-plugins",
+    "project_path": "kde/kdegraphics/kipi-plugins",
+    "repo_path": "graphics/kipi-plugins"
+  },
+  "kirigami": {
+    "description": "A QtQuick based components set",
+    "name": "kirigami",
+    "project_path": "frameworks/kirigami",
+    "repo_path": "frameworks/kirigami"
+  },
+  "kirigami-addons": {
+    "description": "Add-ons for the Kirigami framework",
+    "name": "kirigami-addons",
+    "project_path": "extragear/libs/kirigami-addons",
+    "repo_path": "libraries/kirigami-addons"
+  },
+  "kirigami-gallery": {
+    "description": "Kirigami component gallery application",
+    "name": "kirigami-gallery",
+    "project_path": "kde/kdesdk/kirigami-gallery",
+    "repo_path": "sdk/kirigami-gallery"
+  },
+  "kiriki": {
+    "description": "Kiriki is an addictive and fun dice game",
+    "name": "kiriki",
+    "project_path": "kde/kdegames/kiriki",
+    "repo_path": "games/kiriki"
+  },
+  "kirogi": {
+    "description": "Ground control application for drones",
+    "name": "kirogi",
+    "project_path": "playground/base/kirogi",
+    "repo_path": "utilities/kirogi"
+  },
+  "kiss": {
+    "description": "KDE Initial System Setup",
+    "name": "kiss",
+    "project_path": "playground/system/kiss",
+    "repo_path": "system/kiss"
+  },
+  "kitemmodels": {
+    "description": "KItemModels",
+    "name": "kitemmodels",
+    "project_path": "frameworks/kitemmodels",
+    "repo_path": "frameworks/kitemmodels"
+  },
+  "kitemviews": {
+    "description": "KItemViews",
+    "name": "kitemviews",
+    "project_path": "frameworks/kitemviews",
+    "repo_path": "frameworks/kitemviews"
+  },
+  "kiten": {
+    "description": "Japanese Reference/Study Tool",
+    "name": "kiten",
+    "project_path": "kde/kdeedu/kiten",
+    "repo_path": "education/kiten"
+  },
+  "kitinerary": {
+    "description": "Data Model and Extraction System for Travel Reservation information",
+    "name": "kitinerary",
+    "project_path": "kde/pim/kitinerary",
+    "repo_path": "pim/kitinerary"
+  },
+  "kitinerary-workbench": {
+    "description": "KItinerary Test and Development Tool",
+    "name": "kitinerary-workbench",
+    "project_path": "playground/pim/kitinerary-workbench",
+    "repo_path": "pim/kitinerary-workbench"
+  },
+  "kjobwidgets": {
+    "description": "KJobWidgets",
+    "name": "kjobwidgets",
+    "project_path": "frameworks/kjobwidgets",
+    "repo_path": "frameworks/kjobwidgets"
+  },
+  "kjots": {
+    "description": "Note taking application using Akonadi",
+    "name": "kjots",
+    "project_path": "playground/pim/kjots",
+    "repo_path": "pim/kjots"
+  },
+  "kjournald": {
+    "description": "Framework for interacting with systemd-journald",
+    "name": "kjournald",
+    "project_path": "kde/applications/kjournald",
+    "repo_path": "system/kjournald"
+  },
+  "kjs": {
+    "description": "KJS",
+    "name": "kjs",
+    "project_path": "frameworks/kjs",
+    "repo_path": "frameworks/kjs"
+  },
+  "kjsembed": {
+    "description": "KJSEmbed",
+    "name": "kjsembed",
+    "project_path": "frameworks/kjsembed",
+    "repo_path": "frameworks/kjsembed"
+  },
+  "kjumpingcube": {
+    "description": "KJumpingCube is a simple tactical game",
+    "name": "kjumpingcube",
+    "project_path": "kde/kdegames/kjumpingcube",
+    "repo_path": "games/kjumpingcube"
+  },
+  "kldap": {
+    "description": "Library to assist working with LDAP directories",
+    "name": "kldap",
+    "project_path": "kde/pim/kldap",
+    "repo_path": "pim/kldap"
+  },
+  "kleopatra": {
+    "description": "Certificate manager and GUI for OpenPGP and CMS cryptography",
+    "name": "kleopatra",
+    "project_path": "kde/pim/kleopatra",
+    "repo_path": "pim/kleopatra"
+  },
+  "klettres": {
+    "description": "Learn The Alphabet",
+    "name": "klettres",
+    "project_path": "kde/kdeedu/klettres",
+    "repo_path": "education/klettres"
+  },
+  "klevernotes": {
+    "description": "A convergent markdown note taking application.",
+    "name": "klevernotes",
+    "project_path": "playground/office/klevernotes",
+    "repo_path": "office/klevernotes"
+  },
+  "klickety": {
+    "description": "Klickety is an adaptation of the Clickomania game",
+    "name": "klickety",
+    "project_path": "kde/kdegames/klickety",
+    "repo_path": "games/klickety"
+  },
+  "klimbgrades": {
+    "description": "Conversion utility for the difficulty rating of rock climbs",
+    "name": "klimbgrades",
+    "project_path": "playground/utils/klimbgrades",
+    "repo_path": "utilities/klimbgrades"
+  },
+  "klines": {
+    "description": "KLines is a simple but highly addictive, one player game",
+    "name": "klines",
+    "project_path": "kde/kdegames/klines",
+    "repo_path": "games/klines"
+  },
+  "klinkstatus": {
+    "description": "Tool to check the current status of links in a web page.",
+    "name": "klinkstatus",
+    "project_path": "unmaintained/klinkstatus",
+    "repo_path": "unmaintained/klinkstatus"
+  },
+  "klook": {
+    "description": "Quick file content preview application with Dolphin integration",
+    "name": "klook",
+    "project_path": "playground/base/klook",
+    "repo_path": "graphics/klook"
+  },
+  "kmag": {
+    "description": "Screen magnifier",
+    "name": "kmag",
+    "project_path": "kde/kdeaccessibility/kmag",
+    "repo_path": "accessibility/kmag"
+  },
+  "kmahjongg": {
+    "description": "KMahjongg is a tile matching game for one or two players",
+    "name": "kmahjongg",
+    "project_path": "kde/kdegames/kmahjongg",
+    "repo_path": "games/kmahjongg"
+  },
+  "kmail": {
+    "description": "State-of-the-art feature-rich email client that supports many protocols",
+    "name": "kmail",
+    "project_path": "kde/pim/kmail",
+    "repo_path": "pim/kmail"
+  },
+  "kmail-account-wizard": {
+    "description": "Application which assists you with the configuration of accounts in KMail",
+    "name": "kmail-account-wizard",
+    "project_path": "kde/pim/kmail-account-wizard",
+    "repo_path": "pim/kmail-account-wizard"
+  },
+  "kmailtransport": {
+    "description": "Library, KCM and KDED module to manage mail transport",
+    "name": "kmailtransport",
+    "project_path": "kde/pim/kmailtransport",
+    "repo_path": "pim/kmailtransport"
+  },
+  "kmarkdownwebview": {
+    "description": "KPart for rendering Markdown content",
+    "name": "kmarkdownwebview",
+    "project_path": "extragear/utils/kmarkdownwebview",
+    "repo_path": "utilities/kmarkdownwebview"
+  },
+  "kmbox": {
+    "description": "Library for working with MBox format files",
+    "name": "kmbox",
+    "project_path": "kde/pim/kmbox",
+    "repo_path": "pim/kmbox"
+  },
+  "kmediaplayer": {
+    "description": "KMediaPlayer",
+    "name": "kmediaplayer",
+    "project_path": "frameworks/kmediaplayer",
+    "repo_path": "frameworks/kmediaplayer"
+  },
+  "kmenuedit": {
+    "description": "Menu Editor for Plasma Workspaces",
+    "name": "kmenuedit",
+    "project_path": "kde/workspace/kmenuedit",
+    "repo_path": "plasma/kmenuedit"
+  },
+  "kmime": {
+    "description": "Library to assist handling MIME data",
+    "name": "kmime",
+    "project_path": "kde/pim/kmime",
+    "repo_path": "pim/kmime"
+  },
+  "kmines": {
+    "description": "KMines is the classic Minesweeper game",
+    "name": "kmines",
+    "project_path": "kde/kdegames/kmines",
+    "repo_path": "games/kmines"
+  },
+  "kmix": {
+    "description": "Volume control program",
+    "name": "kmix",
+    "project_path": "kde/kdemultimedia/kmix",
+    "repo_path": "multimedia/kmix"
+  },
+  "kmoretools": {
+    "description": "Support for downloading application assets from the network",
+    "name": "kmoretools",
+    "project_path": "playground/libs/kmoretools",
+    "repo_path": "libraries/kmoretools"
+  },
+  "kmousetool": {
+    "description": "Program that clicks the mouse for you",
+    "name": "kmousetool",
+    "project_path": "kde/kdeaccessibility/kmousetool",
+    "repo_path": "accessibility/kmousetool"
+  },
+  "kmouth": {
+    "description": "Type-and-say front end for speech synthesizers",
+    "name": "kmouth",
+    "project_path": "kde/kdeaccessibility/kmouth",
+    "repo_path": "accessibility/kmouth"
+  },
+  "kmplayer": {
+    "description": "KPart-based video player plugin",
+    "name": "kmplayer",
+    "project_path": "extragear/multimedia/kmplayer",
+    "repo_path": "multimedia/kmplayer"
+  },
+  "kmplot": {
+    "description": "Mathematical Function Plotter",
+    "name": "kmplot",
+    "project_path": "kde/kdeedu/kmplot",
+    "repo_path": "education/kmplot"
+  },
+  "kmuddy": {
+    "description": "A MUD (Multi-User Dungeon) client by KDE",
+    "name": "kmuddy",
+    "project_path": "playground/games/kmuddy",
+    "repo_path": "games/kmuddy"
+  },
+  "kmymoney": {
+    "description": "Personal finance manager",
+    "name": "kmymoney",
+    "project_path": "extragear/office/kmymoney",
+    "repo_path": "office/kmymoney"
+  },
+  "knavalbattle": {
+    "description": "Naval Battle is a ship sinking game",
+    "name": "knavalbattle",
+    "project_path": "kde/kdegames/knavalbattle",
+    "repo_path": "games/knavalbattle"
+  },
+  "knemo": {
+    "description": "A network monitor by KDE",
+    "name": "knemo",
+    "project_path": "unmaintained/knemo",
+    "repo_path": "unmaintained/knemo"
+  },
+  "knetwalk": {
+    "description": "KNetWalk: connect all the terminals to the server, in as few turns as possible",
+    "name": "knetwalk",
+    "project_path": "kde/kdegames/knetwalk",
+    "repo_path": "games/knetwalk"
+  },
+  "knewstuff": {
+    "description": "KNewStuff",
+    "name": "knewstuff",
+    "project_path": "frameworks/knewstuff",
+    "repo_path": "frameworks/knewstuff"
+  },
+  "knights": {
+    "description": "Chess board program.",
+    "name": "knights",
+    "project_path": "kde/kdegames/knights",
+    "repo_path": "games/knights"
+  },
+  "knipptasch": {
+    "description": "Personal accounting application that aims to be the simplest for basic use",
+    "name": "knipptasch",
+    "project_path": "playground/office/knipptasch",
+    "repo_path": "office/knipptasch"
+  },
+  "knotes": {
+    "description": "Note-taking application",
+    "name": "knotes",
+    "project_path": "kde/pim/knotes",
+    "repo_path": "pim/knotes"
+  },
+  "knotifications": {
+    "description": "KNotifications",
+    "name": "knotifications",
+    "project_path": "frameworks/knotifications",
+    "repo_path": "frameworks/knotifications"
+  },
+  "knotifyconfig": {
+    "description": "KNotifyConfig",
+    "name": "knotifyconfig",
+    "project_path": "frameworks/knotifyconfig",
+    "repo_path": "frameworks/knotifyconfig"
+  },
+  "kobjecttracking": {
+    "description": "Library for tracking changes in QObject-based objects",
+    "name": "kobjecttracking",
+    "project_path": "playground/sdk/kobjecttracking",
+    "repo_path": "sdk/kobjecttracking"
+  },
+  "kodaskanna": {
+    "description": "A multi-format 1D/2D code scanner",
+    "name": "kodaskanna",
+    "project_path": "playground/graphics/kodaskanna",
+    "repo_path": "graphics/kodaskanna"
+  },
+  "koffice": {
+    "description": "Free software office suite.",
+    "name": "koffice",
+    "project_path": "unmaintained/koffice",
+    "repo_path": "unmaintained/koffice"
+  },
+  "koffice-chartingshape": {
+    "description": "Charting utilities and additions for KOffice",
+    "name": "koffice-chartingshape",
+    "project_path": "unmaintained/koffice-chartingshape",
+    "repo_path": "unmaintained/koffice-chartingshape"
+  },
+  "koffice-formulashape": {
+    "description": "Formula shape for koffice",
+    "name": "koffice-formulashape",
+    "project_path": "unmaintained/koffice-formulashape",
+    "repo_path": "unmaintained/koffice-formulashape"
+  },
+  "koffice-googledocs": {
+    "description": "KOffice plugin to work with Google Docs",
+    "name": "koffice-googledocs",
+    "project_path": "unmaintained/koffice-googledocs",
+    "repo_path": "unmaintained/koffice-googledocs"
+  },
+  "koffice-musicshape": {
+    "description": "Musical notation shape and editor for koffice",
+    "name": "koffice-musicshape",
+    "project_path": "unmaintained/koffice-musicshape",
+    "repo_path": "unmaintained/koffice-musicshape"
+  },
+  "koffice-plugins": {
+    "description": "plugins for koffice, a free software office suite",
+    "name": "koffice-plugins",
+    "project_path": "unmaintained/koffice-plugins",
+    "repo_path": "unmaintained/koffice-plugins"
+  },
+  "koffice-texthighlight": {
+    "description": "A plugin for KWord to allow giving syntax highlighting to selected text.",
+    "name": "koffice-texthighlight",
+    "project_path": "unmaintained/koffice-texthighlight",
+    "repo_path": "unmaintained/koffice-texthighlight"
+  },
+  "koffice-videoshape": {
+    "description": "Video shape for the KOffice suite",
+    "name": "koffice-videoshape",
+    "project_path": "unmaintained/koffice-videoshape",
+    "repo_path": "unmaintained/koffice-videoshape"
+  },
+  "koko": {
+    "description": "Image gallery application",
+    "name": "koko",
+    "project_path": "extragear/graphics/koko",
+    "repo_path": "graphics/koko"
+  },
+  "kolena": {
+    "description": "Kolena is a KDE wrapper around the Olena image library which extracts text from images.",
+    "name": "kolena",
+    "project_path": "unmaintained/kolena",
+    "repo_path": "unmaintained/kolena"
+  },
+  "kolf": {
+    "description": "Kolf is a miniature golf game with 2d top-down view",
+    "name": "kolf",
+    "project_path": "kde/kdegames/kolf",
+    "repo_path": "games/kolf"
+  },
+  "kollision": {
+    "description": "Kollision is a simple ball dodging game",
+    "name": "kollision",
+    "project_path": "kde/kdegames/kollision",
+    "repo_path": "games/kollision"
+  },
+  "kolor-manager": {
+    "description": "Color management KCM using Oyranos CMS",
+    "name": "kolor-manager",
+    "project_path": "extragear/graphics/kolor-manager",
+    "repo_path": "graphics/kolor-manager"
+  },
+  "kolorfill": {
+    "description": "Simple flood fill game",
+    "name": "kolorfill",
+    "project_path": "playground/base/kolorfill",
+    "repo_path": "games/kolorfill"
+  },
+  "kolourpaint": {
+    "description": "Easy-to-use paint program",
+    "name": "kolourpaint",
+    "project_path": "kde/kdegraphics/kolourpaint",
+    "repo_path": "graphics/kolourpaint"
+  },
+  "kommander": {
+    "description": "Toolkit allowing the creation of minimal, yet functionally powerful scripted applications.",
+    "name": "kommander",
+    "project_path": "unmaintained/kommander",
+    "repo_path": "unmaintained/kommander"
+  },
+  "kommit": {
+    "description": "Graphical Git Client",
+    "name": "kommit",
+    "project_path": "playground/sdk/kommit",
+    "repo_path": "sdk/kommit"
+  },
+  "kompare": {
+    "description": "Graphical File Differences Tool",
+    "name": "kompare",
+    "project_path": "kde/kdesdk/kompare",
+    "repo_path": "sdk/kompare"
+  },
+  "kongress": {
+    "description": "Companion application for conferences",
+    "name": "kongress",
+    "project_path": "extragear/utils/kongress",
+    "repo_path": "utilities/kongress"
+  },
+  "konqueror": {
+    "description": "Web browser and Swiss Army knife for any kind of file management and previewing",
+    "name": "konqueror",
+    "project_path": "kde/applications/konqueror",
+    "repo_path": "network/konqueror"
+  },
+  "konquest": {
+    "description": "Konquest is the KDE version of Gnu-Lactic",
+    "name": "konquest",
+    "project_path": "kde/kdegames/konquest",
+    "repo_path": "games/konquest"
+  },
+  "konsole": {
+    "description": "Terminal emulator by KDE",
+    "name": "konsole",
+    "project_path": "kde/applications/konsole",
+    "repo_path": "utilities/konsole"
+  },
+  "kontact": {
+    "description": "Container application to unify several major PIM applications",
+    "name": "kontact",
+    "project_path": "kde/pim/kontact",
+    "repo_path": "pim/kontact"
+  },
+  "kontactinterface": {
+    "description": "Support libraries to assist integration with Kontact",
+    "name": "kontactinterface",
+    "project_path": "kde/pim/kontactinterface",
+    "repo_path": "pim/kontactinterface"
+  },
+  "kontaminuti": {
+    "description": "Kontaminuti is a simple helper utility to time your activities according to the Pomodoro Technique.",
+    "name": "kontaminuti",
+    "project_path": "unmaintained/kontaminuti",
+    "repo_path": "unmaintained/kontaminuti"
+  },
+  "kontrast": {
+    "description": "Tool to check contrast for colors that allows verifying that your colors are correctly accessible",
+    "name": "kontrast",
+    "project_path": "kde/kdeaccessibility/kontrast",
+    "repo_path": "accessibility/kontrast"
+  },
+  "konversation": {
+    "description": "User-friendly and fully-featured IRC client",
+    "name": "konversation",
+    "project_path": "kde/kdenetwork/konversation",
+    "repo_path": "network/konversation"
+  },
+  "kooka": {
+    "description": "Scanning application and libkscan library",
+    "name": "kooka",
+    "project_path": "playground/graphics/kooka",
+    "repo_path": "graphics/kooka"
+  },
+  "kookbook": {
+    "description": "Cookbook creator",
+    "name": "kookbook",
+    "project_path": "playground/base/kookbook",
+    "repo_path": "utilities/kookbook"
+  },
+  "kopeninghours": {
+    "description": "Library for parsing and evaluating OSM opening hours expressions.",
+    "name": "kopeninghours",
+    "project_path": "kde/pim/kopeninghours",
+    "repo_path": "libraries/kopeninghours"
+  },
+  "kopete": {
+    "description": "Flexible multi-protocol instant messenger for personal and enterprise use",
+    "name": "kopete",
+    "project_path": "kde/kdenetwork/kopete",
+    "repo_path": "network/kopete"
+  },
+  "kopete-pimpresence": {
+    "description": "PIM Presence Plugin for Kopete",
+    "name": "kopete-pimpresence",
+    "project_path": "playground/network/kopete-pimpresence",
+    "repo_path": "unmaintained/kopete-pimpresence"
+  },
+  "kopete-protocol-telepathy": {
+    "description": "Kopete protocol plugin for Telepathy. This provides the ability to add accounts using any Telepathy-supported protocol to Kopete.",
+    "name": "kopete-protocol-telepathy",
+    "project_path": "unmaintained/kopete-protocol-telepathy",
+    "repo_path": "unmaintained/kopete-protocol-telepathy"
+  },
+  "kopete-scripting": {
+    "description": "Scripting Plugin for Kopete",
+    "name": "kopete-scripting",
+    "project_path": "unmaintained/kopete-scripting",
+    "repo_path": "unmaintained/kopete-scripting"
+  },
+  "kopete-sharemydesktop": {
+    "description": "Share My Desktop Plugin for Kopete",
+    "name": "kopete-sharemydesktop",
+    "project_path": "unmaintained/kopete-sharemydesktop",
+    "repo_path": "unmaintained/kopete-sharemydesktop"
+  },
+  "kopete-smpppdcs": {
+    "description": "Smpppdcs Plugin for Kopete",
+    "name": "kopete-smpppdcs",
+    "project_path": "unmaintained/kopete-smpppdcs",
+    "repo_path": "unmaintained/kopete-smpppdcs"
+  },
+  "kopete-thinklight": {
+    "description": "ThinkLight Plugin for Kopete",
+    "name": "kopete-thinklight",
+    "project_path": "unmaintained/kopete-thinklight",
+    "repo_path": "unmaintained/kopete-thinklight"
+  },
+  "kopete-whiteboard": {
+    "description": "Whiteboard Plugin for Kopete",
+    "name": "kopete-whiteboard",
+    "project_path": "unmaintained/kopete-whiteboard",
+    "repo_path": "unmaintained/kopete-whiteboard"
+  },
+  "kor": {
+    "description": "Kor is a simple desktop shell leveraging KDE technologies.",
+    "name": "kor",
+    "project_path": "unmaintained/kor",
+    "repo_path": "unmaintained/kor"
+  },
+  "korganizer": {
+    "description": "Organizational assistant, providing calendars and other similar functionality",
+    "name": "korganizer",
+    "project_path": "kde/pim/korganizer",
+    "repo_path": "pim/korganizer"
+  },
+  "korundum": {
+    "description": "Ruby bindings for libraries created by the KDE community.",
+    "name": "korundum",
+    "project_path": "kde/kdebindings/ruby/korundum",
+    "repo_path": "unmaintained/korundum"
+  },
+  "kosmindoormap": {
+    "description": "OSM multi-floor indoor map renderer",
+    "name": "kosmindoormap",
+    "project_path": "kde/pim/kosmindoormap",
+    "repo_path": "libraries/kosmindoormap"
+  },
+  "kpackage": {
+    "description": "This framework lets applications to manage user installable packages of non-binary assets",
+    "name": "kpackage",
+    "project_path": "frameworks/kpackage",
+    "repo_path": "frameworks/kpackage"
+  },
+  "kparts": {
+    "description": "KParts",
+    "name": "kparts",
+    "project_path": "frameworks/kparts",
+    "repo_path": "frameworks/kparts"
+  },
+  "kpaste": {
+    "description": "command-line tool to paste to https://paste.kde.org",
+    "name": "kpaste",
+    "project_path": "playground/utils/kpaste",
+    "repo_path": "unmaintained/kpaste"
+  },
+  "kpat": {
+    "description": "KPatience offers a selection of solitaire card games",
+    "name": "kpat",
+    "project_path": "kde/kdegames/kpat",
+    "repo_path": "games/kpat"
+  },
+  "kpeg": {
+    "description": "Peg Solitaire Game by KDE.",
+    "name": "kpeg",
+    "project_path": "unmaintained/kpeg",
+    "repo_path": "unmaintained/kpeg"
+  },
+  "kpeople": {
+    "description": "A library that provides access to all contacts and the people who hold them",
+    "name": "kpeople",
+    "project_path": "frameworks/kpeople",
+    "repo_path": "frameworks/kpeople"
+  },
+  "kpeoplesink": {
+    "description": "Expose Sink contacts to KPeople",
+    "name": "kpeoplesink",
+    "project_path": "playground/pim/kpeoplesink",
+    "repo_path": "pim/kpeoplesink"
+  },
+  "kpeoplevcard": {
+    "description": "Expose VCard contacts to KPeople",
+    "name": "kpeoplevcard",
+    "project_path": "kdereview/kpeoplevcard",
+    "repo_path": "pim/kpeoplevcard"
+  },
+  "kphotoalbum": {
+    "description": "Photo Album for easy organization of your images",
+    "name": "kphotoalbum",
+    "project_path": "extragear/graphics/kphotoalbum",
+    "repo_path": "graphics/kphotoalbum"
+  },
+  "kpimtextedit": {
+    "description": "Library that provides extended text editor for PIM applications",
+    "name": "kpimtextedit",
+    "project_path": "kde/pim/kpimtextedit",
+    "repo_path": "pim/kpimtextedit"
+  },
+  "kpipewire": {
+    "description": "Components relating to Flatpak 'pipewire' use in Plasma.",
+    "name": "kpipewire",
+    "project_path": "kde/workspace/kpipewire",
+    "repo_path": "plasma/kpipewire"
+  },
+  "kpkpass": {
+    "description": "Apple Wallet Pass reader",
+    "name": "kpkpass",
+    "project_path": "kde/pim/kpkpass",
+    "repo_path": "pim/kpkpass"
+  },
+  "kplayer": {
+    "description": "KPlayer is a rich multimedia player that uses the mplayer backend.",
+    "name": "kplayer",
+    "project_path": "unmaintained/kplayer",
+    "repo_path": "unmaintained/kplayer"
+  },
+  "kplotting": {
+    "description": "KPlotting",
+    "name": "kplotting",
+    "project_path": "frameworks/kplotting",
+    "repo_path": "frameworks/kplotting"
+  },
+  "kpmcore": {
+    "description": "KDE Partition Manager core library",
+    "name": "kpmcore",
+    "project_path": "kde/kdeadmin/kpmcore",
+    "repo_path": "system/kpmcore"
+  },
+  "kppp": {
+    "description": "Dialer and Front end for pppd",
+    "name": "kppp",
+    "project_path": "unmaintained/kppp",
+    "repo_path": "unmaintained/kppp"
+  },
+  "kprinter4": {
+    "description": "Simple stand-alone PostScript document printer",
+    "name": "kprinter4",
+    "project_path": "unmaintained/kprinter4",
+    "repo_path": "unmaintained/kprinter4"
+  },
+  "kproperty": {
+    "description": "Property editing framework with an editor widget similar to Qt Designer",
+    "name": "kproperty",
+    "project_path": "extragear/libs/kproperty",
+    "repo_path": "libraries/kproperty"
+  },
+  "kpty": {
+    "description": "KPty",
+    "name": "kpty",
+    "project_path": "frameworks/kpty",
+    "repo_path": "frameworks/kpty"
+  },
+  "kpublictransport": {
+    "description": "Library to assist with accessing public transport timetables and other data",
+    "name": "kpublictransport",
+    "project_path": "kde/pim/kpublictransport",
+    "repo_path": "libraries/kpublictransport"
+  },
+  "kqtquickcharts": {
+    "description": "QtQuick plugin to render beautiful and interactive charts",
+    "name": "kqtquickcharts",
+    "project_path": "kde/kdeedu/kqtquickcharts",
+    "repo_path": "libraries/kqtquickcharts"
+  },
+  "kquickcharts": {
+    "description": "A QtQuick plugin providing high-performance charts.",
+    "name": "kquickcharts",
+    "project_path": "frameworks/kquickcharts",
+    "repo_path": "frameworks/kquickcharts"
+  },
+  "kquickchatcomponents": {
+    "description": "Set of chat components for QtQuick chat apps wishing to fit in with KDE's collection of chat apps",
+    "name": "kquickchatcomponents",
+    "project_path": "kdereview/kquickchatcomponents",
+    "repo_path": "libraries/kquickchatcomponents"
+  },
+  "kquickimageeditor": {
+    "description": "Image editing components",
+    "name": "kquickimageeditor",
+    "project_path": "extragear/libs/kquickimageeditor",
+    "repo_path": "libraries/kquickimageeditor"
+  },
+  "kquickitemviews": {
+    "description": "Qt Model compatibility layer for QML",
+    "name": "kquickitemviews",
+    "project_path": "playground/libs/kquickitemviews",
+    "repo_path": "libraries/kquickitemviews"
+  },
+  "krdc": {
+    "description": "Remote Desktop Client",
+    "name": "krdc",
+    "project_path": "kde/kdenetwork/krdc",
+    "repo_path": "network/krdc"
+  },
+  "krdp": {
+    "description": "Library and examples for creating an RDP server.",
+    "name": "krdp",
+    "project_path": "playground/libs/krdp",
+    "repo_path": "plasma/krdp"
+  },
+  "krecipes": {
+    "description": "KDE cooking recipes manager",
+    "name": "krecipes",
+    "project_path": "unmaintained/krecipes",
+    "repo_path": "unmaintained/krecipes"
+  },
+  "krecorder": {
+    "description": "Audio recorder for Plasma Mobile and other platforms",
+    "name": "krecorder",
+    "project_path": "extragear/utils/krecorder",
+    "repo_path": "utilities/krecorder"
+  },
+  "kreenshot-editor": {
+    "description": "Kreenshot Editor is a screenshot image editing application and shared library.",
+    "name": "kreenshot-editor",
+    "project_path": "playground/graphics/kreenshot-editor",
+    "repo_path": "unmaintained/kreenshot-editor"
+  },
+  "kregexpeditor": {
+    "description": "GUI for creating and editing regular expressions",
+    "name": "kregexpeditor",
+    "project_path": "playground/utils/kregexpeditor",
+    "repo_path": "utilities/kregexpeditor"
+  },
+  "kremotecontrol": {
+    "description": "KRemoteControl (formerly known as KDELirc) is a KDE frontend for your remote controls.",
+    "name": "kremotecontrol",
+    "project_path": "unmaintained/kremotecontrol",
+    "repo_path": "unmaintained/kremotecontrol"
+  },
+  "krename": {
+    "description": "Utility to handle specialized file renames",
+    "name": "krename",
+    "project_path": "extragear/utils/krename",
+    "repo_path": "utilities/krename"
+  },
+  "kreport": {
+    "description": "Framework for creation and generation of reports in multiple formats",
+    "name": "kreport",
+    "project_path": "extragear/libs/kreport",
+    "repo_path": "libraries/kreport"
+  },
+  "kreversi": {
+    "description": "KReversi is is a simple one player strategy game played against the computer",
+    "name": "kreversi",
+    "project_path": "kde/kdegames/kreversi",
+    "repo_path": "games/kreversi"
+  },
+  "krfb": {
+    "description": "Desktop Sharing",
+    "name": "krfb",
+    "project_path": "kde/kdenetwork/krfb",
+    "repo_path": "network/krfb"
+  },
+  "krita": {
+    "description": "Krita is a free and open source cross-platform application that offers an end-to-end solution for creating digital art files from scratch built on the KDE and Qt frameworks.",
+    "name": "krita",
+    "project_path": "extragear/graphics/krita",
+    "repo_path": "graphics/krita"
+  },
+  "krita-analogies": {
+    "description": "Filter that tries to restyle an image using comparison with other images.",
+    "name": "krita-analogies",
+    "project_path": "extragear/graphics/krita-extensions/krita-analogies",
+    "repo_path": "unmaintained/krita-analogies"
+  },
+  "krita-cimg": {
+    "description": "Extension based on the cimg library. http://cimg.sourceforge.net/",
+    "name": "krita-cimg",
+    "project_path": "extragear/graphics/krita-extensions/krita-cimg",
+    "repo_path": "unmaintained/krita-cimg"
+  },
+  "krita-ctlbrush": {
+    "description": "Brush written using the Color Transformation Language.",
+    "name": "krita-ctlbrush",
+    "project_path": "extragear/graphics/krita-extensions/krita-ctlbrush",
+    "repo_path": "unmaintained/krita-ctlbrush"
+  },
+  "krita-deskew": {
+    "description": "Deskew rotates an image such that text is straight, which is useful when dealing with scanned images.",
+    "name": "krita-deskew",
+    "project_path": "extragear/graphics/krita-extensions/krita-deskew",
+    "repo_path": "unmaintained/krita-deskew"
+  },
+  "krita-dither": {
+    "description": "A dithering plugin for Krita.",
+    "name": "krita-dither",
+    "project_path": "extragear/graphics/krita-extensions/krita-dither",
+    "repo_path": "unmaintained/krita-dither"
+  },
+  "krita-grayscalizer": {
+    "description": "Simulate the use of \u201clens filter\u201d for creating grayscale images.",
+    "name": "krita-grayscalizer",
+    "project_path": "extragear/graphics/krita-extensions/krita-grayscalizer",
+    "repo_path": "unmaintained/krita-grayscalizer"
+  },
+  "krita-humanbody": {
+    "description": "Canvas decoration that display the outline of a human to help choosing the pose when drawing.",
+    "name": "krita-humanbody",
+    "project_path": "extragear/graphics/krita-extensions/krita-humanbody",
+    "repo_path": "unmaintained/krita-humanbody"
+  },
+  "krita-imagecomplete": {
+    "description": "ImageComplete fills in holes in your image with the gradient of the surround",
+    "name": "krita-imagecomplete",
+    "project_path": "extragear/graphics/krita-extensions/krita-imagecomplete",
+    "repo_path": "unmaintained/krita-imagecomplete"
+  },
+  "krita-linesampler": {
+    "description": "LineSampler \u201csamples\u201d the image with randomly placed lines.",
+    "name": "krita-linesampler",
+    "project_path": "extragear/graphics/krita-extensions/krita-linesampler",
+    "repo_path": "unmaintained/krita-linesampler"
+  },
+  "krita-pyramidalsharpening": {
+    "description": "Use a pyramid to reconstruct a sharper image.",
+    "name": "krita-pyramidalsharpening",
+    "project_path": "extragear/graphics/krita-extensions/krita-pyramidalsharpening",
+    "repo_path": "unmaintained/krita-pyramidalsharpening"
+  },
+  "krono": {
+    "description": "Desktop History Viewer",
+    "name": "krono",
+    "project_path": "unmaintained/krono",
+    "repo_path": "unmaintained/krono"
+  },
+  "kronometer": {
+    "description": "Stopwatch application by KDE",
+    "name": "kronometer",
+    "project_path": "extragear/utils/kronometer",
+    "repo_path": "utilities/kronometer"
+  },
+  "kross": {
+    "description": "Kross",
+    "name": "kross",
+    "project_path": "frameworks/kross",
+    "repo_path": "frameworks/kross"
+  },
+  "kross-interpreters": {
+    "description": "Language interpreters to enable in-process scripting with Kross",
+    "name": "kross-interpreters",
+    "project_path": "kde/kdebindings/kross-interpreters",
+    "repo_path": "libraries/kross-interpreters"
+  },
+  "kruler": {
+    "description": "A pixel measuring tool by KDE",
+    "name": "kruler",
+    "project_path": "kde/kdegraphics/kruler",
+    "repo_path": "graphics/kruler"
+  },
+  "krunner": {
+    "description": "Framework for providing different actions given a string query.",
+    "name": "krunner",
+    "project_path": "frameworks/krunner",
+    "repo_path": "frameworks/krunner"
+  },
+  "krusader": {
+    "description": "Advanced twin panel (commander style) file manager",
+    "name": "krusader",
+    "project_path": "extragear/utils/krusader",
+    "repo_path": "utilities/krusader"
+  },
+  "ksanecore": {
+    "description": "Library providing logic to interface scanners",
+    "name": "ksanecore",
+    "project_path": "libraries/ksanecore",
+    "repo_path": "libraries/ksanecore"
+  },
+  "ksaneplugin": {
+    "description": "This is a KScan plugin that implements the scanning through libksane",
+    "name": "ksaneplugin",
+    "project_path": "unmaintained/ksaneplugin",
+    "repo_path": "unmaintained/ksaneplugin"
+  },
+  "ksaolaji": {
+    "description": "Cleans all sorts of waste things in your system.",
+    "name": "ksaolaji",
+    "project_path": "unmaintained/ksaolaji",
+    "repo_path": "unmaintained/ksaolaji"
+  },
+  "kscd": {
+    "description": "CD player by KDE",
+    "name": "kscd",
+    "project_path": "playground/multimedia/kscd",
+    "repo_path": "multimedia/kscd"
+  },
+  "kscreen": {
+    "description": "KDE's screen management software",
+    "name": "kscreen",
+    "project_path": "kde/workspace/kscreen",
+    "repo_path": "plasma/kscreen"
+  },
+  "kscreenlocker": {
+    "description": "Library and components for secure lock screen architecture",
+    "name": "kscreenlocker",
+    "project_path": "kde/workspace/kscreenlocker",
+    "repo_path": "plasma/kscreenlocker"
+  },
+  "ksecrets": {
+    "description": "Secrets management infrastructure",
+    "name": "ksecrets",
+    "project_path": "playground/utils/ksecrets",
+    "repo_path": "utilities/ksecrets"
+  },
+  "kseexpr": {
+    "description": "The embeddable expression engine fork for Krita",
+    "name": "kseexpr",
+    "project_path": "kdereview/kseexpr",
+    "repo_path": "graphics/kseexpr"
+  },
+  "kservice": {
+    "description": "KService",
+    "name": "kservice",
+    "project_path": "frameworks/kservice",
+    "repo_path": "frameworks/kservice"
+  },
+  "kshim": {
+    "description": "Create a shim to help run your project",
+    "name": "kshim",
+    "project_path": "playground/sdk/kshim",
+    "repo_path": "sdk/kshim"
+  },
+  "kshisen": {
+    "description": "Shisen-Sho is a solitaire-like game played using the standard set of Mahjong tiles",
+    "name": "kshisen",
+    "project_path": "kde/kdegames/kshisen",
+    "repo_path": "games/kshisen"
+  },
+  "ksirk": {
+    "description": "KsirK is a computerized version of a well known strategy game",
+    "name": "ksirk",
+    "project_path": "kde/kdegames/ksirk",
+    "repo_path": "games/ksirk"
+  },
+  "ksmtp": {
+    "description": "Job-based library to send email through an SMTP server",
+    "name": "ksmtp",
+    "project_path": "kde/pim/ksmtp",
+    "repo_path": "pim/ksmtp"
+  },
+  "ksnakeduel": {
+    "description": "KSnakeDuel is a simple snake duel game",
+    "name": "ksnakeduel",
+    "project_path": "kde/kdegames/ksnakeduel",
+    "repo_path": "games/ksnakeduel"
+  },
+  "ksnapshot": {
+    "description": "A handy utility primarily designed for taking screenshots\n\nGet KIPI plugins for \"more features\":https://www.elpauer.org/?p=509",
+    "name": "ksnapshot",
+    "project_path": "unmaintained/ksnapshot",
+    "repo_path": "unmaintained/ksnapshot"
+  },
+  "kspaceduel": {
+    "description": "KSpaceDuel: each of two possible players controls a satellite spaceship orbiting the sun",
+    "name": "kspaceduel",
+    "project_path": "kde/kdegames/kspaceduel",
+    "repo_path": "games/kspaceduel"
+  },
+  "ksquares": {
+    "description": "KSquares is modeled after the well known pen and paper based game of Dots and Boxes",
+    "name": "ksquares",
+    "project_path": "kde/kdegames/ksquares",
+    "repo_path": "games/ksquares"
+  },
+  "ksshaskpass": {
+    "description": "ssh-add helper that uses KWallet and KPasswordDialog",
+    "name": "ksshaskpass",
+    "project_path": "kde/workspace/ksshaskpass",
+    "repo_path": "plasma/ksshaskpass"
+  },
+  "kst-plot": {
+    "description": "Fast real-time plotting program with light data analysis capabilities",
+    "name": "kst-plot",
+    "project_path": "extragear/graphics/kst-plot",
+    "repo_path": "graphics/kst-plot"
+  },
+  "kstars": {
+    "description": "Desktop Planetarium",
+    "name": "kstars",
+    "project_path": "extragear/edu/kstars",
+    "repo_path": "education/kstars"
+  },
+  "kstatusnotifieritem": {
+    "description": "Implementation of Status Notifier Items",
+    "name": "kstatusnotifieritem",
+    "project_path": "frameworks/kstatusnotifieritem",
+    "repo_path": "frameworks/kstatusnotifieritem"
+  },
+  "ksudoku": {
+    "description": "KSudoku is a logic-based symbol placement puzzle",
+    "name": "ksudoku",
+    "project_path": "kde/kdegames/ksudoku",
+    "repo_path": "games/ksudoku"
+  },
+  "ksvg": {
+    "description": "Components for handling SVGs",
+    "name": "ksvg",
+    "project_path": "frameworks/ksvg",
+    "repo_path": "frameworks/ksvg"
+  },
+  "ksysguard": {
+    "description": "Resource usage monitor for your computer",
+    "name": "ksysguard",
+    "project_path": "kde/workspace/ksysguard",
+    "repo_path": "plasma/ksysguard"
+  },
+  "ksystemlog": {
+    "description": "KDE SystemLog Application",
+    "name": "ksystemlog",
+    "project_path": "kde/kdeadmin/ksystemlog",
+    "repo_path": "system/ksystemlog"
+  },
+  "ksystemstats": {
+    "description": "A plugin based system monitoring daemon.",
+    "name": "ksystemstats",
+    "project_path": "kde/workspace/ksystemstats",
+    "repo_path": "plasma/ksystemstats"
+  },
+  "kte-collaborative": {
+    "description": "KTextEditor plugin which allows to edit text documents collaboratively",
+    "name": "kte-collaborative",
+    "project_path": "playground/network/kte-collaborative",
+    "repo_path": "network/kte-collaborative"
+  },
+  "kteatime": {
+    "description": "Handy timer for steeping tea",
+    "name": "kteatime",
+    "project_path": "kde/kdeutils/kteatime",
+    "repo_path": "utilities/kteatime"
+  },
+  "ktechlab": {
+    "description": "IDE for microcontrollers and electronics",
+    "name": "ktechlab",
+    "project_path": "playground/devtools/ktechlab",
+    "repo_path": "sdk/ktechlab"
+  },
+  "ktextaddons": {
+    "description": "Various text handling addons",
+    "name": "ktextaddons",
+    "project_path": "playground/libs/ktextaddons",
+    "repo_path": "libraries/ktextaddons"
+  },
+  "ktexteditor": {
+    "description": "KTextEditor Framework",
+    "name": "ktexteditor",
+    "project_path": "frameworks/ktexteditor",
+    "repo_path": "frameworks/ktexteditor"
+  },
+  "ktexteditorpreviewplugin": {
+    "description": "Plugin for previewing content using the KTextEditor Framework",
+    "name": "ktexteditorpreviewplugin",
+    "project_path": "unmaintained/ktexteditorpreviewplugin",
+    "repo_path": "unmaintained/ktexteditorpreviewplugin"
+  },
+  "ktexttemplate": {
+    "description": "Library to allow application developers to separate the structure of documents from the data they contain.",
+    "name": "ktexttemplate",
+    "project_path": "frameworks/ktexttemplate",
+    "repo_path": "frameworks/ktexttemplate"
+  },
+  "ktextwidgets": {
+    "description": "KTextWidgets",
+    "name": "ktextwidgets",
+    "project_path": "frameworks/ktextwidgets",
+    "repo_path": "frameworks/ktextwidgets"
+  },
+  "ktimer": {
+    "description": "Little tool to execute programs after some time",
+    "name": "ktimer",
+    "project_path": "kde/kdeutils/ktimer",
+    "repo_path": "utilities/ktimer"
+  },
+  "ktimetracker": {
+    "description": "Todo management and time tracker",
+    "name": "ktimetracker",
+    "project_path": "extragear/pim/ktimetracker",
+    "repo_path": "pim/ktimetracker"
+  },
+  "ktnef": {
+    "description": "Libraries to work with TNEF Email Attachments",
+    "name": "ktnef",
+    "project_path": "kde/pim/ktnef",
+    "repo_path": "pim/ktnef"
+  },
+  "ktorrent": {
+    "description": "Powerful BitTorrent client",
+    "name": "ktorrent",
+    "project_path": "kde/kdenetwork/ktorrent",
+    "repo_path": "network/ktorrent"
+  },
+  "ktouch": {
+    "description": "Touch Typing Tutor",
+    "name": "ktouch",
+    "project_path": "kde/kdeedu/ktouch",
+    "repo_path": "education/ktouch"
+  },
+  "ktp-accounts-kcm": {
+    "description": "KCM for configuring Telepathy Instant Messaging Accounts",
+    "name": "ktp-accounts-kcm",
+    "project_path": "kde/kdenetwork/ktp-accounts-kcm",
+    "repo_path": "network/ktp-accounts-kcm"
+  },
+  "ktp-active": {
+    "description": "Plasma Active Client for KDE Telepathy",
+    "name": "ktp-active",
+    "project_path": "unmaintained/ktp-active",
+    "repo_path": "unmaintained/ktp-active"
+  },
+  "ktp-approver": {
+    "description": "KDE channel approver for Telepathy",
+    "name": "ktp-approver",
+    "project_path": "kde/kdenetwork/ktp-approver",
+    "repo_path": "network/ktp-approver"
+  },
+  "ktp-auth-handler": {
+    "description": "UI/KWallet integration for passwords and SSL errors on account connection",
+    "name": "ktp-auth-handler",
+    "project_path": "kde/kdenetwork/ktp-auth-handler",
+    "repo_path": "network/ktp-auth-handler"
+  },
+  "ktp-call-ui": {
+    "description": "Voice/video call UI for Telepathy",
+    "name": "ktp-call-ui",
+    "project_path": "kde/kdenetwork/ktp-call-ui",
+    "repo_path": "network/ktp-call-ui"
+  },
+  "ktp-common-internals": {
+    "description": "Library for KTp",
+    "name": "ktp-common-internals",
+    "project_path": "kde/kdenetwork/ktp-common-internals",
+    "repo_path": "network/ktp-common-internals"
+  },
+  "ktp-contact-list": {
+    "description": "Telepathy contact list application",
+    "name": "ktp-contact-list",
+    "project_path": "kde/kdenetwork/ktp-contact-list",
+    "repo_path": "network/ktp-contact-list"
+  },
+  "ktp-contact-runner": {
+    "description": "KRunner plugin for KDE Telepathy",
+    "name": "ktp-contact-runner",
+    "project_path": "kde/kdenetwork/ktp-contact-runner",
+    "repo_path": "network/ktp-contact-runner"
+  },
+  "ktp-desktop-applets": {
+    "description": "KDE Telepathy applets for the Plasma Desktop",
+    "name": "ktp-desktop-applets",
+    "project_path": "kde/kdenetwork/ktp-desktop-applets",
+    "repo_path": "network/ktp-desktop-applets"
+  },
+  "ktp-filetransfer-handler": {
+    "description": "Telepathy file transfer handler",
+    "name": "ktp-filetransfer-handler",
+    "project_path": "kde/kdenetwork/ktp-filetransfer-handler",
+    "repo_path": "network/ktp-filetransfer-handler"
+  },
+  "ktp-kde": {
+    "description": "Telepathy KDE integration library",
+    "name": "ktp-kde",
+    "project_path": "unmaintained/ktp-kde",
+    "repo_path": "unmaintained/ktp-kde"
+  },
+  "ktp-kded-module": {
+    "description": "KDED module for KDE Telepathy that takes care of system integration",
+    "name": "ktp-kded-module",
+    "project_path": "kde/kdenetwork/ktp-kded-module",
+    "repo_path": "network/ktp-kded-module"
+  },
+  "ktp-kipi-plugin": {
+    "description": "A Kipi Plugin to send images through telepathy",
+    "name": "ktp-kipi-plugin",
+    "project_path": "unmaintained/ktp-kipi-plugin",
+    "repo_path": "unmaintained/ktp-kipi-plugin"
+  },
+  "ktp-launcher-kded": {
+    "description": "KDED Module which ensures necessary Telepathy services are running.",
+    "name": "ktp-launcher-kded",
+    "project_path": "unmaintained/ktp-launcher-kded",
+    "repo_path": "unmaintained/ktp-launcher-kded"
+  },
+  "ktp-nepomuk-service": {
+    "description": "Nepomuk integration service for Telepathy",
+    "name": "ktp-nepomuk-service",
+    "project_path": "unmaintained/ktp-nepomuk-service",
+    "repo_path": "unmaintained/ktp-nepomuk-service"
+  },
+  "ktp-presence-dataengine": {
+    "description": "Plasma dataengine for managing Telepathy account presence.",
+    "name": "ktp-presence-dataengine",
+    "project_path": "unmaintained/ktp-presence-dataengine",
+    "repo_path": "unmaintained/ktp-presence-dataengine"
+  },
+  "ktp-send-file": {
+    "description": "File manager plugin to launch a file transfer job with a specified contact",
+    "name": "ktp-send-file",
+    "project_path": "kde/kdenetwork/ktp-send-file",
+    "repo_path": "network/ktp-send-file"
+  },
+  "ktp-ssh-contact": {
+    "description": "Connect to your contacts using ssh",
+    "name": "ktp-ssh-contact",
+    "project_path": "unmaintained/ktp-ssh-contact",
+    "repo_path": "unmaintained/ktp-ssh-contact"
+  },
+  "ktp-test-tool": {
+    "description": "A tool for testing out the various components of the KDE Telepathy.\n\nDEPRECATED",
+    "name": "ktp-test-tool",
+    "project_path": "unmaintained/ktp-test-tool",
+    "repo_path": "unmaintained/ktp-test-tool"
+  },
+  "ktp-testlib": {
+    "description": "Infrastructure library for building unit tests for Telepathy components",
+    "name": "ktp-testlib",
+    "project_path": "unmaintained/ktp-testlib",
+    "repo_path": "unmaintained/ktp-testlib"
+  },
+  "ktp-text-ui": {
+    "description": "Telepathy handler for text chats",
+    "name": "ktp-text-ui",
+    "project_path": "kde/kdenetwork/ktp-text-ui",
+    "repo_path": "network/ktp-text-ui"
+  },
+  "ktrip": {
+    "description": "Public Transport Assistance for Mobile Devices",
+    "name": "ktrip",
+    "project_path": "extragear/utils/ktrip",
+    "repo_path": "utilities/ktrip"
+  },
+  "ktuberling": {
+    "description": "KTuberling is a simple constructor game suitable for children and adults alike",
+    "name": "ktuberling",
+    "project_path": "kde/kdegames/ktuberling",
+    "repo_path": "games/ktuberling"
+  },
+  "kturtle": {
+    "description": "Educational programming environment that uses TurtleSpeak",
+    "name": "kturtle",
+    "project_path": "kde/kdeedu/kturtle",
+    "repo_path": "education/kturtle"
+  },
+  "ktutorial": {
+    "description": "A library and an editor for interactive tutorials in KDE applications",
+    "name": "ktutorial",
+    "project_path": "unmaintained/ktutorial",
+    "repo_path": "unmaintained/ktutorial"
+  },
+  "ktux": {
+    "description": "KTux is a screensaver of outer space, with Tux in a spaceship flying by.",
+    "name": "ktux",
+    "project_path": "unmaintained/ktux",
+    "repo_path": "unmaintained/ktux"
+  },
+  "kube": {
+    "description": "Modern groupware client based on QtQuick and Sink",
+    "name": "kube",
+    "project_path": "playground/pim/kube",
+    "repo_path": "pim/kube"
+  },
+  "kubeplayer": {
+    "description": "A multimedia player for different online platforms.",
+    "name": "kubeplayer",
+    "project_path": "unmaintained/kubeplayer",
+    "repo_path": "unmaintained/kubeplayer"
+  },
+  "kubrick": {
+    "description": "Kubrick is based on the famous Rubik's Cube",
+    "name": "kubrick",
+    "project_path": "kde/kdegames/kubrick",
+    "repo_path": "games/kubrick"
+  },
+  "kubuntu-debug-installer": {
+    "description": "Program to install debug packages for DrKonqi on Kubuntu",
+    "name": "kubuntu-debug-installer",
+    "project_path": "playground/base/kubuntu-debug-installer",
+    "repo_path": "system/kubuntu-debug-installer"
+  },
+  "kubuntu-driver-kcm": {
+    "description": "KCM that uses Ubuntu driver management system to install proprietary drivers",
+    "name": "kubuntu-driver-kcm",
+    "project_path": "playground/base/kubuntu-driver-kcm",
+    "repo_path": "system/kubuntu-driver-kcm"
+  },
+  "kubuntu-notification-helper": {
+    "description": "Daemon that presents various notifications to Kubuntu users",
+    "name": "kubuntu-notification-helper",
+    "project_path": "playground/base/kubuntu-notification-helper",
+    "repo_path": "system/kubuntu-notification-helper"
+  },
+  "kuickshow": {
+    "description": "A fast and convenient image viewer",
+    "name": "kuickshow",
+    "project_path": "playground/graphics/kuickshow",
+    "repo_path": "graphics/kuickshow"
+  },
+  "kunifiedpush": {
+    "description": "UnifiedPush client components",
+    "name": "kunifiedpush",
+    "project_path": "libraries/kunifiedpush",
+    "repo_path": "libraries/kunifiedpush"
+  },
+  "kunitconversion": {
+    "description": "KUnitConversion",
+    "name": "kunitconversion",
+    "project_path": "frameworks/kunitconversion",
+    "repo_path": "frameworks/kunitconversion"
+  },
+  "kup": {
+    "description": "Backup scheduler for the Plasma desktop",
+    "name": "kup",
+    "project_path": "extragear/system/kup",
+    "repo_path": "system/kup"
+  },
+  "kuser": {
+    "description": "KDE User Manager",
+    "name": "kuser",
+    "project_path": "unmaintained/kuser",
+    "repo_path": "unmaintained/kuser"
+  },
+  "kuserfeedback": {
+    "description": "Framework for collecting user feedback for apps via telemetry and surveys",
+    "name": "kuserfeedback",
+    "project_path": "frameworks/kuserfeedback",
+    "repo_path": "frameworks/kuserfeedback"
+  },
+  "kvkbd": {
+    "description": "A virtual keyboard for Plasma",
+    "name": "kvkbd",
+    "project_path": "unmaintained/kvkbd",
+    "repo_path": "unmaintained/kvkbd"
+  },
+  "kwallet": {
+    "description": "KWallet: Credential Storage",
+    "name": "kwallet",
+    "project_path": "frameworks/kwallet",
+    "repo_path": "frameworks/kwallet"
+  },
+  "kwallet-pam": {
+    "description": "PAM Integration with KWallet - Unlock KWallet when you login",
+    "name": "kwallet-pam",
+    "project_path": "kde/workspace/kwallet-pam",
+    "repo_path": "plasma/kwallet-pam"
+  },
+  "kwalletmanager": {
+    "description": "Tool to manage the passwords on your system",
+    "name": "kwalletmanager",
+    "project_path": "kde/kdeutils/kwalletmanager",
+    "repo_path": "utilities/kwalletmanager"
+  },
+  "kwave": {
+    "description": "Sound editor by KDE",
+    "name": "kwave",
+    "project_path": "kde/kdemultimedia/kwave",
+    "repo_path": "multimedia/kwave"
+  },
+  "kwayland": {
+    "description": "KWayland provides a Qt-style Client and Server library wrapper for the Wayland libraries.",
+    "name": "kwayland",
+    "project_path": "kde/workspace/kwayland",
+    "repo_path": "plasma/kwayland"
+  },
+  "kwayland-integration": {
+    "description": "Integration plugins for various KDE frameworks for the Wayland windowing system",
+    "name": "kwayland-integration",
+    "project_path": "kde/workspace/kwayland-integration",
+    "repo_path": "plasma/kwayland-integration"
+  },
+  "kwayland-server": {
+    "description": "Wayland Server Components built on KDE Frameworks",
+    "name": "kwayland-server",
+    "project_path": "kde/workspace/kwayland-server",
+    "repo_path": "plasma/kwayland-server"
+  },
+  "kweather": {
+    "description": "Weather application for Plasma Mobile",
+    "name": "kweather",
+    "project_path": "extragear/utils/kweather",
+    "repo_path": "utilities/kweather"
+  },
+  "kweathercore": {
+    "description": "Library to facilitate retrieval of weather information including forecasts and alerts",
+    "name": "kweathercore",
+    "project_path": "extragear/libs/kweathercore",
+    "repo_path": "libraries/kweathercore"
+  },
+  "kwebkitpart": {
+    "description": "WebKit browser component available as KPart",
+    "name": "kwebkitpart",
+    "project_path": "extragear/base/kwebkitpart",
+    "repo_path": "libraries/kwebkitpart"
+  },
+  "kwhiteboard": {
+    "description": "KWhiteboard is a shared whiteboard application built with Telepathy. It allows you to run a shared whiteboard session with Instant Messaging contacts.",
+    "name": "kwhiteboard",
+    "project_path": "unmaintained/kwhiteboard",
+    "repo_path": "unmaintained/kwhiteboard"
+  },
+  "kwidgetsaddons": {
+    "description": "KWidgetsAddons",
+    "name": "kwidgetsaddons",
+    "project_path": "frameworks/kwidgetsaddons",
+    "repo_path": "frameworks/kwidgetsaddons"
+  },
+  "kwin": {
+    "description": "Easy to use, but flexible, X Window Manager and Wayland Compositor",
+    "name": "kwin",
+    "project_path": "kde/workspace/kwin",
+    "repo_path": "plasma/kwin"
+  },
+  "kwindowsaddons": {
+    "description": "Runtime components for KDE software on Windows",
+    "name": "kwindowsaddons",
+    "project_path": "playground/base/kwindowsaddons",
+    "repo_path": "libraries/kwindowsaddons"
+  },
+  "kwindowsystem": {
+    "description": "KWindowSystem",
+    "name": "kwindowsystem",
+    "project_path": "frameworks/kwindowsystem",
+    "repo_path": "frameworks/kwindowsystem"
+  },
+  "kwooty": {
+    "description": "Friendly newsgroup binary downloader for Usenet",
+    "name": "kwooty",
+    "project_path": "playground/network/kwooty",
+    "repo_path": "network/kwooty"
+  },
+  "kwordquiz": {
+    "description": "Flash Card Trainer",
+    "name": "kwordquiz",
+    "project_path": "kde/kdeedu/kwordquiz",
+    "repo_path": "education/kwordquiz"
+  },
+  "kwrited": {
+    "description": "Listen to traditional system notifications",
+    "name": "kwrited",
+    "project_path": "kde/workspace/kwrited",
+    "repo_path": "plasma/kwrited"
+  },
+  "kxmlgui": {
+    "description": "KXMLGUI",
+    "name": "kxmlgui",
+    "project_path": "frameworks/kxmlgui",
+    "repo_path": "frameworks/kxmlgui"
+  },
+  "kxmlrpcclient": {
+    "description": "KXMLRPCClient - Library to assist working with XML-RPC APIs",
+    "name": "kxmlrpcclient",
+    "project_path": "frameworks/kxmlrpcclient",
+    "repo_path": "frameworks/kxmlrpcclient"
+  },
+  "kxstitch": {
+    "description": "Cross stitch pattern and chart creation",
+    "name": "kxstitch",
+    "project_path": "extragear/graphics/kxstitch",
+    "repo_path": "graphics/kxstitch"
+  },
+  "labplot": {
+    "description": "LabPlot is a FREE, open source and cross-platform Data Visualization and Analysis software accessible to everyone.",
+    "name": "labplot",
+    "project_path": "extragear/edu/labplot",
+    "repo_path": "education/labplot"
+  },
+  "lancelot": {
+    "description": "Alternative launcher for Plasma with a more complete set of features compared to the default",
+    "name": "lancelot",
+    "project_path": "playground/base/lancelot",
+    "repo_path": "plasma/lancelot"
+  },
+  "latte-dock": {
+    "description": "Replacement dock for Plasma desktops, providing an elegant and intuitive experience for your tasks and plasmoids",
+    "name": "latte-dock",
+    "project_path": "extragear/base/latte-dock",
+    "repo_path": "plasma/latte-dock"
+  },
+  "layer-shell-qt": {
+    "description": "Qt component to allow applications to make use of the Wayland wl-layer-shell protocol.",
+    "name": "layer-shell-qt",
+    "project_path": "kde/workspace/layer-shell-qt",
+    "repo_path": "plasma/layer-shell-qt"
+  },
+  "libbluedevil": {
+    "description": "KDE bluetooth framework libraries.",
+    "name": "libbluedevil",
+    "project_path": "unmaintained/libbluedevil",
+    "repo_path": "unmaintained/libbluedevil"
+  },
+  "libdebconf-kde": {
+    "description": "A library that talks debconf protocol used to present questions",
+    "name": "libdebconf-kde",
+    "project_path": "extragear/sysadmin/libdebconf-kde",
+    "repo_path": "system/libdebconf-kde"
+  },
+  "libechonest": {
+    "description": "Qt library for communicating with The Echo Nest.",
+    "name": "libechonest",
+    "project_path": "unmaintained/libechonest",
+    "repo_path": "unmaintained/libechonest"
+  },
+  "libgpg-error": {
+    "description": null,
+    "name": "libgpg-error",
+    "project_path": "third-party/libgpg-error",
+    "repo_path": null
+  },
+  "libgravatar": {
+    "description": "Library that provides Gravatar support",
+    "name": "libgravatar",
+    "project_path": "kde/pim/libgravatar",
+    "repo_path": "pim/libgravatar"
+  },
+  "libkcddb": {
+    "description": "Library used to retrieve audio CD metadata from the Internet",
+    "name": "libkcddb",
+    "project_path": "kde/kdemultimedia/libkcddb",
+    "repo_path": "multimedia/libkcddb"
+  },
+  "libkcompactdisc": {
+    "description": "Library for interfacing with CDs",
+    "name": "libkcompactdisc",
+    "project_path": "kde/kdemultimedia/libkcompactdisc",
+    "repo_path": "multimedia/libkcompactdisc"
+  },
+  "libkcw": {
+    "description": "A minimal toolkit for win32 API required to build up the console wrapper.",
+    "name": "libkcw",
+    "project_path": "unmaintained/libkcw",
+    "repo_path": "unmaintained/libkcw"
+  },
+  "libkdcraw": {
+    "description": "C++ interface around LibRaw library used to decode RAW picture files",
+    "name": "libkdcraw",
+    "project_path": "kde/kdegraphics/libs/libkdcraw",
+    "repo_path": "graphics/libkdcraw"
+  },
+  "libkdeedu": {
+    "description": "Libraries used by KDE Education applications",
+    "name": "libkdeedu",
+    "project_path": "unmaintained/libkdeedu",
+    "repo_path": "unmaintained/libkdeedu"
+  },
+  "libkdegames": {
+    "description": "Common code and data for many KDE games",
+    "name": "libkdegames",
+    "project_path": "kde/kdegames/libkdegames",
+    "repo_path": "games/libkdegames"
+  },
+  "libkdepim": {
+    "description": "Library for common KDE PIM applications",
+    "name": "libkdepim",
+    "project_path": "kde/pim/libkdepim",
+    "repo_path": "pim/libkdepim"
+  },
+  "libkeduvocdocument": {
+    "description": "Library to parse, convert, and manipulate KVTML files",
+    "name": "libkeduvocdocument",
+    "project_path": "kde/kdeedu/libkeduvocdocument",
+    "repo_path": "education/libkeduvocdocument"
+  },
+  "libkexiv2": {
+    "description": "Wrapper around Exiv2 library to manipulate picture metadata as EXIF and XMP",
+    "name": "libkexiv2",
+    "project_path": "kde/kdegraphics/libs/libkexiv2",
+    "repo_path": "graphics/libkexiv2"
+  },
+  "libkface": {
+    "description": "Qt/C++ library for KDE applications to perform face recognition and detection over pictures.",
+    "name": "libkface",
+    "project_path": "unmaintained/libkface",
+    "repo_path": "unmaintained/libkface"
+  },
+  "libkfbapi": {
+    "description": "A library for accessing Facebook services.",
+    "name": "libkfbapi",
+    "project_path": "unmaintained/libkfbapi",
+    "repo_path": "unmaintained/libkfbapi"
+  },
+  "libkgapi": {
+    "description": "Library for accessing various Google services via their public API",
+    "name": "libkgapi",
+    "project_path": "kde/pim/libkgapi",
+    "repo_path": "pim/libkgapi"
+  },
+  "libkgeomap": {
+    "description": "Wrapper around different world-map components to browse and arrange photos over a map",
+    "name": "libkgeomap",
+    "project_path": "kde/kdegraphics/libs/libkgeomap",
+    "repo_path": "graphics/libkgeomap"
+  },
+  "libkimageannotator": {
+    "description": "Utility for annotating images",
+    "name": "libkimageannotator",
+    "project_path": "playground/libs/libkimageannotator",
+    "repo_path": "libraries/libkimageannotator"
+  },
+  "libkipi": {
+    "description": "Qt/C++ interface to use kipi-plugins from KDE image management programs",
+    "name": "libkipi",
+    "project_path": "kde/kdegraphics/libs/libkipi",
+    "repo_path": "graphics/libkipi"
+  },
+  "libkleo": {
+    "description": "Library that provides cryptography support for mails",
+    "name": "libkleo",
+    "project_path": "kde/pim/libkleo",
+    "repo_path": "pim/libkleo"
+  },
+  "libkmahjongg": {
+    "description": "Common code, backgrounds and tile sets for games using Mahjongg tiles",
+    "name": "libkmahjongg",
+    "project_path": "kde/kdegames/libkmahjongg",
+    "repo_path": "games/libkmahjongg"
+  },
+  "libkomparediff2": {
+    "description": "Library to compare files and strings, used in Kompare and KDevelop",
+    "name": "libkomparediff2",
+    "project_path": "kde/kdesdk/libkomparediff2",
+    "repo_path": "sdk/libkomparediff2"
+  },
+  "libkoralle": {
+    "description": "a library for parsing data in the Resource Interchange File Format (RIFF)",
+    "name": "libkoralle",
+    "project_path": "unmaintained/libkoralle",
+    "repo_path": "unmaintained/libkoralle"
+  },
+  "libksane": {
+    "description": "Library providing QWidget with all the logic to interface scanners",
+    "name": "libksane",
+    "project_path": "kde/kdegraphics/libs/libksane",
+    "repo_path": "graphics/libksane"
+  },
+  "libkscreen": {
+    "description": "KDE's screen management software",
+    "name": "libkscreen",
+    "project_path": "kde/workspace/libkscreen",
+    "repo_path": "plasma/libkscreen"
+  },
+  "libksieve": {
+    "description": "Library which manages Sieve support",
+    "name": "libksieve",
+    "project_path": "kde/pim/libksieve",
+    "repo_path": "pim/libksieve"
+  },
+  "libksysguard": {
+    "description": "Library to retrieve information on the current status of computer hardware",
+    "name": "libksysguard",
+    "project_path": "kde/workspace/libksysguard",
+    "repo_path": "plasma/libksysguard"
+  },
+  "libktorrent": {
+    "description": "BitTorrent protocol implementation",
+    "name": "libktorrent",
+    "project_path": "kde/kdenetwork/libktorrent",
+    "repo_path": "network/libktorrent"
+  },
+  "libkubuntu": {
+    "description": "Library for Kubuntu platform integration",
+    "name": "libkubuntu",
+    "project_path": "playground/base/libkubuntu",
+    "repo_path": "libraries/libkubuntu"
+  },
+  "libkvkontakte": {
+    "description": "C++/KF5 library for asynchronous interaction with VK social network web API",
+    "name": "libkvkontakte",
+    "project_path": "extragear/libs/libkvkontakte",
+    "repo_path": "libraries/libkvkontakte"
+  },
+  "liblikeback": {
+    "description": "A library that allows users to easily give feedback on software\nby embedding itself into every window and providing straight forward dialogs to\nexpress like or dislike of something.",
+    "name": "liblikeback",
+    "project_path": "unmaintained/liblikeback",
+    "repo_path": "unmaintained/liblikeback"
+  },
+  "libmediawiki": {
+    "description": "C++ interface for MediaWiki-based web services such as Wikipedia",
+    "name": "libmediawiki",
+    "project_path": "extragear/libs/libmediawiki",
+    "repo_path": "libraries/libmediawiki"
+  },
+  "libplasma": {
+    "description": "Plasma library and runtime components",
+    "name": "libplasma",
+    "project_path": "kde/workspace/libplasma",
+    "repo_path": "plasma/libplasma"
+  },
+  "libqaccessibilityclient": {
+    "description": "Accessibilty tools helper library, used e.g. by screen readers",
+    "name": "libqaccessibilityclient",
+    "project_path": "extragear/libs/libqaccessibilityclient",
+    "repo_path": "libraries/libqaccessibilityclient"
+  },
+  "libqapt": {
+    "description": "A Qt wrapper library/APT implementation around the libapt-pkg library",
+    "name": "libqapt",
+    "project_path": "extragear/sysadmin/libqapt",
+    "repo_path": "system/libqapt"
+  },
+  "libqgit2": {
+    "description": "Qt wrapper library around the libgit2 git access library",
+    "name": "libqgit2",
+    "project_path": "playground/libs/libqgit2",
+    "repo_path": "libraries/libqgit2"
+  },
+  "libqinfinity": {
+    "description": "Qt wrapper around libinfinity, a library for collaborative editing",
+    "name": "libqinfinity",
+    "project_path": "unmaintained/libqinfinity",
+    "repo_path": "unmaintained/libqinfinity"
+  },
+  "libqmycroft": {
+    "description": "Mycroft integration library using a mock api to integrate apps as skill in mycroft",
+    "name": "libqmycroft",
+    "project_path": "playground/libs/libqmycroft",
+    "repo_path": "libraries/libqmycroft"
+  },
+  "libqsystemd": {
+    "description": "Simple Qt systemd interface library",
+    "name": "libqsystemd",
+    "project_path": "playground/libs/libqsystemd",
+    "repo_path": "libraries/libqsystemd"
+  },
+  "libquotient": {
+    "description": null,
+    "name": "libquotient",
+    "project_path": "third-party/libquotient",
+    "repo_path": null
+  },
+  "libqzeitgeist": {
+    "description": "A Qt interface to the Zeitgeist event tracking system",
+    "name": "libqzeitgeist",
+    "project_path": "kdesupport/libqzeitgeist",
+    "repo_path": "unmaintained/libqzeitgeist"
+  },
+  "libstreamanalyzer": {
+    "description": "Strigi libstreamanalyzer",
+    "name": "libstreamanalyzer",
+    "project_path": "kdesupport/strigi/libstreamanalyzer",
+    "repo_path": "unmaintained/libstreamanalyzer"
+  },
+  "libstreams": {
+    "description": "Strigi libstreams",
+    "name": "libstreams",
+    "project_path": "kdesupport/strigi/libstreams",
+    "repo_path": "unmaintained/libstreams"
+  },
+  "libtagaro": {
+    "description": "Replacement for libkdegames which will allow KDE games to scale to mobile form factors, and to fully take advantage of Qt 4 facilities.",
+    "name": "libtagaro",
+    "project_path": "unmaintained/libtagaro",
+    "repo_path": "unmaintained/libtagaro"
+  },
+  "libtmdbqt": {
+    "description": "Library that can retrieve information about movies from the TMDb web service",
+    "name": "libtmdbqt",
+    "project_path": "playground/network/libtmdbqt",
+    "repo_path": "libraries/libtmdbqt"
+  },
+  "licensedigger": {
+    "description": "Tools to convert existing license headers to SPDX compliant headers",
+    "name": "licensedigger",
+    "project_path": "playground/sdk/licensedigger",
+    "repo_path": "sdk/licensedigger"
+  },
+  "licentia": {
+    "description": "Choose a license for your project",
+    "name": "licentia",
+    "project_path": "kdereview/licentia",
+    "repo_path": "sdk/licentia"
+  },
+  "lightdm-kde-greeter": {
+    "description": "Login screen using the LightDM framework.\n \n* \"LightDM project\":https://launchpad.net/lightdm\n* \"Bug Tracker\":https://bugs.kde.org/describecomponents.cgi?product=lightdm",
+    "name": "lightdm-kde-greeter",
+    "project_path": "playground/base/lightdm-kde-greeter",
+    "repo_path": "plasma/lightdm-kde-greeter"
+  },
+  "liquidshell": {
+    "description": "Basic desktop shell using QtWidgets",
+    "name": "liquidshell",
+    "project_path": "extragear/base/liquidshell",
+    "repo_path": "system/liquidshell"
+  },
+  "lokalize": {
+    "description": "Computer-aided translation",
+    "name": "lokalize",
+    "project_path": "kde/kdesdk/lokalize",
+    "repo_path": "sdk/lokalize"
+  },
+  "lskat": {
+    "description": "Lieutenant Skat (from German Offiziersskat) is a fun and engaging card game for two players",
+    "name": "lskat",
+    "project_path": "kde/kdegames/lskat",
+    "repo_path": "games/lskat"
+  },
+  "macports-kde": {
+    "description": "Macports Tree for KDE Software",
+    "name": "macports-kde",
+    "project_path": "playground/sdk/macports-kde",
+    "repo_path": "unmaintained/macports-kde"
+  },
+  "mailcommon": {
+    "description": "Library which provides support for mail applications",
+    "name": "mailcommon",
+    "project_path": "kde/pim/mailcommon",
+    "repo_path": "pim/mailcommon"
+  },
+  "mailimporter": {
+    "description": "Library that implements importing of emails from various other email clients",
+    "name": "mailimporter",
+    "project_path": "kde/pim/mailimporter",
+    "repo_path": "pim/mailimporter"
+  },
+  "mangonel": {
+    "description": "Simple and pretty application launcher",
+    "name": "mangonel",
+    "project_path": "extragear/base/mangonel",
+    "repo_path": "utilities/mangonel"
+  },
+  "marble": {
+    "description": "Virtual Globe and World Atlas that you can use to learn more about the Earth",
+    "name": "marble",
+    "project_path": "kde/kdeedu/marble",
+    "repo_path": "education/marble"
+  },
+  "mark": {
+    "description": "Scientific tool for data annotation",
+    "name": "mark",
+    "project_path": "playground/base/mark",
+    "repo_path": "education/mark"
+  },
+  "markdownpart": {
+    "description": "KPart for rendering Markdown content",
+    "name": "markdownpart",
+    "project_path": "kde/kdeutils/markdownpart",
+    "repo_path": "utilities/markdownpart"
+  },
+  "marknote": {
+    "description": "A simple markdown note management app",
+    "name": "marknote",
+    "project_path": "extragear/office/marknote",
+    "repo_path": "office/marknote"
+  },
+  "massif-visualizer": {
+    "description": "Visualizer for Valgrind Massif data files",
+    "name": "massif-visualizer",
+    "project_path": "extragear/sdk/massif-visualizer",
+    "repo_path": "sdk/massif-visualizer"
+  },
+  "maui-accounts-dbus-daemon": {
+    "description": "",
+    "name": "maui-accounts-dbus-daemon",
+    "project_path": "playground/base/maui-accounts-dbus-daemon",
+    "repo_path": "maui/maui-accounts-dbus-daemon"
+  },
+  "maui-accounts-gui": {
+    "description": "",
+    "name": "maui-accounts-gui",
+    "project_path": "playground/base/maui-accounts-gui",
+    "repo_path": "maui/maui-accounts-gui"
+  },
+  "maui-agenda": {
+    "description": "Maui Calendar App",
+    "name": "maui-agenda",
+    "project_path": "playground/base/agenda",
+    "repo_path": "maui/agenda"
+  },
+  "maui-booth": {
+    "description": "A convergent camera app",
+    "name": "maui-booth",
+    "project_path": "playground/base/maui-booth",
+    "repo_path": "maui/booth"
+  },
+  "maui-clip": {
+    "description": "Video player and video collection manager",
+    "name": "maui-clip",
+    "project_path": "playground/base/maui-clip",
+    "repo_path": "maui/clip"
+  },
+  "maui-communicator": {
+    "description": "Contacts and dialer application",
+    "name": "maui-communicator",
+    "project_path": "playground/base/maui-communicator",
+    "repo_path": "maui/communicator"
+  },
+  "maui-era": {
+    "description": "Maui Clock app",
+    "name": "maui-era",
+    "project_path": "playground/base/era",
+    "repo_path": "maui/era"
+  },
+  "maui-fiery": {
+    "description": "A convergent web browser",
+    "name": "maui-fiery",
+    "project_path": "playground/base/maui-fiery",
+    "repo_path": "maui/fiery"
+  },
+  "maui-libdavclient": {
+    "description": "DAV protocol support for Maui applications",
+    "name": "maui-libdavclient",
+    "project_path": "playground/base/maui-libdavclient",
+    "repo_path": "maui/maui-libdavclient"
+  },
+  "maui-pix": {
+    "description": "Image gallery application",
+    "name": "maui-pix",
+    "project_path": "playground/base/maui-pix",
+    "repo_path": "maui/pix"
+  },
+  "maui-shelf": {
+    "description": "Document and EBook collection manager",
+    "name": "maui-shelf",
+    "project_path": "playground/base/maui-shelf",
+    "repo_path": "maui/shelf"
+  },
+  "maui-station": {
+    "description": "Convergent terminal emulator",
+    "name": "maui-station",
+    "project_path": "playground/base/maui-station",
+    "repo_path": "maui/station"
+  },
+  "maui-strike": {
+    "description": "Strike is a simple minimal IDE for the Linux phones. Code, build, and run from the phone.",
+    "name": "maui-strike",
+    "project_path": "playground/sdk/strike",
+    "repo_path": "maui/strike"
+  },
+  "mauikit": {
+    "description": "Templated convergent controls and multi-platform utilities for Maui applications",
+    "name": "mauikit",
+    "project_path": "playground/libs/mauikit",
+    "repo_path": "maui/mauikit"
+  },
+  "mauikit-accounts": {
+    "description": "MauiKit utilities to handle User Accounts",
+    "name": "mauikit-accounts",
+    "project_path": "playground/libs/mauikit-accounts",
+    "repo_path": "maui/mauikit-accounts"
+  },
+  "mauikit-calendar": {
+    "description": "Calendar support components for Maui applications",
+    "name": "mauikit-calendar",
+    "project_path": "playground/base/mauikit-calendar",
+    "repo_path": "maui/mauikit-calendar"
+  },
+  "mauikit-documents": {
+    "description": "MauiKit QtQuick plugins for text editing",
+    "name": "mauikit-documents",
+    "project_path": "playground/base/mauikit-documents",
+    "repo_path": "maui/mauikit-documents"
+  },
+  "mauikit-filebrowsing": {
+    "description": "MauiKit File Browsing utilities and controls",
+    "name": "mauikit-filebrowsing",
+    "project_path": "playground/libs/mauikit-filebrowsing",
+    "repo_path": "maui/mauikit-filebrowsing"
+  },
+  "mauikit-imagetools": {
+    "description": "MauiKit Image Tools Components",
+    "name": "mauikit-imagetools",
+    "project_path": "playground/libs/mauikit-imagetools",
+    "repo_path": "maui/mauikit-imagetools"
+  },
+  "mauikit-terminal": {
+    "description": "Terminal support components for Maui applications",
+    "name": "mauikit-terminal",
+    "project_path": "playground/base/mauikit-terminal",
+    "repo_path": "maui/mauikit-terminal"
+  },
+  "mauikit-texteditor": {
+    "description": "MauiKit Text Editor components",
+    "name": "mauikit-texteditor",
+    "project_path": "playground/libs/mauikit-texteditor",
+    "repo_path": "maui/mauikit-texteditor"
+  },
+  "mauiman": {
+    "description": "Maui Manager Library. Server and public library API.",
+    "name": "mauiman",
+    "project_path": "playground/base/mauiman",
+    "repo_path": "maui/mauiman"
+  },
+  "mbox-importer": {
+    "description": "Wizard to assist with importing MBox email archives into Akonadi",
+    "name": "mbox-importer",
+    "project_path": "kde/pim/mbox-importer",
+    "repo_path": "pim/mbox-importer"
+  },
+  "melon": {
+    "description": "Desktop QML file manager",
+    "name": "melon",
+    "project_path": "playground/system/melon",
+    "repo_path": "system/melon"
+  },
+  "merkuro": {
+    "description": "A calendar application using Akonadi to sync with external services (Nextcloud, GMail, ...)",
+    "name": "merkuro",
+    "project_path": "kde/pim/merkuro",
+    "repo_path": "pim/merkuro"
+  },
+  "messagelib": {
+    "description": "Library components for messages (e.g. displaying Akonadi collections)",
+    "name": "messagelib",
+    "project_path": "kde/pim/messagelib",
+    "repo_path": "pim/messagelib"
+  },
+  "milou": {
+    "description": "A dedicated search application built on top of Baloo",
+    "name": "milou",
+    "project_path": "kde/workspace/milou",
+    "repo_path": "plasma/milou"
+  },
+  "mimetreeparser": {
+    "description": "Parser for MIME trees",
+    "name": "mimetreeparser",
+    "project_path": "playground/pim/mimetreeparser",
+    "repo_path": "pim/mimetreeparser"
+  },
+  "ministro": {
+    "description": "Ministro is system wide library installer/provider for android platform.",
+    "name": "ministro",
+    "project_path": "unmaintained/necessitas/ministro",
+    "repo_path": "unmaintained/ministro"
+  },
+  "minuet": {
+    "description": "Free and open-source software for music education",
+    "name": "minuet",
+    "project_path": "kde/kdeedu/minuet",
+    "repo_path": "education/minuet"
+  },
+  "modemmanager-qt": {
+    "description": "Qt wrapper for ModemManager DBus API.\n\nReport bugs in bugs.kde.org, under product frameworks-modemmanager-qt.",
+    "name": "modemmanager-qt",
+    "project_path": "frameworks/modemmanager-qt",
+    "repo_path": "frameworks/modemmanager-qt"
+  },
+  "mplayerthumbs": {
+    "description": "MPlayer based thumbnail generator for video files.",
+    "name": "mplayerthumbs",
+    "project_path": "unmaintained/mplayerthumbs",
+    "repo_path": "unmaintained/mplayerthumbs"
+  },
+  "mpvqt": {
+    "description": "MpvQt is a libmpv wrapper for QtQuick2 and QML",
+    "name": "mpvqt",
+    "project_path": "kde/applications/mpvqt",
+    "repo_path": "libraries/mpvqt"
+  },
+  "mrdanga-player": {
+    "description": "Player for a percussion instrument from India of ancient origin.",
+    "name": "mrdanga-player",
+    "project_path": "unmaintained/mrdanga-player",
+    "repo_path": "unmaintained/mrdanga-player"
+  },
+  "mtp-server": {
+    "description": "MTP server allowing file access to Plasma Mobile devices",
+    "name": "mtp-server",
+    "project_path": "playground/mobile/mtp-server",
+    "repo_path": "plasma-mobile/mtp-server"
+  },
+  "mula": {
+    "description": "Multi Language Dictionary with online, offline dictionary, translation and text-to-speech support.",
+    "name": "mula",
+    "project_path": "unmaintained/mula",
+    "repo_path": "unmaintained/mula"
+  },
+  "muon": {
+    "description": "A collection of package management tools for Debian-based systems",
+    "name": "muon",
+    "project_path": "extragear/sysadmin/muon",
+    "repo_path": "system/muon"
+  },
+  "mycroft-bigscreen-setup": {
+    "description": "Bigscreen first boot mycroft configuration and setup skill",
+    "name": "mycroft-bigscreen-setup",
+    "project_path": "playground/utils/mycroft-bigscreen-setup",
+    "repo_path": "plasma-bigscreen/mycroft-bigscreen-setup"
+  },
+  "mycroft-gui": {
+    "description": "The Graphical User Interface used by the Mycroft Mark II and more",
+    "name": "mycroft-gui",
+    "project_path": "playground/system/mycroft-gui",
+    "repo_path": "system/mycroft-gui"
+  },
+  "mycroft-plasmoid": {
+    "description": "Plasma integration of different Mycroft AI services",
+    "name": "mycroft-plasmoid",
+    "project_path": "extragear/utils/mycroft-plasmoid",
+    "repo_path": "utilities/mycroft-plasmoid"
+  },
+  "mycroft-ptt-client": {
+    "description": "A simple push to talk client for mycroft based on libinput for USB remotes or external devices that wish to activate the mycroft listener with a button press for Plasma Bigscreen",
+    "name": "mycroft-ptt-client",
+    "project_path": "playground/utils/mycroft-ptt-client",
+    "repo_path": "plasma-bigscreen/mycroft-ptt-client"
+  },
+  "mycroft-skill-installer": {
+    "description": "Voice applications and mycroft skills installer for plasma bigscreen",
+    "name": "mycroft-skill-installer",
+    "project_path": "playground/utils/mycroft-skill-installer",
+    "repo_path": "plasma-bigscreen/mycroft-skill-installer"
+  },
+  "necessitas-installer-framework": {
+    "description": "Qt's Installer Framework with a few custom patches",
+    "name": "necessitas-installer-framework",
+    "project_path": "unmaintained/necessitas/necessitas-installer-framework",
+    "repo_path": "unmaintained/necessitas-installer-framework"
+  },
+  "necessitas-tools": {
+    "description": "Tools and scripts used to build Necessitas SDK.",
+    "name": "necessitas-tools",
+    "project_path": "unmaintained/necessitas/necessitas-tools",
+    "repo_path": "unmaintained/necessitas-tools"
+  },
+  "neochat": {
+    "description": "A client for matrix, the decentralized communication protocol",
+    "name": "neochat",
+    "project_path": "extragear/network/neochat",
+    "repo_path": "network/neochat"
+  },
+  "neon-docker-images": {
+    "description": "",
+    "name": "neon-docker-images",
+    "project_path": "neon/docker-images",
+    "repo_path": "neon/docker-images"
+  },
+  "neon-neon-repositories": {
+    "description": "",
+    "name": "neon-neon-repositories",
+    "project_path": "neon/neon/repositories",
+    "repo_path": "neon/neon/repositories"
+  },
+  "nepomuk-core": {
+    "description": "The core Nepomuk system contains of the central services like file indexing, file system monitoring, query, and of course storage, as well as the corresponding client libraries.\n\nThis is a compile time dependency for kde-runtime.",
+    "name": "nepomuk-core",
+    "project_path": "unmaintained/nepomuk-core",
+    "repo_path": "unmaintained/nepomuk-core"
+  },
+  "nepomuk-system-tray": {
+    "description": "More enchanced system tray for Nepomuk.",
+    "name": "nepomuk-system-tray",
+    "project_path": "unmaintained/nepomuk-system-tray",
+    "repo_path": "unmaintained/nepomuk-system-tray"
+  },
+  "nepomuk-tools": {
+    "description": "Collection of nepomuk development tools(mostly command line): working with nepomuk server, services and so on",
+    "name": "nepomuk-tools",
+    "project_path": "unmaintained/nepomuk-tools",
+    "repo_path": "unmaintained/nepomuk-tools"
+  },
+  "nepomuk-web-extractor": {
+    "description": "Extract information for Nepomuk resources from various locations.\nMore information is available in following wiki pages: [[https://techbase.kde.org/Projects/Nepomuk/WebExtractor]]",
+    "name": "nepomuk-web-extractor",
+    "project_path": "unmaintained/nepomuk-web-extractor",
+    "repo_path": "unmaintained/nepomuk-web-extractor"
+  },
+  "nepomuk-webminer": {
+    "description": "Finds additional metadata on the internet (via Python plugins) and adds it to Nepomuk.",
+    "name": "nepomuk-webminer",
+    "project_path": "unmaintained/nepomuk-webminer",
+    "repo_path": "unmaintained/nepomuk-webminer"
+  },
+  "nepomuk-widgets": {
+    "description": "The Library containing the Nepomuk Widgets.",
+    "name": "nepomuk-widgets",
+    "project_path": "unmaintained/nepomuk-widgets",
+    "repo_path": "unmaintained/nepomuk-widgets"
+  },
+  "nepomukannotation": {
+    "description": "A library and a set of tools that provide annotation suggestions.",
+    "name": "nepomukannotation",
+    "project_path": "unmaintained/nepomukannotation",
+    "repo_path": "unmaintained/nepomukannotation"
+  },
+  "nepomukextras": {
+    "description": "A set of convinience classes for the Nepomuk semantic desktop.",
+    "name": "nepomukextras",
+    "project_path": "unmaintained/nepomukextras",
+    "repo_path": "unmaintained/nepomukextras"
+  },
+  "nepomukshell": {
+    "description": "NepSaK - The Nepomuk Swiss Army Knife aka. NepomukShell is a maintenance and debugging tool intended for developers. \n\nIt allows to browse, query, and edit Nepomuk resources.",
+    "name": "nepomukshell",
+    "project_path": "unmaintained/nepomukshell",
+    "repo_path": "unmaintained/nepomukshell"
+  },
+  "nepomuktvnamer": {
+    "description": "A command line tool, service, and desktop action to fetch information about TV Shows from thetvdb.com and store it into Nepomuk.",
+    "name": "nepomuktvnamer",
+    "project_path": "unmaintained/nepomuktvnamer",
+    "repo_path": "unmaintained/nepomuktvnamer"
+  },
+  "networkmanagement": {
+    "description": "Control panel and widget network connections.",
+    "name": "networkmanagement",
+    "project_path": "unmaintained/networkmanagement",
+    "repo_path": "unmaintained/networkmanagement"
+  },
+  "networkmanager-qt": {
+    "description": "Qt wrapper for NetworkManager API.\n\nReport bugs in bugs.kde.org, under product frameworks-networkmanager-qt.",
+    "name": "networkmanager-qt",
+    "project_path": "frameworks/networkmanager-qt",
+    "repo_path": "frameworks/networkmanager-qt"
+  },
+  "nomad-style": {
+    "description": "",
+    "name": "nomad-style",
+    "project_path": "playground/base/nomad-style",
+    "repo_path": "maui/nomad-style"
+  },
+  "nongurigaeru": {
+    "description": "The missing Foundation library for Qt GUI apps.",
+    "name": "nongurigaeru",
+    "project_path": "kdereview/nongurigaeru",
+    "repo_path": "libraries/nongurigaeru"
+  },
+  "nota": {
+    "description": "Multi-platform text editor",
+    "name": "nota",
+    "project_path": "playground/base/nota",
+    "repo_path": "maui/nota"
+  },
+  "notably": {
+    "description": "A semantic note taking application based on the Nepomuk framework.",
+    "name": "notably",
+    "project_path": "unmaintained/notably",
+    "repo_path": "unmaintained/notably"
+  },
+  "notae": {
+    "description": "A simple note taking application that automatically saves your work",
+    "name": "notae",
+    "project_path": "playground/utils/notae",
+    "repo_path": "utilities/notae"
+  },
+  "notificationsurvey": {
+    "description": "For more information, see https://community.kde.org/Elegance/Notification_Study",
+    "name": "notificationsurvey",
+    "project_path": "unmaintained/notificationsurvey",
+    "repo_path": "unmaintained/notificationsurvey"
+  },
+  "ocean-sound-theme": {
+    "description": "Ocean Sound Theme for Plasma",
+    "name": "ocean-sound-theme",
+    "project_path": "kde/workspace/ocean-sound-theme",
+    "repo_path": "plasma/ocean-sound-theme"
+  },
+  "ocs-apiserver": {
+    "description": "Backend API server for the software store",
+    "name": "ocs-apiserver",
+    "project_path": "playground/www/ocs-apiserver",
+    "repo_path": "webapps/ocs-apiserver"
+  },
+  "ocs-cdn": {
+    "description": "Content delivery network for the software store",
+    "name": "ocs-cdn",
+    "project_path": "playground/www/ocs-cdn",
+    "repo_path": "webapps/ocs-cdn"
+  },
+  "ocs-fileserver": {
+    "description": "File server for the software store",
+    "name": "ocs-fileserver",
+    "project_path": "playground/www/ocs-fileserver",
+    "repo_path": "webapps/ocs-fileserver"
+  },
+  "ocs-server": {
+    "description": "A web server which provides OCS (Open Collaboration Services) functionality, and a web demo client",
+    "name": "ocs-server",
+    "project_path": "playground/www/ocs-server",
+    "repo_path": "webapps/ocs-server"
+  },
+  "ocs-webserver": {
+    "description": "Webserver for running a software store",
+    "name": "ocs-webserver",
+    "project_path": "playground/www/ocs-webserver",
+    "repo_path": "webapps/ocs-webserver"
+  },
+  "okteta": {
+    "description": "Hex editor for viewing and editing the raw data of files",
+    "name": "okteta",
+    "project_path": "extragear/utils/okteta",
+    "repo_path": "utilities/okteta"
+  },
+  "okular": {
+    "description": "KDE document viewer",
+    "name": "okular",
+    "project_path": "kde/kdegraphics/okular",
+    "repo_path": "graphics/okular"
+  },
+  "optiimage": {
+    "description": "Optimize your images with OptiImage, a useful image compressor that supports PNG, JPEG, WebP and SVG file types.",
+    "name": "optiimage",
+    "project_path": "playground/graphics/optiimage",
+    "repo_path": "graphics/optiimage"
+  },
+  "osx-patches": {
+    "description": "Fixes for KDE problems that occur on Apple OS X",
+    "name": "osx-patches",
+    "project_path": "playground/base/osx-patches",
+    "repo_path": "unmaintained/osx-patches"
+  },
+  "others-kde-br-promo": {
+    "description": "General repository for KDE Brazil promo material (artwork, templates, talks, etc)",
+    "name": "others-kde-br-promo",
+    "project_path": "others/kde-br-promo",
+    "repo_path": "unmaintained/kde-br-promo"
+  },
+  "others-kde-promo": {
+    "description": "This is an easy method for organizing KDE Promo materials.",
+    "name": "others-kde-promo",
+    "project_path": "others/kde-promo",
+    "repo_path": "unmaintained/kde-promo"
+  },
+  "others-kig-data": {
+    "description": "Course data for Kig, provided by KDE Edu.",
+    "name": "others-kig-data",
+    "project_path": "others/kde-edu-courses/kig-data",
+    "repo_path": "unmaintained/kig-data"
+  },
+  "others-krita-marketing": {
+    "description": "Working together to creating marketing and introduction documents for Krita",
+    "name": "others-krita-marketing",
+    "project_path": "others/krita-marketing",
+    "repo_path": "unmaintained/krita-marketing"
+  },
+  "others-kturtle-data": {
+    "description": "Course data for KTurtle, provided by KDE Edu.",
+    "name": "others-kturtle-data",
+    "project_path": "others/kde-edu-courses/kturtle-data",
+    "repo_path": "unmaintained/kturtle-data"
+  },
+  "others-kvtml-data": {
+    "description": "Course data for Vocabulary trainers, provided by KDE Edu.",
+    "name": "others-kvtml-data",
+    "project_path": "others/kde-edu-courses/kvtml-data",
+    "repo_path": "unmaintained/kvtml-data"
+  },
+  "oxygen": {
+    "description": "The Oxygen Style for Qt/KDE Applications",
+    "name": "oxygen",
+    "project_path": "kde/workspace/oxygen",
+    "repo_path": "plasma/oxygen"
+  },
+  "oxygen-fonts": {
+    "description": "The Oxygen font family. A desktop/gui font family for integrated use with the KDE desktop.",
+    "name": "oxygen-fonts",
+    "project_path": "unmaintained/oxygen-fonts",
+    "repo_path": "unmaintained/oxygen-fonts"
+  },
+  "oxygen-gtk": {
+    "description": "Port of the Oxygen widget theme to GTK",
+    "name": "oxygen-gtk",
+    "project_path": "playground/artwork/oxygen-gtk",
+    "repo_path": "plasma/oxygen-gtk"
+  },
+  "oxygen-icons": {
+    "description": "Oxygen icon theme",
+    "name": "oxygen-icons",
+    "project_path": "frameworks/oxygen-icons",
+    "repo_path": "frameworks/oxygen-icons"
+  },
+  "oxygen-sounds": {
+    "description": "The Oxygen Sound Theme",
+    "name": "oxygen-sounds",
+    "project_path": "kde/workspace/oxygen-sounds",
+    "repo_path": "plasma/oxygen-sounds"
+  },
+  "oxygen-transparent": {
+    "description": "Fork of the default KDE widget and window decoration theme (Oxygen) that supports transparency for application windows.",
+    "name": "oxygen-transparent",
+    "project_path": "unmaintained/oxygen-transparent",
+    "repo_path": "unmaintained/oxygen-transparent"
+  },
+  "packagekit-qt": {
+    "description": null,
+    "name": "packagekit-qt",
+    "project_path": "third-party/packagekit-qt",
+    "repo_path": null
+  },
+  "pairs": {
+    "description": "A memory and pairs game by KDE",
+    "name": "pairs",
+    "project_path": "unmaintained/pairs",
+    "repo_path": "unmaintained/pairs"
+  },
+  "palapeli": {
+    "description": "Palapeli is a single-player jigsaw puzzle game",
+    "name": "palapeli",
+    "project_path": "kde/kdegames/palapeli",
+    "repo_path": "games/palapeli"
+  },
+  "paleta": {
+    "description": "Color utilities",
+    "name": "paleta",
+    "project_path": "playground/base/paleta",
+    "repo_path": "maui/paleta"
+  },
+  "parley": {
+    "description": "Vocabulary Trainer",
+    "name": "parley",
+    "project_path": "kde/kdeedu/parley",
+    "repo_path": "education/parley"
+  },
+  "partitionmanager": {
+    "description": "Manage the disk devices, partitions and file systems on your computer",
+    "name": "partitionmanager",
+    "project_path": "kde/kdeadmin/partitionmanager",
+    "repo_path": "system/partitionmanager"
+  },
+  "peertube-voice-application": {
+    "description": "Peertube video player voice application and mycroft skill for Plasma Bigscreen",
+    "name": "peertube-voice-application",
+    "project_path": "playground/utils/peertube-voice-application",
+    "repo_path": "plasma-bigscreen/peertube-voice-application"
+  },
+  "perceptualcolor": {
+    "description": "Qt GUI components for choosing colors, with focus on an intuitive and perceptually uniform presentatio",
+    "name": "perceptualcolor",
+    "project_path": "playground/libs/perceptualcolor",
+    "repo_path": "libraries/perceptualcolor"
+  },
+  "perlkde": {
+    "description": "Perl bindings for libraries created by the KDE community.",
+    "name": "perlkde",
+    "project_path": "kde/kdebindings/perl/perlkde",
+    "repo_path": "unmaintained/perlkde"
+  },
+  "perlqt": {
+    "description": "Perl bindings for the Qt libraries.",
+    "name": "perlqt",
+    "project_path": "kde/kdebindings/perl/perlqt",
+    "repo_path": "unmaintained/perlqt"
+  },
+  "person-viewer": {
+    "description": "Simple address book application displaying info about aggregated contacts",
+    "name": "person-viewer",
+    "project_path": "playground/pim/person-viewer",
+    "repo_path": "unmaintained/person-viewer"
+  },
+  "peruse": {
+    "description": "A comic book viewer and creator based on Frameworks 5, for use on multiple form factors",
+    "name": "peruse",
+    "project_path": "extragear/graphics/peruse",
+    "repo_path": "graphics/peruse"
+  },
+  "phoneblocker": {
+    "description": "Application for blocking unwanted calls and messages on your Blackberry.",
+    "name": "phoneblocker",
+    "project_path": "unmaintained/phoneblocker",
+    "repo_path": "unmaintained/phoneblocker"
+  },
+  "phonon": {
+    "description": "Multi-platform sound framework for application developers",
+    "name": "phonon",
+    "project_path": "kdesupport/phonon",
+    "repo_path": "libraries/phonon"
+  },
+  "phonon-directshow": {
+    "description": "A DirectShow backend for the Phonon multimedia library.",
+    "name": "phonon-directshow",
+    "project_path": "unmaintained/phonon-directshow",
+    "repo_path": "unmaintained/phonon-directshow"
+  },
+  "phonon-gstreamer": {
+    "description": "GStreamer backend for the Phonon multimedia library",
+    "name": "phonon-gstreamer",
+    "project_path": "kdesupport/phonon-gstreamer",
+    "repo_path": "libraries/phonon-gstreamer"
+  },
+  "phonon-mmf": {
+    "description": "A MMF (Multimedia Framework Architecture) backend for the Phonon multimedia library.",
+    "name": "phonon-mmf",
+    "project_path": "unmaintained/phonon-mmf",
+    "repo_path": "unmaintained/phonon-mmf"
+  },
+  "phonon-mplayer": {
+    "description": "A MPlayer backend for the Phonon multimedia library.",
+    "name": "phonon-mplayer",
+    "project_path": "unmaintained/phonon-mplayer",
+    "repo_path": "unmaintained/phonon-mplayer"
+  },
+  "phonon-quicktime": {
+    "description": "A QuickTime backend for the Phonon multimedia library.",
+    "name": "phonon-quicktime",
+    "project_path": "unmaintained/phonon-quicktime",
+    "repo_path": "unmaintained/phonon-quicktime"
+  },
+  "phonon-vlc": {
+    "description": "VLC backend for the Phonon multimedia library",
+    "name": "phonon-vlc",
+    "project_path": "kdesupport/phonon-vlc",
+    "repo_path": "libraries/phonon-vlc"
+  },
+  "phonon-waveout": {
+    "description": "A WaveOut backend for the Phonon multimedia library.",
+    "name": "phonon-waveout",
+    "project_path": "unmaintained/phonon-waveout",
+    "repo_path": "unmaintained/phonon-waveout"
+  },
+  "phonon-xine": {
+    "description": "A Xine backend for the Phonon multimedia library.",
+    "name": "phonon-xine",
+    "project_path": "unmaintained/phonon-xine",
+    "repo_path": "unmaintained/phonon-xine"
+  },
+  "photobook": {
+    "description": "An application to manage your photos",
+    "name": "photobook",
+    "project_path": "unmaintained/photobook",
+    "repo_path": "unmaintained/photobook"
+  },
+  "picmi": {
+    "description": "A nonogram logic game by KDE",
+    "name": "picmi",
+    "project_path": "kde/kdegames/picmi",
+    "repo_path": "games/picmi"
+  },
+  "pico-wizard": {
+    "description": "A Post Installation Configuration Wizard for Linux OSes",
+    "name": "pico-wizard",
+    "project_path": "playground/base/pico-wizard",
+    "repo_path": "plasma/pico-wizard"
+  },
+  "pikasso": {
+    "description": "Simple drawing programs using Kirigami for the UI and Rust for the rendering.",
+    "name": "pikasso",
+    "project_path": "playground/graphics/pikasso",
+    "repo_path": "graphics/pikasso"
+  },
+  "pim-data-exporter": {
+    "description": "Application to assist you with backing up and archiving of PIM data",
+    "name": "pim-data-exporter",
+    "project_path": "kde/pim/pim-data-exporter",
+    "repo_path": "pim/pim-data-exporter"
+  },
+  "pim-sieve-editor": {
+    "description": "Application to assist with editing IMAP Sieve filters",
+    "name": "pim-sieve-editor",
+    "project_path": "kde/pim/pim-sieve-editor",
+    "repo_path": "pim/pim-sieve-editor"
+  },
+  "pim-storage-service-manager": {
+    "description": "Assistant to help with managing external and cloud data storage providers such as Owncloud and Google Drive.",
+    "name": "pim-storage-service-manager",
+    "project_path": "unmaintained/pim-storage-service-manager",
+    "repo_path": "unmaintained/pim-storage-service-manager"
+  },
+  "pimcommon": {
+    "description": "Common library components for KDE PIM",
+    "name": "pimcommon",
+    "project_path": "kde/pim/pimcommon",
+    "repo_path": "pim/pimcommon"
+  },
+  "plank-player": {
+    "description": "Multimedia Player for playing local files on Plasma Bigscreen allowing navigation with just a remote control",
+    "name": "plank-player",
+    "project_path": "kde/workspace/plank-player",
+    "repo_path": "plasma/plank-player"
+  },
+  "plasma-active-kickstart": {
+    "description": "Repository of Kickstart and Yaml files used to create filesystem images of Plasma Active device adaptations",
+    "name": "plasma-active-kickstart",
+    "project_path": "unmaintained/plasma-active-kickstart",
+    "repo_path": "unmaintained/plasma-active-kickstart"
+  },
+  "plasma-active-maliit": {
+    "description": "QML plugin for the Maliit vitual keyboard using KDE Plasma components, intended to be used in Plasma Active",
+    "name": "plasma-active-maliit",
+    "project_path": "playground/base/plasma-active-maliit",
+    "repo_path": "unmaintained/plasma-active-maliit"
+  },
+  "plasma-active-window-control": {
+    "description": "Active Window Control applet for the Plasma Desktop",
+    "name": "plasma-active-window-control",
+    "project_path": "extragear/base/plasma-active-window-control",
+    "repo_path": "plasma/plasma-active-window-control"
+  },
+  "plasma-activities": {
+    "description": "Core components for the KDE's Activities System",
+    "name": "plasma-activities",
+    "project_path": "kde/workspace/plasma-activities",
+    "repo_path": "plasma/plasma-activities"
+  },
+  "plasma-activities-stats": {
+    "description": "A library for accessing the usage data collected by the activities system.",
+    "name": "plasma-activities-stats",
+    "project_path": "kde/workspace/plasma-activities-stats",
+    "repo_path": "plasma/plasma-activities-stats"
+  },
+  "plasma-bigscreen": {
+    "description": "Plasma shell for TVs",
+    "name": "plasma-bigscreen",
+    "project_path": "kde/workspace/plasma-bigscreen",
+    "repo_path": "plasma/plasma-bigscreen"
+  },
+  "plasma-browser-integration": {
+    "description": "Components necessary to integrate browsers into the Plasma Desktop",
+    "name": "plasma-browser-integration",
+    "project_path": "kde/workspace/plasma-browser-integration",
+    "repo_path": "plasma/plasma-browser-integration"
+  },
+  "plasma-camera": {
+    "description": "Camera application for Plasma Mobile",
+    "name": "plasma-camera",
+    "project_path": "extragear/base/plasma-camera",
+    "repo_path": "plasma-mobile/plasma-camera"
+  },
+  "plasma-crystal": {
+    "description": "A widget that can be used as search widget, or alternative file-open mechanism",
+    "name": "plasma-crystal",
+    "project_path": "unmaintained/plasma-crystal",
+    "repo_path": "unmaintained/plasma-crystal"
+  },
+  "plasma-desktop": {
+    "description": "Plasma for the Desktop",
+    "name": "plasma-desktop",
+    "project_path": "kde/workspace/plasma-desktop",
+    "repo_path": "plasma/plasma-desktop"
+  },
+  "plasma-dialer": {
+    "description": "Dialer for Plasma Mobile",
+    "name": "plasma-dialer",
+    "project_path": "extragear/mobile/plasma-dialer",
+    "repo_path": "plasma-mobile/plasma-dialer"
+  },
+  "plasma-disks": {
+    "description": "Monitors S.M.A.R.T. capable devices for imminent failure.",
+    "name": "plasma-disks",
+    "project_path": "kde/workspace/plasma-disks",
+    "repo_path": "plasma/plasma-disks"
+  },
+  "plasma-firewall": {
+    "description": "Control Panel for your system firewall",
+    "name": "plasma-firewall",
+    "project_path": "kde/workspace/plasma-firewall",
+    "repo_path": "plasma/plasma-firewall"
+  },
+  "plasma-integration": {
+    "description": "Qt Platform Theme integration plugins for Plasma Workspaces",
+    "name": "plasma-integration",
+    "project_path": "kde/workspace/plasma-integration",
+    "repo_path": "plasma/plasma-integration"
+  },
+  "plasma-lionmail": {
+    "description": "A Plasma widget displaying new and important email",
+    "name": "plasma-lionmail",
+    "project_path": "unmaintained/plasma-lionmail",
+    "repo_path": "unmaintained/plasma-lionmail"
+  },
+  "plasma-maliit-framework": {
+    "description": "Framework for Maliit integration with Plasma",
+    "name": "plasma-maliit-framework",
+    "project_path": "playground/mobile/plasma-maliit-framework",
+    "repo_path": "plasma-mobile/plasma-maliit-framework"
+  },
+  "plasma-maliit-plugins": {
+    "description": "Plasma integration for Maliit virtual keyboard",
+    "name": "plasma-maliit-plugins",
+    "project_path": "playground/mobile/plasma-maliit-plugins",
+    "repo_path": "plasma-mobile/plasma-maliit-plugins"
+  },
+  "plasma-mediacenter": {
+    "description": "h3. Plasma Media Center is designed to provide an easy and comfortable way to watch your videos, browse your photo collection and listen to your music, all in one place.",
+    "name": "plasma-mediacenter",
+    "project_path": "unmaintained/plasma-mediacenter",
+    "repo_path": "unmaintained/plasma-mediacenter"
+  },
+  "plasma-mobile": {
+    "description": "Plasma shell for mobile devices",
+    "name": "plasma-mobile",
+    "project_path": "kde/workspace/plasma-mobile",
+    "repo_path": "plasma/plasma-mobile"
+  },
+  "plasma-mobile-config": {
+    "description": "Generic as well as device-specific configuration for Plasma Active installations.",
+    "name": "plasma-mobile-config",
+    "project_path": "unmaintained/plasma-mobile-config",
+    "repo_path": "unmaintained/plasma-mobile-config"
+  },
+  "plasma-mobile-design-docs": {
+    "description": "Design documents for Plasma Mobile",
+    "name": "plasma-mobile-design-docs",
+    "project_path": "unmaintained/plasma-mobile-design-docs",
+    "repo_path": "unmaintained/plasma-mobile-design-docs"
+  },
+  "plasma-mobile-history": {
+    "description": "A complete Plasma workspace targeted from small handheld devices to larger tablets.",
+    "name": "plasma-mobile-history",
+    "project_path": "extragear/base/plasma-mobile-history",
+    "repo_path": "unmaintained/plasma-mobile-history"
+  },
+  "plasma-mobile-sounds": {
+    "description": "Sounds for Plasma Mobile devices",
+    "name": "plasma-mobile-sounds",
+    "project_path": "playground/mobile/plasma-mobile-sounds",
+    "repo_path": "plasma-mobile/plasma-mobile-sounds"
+  },
+  "plasma-mycroft-mobile": {
+    "description": "Plasma Mobile integration of different Mycroft AI services",
+    "name": "plasma-mycroft-mobile",
+    "project_path": "playground/utils/mycroft-plasmoid-mobile",
+    "repo_path": "plasma-mobile/mycroft-plasmoid-mobile"
+  },
+  "plasma-nano": {
+    "description": "A minimal Plasma shell package",
+    "name": "plasma-nano",
+    "project_path": "kde/workspace/plasma-nano",
+    "repo_path": "plasma/plasma-nano"
+  },
+  "plasma-nm": {
+    "description": "Plasma applet written in QML for managing network connections",
+    "name": "plasma-nm",
+    "project_path": "kde/workspace/plasma-nm",
+    "repo_path": "plasma/plasma-nm"
+  },
+  "plasma-pa": {
+    "description": "Plasma applet for audio volume management using PulseAudio",
+    "name": "plasma-pa",
+    "project_path": "kde/workspace/plasma-pa",
+    "repo_path": "plasma/plasma-pa"
+  },
+  "plasma-packagekit": {
+    "description": "Plasma applet to monitor Packagekit",
+    "name": "plasma-packagekit",
+    "project_path": "playground/base/plasma-packagekit",
+    "repo_path": "system/plasma-packagekit"
+  },
+  "plasma-pass": {
+    "description": "Plasma applet for the Pass password manager",
+    "name": "plasma-pass",
+    "project_path": "extragear/base/plasma-pass",
+    "repo_path": "plasma/plasma-pass"
+  },
+  "plasma-phone-settings": {
+    "description": "Configuration files for Plasma Mobile deployments",
+    "name": "plasma-phone-settings",
+    "project_path": "playground/mobile/plasma-phone-settings",
+    "repo_path": "plasma-mobile/plasma-phone-settings"
+  },
+  "plasma-phonebook": {
+    "description": "Phone book for Plasma Mobile",
+    "name": "plasma-phonebook",
+    "project_path": "extragear/base/plasma-phonebook",
+    "repo_path": "plasma-mobile/plasma-phonebook"
+  },
+  "plasma-pk-updates": {
+    "description": "Plasma applet for software updates using PackageKit",
+    "name": "plasma-pk-updates",
+    "project_path": "playground/base/plasma-pk-updates",
+    "repo_path": "system/plasma-pk-updates"
+  },
+  "plasma-redshift-control": {
+    "description": "Redshift control applet for the Plasma Desktop",
+    "name": "plasma-redshift-control",
+    "project_path": "extragear/base/plasma-redshift-control",
+    "repo_path": "plasma/plasma-redshift-control"
+  },
+  "plasma-remotecontrollers": {
+    "description": "Translate various input device events into keyboard and pointer events",
+    "name": "plasma-remotecontrollers",
+    "project_path": "kde/workspace/plasma-remotecontrollers",
+    "repo_path": "plasma-bigscreen/plasma-remotecontrollers"
+  },
+  "plasma-samegame": {
+    "description": "Samegame clone suitable for mobile devices",
+    "name": "plasma-samegame",
+    "project_path": "extragear/base/plasma-samegame",
+    "repo_path": "plasma-mobile/plasma-samegame"
+  },
+  "plasma-sdk": {
+    "description": "Applications useful for Plasma development",
+    "name": "plasma-sdk",
+    "project_path": "kde/workspace/plasma-sdk",
+    "repo_path": "plasma/plasma-sdk"
+  },
+  "plasma-settings": {
+    "description": "Settings application for Plasma Mobile",
+    "name": "plasma-settings",
+    "project_path": "extragear/base/plasma-settings",
+    "repo_path": "plasma-mobile/plasma-settings"
+  },
+  "plasma-simplemenu": {
+    "description": "Simplified menu for your Plasma Desktop",
+    "name": "plasma-simplemenu",
+    "project_path": "extragear/base/plasma-simplemenu",
+    "repo_path": "plasma/plasma-simplemenu"
+  },
+  "plasma-systemd-integration": {
+    "description": "Integration of Plasma Workspace and various modules with systemd",
+    "name": "plasma-systemd-integration",
+    "project_path": "unmaintained/plasma-systemd-integration",
+    "repo_path": "unmaintained/plasma-systemd-integration"
+  },
+  "plasma-systemmonitor": {
+    "description": "An interface for monitoring system sensors, process information and other system resources",
+    "name": "plasma-systemmonitor",
+    "project_path": "kde/workspace/plasma-systemmonitor",
+    "repo_path": "plasma/plasma-systemmonitor"
+  },
+  "plasma-tests": {
+    "description": "Tests for the Plasma Workspace",
+    "name": "plasma-tests",
+    "project_path": "kde/workspace/plasma-tests",
+    "repo_path": "plasma/plasma-tests"
+  },
+  "plasma-thunderbolt": {
+    "description": "Plasma integration for controlling Thunderbolt devices",
+    "name": "plasma-thunderbolt",
+    "project_path": "kde/workspace/plasma-thunderbolt",
+    "repo_path": "plasma/plasma-thunderbolt"
+  },
+  "plasma-vault": {
+    "description": "Plasma applet and services for creating encrypted vaults",
+    "name": "plasma-vault",
+    "project_path": "kde/workspace/plasma-vault",
+    "repo_path": "plasma/plasma-vault"
+  },
+  "plasma-wayland-protocols": {
+    "description": "Plasma-specific protocols for Wayland",
+    "name": "plasma-wayland-protocols",
+    "project_path": "kdesupport/plasma-wayland-protocols",
+    "repo_path": "libraries/plasma-wayland-protocols"
+  },
+  "plasma-welcome": {
+    "description": "A friendly onboarding wizard for Plasma",
+    "name": "plasma-welcome",
+    "project_path": "kde/workspace/plasma-welcome",
+    "repo_path": "plasma/plasma-welcome"
+  },
+  "plasma-workspace": {
+    "description": "Various components needed to run a Plasma-based environment",
+    "name": "plasma-workspace",
+    "project_path": "kde/workspace/plasma-workspace",
+    "repo_path": "plasma/plasma-workspace"
+  },
+  "plasma-workspace-wallpapers": {
+    "description": "Wallpapers for Plasma Workspaces",
+    "name": "plasma-workspace-wallpapers",
+    "project_path": "kde/workspace/plasma-workspace-wallpapers",
+    "repo_path": "plasma/plasma-workspace-wallpapers"
+  },
+  "plasma5support": {
+    "description": "Support components for porting from KF5/Qt5 to KF6/Qt6",
+    "name": "plasma5support",
+    "project_path": "kde/workspace/plasma5support",
+    "repo_path": "plasma/plasma5support"
+  },
+  "plasmate": {
+    "description": "Plasma Applet Development Environment",
+    "name": "plasmate",
+    "project_path": "playground/sdk/plasmate",
+    "repo_path": "unmaintained/plasmate"
+  },
+  "plasmatube": {
+    "description": "Kirigami YouTube video player based on QtMultimedia and youtube-dl",
+    "name": "plasmatube",
+    "project_path": "playground/mobile/plasmatube",
+    "repo_path": "multimedia/plasmatube"
+  },
+  "plasmoid-eventlist": {
+    "description": "A plasmoid to show your events and todos from Akonadi",
+    "name": "plasmoid-eventlist",
+    "project_path": "unmaintained/plasmoid-eventlist",
+    "repo_path": "unmaintained/plasmoid-eventlist"
+  },
+  "plymouth-kcm": {
+    "description": "KCM to manage the Plymouth (Boot) theme",
+    "name": "plymouth-kcm",
+    "project_path": "kde/workspace/plymouth-kcm",
+    "repo_path": "plasma/plymouth-kcm"
+  },
+  "pokipoki": {
+    "description": "Persistent object framework",
+    "name": "pokipoki",
+    "project_path": "kdereview/pokipoki",
+    "repo_path": "libraries/pokipoki"
+  },
+  "polinpin": {
+    "description": "Site for conducting tests",
+    "name": "polinpin",
+    "project_path": "playground/www/polinpin",
+    "repo_path": "webapps/polinpin"
+  },
+  "polkit-kde-agent-1": {
+    "description": "Daemon providing a Polkit authentication UI for Plasma",
+    "name": "polkit-kde-agent-1",
+    "project_path": "kde/workspace/polkit-kde-agent-1",
+    "repo_path": "plasma/polkit-kde-agent-1"
+  },
+  "polkit-kde-kcmodules-1": {
+    "description": "Set of configuration modules which allows administrator to change polkit settings.",
+    "name": "polkit-kde-kcmodules-1",
+    "project_path": "playground/system/polkit-kde-kcmodules-1",
+    "repo_path": "system/polkit-kde-kcmodules-1"
+  },
+  "polkit-qt-1": {
+    "description": "Qt wrapper around Polkit-1 client libraries",
+    "name": "polkit-qt-1",
+    "project_path": "kdesupport/polkit-qt-1",
+    "repo_path": "libraries/polkit-qt-1"
+  },
+  "pology": {
+    "description": "Library and collection of tools for in-depth processing of PO files",
+    "name": "pology",
+    "project_path": "playground/sdk/pology",
+    "repo_path": "sdk/pology"
+  },
+  "poppler": {
+    "description": null,
+    "name": "poppler",
+    "project_path": "third-party/poppler",
+    "repo_path": null
+  },
+  "powerdevil": {
+    "description": "Manages the power consumption settings of a Plasma shell",
+    "name": "powerdevil",
+    "project_path": "kde/workspace/powerdevil",
+    "repo_path": "plasma/powerdevil"
+  },
+  "powerplant": {
+    "description": "A verry WIP app to keep track of your plant's needs",
+    "name": "powerplant",
+    "project_path": "playground/utils/powerplant",
+    "repo_path": "utilities/powerplant"
+  },
+  "poxml": {
+    "description": "Translate DocBook XML files using gettext PO files",
+    "name": "poxml",
+    "project_path": "kde/kdesdk/poxml",
+    "repo_path": "sdk/poxml"
+  },
+  "print-manager": {
+    "description": "A tool for managing print jobs and printers",
+    "name": "print-manager",
+    "project_path": "kde/kdeworkspace/print-manager",
+    "repo_path": "plasma/print-manager"
+  },
+  "printer-applet": {
+    "description": "Printer Applet is a system tray utility that shows current print jobs, shows printer warnings and errors.",
+    "name": "printer-applet",
+    "project_path": "unmaintained/printer-applet",
+    "repo_path": "unmaintained/printer-applet"
+  },
+  "prison": {
+    "description": "prison is a barcode api currently offering a nice Qt api to produce QRCode barcodes and DataMatrix barcodes, and can easily be made support more.",
+    "name": "prison",
+    "project_path": "frameworks/prison",
+    "repo_path": "frameworks/prison"
+  },
+  "propagator": {
+    "description": "A git mirror fleet manager",
+    "name": "propagator",
+    "project_path": "unmaintained/propagator",
+    "repo_path": "unmaintained/propagator"
+  },
+  "publictransport": {
+    "description": "PublicTransport Applets, Runner, Data Engine & Tools.",
+    "name": "publictransport",
+    "project_path": "playground/base/publictransport",
+    "repo_path": "unmaintained/publictransport"
+  },
+  "pulseaudio-qt": {
+    "description": "Qt bindings for libpulse",
+    "name": "pulseaudio-qt",
+    "project_path": "extragear/libs/pulseaudio-qt",
+    "repo_path": "libraries/pulseaudio-qt"
+  },
+  "purpose": {
+    "description": "Framework for providing abstractions to get the developer's purposes fulfilled.",
+    "name": "purpose",
+    "project_path": "frameworks/purpose",
+    "repo_path": "frameworks/purpose"
+  },
+  "pvfviewer": {
+    "description": "PC Stitch Pattern Viewer",
+    "name": "pvfviewer",
+    "project_path": "extragear/graphics/pvfviewer",
+    "repo_path": "graphics/pvfviewer"
+  },
+  "pykde4": {
+    "description": "Python KDE bindings using PyQt4 SIP technology.",
+    "name": "pykde4",
+    "project_path": "kde/kdebindings/python/pykde4",
+    "repo_path": "unmaintained/pykde4"
+  },
+  "pykde5": {
+    "description": "Python bindings for KF5",
+    "name": "pykde5",
+    "project_path": "kde/kdebindings/python/pykde5",
+    "repo_path": "libraries/pykde5"
+  },
+  "qca": {
+    "description": "Qt Cryptographic Architecture \u2014 straightforward cross-platform crypto API",
+    "name": "qca",
+    "project_path": "kdesupport/qca",
+    "repo_path": "libraries/qca"
+  },
+  "qcoro": {
+    "description": null,
+    "name": "qcoro",
+    "project_path": "third-party/qcoro",
+    "repo_path": null
+  },
+  "qml-lsp": {
+    "description": "Collection of QML tools, including qml-lsp, qml-dap, and qml-refactor-fairy",
+    "name": "qml-lsp",
+    "project_path": "playground/sdk/qml-lsp",
+    "repo_path": "sdk/qml-lsp"
+  },
+  "qmlkonsole": {
+    "description": "Terminal app for Plasma Mobile",
+    "name": "qmlkonsole",
+    "project_path": "playground/mobile/qmlkonsole",
+    "repo_path": "plasma-mobile/qmlkonsole"
+  },
+  "qmlonline": {
+    "description": "Browser based QML Renderer",
+    "name": "qmlonline",
+    "project_path": "playground/www/qmlonline",
+    "repo_path": "webapps/qmlonline"
+  },
+  "qmltermwidget": {
+    "description": null,
+    "name": "qmltermwidget",
+    "project_path": "third-party/qmltermwidget",
+    "repo_path": null
+  },
+  "qmlweb": {
+    "description": "QmlWeb JavaScript Library",
+    "name": "qmlweb",
+    "project_path": "playground/www/qmlweb",
+    "repo_path": "unmaintained/qmlweb"
+  },
+  "qqc2-breeze-style": {
+    "description": "Breeze inspired QQC2 Style",
+    "name": "qqc2-breeze-style",
+    "project_path": "kde/workspace/qqc2-breeze-style",
+    "repo_path": "plasma/qqc2-breeze-style"
+  },
+  "qqc2-desktop-style": {
+    "description": "Qt Quick Controls 2: Desktop Style",
+    "name": "qqc2-desktop-style",
+    "project_path": "frameworks/qqc2-desktop-style",
+    "repo_path": "frameworks/qqc2-desktop-style"
+  },
+  "qrca": {
+    "description": "QR code scanner for Plasma Mobile",
+    "name": "qrca",
+    "project_path": "kdereview/utilities/qrca",
+    "repo_path": "utilities/qrca"
+  },
+  "qt1": {
+    "description": "Historical copy of Qt 1, adapted to compile on modern systems (circa. 2016)",
+    "name": "qt1",
+    "project_path": "historical/qt1",
+    "repo_path": "historical/qt1"
+  },
+  "qt2": {
+    "description": "Historical copy of Qt 2, adapted to compile on modern systems (circa. 2018)",
+    "name": "qt2",
+    "project_path": "historical/qt2",
+    "repo_path": "historical/qt2"
+  },
+  "qtatspi": {
+    "description": "Qt accessibility bridge plugin",
+    "name": "qtatspi",
+    "project_path": "unmaintained/qtatspi",
+    "repo_path": "unmaintained/qtatspi"
+  },
+  "qtcurve": {
+    "description": "Style engine for Qt and other toolkits",
+    "name": "qtcurve",
+    "project_path": "extragear/base/qtcurve",
+    "repo_path": "system/qtcurve"
+  },
+  "qtjolie": {
+    "description": "Qt binding to use the Jolie service-oriented framework",
+    "name": "qtjolie",
+    "project_path": "playground/libs/qtjolie",
+    "repo_path": "libraries/qtjolie"
+  },
+  "qtkeychain": {
+    "description": null,
+    "name": "qtkeychain",
+    "project_path": "third-party/qtkeychain",
+    "repo_path": null
+  },
+  "qtruby": {
+    "description": "Ruby bindings for the Qt libraries.",
+    "name": "qtruby",
+    "project_path": "kde/kdebindings/ruby/qtruby",
+    "repo_path": "unmaintained/qtruby"
+  },
+  "quanta": {
+    "description": "Quanta, an IDE for Web Development based on the KDevelop Platform.",
+    "name": "quanta",
+    "project_path": "playground/devtools/quanta",
+    "repo_path": "unmaintained/quanta"
+  },
+  "qyoto": {
+    "description": ".NET/Mono bindings for the Qt libraries.",
+    "name": "qyoto",
+    "project_path": "kde/kdebindings/csharp/qyoto",
+    "repo_path": "unmaintained/qyoto"
+  },
+  "rattlesnake": {
+    "description": "Rattlesnake is a metronome app for mobile and desktop.",
+    "name": "rattlesnake",
+    "project_path": "playground/multimedia/rattlesnake",
+    "repo_path": "multimedia/rattlesnake"
+  },
+  "raven": {
+    "description": "A mail client for Plasma Mobile",
+    "name": "raven",
+    "project_path": "playground/mobile/raven",
+    "repo_path": "plasma-mobile/raven"
+  },
+  "rcharactersheet": {
+    "description": "Rolisteam Character Set Shared Components",
+    "name": "rcharactersheet",
+    "project_path": "playground/games/rcharactersheet",
+    "repo_path": "rolisteam/rcharactersheet"
+  },
+  "rcse": {
+    "description": "Character Set IDE for Rolisteam applications.",
+    "name": "rcse",
+    "project_path": "playground/games/rcse",
+    "repo_path": "rolisteam/rcse"
+  },
+  "rekollect": {
+    "description": "A rich note-taking application.",
+    "name": "rekollect",
+    "project_path": "unmaintained/rekollect",
+    "repo_path": "unmaintained/rekollect"
+  },
+  "rekonq": {
+    "description": "rekonq is a web browser by KDE based on WebKit.",
+    "name": "rekonq",
+    "project_path": "unmaintained/rekonq",
+    "repo_path": "unmaintained/rekonq"
+  },
+  "release-buddy": {
+    "description": "KDE Release and Packaging System",
+    "name": "release-buddy",
+    "project_path": "playground/utils/release-buddy",
+    "repo_path": "unmaintained/release-buddy"
+  },
+  "releaseme": {
+    "description": "Release script framework",
+    "name": "releaseme",
+    "project_path": "playground/sdk/releaseme",
+    "repo_path": "sdk/releaseme"
+  },
+  "repo-management": {
+    "description": "This project contains the hooks and scripts that power the KDE git infrastructure.",
+    "name": "repo-management",
+    "project_path": "repo-management",
+    "repo_path": "sysadmin/repo-management"
+  },
+  "ring-kde": {
+    "description": "Qt-based Ring communication framework (www.ring.cx) client",
+    "name": "ring-kde",
+    "project_path": "extragear/pim/ring-kde",
+    "repo_path": "network/ring-kde"
+  },
+  "rkward": {
+    "description": "Easily extensible and easy-to-use IDE/GUI for R",
+    "name": "rkward",
+    "project_path": "kdereview/rkward",
+    "repo_path": "education/rkward"
+  },
+  "rocs": {
+    "description": "An educational Graph Theory IDE",
+    "name": "rocs",
+    "project_path": "kde/kdeedu/rocs",
+    "repo_path": "education/rocs"
+  },
+  "rolisteam": {
+    "description": "Virtual Tabletop Backend for Games",
+    "name": "rolisteam",
+    "project_path": "playground/games/rolisteam",
+    "repo_path": "rolisteam/rolisteam"
+  },
+  "rolisteam-common": {
+    "description": "Shared Components for Rolisteam",
+    "name": "rolisteam-common",
+    "project_path": "playground/games/rolisteam-common",
+    "repo_path": "rolisteam/rolisteam-common"
+  },
+  "rolisteam-community-data": {
+    "description": "Contributed Resources for Rolisteam Applications (Character Sheets, Themes, etc)",
+    "name": "rolisteam-community-data",
+    "project_path": "playground/games/rolisteam-community-data",
+    "repo_path": "rolisteam/rolisteam-community-data"
+  },
+  "rolisteam-diceparser": {
+    "description": "Rolisteam Dice Handling Components",
+    "name": "rolisteam-diceparser",
+    "project_path": "playground/games/rolisteam-diceparser",
+    "repo_path": "rolisteam/rolisteam-diceparser"
+  },
+  "rolisteam-packaging": {
+    "description": "Packaging resources for Rolisteam (Windows, Mac, Docker image, Snap and Debian packages)",
+    "name": "rolisteam-packaging",
+    "project_path": "playground/games/rolisteam-packaging",
+    "repo_path": "rolisteam/rolisteam-packaging"
+  },
+  "rolisteam-plugins": {
+    "description": "Various Shared Plugins for Rolisteam",
+    "name": "rolisteam-plugins",
+    "project_path": "playground/games/rolisteam-plugins",
+    "repo_path": "rolisteam/rolisteam-plugins"
+  },
+  "rsibreak": {
+    "description": "Helps prevent Repetitive Strain Injury by reminding you to take a break",
+    "name": "rsibreak",
+    "project_path": "extragear/utils/rsibreak",
+    "repo_path": "utilities/rsibreak"
+  },
+  "ruqola": {
+    "description": "KDE client for Rocket Chat",
+    "name": "ruqola",
+    "project_path": "extragear/network/ruqola",
+    "repo_path": "network/ruqola"
+  },
+  "rust-qt-binding-generator": {
+    "description": "Generate bindings to use Rust code in Qt and QML",
+    "name": "rust-qt-binding-generator",
+    "project_path": "extragear/sdk/rust-qt-binding-generator",
+    "repo_path": "sdk/rust-qt-binding-generator"
+  },
+  "samba-mounter": {
+    "description": "Samba Share Mounter",
+    "name": "samba-mounter",
+    "project_path": "playground/base/samba-mounter",
+    "repo_path": "system/samba-mounter"
+  },
+  "scribo": {
+    "description": "Natural Language Processing based on the Nepomuk semantic desktop framework.",
+    "name": "scribo",
+    "project_path": "unmaintained/scribo",
+    "repo_path": "unmaintained/scribo"
+  },
+  "sddm-kcm": {
+    "description": "Configuration module for SDDM",
+    "name": "sddm-kcm",
+    "project_path": "kde/workspace/sddm-kcm",
+    "repo_path": "plasma/sddm-kcm"
+  },
+  "selenium-webdriver-at-spi": {
+    "description": "Selenium/Appium WebDriver implementation based on AT-SPI Accessibility",
+    "name": "selenium-webdriver-at-spi",
+    "project_path": "playground/sdk/selenium-webdriver-at-spi",
+    "repo_path": "sdk/selenium-webdriver-at-spi"
+  },
+  "sflphone-kde": {
+    "description": "SFLPhone KDE is an enterprise class soft phone with integration with various KDE technologies such as Akonadi",
+    "name": "sflphone-kde",
+    "project_path": "unmaintained/sflphone-kde",
+    "repo_path": "unmaintained/sflphone-kde"
+  },
+  "share-like-connect": {
+    "description": "A simple ubiquitous user interface for interacting with your data.",
+    "name": "share-like-connect",
+    "project_path": "unmaintained/share-like-connect",
+    "repo_path": "unmaintained/share-like-connect"
+  },
+  "signon-kwallet-extension": {
+    "description": "KWallet integration for the SignOn framework (gitlab.com/accounts-sso)",
+    "name": "signon-kwallet-extension",
+    "project_path": "kde/kdenetwork/signon-kwallet-extension",
+    "repo_path": "network/signon-kwallet-extension"
+  },
+  "signond": {
+    "description": null,
+    "name": "signond",
+    "project_path": "third-party/signond",
+    "repo_path": null
+  },
+  "silk": {
+    "description": "Utilities and libraries for the integration of online content and communication into the user experience.",
+    "name": "silk",
+    "project_path": "unmaintained/silk",
+    "repo_path": "unmaintained/silk"
+  },
+  "simon": {
+    "description": "Highly configurable, targeted speech recognition software",
+    "name": "simon",
+    "project_path": "unmaintained/simon",
+    "repo_path": "unmaintained/simon"
+  },
+  "simon-tools": {
+    "description": "Additional tools and utilities for simon",
+    "name": "simon-tools",
+    "project_path": "unmaintained/simon-tools",
+    "repo_path": "unmaintained/simon-tools"
+  },
+  "sink": {
+    "description": "Offline caching, synchronization and indexing system for PIM data",
+    "name": "sink",
+    "project_path": "playground/pim/sink",
+    "repo_path": "pim/sink"
+  },
+  "skanlite": {
+    "description": "Lite image scanning application",
+    "name": "skanlite",
+    "project_path": "kde/kdegraphics/skanlite",
+    "repo_path": "graphics/skanlite"
+  },
+  "skanpage": {
+    "description": "Utility to scan images and multi-page documents",
+    "name": "skanpage",
+    "project_path": "kde/kdeutils/skanpage",
+    "repo_path": "utilities/skanpage"
+  },
+  "skladnik": {
+    "description": "Skladnik is the Japanese warehouse keeper sokoban game",
+    "name": "skladnik",
+    "project_path": "extragear/games/skladnik",
+    "repo_path": "games/skladnik"
+  },
+  "skrooge": {
+    "description": "Personal finance manager that aims at being powerful and intuitive",
+    "name": "skrooge",
+    "project_path": "extragear/office/skrooge",
+    "repo_path": "office/skrooge"
+  },
+  "smaragd": {
+    "description": "KWin plugin to support Emerald themes in KDE",
+    "name": "smaragd",
+    "project_path": "playground/artwork/smaragd",
+    "repo_path": "plasma/smaragd"
+  },
+  "smb4k": {
+    "description": "Advanced network neighborhood browser and Samba share mounting utility",
+    "name": "smb4k",
+    "project_path": "extragear/network/smb4k",
+    "repo_path": "network/smb4k"
+  },
+  "smokegen": {
+    "description": "A general purpose C++ parser with a plugin infrastructure enabling ''generators'' to be written, which can do various things with the C++ AST. It is currently used for generating the various SMOKE libraries.",
+    "name": "smokegen",
+    "project_path": "kde/kdebindings/smoke/smokegen",
+    "repo_path": "unmaintained/smokegen"
+  },
+  "smokekde": {
+    "description": "SMOKE bindings for libraries created by the KDE community. Used by language bindings.",
+    "name": "smokekde",
+    "project_path": "kde/kdebindings/smoke/smokekde",
+    "repo_path": "unmaintained/smokekde"
+  },
+  "smokeqt": {
+    "description": "SMOKE bindings for the Qt libraries. Used by language bindings.",
+    "name": "smokeqt",
+    "project_path": "kde/kdebindings/smoke/smokeqt",
+    "repo_path": "unmaintained/smokeqt"
+  },
+  "snap-kf5": {
+    "description": "Content Snap for Qt5 and KF5",
+    "name": "snap-kf5",
+    "project_path": "playground/packaging/snap-kf5",
+    "repo_path": "packaging/snap-kf5"
+  },
+  "snap-kf5-launcher": {
+    "description": "Launcher for Content Snap for Qt5 and KF5",
+    "name": "snap-kf5-launcher",
+    "project_path": "playground/packaging/snap-kf5-launcher",
+    "repo_path": "packaging/snap-kf5-launcher"
+  },
+  "snapcraft-kde-applications": {
+    "description": "Snapcraft packaging files for some KDE Applications",
+    "name": "snapcraft-kde-applications",
+    "project_path": "playground/packaging/snapcraft-kde-applications",
+    "repo_path": "packaging/snapcraft-kde-applications"
+  },
+  "snorenotify": {
+    "description": "Multi-platform Qt notification framework",
+    "name": "snorenotify",
+    "project_path": "playground/libs/snorenotify",
+    "repo_path": "libraries/snorenotify"
+  },
+  "snoretoast": {
+    "description": "Command-line application capable of creating Windows Toast notifications",
+    "name": "snoretoast",
+    "project_path": "playground/libs/snoretoast",
+    "repo_path": "libraries/snoretoast"
+  },
+  "solid": {
+    "description": "Solid",
+    "name": "solid",
+    "project_path": "frameworks/solid",
+    "repo_path": "frameworks/solid"
+  },
+  "solid-power": {
+    "description": "This framework is the single entry point for power management.",
+    "name": "solid-power",
+    "project_path": "unmaintained/solid-power",
+    "repo_path": "unmaintained/solid-power"
+  },
+  "sonnet": {
+    "description": "Spelling framework for Qt.",
+    "name": "sonnet",
+    "project_path": "frameworks/sonnet",
+    "repo_path": "frameworks/sonnet"
+  },
+  "soprano": {
+    "description": "Soprano is a library which provides a highly usable object-oriented C++/Qt4 framework for RDF data.",
+    "name": "soprano",
+    "project_path": "kdesupport/soprano",
+    "repo_path": "unmaintained/soprano"
+  },
+  "soundcloud-voice-application": {
+    "description": "Soundcloud music player voice application and mycroft skill for Plasma Bigscreen",
+    "name": "soundcloud-voice-application",
+    "project_path": "playground/utils/soundcloud-voice-application",
+    "repo_path": "plasma-bigscreen/soundcloud-voice-application"
+  },
+  "spacebar": {
+    "description": "SMS/MMS application for Plasma Mobile",
+    "name": "spacebar",
+    "project_path": "extragear/mobile/spacebar",
+    "repo_path": "plasma-mobile/spacebar"
+  },
+  "spectacle": {
+    "description": "Screenshot capture utility",
+    "name": "spectacle",
+    "project_path": "kde/kdegraphics/spectacle",
+    "repo_path": "graphics/spectacle"
+  },
+  "sprinter": {
+    "description": "Multi-agent query parser and result generator",
+    "name": "sprinter",
+    "project_path": "unmaintained/sprinter",
+    "repo_path": "unmaintained/sprinter"
+  },
+  "sprinter-plugins": {
+    "description": "Plugins for Sprinter",
+    "name": "sprinter-plugins",
+    "project_path": "playground/libs/sprinter-plugins",
+    "repo_path": "unmaintained/sprinter-plugins"
+  },
+  "stackfolder": {
+    "description": "Browse the stack of folders",
+    "name": "stackfolder",
+    "project_path": "unmaintained/stackfolder",
+    "repo_path": "unmaintained/stackfolder"
+  },
+  "startactive": {
+    "description": "A dependency-based init system for KDE workspace.",
+    "name": "startactive",
+    "project_path": "unmaintained/startactive",
+    "repo_path": "unmaintained/startactive"
+  },
+  "step": {
+    "description": "Interactive physics simulator",
+    "name": "step",
+    "project_path": "kde/kdeedu/step",
+    "repo_path": "education/step"
+  },
+  "stibium": {
+    "description": "Stibium is a version of KDE developed as a web application, using personal cloud services to store data.",
+    "name": "stibium",
+    "project_path": "playground/www/stibium",
+    "repo_path": "unmaintained/stibium"
+  },
+  "stopmotion": {
+    "description": "Grab the frames of your animation!",
+    "name": "stopmotion",
+    "project_path": "playground/multimedia/stopmotion",
+    "repo_path": "multimedia/stopmotion"
+  },
+  "strigi": {
+    "description": "Strigi",
+    "name": "strigi",
+    "project_path": "kdesupport/strigi/strigi",
+    "repo_path": "unmaintained/strigi"
+  },
+  "strigi-multimedia": {
+    "description": "Various analyzers to provide multimedia support to Strigi",
+    "name": "strigi-multimedia",
+    "project_path": "unmaintained/strigi-multimedia",
+    "repo_path": "unmaintained/strigi-multimedia"
+  },
+  "strigiclient": {
+    "description": "Strigi client",
+    "name": "strigiclient",
+    "project_path": "kdesupport/strigi/strigiclient",
+    "repo_path": "unmaintained/strigiclient"
+  },
+  "strigidaemon": {
+    "description": "Strigi daemon",
+    "name": "strigidaemon",
+    "project_path": "kdesupport/strigi/strigidaemon",
+    "repo_path": "unmaintained/strigidaemon"
+  },
+  "strigiutils": {
+    "description": "Strigi utilities",
+    "name": "strigiutils",
+    "project_path": "kdesupport/strigi/strigiutils",
+    "repo_path": "unmaintained/strigiutils"
+  },
+  "subtitlecomposer": {
+    "description": "Video subtitle editor",
+    "name": "subtitlecomposer",
+    "project_path": "kde/kdemultimedia/subtitlecomposer",
+    "repo_path": "multimedia/subtitlecomposer"
+  },
+  "superbuild": {
+    "description": "Automates building separate (KDE) repositories in one go using plain CMake, similar to kdesrc-build.",
+    "name": "superbuild",
+    "project_path": "unmaintained/superbuild",
+    "repo_path": "unmaintained/superbuild"
+  },
+  "superkaramba": {
+    "description": "SuperKaramba is a tool that allows you to easily create interactive widgets on your KDE desktop.",
+    "name": "superkaramba",
+    "project_path": "unmaintained/superkaramba",
+    "repo_path": "unmaintained/superkaramba"
+  },
+  "svgmod": {
+    "description": "Apply system colors to plasma rendered SVGs",
+    "name": "svgmod",
+    "project_path": "playground/devtools/svgmod",
+    "repo_path": "unmaintained/svgmod"
+  },
+  "svgpart": {
+    "description": "A KPart for SVG support",
+    "name": "svgpart",
+    "project_path": "kde/kdegraphics/svgpart",
+    "repo_path": "graphics/svgpart"
+  },
+  "sweeper": {
+    "description": "Application that helps to clean unwanted traces the user leaves on the system",
+    "name": "sweeper",
+    "project_path": "kde/kdeutils/sweeper",
+    "repo_path": "utilities/sweeper"
+  },
+  "symboleditor": {
+    "description": "Application to create libraries of QPainterPath objects with rendering hints",
+    "name": "symboleditor",
+    "project_path": "extragear/graphics/symboleditor",
+    "repo_path": "graphics/symboleditor"
+  },
+  "symmy": {
+    "description": "GPG symmetric encryption frontend",
+    "name": "symmy",
+    "project_path": "extragear/utils/symmy",
+    "repo_path": "utilities/symmy"
+  },
+  "synchrotron": {
+    "description": "An OCS compatible web service for publishing application add-ons from upstream projects directly to users via a git repository.",
+    "name": "synchrotron",
+    "project_path": "playground/www/synchrotron",
+    "repo_path": "unmaintained/synchrotron"
+  },
+  "synchrotron-sources": {
+    "description": "An OCS compatible web service for publishing application add-ons from upstream projects directly to users via a git repository.",
+    "name": "synchrotron-sources",
+    "project_path": "playground/www/synchrotron-sources",
+    "repo_path": "unmaintained/synchrotron-sources"
+  },
+  "syndication": {
+    "description": "Syndication Library",
+    "name": "syndication",
+    "project_path": "frameworks/syndication",
+    "repo_path": "frameworks/syndication"
+  },
+  "syntax-highlighting": {
+    "description": "Syntax highlighting Engine for Structured Text and Code.",
+    "name": "syntax-highlighting",
+    "project_path": "frameworks/syntax-highlighting",
+    "repo_path": "frameworks/syntax-highlighting"
+  },
+  "sysadmin-activityfilter": {
+    "description": "Configuration for the Activity Filter service",
+    "name": "sysadmin-activityfilter",
+    "project_path": "sysadmin/activityfilter",
+    "repo_path": "sysadmin/activityfilter"
+  },
+  "sysadmin-appimage-tooling": {
+    "description": "",
+    "name": "sysadmin-appimage-tooling",
+    "project_path": "sysadmin/appimage-tooling",
+    "repo_path": "sysadmin/appimage-tooling"
+  },
+  "sysadmin-appstream-metainfo-release-update": {
+    "description": "Updates AppStream Metainfo files for new releases of your software\r\n",
+    "name": "sysadmin-appstream-metainfo-release-update",
+    "project_path": "sysadmin/appstream-metainfo-release-update",
+    "repo_path": "sysadmin/appstream-metainfo-release-update"
+  },
+  "sysadmin-binary-factory-tooling": {
+    "description": "All tooling and other materials necessary for the operation of the KDE Binary Factory",
+    "name": "sysadmin-binary-factory-tooling",
+    "project_path": "sysadmin/binary-factory-tooling",
+    "repo_path": "sysadmin/binary-factory-tooling"
+  },
+  "sysadmin-bugzilla-bot": {
+    "description": "",
+    "name": "sysadmin-bugzilla-bot",
+    "project_path": "sysadmin/bugzilla-bot",
+    "repo_path": "sysadmin/bugzilla-bot"
+  },
+  "sysadmin-ci-management": {
+    "description": "Contains all management jobs and other data needed to run our Gitlab CI infrastructure.",
+    "name": "sysadmin-ci-management",
+    "project_path": "sysadmin/ci-management",
+    "repo_path": "sysadmin/ci-management"
+  },
+  "sysadmin-ci-notary-service": {
+    "description": "An SFTP-backed services provider",
+    "name": "sysadmin-ci-notary-service",
+    "project_path": "sysadmin/ci-notary-service",
+    "repo_path": "sysadmin/ci-notary-service"
+  },
+  "sysadmin-ci-service-templates": {
+    "description": "Gitlab CI templates for use with Micro Services",
+    "name": "sysadmin-ci-service-templates",
+    "project_path": "sysadmin/ci-service-templates",
+    "repo_path": "sysadmin/ci-service-templates"
+  },
+  "sysadmin-ci-tooling": {
+    "description": "Contains all tooling necessary to operate build.kde.org, including the Docker images for our Linux builds along with the documentation necessary to setup FreeBSD and Windows builds.",
+    "name": "sysadmin-ci-tooling",
+    "project_path": "sysadmin/ci-tooling",
+    "repo_path": "sysadmin/ci-tooling"
+  },
+  "sysadmin-ci-utilities": {
+    "description": "Contains all tooling necessary to run our Gitlab CI jobs for all platforms.",
+    "name": "sysadmin-ci-utilities",
+    "project_path": "sysadmin/ci-utilities",
+    "repo_path": "sysadmin/ci-utilities"
+  },
+  "sysadmin-dns": {
+    "description": "DNS Zone files for Sysadmin managed domains",
+    "name": "sysadmin-dns",
+    "project_path": "sysadmin/dns",
+    "repo_path": "sysadmin/dns"
+  },
+  "sysadmin-docs": {
+    "description": "Documentation for infrastructure and services managed by sysadmin team",
+    "name": "sysadmin-docs",
+    "project_path": "sysadmin/sysadmin-docs",
+    "repo_path": "sysadmin/sysadmin-docs"
+  },
+  "sysadmin-geoip-service-backend": {
+    "description": "",
+    "name": "sysadmin-geoip-service-backend",
+    "project_path": "sysadmin/geoip-service-backend",
+    "repo_path": "sysadmin/geoip-service-backend"
+  },
+  "sysadmin-gerrit-all-projects": {
+    "description": "",
+    "name": "sysadmin-gerrit-all-projects",
+    "project_path": "sysadmin/gerrit-all-projects",
+    "repo_path": "sysadmin/gerrit-all-projects"
+  },
+  "sysadmin-gerrit-ci-matrix": {
+    "description": "",
+    "name": "sysadmin-gerrit-ci-matrix",
+    "project_path": "sysadmin/gerrit-ci-matrix",
+    "repo_path": "sysadmin/gerrit-ci-matrix"
+  },
+  "sysadmin-gerrit-gear": {
+    "description": "",
+    "name": "sysadmin-gerrit-gear",
+    "project_path": "sysadmin/gerrit-gear",
+    "repo_path": "sysadmin/gerrit-gear"
+  },
+  "sysadmin-gerrit-imported-projects": {
+    "description": "Read-only imports from KDE git to Gerrit",
+    "name": "sysadmin-gerrit-imported-projects",
+    "project_path": "sysadmin/gerrit-imported-projects",
+    "repo_path": "sysadmin/gerrit-imported-projects"
+  },
+  "sysadmin-gerrit-infra-projects": {
+    "description": "",
+    "name": "sysadmin-gerrit-infra-projects",
+    "project_path": "sysadmin/gerrit-infra-projects",
+    "repo_path": "sysadmin/gerrit-infra-projects"
+  },
+  "sysadmin-gerrit-kde-ci-checked-projects": {
+    "description": "",
+    "name": "sysadmin-gerrit-kde-ci-checked-projects",
+    "project_path": "sysadmin/gerrit-kde-ci-checked-projects",
+    "repo_path": "sysadmin/gerrit-kde-ci-checked-projects"
+  },
+  "sysadmin-gerrit-kde-ci-enforced-projects": {
+    "description": "",
+    "name": "sysadmin-gerrit-kde-ci-enforced-projects",
+    "project_path": "sysadmin/gerrit-kde-ci-enforced-projects",
+    "repo_path": "sysadmin/gerrit-kde-ci-enforced-projects"
+  },
+  "sysadmin-gerrit-kde-traditional-projects": {
+    "description": "",
+    "name": "sysadmin-gerrit-kde-traditional-projects",
+    "project_path": "sysadmin/gerrit-kde-traditional-projects",
+    "repo_path": "sysadmin/gerrit-kde-traditional-projects"
+  },
+  "sysadmin-gerrit-project-config": {
+    "description": "",
+    "name": "sysadmin-gerrit-project-config",
+    "project_path": "sysadmin/gerrit-project-config",
+    "repo_path": "sysadmin/gerrit-project-config"
+  },
+  "sysadmin-gerrit-turbo-hipster": {
+    "description": "",
+    "name": "sysadmin-gerrit-turbo-hipster",
+    "project_path": "sysadmin/gerrit-turbo-hipster",
+    "repo_path": "sysadmin/gerrit-turbo-hipster"
+  },
+  "sysadmin-gerrit-zuul": {
+    "description": "",
+    "name": "sysadmin-gerrit-zuul",
+    "project_path": "sysadmin/gerrit-zuul",
+    "repo_path": "sysadmin/gerrit-zuul"
+  },
+  "sysadmin-gitlab-jobwatch": {
+    "description": "Agent to record the status of changes to Gitlab CI jobs in a separate database",
+    "name": "sysadmin-gitlab-jobwatch",
+    "project_path": "sysadmin/gitlab-jobwatch",
+    "repo_path": "sysadmin/gitlab-jobwatch"
+  },
+  "sysadmin-gitlab-ldapsync": {
+    "description": "Agent to monitor a given LDAP directory for changes and propagate them to Gitlab",
+    "name": "sysadmin-gitlab-ldapsync",
+    "project_path": "sysadmin/gitlab-ldapsync",
+    "repo_path": "sysadmin/gitlab-ldapsync"
+  },
+  "sysadmin-gitlab-react": {
+    "description": "Agent to monitor a given gitlab instance and perform pre-defined actions",
+    "name": "sysadmin-gitlab-react",
+    "project_path": "sysadmin/gitlab-react",
+    "repo_path": "sysadmin/gitlab-react"
+  },
+  "sysadmin-gitlab-triaging": {
+    "description": "Service to automatically triage Merge Requests, Tasks and other items on KDE Invent (Gitlab)",
+    "name": "sysadmin-gitlab-triaging",
+    "project_path": "sysadmin/gitlab-triaging",
+    "repo_path": "sysadmin/gitlab-triaging"
+  },
+  "sysadmin-gitlab-vulnerability-issues": {
+    "description": "Vulnerability Reports as GitLab Issues",
+    "name": "sysadmin-gitlab-vulnerability-issues",
+    "project_path": "sysadmin/gitlab-vulnerability-issues",
+    "repo_path": "sysadmin/gitlab-vulnerability-issues"
+  },
+  "sysadmin-irc-notifications": {
+    "description": "Essential materials for the KDE IRC commit notifications system, based on Irker and CIA style XML delivered via SMTP.",
+    "name": "sysadmin-irc-notifications",
+    "project_path": "sysadmin/irc-notifications",
+    "repo_path": "sysadmin/irc-notifications"
+  },
+  "sysadmin-kde-ansible": {
+    "description": "Ansible playbooks for KDE infrastructure",
+    "name": "sysadmin-kde-ansible",
+    "project_path": "sysadmin/kde-ansible",
+    "repo_path": "sysadmin/kde-ansible"
+  },
+  "sysadmin-kikibot": {
+    "description": "Custom IRC Response bot for Krita",
+    "name": "sysadmin-kikibot",
+    "project_path": "sysadmin/kikibot",
+    "repo_path": "sysadmin/kikibot"
+  },
+  "sysadmin-l10n-scripty": {
+    "description": "Localization and Internationalization Service Bot",
+    "name": "sysadmin-l10n-scripty",
+    "project_path": "sysadmin/l10n-scripty",
+    "repo_path": "sysadmin/l10n-scripty"
+  },
+  "sysadmin-neon-appstream-extra-metainfo": {
+    "description": "extra-metainfo information for appstream-generator",
+    "name": "sysadmin-neon-appstream-extra-metainfo",
+    "project_path": "sysadmin/neon-appstream-extra-metainfo",
+    "repo_path": "sysadmin/neon-appstream-extra-metainfo"
+  },
+  "sysadmin-neon-image-syncd": {
+    "description": "",
+    "name": "sysadmin-neon-image-syncd",
+    "project_path": "sysadmin/neon-image-syncd",
+    "repo_path": "sysadmin/neon-image-syncd"
+  },
+  "sysadmin-neon-logind-cleanup": {
+    "description": "",
+    "name": "sysadmin-neon-logind-cleanup",
+    "project_path": "sysadmin/neon-logind-cleanup",
+    "repo_path": "sysadmin/neon-logind-cleanup"
+  },
+  "sysadmin-neon-openqa": {
+    "description": "",
+    "name": "sysadmin-neon-openqa",
+    "project_path": "sysadmin/neon-openqa",
+    "repo_path": "sysadmin/neon-openqa"
+  },
+  "sysadmin-neon-server-deploy": {
+    "description": "",
+    "name": "sysadmin-neon-server-deploy",
+    "project_path": "sysadmin/neon-server-deploy",
+    "repo_path": "sysadmin/neon-server-deploy"
+  },
+  "sysadmin-neon-sftp-bridge": {
+    "description": "",
+    "name": "sysadmin-neon-sftp-bridge",
+    "project_path": "sysadmin/neon-sftp-bridge",
+    "repo_path": "sysadmin/neon-sftp-bridge"
+  },
+  "sysadmin-projects-api": {
+    "description": "",
+    "name": "sysadmin-projects-api",
+    "project_path": "sysadmin/projects-api",
+    "repo_path": "sysadmin/projects-api"
+  },
+  "sysadmin-rbot-plugin-kde-bugzilla": {
+    "description": "",
+    "name": "sysadmin-rbot-plugin-kde-bugzilla",
+    "project_path": "sysadmin/rbot-plugin-kde-bugzilla",
+    "repo_path": "sysadmin/rbot-plugin-kde-bugzilla"
+  },
+  "sysadmin-rbot-plugin-kde-phabricator": {
+    "description": "",
+    "name": "sysadmin-rbot-plugin-kde-phabricator",
+    "project_path": "sysadmin/rbot-plugin-kde-phabricator",
+    "repo_path": "sysadmin/rbot-plugin-kde-phabricator"
+  },
+  "sysadmin-release-tools": {
+    "description": "Scripts and tools used when releasing KDE SC",
+    "name": "sysadmin-release-tools",
+    "project_path": "sysadmin/release-tools",
+    "repo_path": "sysadmin/release-tools"
+  },
+  "sysadmin-replicant": {
+    "description": "Agent to mirror all repositories, and changes in them, from a Gitlab instance",
+    "name": "sysadmin-replicant",
+    "project_path": "sysadmin/replicant",
+    "repo_path": "sysadmin/replicant"
+  },
+  "sysadmin-repo-metadata": {
+    "description": "Metadata concerning repositories on Gitlab (invent.kde.org)",
+    "name": "sysadmin-repo-metadata",
+    "project_path": "sysadmin/repo-metadata",
+    "repo_path": "sysadmin/repo-metadata"
+  },
+  "sysadmin-sentry-bugzilla-bridge": {
+    "description": "Service to bridge Sentry and Bugzilla",
+    "name": "sysadmin-sentry-bugzilla-bridge",
+    "project_path": "sysadmin/sentry-bugzilla-bridge",
+    "repo_path": "sysadmin/sentry-bugzilla-bridge"
+  },
+  "sysadmin-webstats": {
+    "description": "Scripts and templates used to manage web statistics on KDE servers",
+    "name": "sysadmin-webstats",
+    "project_path": "sysadmin/webstats",
+    "repo_path": "sysadmin/webstats"
+  },
+  "systemd-kcm": {
+    "description": "Kcm module for managing systemd",
+    "name": "systemd-kcm",
+    "project_path": "unmaintained/systemd-kcm",
+    "repo_path": "unmaintained/systemd-kcm"
+  },
+  "systemdgenie": {
+    "description": "Systemd managment utility",
+    "name": "systemdgenie",
+    "project_path": "playground/sysadmin/systemdgenie",
+    "repo_path": "system/systemdgenie"
+  },
+  "systemsettings": {
+    "description": "Control center to configure your Plasma Desktop",
+    "name": "systemsettings",
+    "project_path": "kde/workspace/systemsettings",
+    "repo_path": "plasma/systemsettings"
+  },
+  "taglib": {
+    "description": null,
+    "name": "taglib",
+    "project_path": "third-party/taglib",
+    "repo_path": null
+  },
+  "telepathy-kdeconnect": {
+    "description": "KDE Connect connection manager for Telepathy.",
+    "name": "telepathy-kdeconnect",
+    "project_path": "unmaintained/telepathy-kdeconnect",
+    "repo_path": "unmaintained/telepathy-kdeconnect"
+  },
+  "telepathy-logger-qt": {
+    "description": "Qt wrapper around TpLogger client library",
+    "name": "telepathy-logger-qt",
+    "project_path": "extragear/network/telepathy/telepathy-logger-qt",
+    "repo_path": "network/telepathy-logger-qt"
+  },
+  "tellico": {
+    "description": "Collection management software, free and simple",
+    "name": "tellico",
+    "project_path": "extragear/office/tellico",
+    "repo_path": "office/tellico"
+  },
+  "telly-skout": {
+    "description": "Convergent TV guide based on Kirigami.",
+    "name": "telly-skout",
+    "project_path": "extragear/utilities/telly-skout",
+    "repo_path": "utilities/telly-skout"
+  },
+  "threadweaver": {
+    "description": "ThreadWeaver",
+    "name": "threadweaver",
+    "project_path": "frameworks/threadweaver",
+    "repo_path": "frameworks/threadweaver"
+  },
+  "tikzkit": {
+    "description": "WYSIWYG editor to create PGF/TikZ pictures",
+    "name": "tikzkit",
+    "project_path": "playground/graphics/tikzkit",
+    "repo_path": "graphics/tikzkit"
+  },
+  "toad": {
+    "description": "Organize your tasks",
+    "name": "toad",
+    "project_path": "playground/utilities/toad",
+    "repo_path": "utilities/toad"
+  },
+  "tok": {
+    "description": "Telegram client built using Kirigami",
+    "name": "tok",
+    "project_path": "playground/network/tok",
+    "repo_path": "network/tok"
+  },
+  "tokodon": {
+    "description": "Tokodon is a Mastodon client for Plasma and Plasma Mobile",
+    "name": "tokodon",
+    "project_path": "extragear/network/tokodon",
+    "repo_path": "network/tokodon"
+  },
+  "totalreqall": {
+    "description": "A program for memorizing the Bible and other works. Uses the Sword library.",
+    "name": "totalreqall",
+    "project_path": "playground/utilities/totalreqall",
+    "repo_path": "utilities/totalreqall"
+  },
+  "trainer": {
+    "description": "Application to help you practice sport exercises with a description and duration",
+    "name": "trainer",
+    "project_path": "playground/mobile/trainer",
+    "repo_path": "plasma-mobile/trainer"
+  },
+  "trojita": {
+    "description": "Fast, lightweight and standard-compliant IMAP e-mail client",
+    "name": "trojita",
+    "project_path": "extragear/pim/trojita",
+    "repo_path": "pim/trojita"
+  },
+  "tupi": {
+    "description": "Tupi is an open/free 2D animation software based on usability, a friendly user experience and community values.",
+    "name": "tupi",
+    "project_path": "unmaintained/tupi",
+    "repo_path": "unmaintained/tupi"
+  },
+  "twine2": {
+    "description": "Python bindings SIP updater that processes C++ header files into Riverbank SIP",
+    "name": "twine2",
+    "project_path": "playground/bindings/twine2",
+    "repo_path": "libraries/twine2"
+  },
+  "ubiquity-slideshow-neon": {
+    "description": "Neon slideshow for Ubiquity",
+    "name": "ubiquity-slideshow-neon",
+    "project_path": "playground/base/ubiquity-slideshow-neon",
+    "repo_path": "system/ubiquity-slideshow-neon"
+  },
+  "ufw-kde": {
+    "description": "GUI Interface for Uncomplicated Firewall (UFW).",
+    "name": "ufw-kde",
+    "project_path": "playground/sysadmin/ufw-kde",
+    "repo_path": "unmaintained/ufw-kde"
+  },
+  "umbrello": {
+    "description": "GUI for diagramming Unified Modelling Language (UML)",
+    "name": "umbrello",
+    "project_path": "kde/kdesdk/umbrello",
+    "repo_path": "sdk/umbrello"
+  },
+  "upnp-lib-qt": {
+    "description": "UPnP wrapper for Qt",
+    "name": "upnp-lib-qt",
+    "project_path": "playground/base/upnp-lib-qt",
+    "repo_path": "libraries/upnp-lib-qt"
+  },
+  "user-manager": {
+    "description": "A simple system settings module to manage the users of your system",
+    "name": "user-manager",
+    "project_path": "unmaintained/user-manager",
+    "repo_path": "plasma/user-manager"
+  },
+  "vail": {
+    "description": "Communicate using Morse",
+    "name": "vail",
+    "project_path": "playground/utils/vail",
+    "repo_path": "utilities/vail"
+  },
+  "vakzination": {
+    "description": "Vakzination manages your health certificates like vaccination, test, and recovery certificates.",
+    "name": "vakzination",
+    "project_path": "playground/pim/vakzination",
+    "repo_path": "pim/vakzination"
+  },
+  "veritas": {
+    "description": "Veritas provides a common interface for running unit tests in KDevPlatform.",
+    "name": "veritas",
+    "project_path": "unmaintained/veritas",
+    "repo_path": "unmaintained/veritas"
+  },
+  "vvave": {
+    "description": "Multi-platform media player",
+    "name": "vvave",
+    "project_path": "playground/multimedia/vvave",
+    "repo_path": "maui/vvave"
+  },
+  "wacomtablet": {
+    "description": "GUI for Wacom Linux drivers that supports different button/pen layout profiles",
+    "name": "wacomtablet",
+    "project_path": "kde/workspace/wacomtablet",
+    "repo_path": "plasma/wacomtablet"
+  },
+  "washipad": {
+    "description": "A minimalist application for sketchnoting",
+    "name": "washipad",
+    "project_path": "playground/utils/washipad",
+    "repo_path": "graphics/washipad"
+  },
+  "wayland": {
+    "description": null,
+    "name": "wayland",
+    "project_path": "third-party/wayland",
+    "repo_path": null
+  },
+  "wayland-protocols": {
+    "description": null,
+    "name": "wayland-protocols",
+    "project_path": "third-party/wayland-protocols",
+    "repo_path": null
+  },
+  "websites-20years-kde-org": {
+    "description": "Website for the \"20 years of KDE\" book \u2014 20years.kde.org",
+    "name": "websites-20years-kde-org",
+    "project_path": "websites/20years-kde-org",
+    "repo_path": "websites/20years-kde-org"
+  },
+  "websites-25for25-kde-org": {
+    "description": "Website for the KDE 25th Anniversary Fundraising",
+    "name": "websites-25for25-kde-org",
+    "project_path": "websites/25for25-kde-org",
+    "repo_path": "websites/25for25-kde-org"
+  },
+  "websites-25years-kde-org": {
+    "description": "Website to celebrate the 25th anniversary of the KDE project",
+    "name": "websites-25years-kde-org",
+    "project_path": "websites/25years-kde-org",
+    "repo_path": "websites/25years-kde-org"
+  },
+  "websites-accessibility-kde-org": {
+    "description": "Website for KDE's accessibility technologies",
+    "name": "websites-accessibility-kde-org",
+    "project_path": "websites/accessibility-kde-org",
+    "repo_path": "websites/accessibility-kde-org"
+  },
+  "websites-aether-drupal7": {
+    "description": "Aether theme for Drupal 7",
+    "name": "websites-aether-drupal7",
+    "project_path": "websites/aether-drupal7",
+    "repo_path": "websites/aether-drupal7"
+  },
+  "websites-aether-mediawiki": {
+    "description": "Aether theme for KDE's wikis",
+    "name": "websites-aether-mediawiki",
+    "project_path": "websites/aether-mediawiki",
+    "repo_path": "websites/aether-mediawiki"
+  },
+  "websites-aether-sass": {
+    "description": "Aether-flavoured SASS for various websites",
+    "name": "websites-aether-sass",
+    "project_path": "websites/aether-sass",
+    "repo_path": "websites/aether-sass"
+  },
+  "websites-aether-sphinx": {
+    "description": "Aether theme for Sphinx documentation",
+    "name": "websites-aether-sphinx",
+    "project_path": "websites/aether-sphinx",
+    "repo_path": "websites/aether-sphinx"
+  },
+  "websites-aether-wordpress": {
+    "description": "Aether theme for Wordpress",
+    "name": "websites-aether-wordpress",
+    "project_path": "websites/aether-wordpress",
+    "repo_path": "websites/aether-wordpress"
+  },
+  "websites-akademy-kde-org": {
+    "description": "Website for Akademy - akademy.kde.org",
+    "name": "websites-akademy-kde-org",
+    "project_path": "websites/akademy-kde-org",
+    "repo_path": "websites/akademy-kde-org"
+  },
+  "websites-akademy-registration": {
+    "description": "Drupal 6 module for the Akademy registration system",
+    "name": "websites-akademy-registration",
+    "project_path": "websites/akademy-registration",
+    "repo_path": "websites/akademy-registration"
+  },
+  "websites-akademy-schedule-kde-org": {
+    "description": "Website for the Akademy schedule \u2014 akademy-schedule.kde.org",
+    "name": "websites-akademy-schedule-kde-org",
+    "project_path": "websites/akademy-schedule-kde-org",
+    "repo_path": "websites/akademy-schedule-kde-org"
+  },
+  "websites-akademy2004-kde-org": {
+    "description": "Static copy of the 2004 Conference (Akademy) website \u2014 conference2004.kde.org",
+    "name": "websites-akademy2004-kde-org",
+    "project_path": "websites/akademy2004-kde-org",
+    "repo_path": "websites/akademy2004-kde-org"
+  },
+  "websites-akademy2005-kde-org": {
+    "description": "Static copy of the 2005 Conference (Akademy) website \u2014 conference2005.kde.org",
+    "name": "websites-akademy2005-kde-org",
+    "project_path": "websites/akademy2005-kde-org",
+    "repo_path": "websites/akademy2005-kde-org"
+  },
+  "websites-akademy2006-kde-org": {
+    "description": "Static copy of the Akademy 2006 website \u2014 akademy2006.kde.org",
+    "name": "websites-akademy2006-kde-org",
+    "project_path": "websites/akademy2006-kde-org",
+    "repo_path": "websites/akademy2006-kde-org"
+  },
+  "websites-akademy2007-kde-org": {
+    "description": "Static copy of the Akademy 2007 website \u2014 akademy2007.kde.org",
+    "name": "websites-akademy2007-kde-org",
+    "project_path": "websites/akademy2007-kde-org",
+    "repo_path": "websites/akademy2007-kde-org"
+  },
+  "websites-akademy2008-kde-org": {
+    "description": "Static copy of the Akademy 2008 website \u2014 akademy2008.kde.org",
+    "name": "websites-akademy2008-kde-org",
+    "project_path": "websites/akademy2008-kde-org",
+    "repo_path": "websites/akademy2008-kde-org"
+  },
+  "websites-akademy2009-kde-org": {
+    "description": "Static copy of the Akademy 2009 website \u2014 akademy2009.kde.org",
+    "name": "websites-akademy2009-kde-org",
+    "project_path": "websites/akademy2009-kde-org",
+    "repo_path": "websites/akademy2009-kde-org"
+  },
+  "websites-akademy2010-kde-org": {
+    "description": "Static copy of the Akademy 2010 website \u2014 akademy2010.kde.org",
+    "name": "websites-akademy2010-kde-org",
+    "project_path": "websites/akademy2010-kde-org",
+    "repo_path": "websites/akademy2010-kde-org"
+  },
+  "websites-akademy2012-kde-org": {
+    "description": "Static copy of the Akademy 2012 website \u2014 akademy2012.kde.org",
+    "name": "websites-akademy2012-kde-org",
+    "project_path": "websites/akademy2012-kde-org",
+    "repo_path": "websites/akademy2012-kde-org"
+  },
+  "websites-amarok-kde-org": {
+    "description": "Static copy of the Amarok website \u2014 amarok.kde.org",
+    "name": "websites-amarok-kde-org",
+    "project_path": "websites/amarok-kde-org",
+    "repo_path": "websites/amarok-kde-org"
+  },
+  "websites-apps-kde-org": {
+    "description": "KDE application catalog \u2014 apps.kde.org",
+    "name": "websites-apps-kde-org",
+    "project_path": "websites/apps-kde-org",
+    "repo_path": "websites/apps-kde-org"
+  },
+  "websites-apps-kde-org-archived": {
+    "description": "Application which used to run apps.kde.org",
+    "name": "websites-apps-kde-org-archived",
+    "project_path": "websites/apps-kde-org-archived",
+    "repo_path": "websites/apps-kde-org-archived"
+  },
+  "websites-atelier-kde-org": {
+    "description": "Application that serves atelier.kde.org",
+    "name": "websites-atelier-kde-org",
+    "project_path": "websites/atelier-kde-org",
+    "repo_path": "websites/atelier-kde-org"
+  },
+  "websites-autoconfig-kde-org": {
+    "description": "Automatic configuration metadata for KDE.org services for external applications",
+    "name": "websites-autoconfig-kde-org",
+    "project_path": "websites/autoconfig-kde-org",
+    "repo_path": "websites/autoconfig-kde-org"
+  },
+  "websites-ballot-kde-org": {
+    "description": "Ugly, simple, and very secure voting system \u2014 ballot.kde.org",
+    "name": "websites-ballot-kde-org",
+    "project_path": "websites/ballot-kde-org",
+    "repo_path": "websites/ballot-kde-org"
+  },
+  "websites-blogs-kde-org": {
+    "description": "Contributor blogs site (based on Hugo)",
+    "name": "websites-blogs-kde-org",
+    "project_path": "websites/blogs-kde-org",
+    "repo_path": "websites/blogs-kde-org"
+  },
+  "websites-br-qtcon-org": {
+    "description": "Website for QtCon Brazil \u2014 br.qtcon.org",
+    "name": "websites-br-qtcon-org",
+    "project_path": "websites/br-qtcon-org",
+    "repo_path": "websites/br-qtcon-org"
+  },
+  "websites-bugs-kde-org": {
+    "description": "Modified sources for the KDE Bugtracking System \u2014 bugs.kde.org",
+    "name": "websites-bugs-kde-org",
+    "project_path": "websites/bugs-kde-org",
+    "repo_path": "websites/bugs-kde-org"
+  },
+  "websites-buzz-kde-org": {
+    "description": "Website of the Buzz aggregator",
+    "name": "websites-buzz-kde-org",
+    "project_path": "websites/buzz-kde-org",
+    "repo_path": "websites/buzz-kde-org"
+  },
+  "websites-calligra-org": {
+    "description": "Website for Calligra \u2014 calligra.org",
+    "name": "websites-calligra-org",
+    "project_path": "websites/calligra-org",
+    "repo_path": "websites/calligra-org"
+  },
+  "websites-camp-kde-org": {
+    "description": "Website for Camp KDE",
+    "name": "websites-camp-kde-org",
+    "project_path": "websites/camp-kde-org",
+    "repo_path": "websites/camp-kde-org"
+  },
+  "websites-cantor-kde-org": {
+    "description": "Website for Cantor \u2014 cantor.kde.org",
+    "name": "websites-cantor-kde-org",
+    "project_path": "websites/cantor-kde-org",
+    "repo_path": "websites/cantor-kde-org"
+  },
+  "websites-capacity": {
+    "description": "PHP application used as back end to display some of KDE's websites",
+    "name": "websites-capacity",
+    "project_path": "websites/capacity",
+    "repo_path": "websites/capacity"
+  },
+  "websites-choqok-kde-org": {
+    "description": "Website for Choqok \u2014 choqok.kde.org",
+    "name": "websites-choqok-kde-org",
+    "project_path": "websites/choqok-kde-org",
+    "repo_path": "websites/choqok-kde-org"
+  },
+  "websites-commit-digest-kde-org": {
+    "description": "Static copy of the KDE Commit Digest \u2014 commit-digest.kde.org",
+    "name": "websites-commit-digest-kde-org",
+    "project_path": "websites/commit-digest-kde-org",
+    "repo_path": "websites/commit-digest-kde-org"
+  },
+  "websites-conf-kde-in": {
+    "description": "Website for the KDE India Conference \u2014 conf.kde.in",
+    "name": "websites-conf-kde-in",
+    "project_path": "websites/conf-kde-in",
+    "repo_path": "websites/conf-kde-in"
+  },
+  "websites-conf-kde-org": {
+    "description": "Conference planning and management system \u2014 conf.kde.org",
+    "name": "websites-conf-kde-org",
+    "project_path": "websites/conf-kde-org",
+    "repo_path": "websites/conf-kde-org"
+  },
+  "websites-conf-qtcon-org": {
+    "description": "Static archive of the QtCon Conference Organization system \u2014 conf.qtcon.org",
+    "name": "websites-conf-qtcon-org",
+    "project_path": "websites/conf-qtcon-org",
+    "repo_path": "websites/conf-qtcon-org"
+  },
+  "websites-contents-neon-kde-org": {
+    "description": "REST API for Neon package contents queries \u2014 contents.neon.kde.org",
+    "name": "websites-contents-neon-kde-org",
+    "project_path": "websites/contents-neon-kde-org",
+    "repo_path": "websites/contents-neon-kde-org"
+  },
+  "websites-cutehmi-kde-org": {
+    "description": "Website for CuteHMI \u2014 cutehmi.kde.org",
+    "name": "websites-cutehmi-kde-org",
+    "project_path": "websites/cutehmi-kde-org",
+    "repo_path": "websites/cutehmi-kde-org"
+  },
+  "websites-desktopsummit-org": {
+    "description": "Static copy of the DesktopSummit website \u2014 desktopsummit.org",
+    "name": "websites-desktopsummit-org",
+    "project_path": "websites/desktopsummit-org",
+    "repo_path": "websites/desktopsummit-org"
+  },
+  "websites-digikam-org": {
+    "description": "Website for digiKam \u2014 digikam.org",
+    "name": "websites-digikam-org",
+    "project_path": "websites/digikam-org",
+    "repo_path": "websites/digikam-org"
+  },
+  "websites-discover-kde-org": {
+    "description": "Drupal theme for the Discover website",
+    "name": "websites-discover-kde-org",
+    "project_path": "websites/discover-kde-org",
+    "repo_path": "websites/discover-kde-org"
+  },
+  "websites-docs-kde-org": {
+    "description": "Scripts and other materials needed to support and operate docs.kde.org",
+    "name": "websites-docs-kde-org",
+    "project_path": "websites/docs-kde-org",
+    "repo_path": "websites/docs-kde-org"
+  },
+  "websites-docs-krita-org": {
+    "description": "The Krita Manual. Built with Sphinx by Jenkins, available online at https://docs.krita.org\r\n\r\nCheck the krita_manual_readme.rst on how to help us!",
+    "name": "websites-docs-krita-org",
+    "project_path": "websites/docs-krita-org",
+    "repo_path": "documentation/docs-krita-org"
+  },
+  "websites-docs-plasma-mobile-org": {
+    "description": "Plasma Mobile documentation based on Sphinx",
+    "name": "websites-docs-plasma-mobile-org",
+    "project_path": "websites/docs-plasma-mobile-org",
+    "repo_path": "documentation/docs-plasma-mobile-org"
+  },
+  "websites-download-kde-org": {
+    "description": "MirrorBrain configuration, templates, etc. \u2014 download.kde.org",
+    "name": "websites-download-kde-org",
+    "project_path": "websites/download-kde-org",
+    "repo_path": "websites/download-kde-org"
+  },
+  "websites-eco-kde-org": {
+    "description": "Website to promote KDE's environmental projects",
+    "name": "websites-eco-kde-org",
+    "project_path": "websites/eco-kde-org",
+    "repo_path": "websites/eco-kde-org"
+  },
+  "websites-edu-kde-org": {
+    "description": "Website for KDE's educational software \u2014 edu.kde.org",
+    "name": "websites-edu-kde-org",
+    "project_path": "websites/edu-kde-org",
+    "repo_path": "websites/edu-kde-org"
+  },
+  "websites-elisa-kde-org": {
+    "description": "Website for Elisa \u2014 elisa.kde.org",
+    "name": "websites-elisa-kde-org",
+    "project_path": "websites/elisa-kde-org",
+    "repo_path": "websites/elisa-kde-org"
+  },
+  "websites-ev-kde-org": {
+    "description": "Website for KDE e.V. \u2014 ev.kde.org",
+    "name": "websites-ev-kde-org",
+    "project_path": "websites/ev-kde-org",
+    "repo_path": "websites/ev-kde-org"
+  },
+  "websites-events-kde-org": {
+    "description": "Conference and sprint attendance management system \u2014 events.kde.org",
+    "name": "websites-events-kde-org",
+    "project_path": "websites/events-kde-org",
+    "repo_path": "websites/events-kde-org"
+  },
+  "websites-evolve-kde-org": {
+    "description": "Website for the \"Evolving KDE\" survey",
+    "name": "websites-evolve-kde-org",
+    "project_path": "websites/evolve-kde-org",
+    "repo_path": "websites/evolve-kde-org"
+  },
+  "websites-extensions-krita-org": {
+    "description": "Scripts that were used to power extensions.krita.org",
+    "name": "websites-extensions-krita-org",
+    "project_path": "websites/extensions-krita-org",
+    "repo_path": "websites/extensions-krita-org"
+  },
+  "websites-falkon-org": {
+    "description": "Website for Falkon \u2014 falkon.org",
+    "name": "websites-falkon-org",
+    "project_path": "websites/falkon-org",
+    "repo_path": "websites/falkon-org"
+  },
+  "websites-forum-kde-org": {
+    "description": "KDE Community Forum version of phpBB \u2014 forum.kde.org",
+    "name": "websites-forum-kde-org",
+    "project_path": "websites/forum-kde-org",
+    "repo_path": "websites/forum-kde-org"
+  },
+  "websites-fosdem-2021-website-content": {
+    "description": "Website content for the KDE booth at FOSDEM 2021 (Online Conference)",
+    "name": "websites-fosdem-2021-website-content",
+    "project_path": "websites/fosdem-2021-website-content",
+    "repo_path": "websites/fosdem-2021-website-content"
+  },
+  "websites-fosdem-2021-website-static": {
+    "description": "Static content for the KDE booth at FOSDEM 2021 (Online Conference)",
+    "name": "websites-fosdem-2021-website-static",
+    "project_path": "websites/fosdem-2021-website-static",
+    "repo_path": "websites/fosdem-2021-website-static"
+  },
+  "websites-fr-kde-org": {
+    "description": "Website for the French KDE community \u2014 fr.kde.org",
+    "name": "websites-fr-kde-org",
+    "project_path": "websites/fr-kde-org",
+    "repo_path": "websites/fr-kde-org"
+  },
+  "websites-freebsd-kde-org": {
+    "description": "Website of the KDE/FreeBSD initiative \u2014 freebsd.kde.org",
+    "name": "websites-freebsd-kde-org",
+    "project_path": "websites/freebsd-kde-org",
+    "repo_path": "websites/freebsd-kde-org"
+  },
+  "websites-fund-krita-org": {
+    "description": "Infrastructure for the Krita Fund website",
+    "name": "websites-fund-krita-org",
+    "project_path": "websites/fund-krita-org",
+    "repo_path": "websites/fund-krita-org"
+  },
+  "websites-games-kde-org": {
+    "description": "Website for KDE's games \u2014 games.kde.org",
+    "name": "websites-games-kde-org",
+    "project_path": "websites/games-kde-org",
+    "repo_path": "websites/games-kde-org"
+  },
+  "websites-gcompris-net": {
+    "description": "Website for GCompris \u2014 gcompris.net",
+    "name": "websites-gcompris-net",
+    "project_path": "websites/gcompris-net",
+    "repo_path": "websites/gcompris-net"
+  },
+  "websites-ghostwriter-kde-org": {
+    "description": "Website for Ghostwriter",
+    "name": "websites-ghostwriter-kde-org",
+    "project_path": "websites/ghostwriter-kde-org",
+    "repo_path": "websites/ghostwriter-kde-org"
+  },
+  "websites-go-kde-org": {
+    "description": "Data for the KDE Short URL Redirector Service - go.kde.org",
+    "name": "websites-go-kde-org",
+    "project_path": "websites/go-kde-org",
+    "repo_path": "websites/go-kde-org"
+  },
+  "websites-haruna-kde-org": {
+    "description": "Website for Haruna - haruna.kde.org",
+    "name": "websites-haruna-kde-org",
+    "project_path": "websites/haruna-kde-org",
+    "repo_path": "websites/haruna-kde-org"
+  },
+  "websites-hig-kde-org": {
+    "description": "KDE Human Interface Guidelines website",
+    "name": "websites-hig-kde-org",
+    "project_path": "websites/hig-kde-org",
+    "repo_path": "documentation/hig-kde-org"
+  },
+  "websites-hugo-bootstrap": {
+    "description": "Tooling to provide the Bootstrap CSS/JS framework for Hugo",
+    "name": "websites-hugo-bootstrap",
+    "project_path": "websites/hugo-bootstrap",
+    "repo_path": "websites/hugo-bootstrap"
+  },
+  "websites-hugo-i18n": {
+    "description": "Tooling to help translate Hugo generated websites with gettext",
+    "name": "websites-hugo-i18n",
+    "project_path": "websites/hugo-i18n",
+    "repo_path": "websites/hugo-i18n"
+  },
+  "websites-hugo-kde": {
+    "description": "KDE extensions and theming for the Hugo static website generator framework.",
+    "name": "websites-hugo-kde",
+    "project_path": "websites/hugo-kde",
+    "repo_path": "websites/hugo-kde"
+  },
+  "websites-hugo-kde-template": {
+    "description": "Template for KDE websites based on the Hugo framework.",
+    "name": "websites-hugo-kde-template",
+    "project_path": "websites/hugo-kde-template",
+    "repo_path": "websites/hugo-kde-template"
+  },
+  "websites-i-kaidan-im": {
+    "description": "Easy XMPP invitation landing page for Kaidan \u2014 i.kaidan.im",
+    "name": "websites-i-kaidan-im",
+    "project_path": "websites/i-kaidan-im",
+    "repo_path": "websites/i-kaidan-im"
+  },
+  "websites-identity-kde-org": {
+    "description": "Custom KDE application, code-named Solena, which runs identity.kde.org",
+    "name": "websites-identity-kde-org",
+    "project_path": "websites/identity-kde-org",
+    "repo_path": "websites/identity-kde-org"
+  },
+  "websites-inqlude": {
+    "description": "Tools for Inqlude, the Qt library archive \u2014 inqlude.org",
+    "name": "websites-inqlude",
+    "project_path": "websites/inqlude",
+    "repo_path": "websites/inqlude"
+  },
+  "websites-inqlude-data": {
+    "description": "Metadata for Inqlude, the Qt library archive \u2014 inqlude.org",
+    "name": "websites-inqlude-data",
+    "project_path": "websites/inqlude-data",
+    "repo_path": "websites/inqlude-data"
+  },
+  "websites-jekyll-kde-theme": {
+    "description": "Aether theme for Jekyll-based websites",
+    "name": "websites-jekyll-kde-theme",
+    "project_path": "websites/jekyll-kde-theme",
+    "repo_path": "websites/jekyll-kde-theme"
+  },
+  "websites-jointhegame-kde-org": {
+    "description": "KDE e.V.'s website for the individual membership program",
+    "name": "websites-jointhegame-kde-org",
+    "project_path": "websites/jointhegame-kde-org",
+    "repo_path": "websites/jointhegame-kde-org"
+  },
+  "websites-jp-kde-org": {
+    "description": "Website for the Japanese KDE community / \u65e5\u672c KDE \u30e6\u30fc\u30b6\u4f1a\u306e\u30a6\u30a7\u30d6\u30b5\u30a4\u30c8 \u2014 jp.kde.org",
+    "name": "websites-jp-kde-org",
+    "project_path": "websites/jp-kde-org",
+    "repo_path": "websites/jp-kde-org"
+  },
+  "websites-juk-kde-org": {
+    "description": "Website for JuK \u2014 juk.kde.org",
+    "name": "websites-juk-kde-org",
+    "project_path": "websites/juk-kde-org",
+    "repo_path": "websites/juk-kde-org"
+  },
+  "websites-kaidan-im": {
+    "description": "Website for Kaidan \u2014 kaidan.im",
+    "name": "websites-kaidan-im",
+    "project_path": "websites/kaidan-im",
+    "repo_path": "websites/kaidan-im"
+  },
+  "websites-kate-editor-org": {
+    "description": "Website for Kate \u2014 kate-editor.org",
+    "name": "websites-kate-editor-org",
+    "project_path": "websites/kate-editor-org",
+    "repo_path": "websites/kate-editor-org"
+  },
+  "websites-kde-china-org": {
+    "description": "Website for the Chinese KDE community \u2014 kde-china.org",
+    "name": "websites-kde-china-org",
+    "project_path": "websites/kde-china-org",
+    "repo_path": "websites/kde-china-org"
+  },
+  "websites-kde-in": {
+    "description": "Website for the Indian KDE community \u2014 kde.in",
+    "name": "websites-kde-in",
+    "project_path": "websites/kde-in",
+    "repo_path": "websites/kde-in"
+  },
+  "websites-kde-org": {
+    "description": "Main KDE Community website \u2014 kde.org",
+    "name": "websites-kde-org",
+    "project_path": "websites/kde-org",
+    "repo_path": "websites/kde-org"
+  },
+  "websites-kde-org-announcements-releases": {
+    "description": "Website for KDE.org release announcements \u2014 kde.org/announcements/releases",
+    "name": "websites-kde-org-announcements-releases",
+    "project_path": "websites/kde-org-announcements-releases",
+    "repo_path": "websites/kde-org-announcements-releases"
+  },
+  "websites-kde-org-applications-extractor": {
+    "description": "Code to generate the kde.org/applications metadata",
+    "name": "websites-kde-org-applications-extractor",
+    "project_path": "websites/kde-org-applications-extractor",
+    "repo_path": "websites/kde-org-applications-extractor"
+  },
+  "websites-kde-ru": {
+    "description": "Website for the Russian KDE community \u2014 kde.ru",
+    "name": "websites-kde-ru",
+    "project_path": "websites/kde-ru",
+    "repo_path": "websites/kde-ru"
+  },
+  "websites-kdeconnect-kde-org": {
+    "description": "Website for KDE Connect \u2014 kdeconnect.kde.org",
+    "name": "websites-kdeconnect-kde-org",
+    "project_path": "websites/kdeconnect-kde-org",
+    "repo_path": "websites/kdeconnect-kde-org"
+  },
+  "websites-kdeitalia-it": {
+    "description": "Website for the Italian KDE community \u2014 kdeitalia.it",
+    "name": "websites-kdeitalia-it",
+    "project_path": "websites/kdeitalia-it",
+    "repo_path": "websites/kdeitalia-it"
+  },
+  "websites-kdemail-net": {
+    "description": "E-mail service for KDE contributors \u2014 kdemail.net",
+    "name": "websites-kdemail-net",
+    "project_path": "websites/kdemail-net",
+    "repo_path": "websites/kdemail-net"
+  },
+  "websites-kdesrc-build-kde-org": {
+    "description": "Website for kdesrc-build \u2014 kdesrc-build.kde.org",
+    "name": "websites-kdesrc-build-kde-org",
+    "project_path": "websites/kdesrc-build-kde-org",
+    "repo_path": "websites/kdesrc-build-kde-org"
+  },
+  "websites-kdetalk-net": {
+    "description": "Website for KDE's Jabber server \u2014 kdetalk.net",
+    "name": "websites-kdetalk-net",
+    "project_path": "websites/kdetalk-net",
+    "repo_path": "websites/kdetalk-net"
+  },
+  "websites-kdevelop-org": {
+    "description": "The marketing site for KDevelop.org",
+    "name": "websites-kdevelop-org",
+    "project_path": "websites/kdevelop-org",
+    "repo_path": "websites/kdevelop-org"
+  },
+  "websites-kexi-project-org": {
+    "description": "Website for Kexi - kexi-project.org",
+    "name": "websites-kexi-project-org",
+    "project_path": "websites/kexi-project-org",
+    "repo_path": "websites/kexi-project-org"
+  },
+  "websites-kgeotag-kde-org": {
+    "description": "Website for KGeoTag - kgeotag.kde.org",
+    "name": "websites-kgeotag-kde-org",
+    "project_path": "websites/kgeotag-kde-org",
+    "repo_path": "websites/kgeotag-kde-org"
+  },
+  "websites-kid3-kde-org": {
+    "description": "Website for Kid3 \u2014 kid3.kde.org",
+    "name": "websites-kid3-kde-org",
+    "project_path": "websites/kid3-kde-org",
+    "repo_path": "websites/kid3-kde-org"
+  },
+  "websites-kirogi-org": {
+    "description": "Website for Kirogi \u2014 kirogi.org",
+    "name": "websites-kirogi-org",
+    "project_path": "websites/kirogi-org",
+    "repo_path": "websites/kirogi-org"
+  },
+  "websites-kmymoney-org": {
+    "description": "Website for KMyMoney \u2014 kmymoney.org",
+    "name": "websites-kmymoney-org",
+    "project_path": "websites/kmymoney-org",
+    "repo_path": "websites/kmymoney-org"
+  },
+  "websites-konqueror-org": {
+    "description": "Website for Konqueror",
+    "name": "websites-konqueror-org",
+    "project_path": "websites/konqueror-org",
+    "repo_path": "websites/konqueror-org"
+  },
+  "websites-konsole-kde-org": {
+    "description": "Website for Konsole \u2014 konsole.kde.org",
+    "name": "websites-konsole-kde-org",
+    "project_path": "websites/konsole-kde-org",
+    "repo_path": "websites/konsole-kde-org"
+  },
+  "websites-kontact-kde-org": {
+    "description": "Website for Kontact \u2014 kontact.kde.org",
+    "name": "websites-kontact-kde-org",
+    "project_path": "websites/kontact-kde-org",
+    "repo_path": "websites/kontact-kde-org"
+  },
+  "websites-konversation-kde-org": {
+    "description": "Website for Konversation \u2014 konversation.kde.org",
+    "name": "websites-konversation-kde-org",
+    "project_path": "websites/konversation-kde-org",
+    "repo_path": "websites/konversation-kde-org"
+  },
+  "websites-kpdf-kde-org": {
+    "description": "Static copy of the KPDF website \u2014 kpdf.kde.org",
+    "name": "websites-kpdf-kde-org",
+    "project_path": "websites/kpdf-kde-org",
+    "repo_path": "websites/kpdf-kde-org"
+  },
+  "websites-kphotoalbum-org": {
+    "description": "Website for KPhotoAlbum \u2014 kphotoalbum.org",
+    "name": "websites-kphotoalbum-org",
+    "project_path": "websites/kphotoalbum-org",
+    "repo_path": "websites/kphotoalbum-org"
+  },
+  "websites-krita-org": {
+    "description": "The marketing site for Krita.org, migrated to use the Hugo static site generator",
+    "name": "websites-krita-org",
+    "project_path": "websites/krita-org",
+    "repo_path": "websites/krita-org"
+  },
+  "websites-krita-org-theme": {
+    "description": "Wordpress theme for krita.org",
+    "name": "websites-krita-org-theme",
+    "project_path": "websites/krita-org-theme",
+    "repo_path": "websites/krita-org-theme"
+  },
+  "websites-krusader-org": {
+    "description": "Website for Krusader \u2014 krusader.org",
+    "name": "websites-krusader-org",
+    "project_path": "websites/krusader-org",
+    "repo_path": "websites/krusader-org"
+  },
+  "websites-kst-plot-kde-org": {
+    "description": "Static copy of the Kst Plot website \u2014 kst-plot.kde.org",
+    "name": "websites-kst-plot-kde-org",
+    "project_path": "websites/kst-plot-kde-org",
+    "repo_path": "websites/kst-plot-kde-org"
+  },
+  "websites-kstars-kde-org": {
+    "description": "Website for KStars \u2014 kstars.kde.org",
+    "name": "websites-kstars-kde-org",
+    "project_path": "websites/kstars-kde-org",
+    "repo_path": "websites/kstars-kde-org"
+  },
+  "websites-kube-kde-org": {
+    "description": "Website for Kube \u2014 kube-project.com",
+    "name": "websites-kube-kde-org",
+    "project_path": "websites/kube-kde-org",
+    "repo_path": "websites/kube-kde-org"
+  },
+  "websites-lakademy-kde-org": {
+    "description": "Website for LaKademy \u2014 lakademy.kde.org",
+    "name": "websites-lakademy-kde-org",
+    "project_path": "websites/lakademy-kde-org",
+    "repo_path": "websites/lakademy-kde-org"
+  },
+  "websites-lists-kde-org": {
+    "description": "Necessary code to redirect from lists.kde.org to appropriate mail archives",
+    "name": "websites-lists-kde-org",
+    "project_path": "websites/lists-kde-org",
+    "repo_path": "websites/lists-kde-org"
+  },
+  "websites-lokalize-kde-org": {
+    "description": "Website for Lokalize",
+    "name": "websites-lokalize-kde-org",
+    "project_path": "websites/lokalize-kde-org",
+    "repo_path": "websites/lokalize-kde-org"
+  },
+  "websites-manifesto-kde-org": {
+    "description": "Website for the KDE Manifesto \u2014 manifesto.kde.org",
+    "name": "websites-manifesto-kde-org",
+    "project_path": "websites/manifesto-kde-org",
+    "repo_path": "websites/manifesto-kde-org"
+  },
+  "websites-marble-kde-org": {
+    "description": "Website for Marble \u2014 marble.kde.org",
+    "name": "websites-marble-kde-org",
+    "project_path": "websites/marble-kde-org",
+    "repo_path": "websites/marble-kde-org"
+  },
+  "websites-mediawiki": {
+    "description": "Customized version of MediaWiki that was used by the KDE Wikis",
+    "name": "websites-mediawiki",
+    "project_path": "websites/mediawiki",
+    "repo_path": "websites/mediawiki"
+  },
+  "websites-mediawiki-bugzilla": {
+    "description": "Bugzilla plugin for MediaWiki",
+    "name": "websites-mediawiki-bugzilla",
+    "project_path": "websites/mediawiki-bugzilla",
+    "repo_path": "websites/mediawiki-bugzilla"
+  },
+  "websites-mediawiki-documentation-tags": {
+    "description": "Documentation Tags plugin for MediaWiki",
+    "name": "websites-mediawiki-documentation-tags",
+    "project_path": "websites/mediawiki-documentation-tags",
+    "repo_path": "websites/mediawiki-documentation-tags"
+  },
+  "websites-mediawiki-kde-extensions": {
+    "description": "KDE Specific Extensions for MediaWiki",
+    "name": "websites-mediawiki-kde-extensions",
+    "project_path": "websites/mediawiki-kde-extensions",
+    "repo_path": "websites/mediawiki-kde-extensions"
+  },
+  "websites-mentorship-kde-org": {
+    "description": "Website for KDE Mentor Programs (GSoC and Summer of KDE)",
+    "name": "websites-mentorship-kde-org",
+    "project_path": "websites/mentorship-kde-org",
+    "repo_path": "websites/mentorship-kde-org"
+  },
+  "websites-minuet-kde-org": {
+    "description": "Website for Minuet \u2014 minuet.kde.org",
+    "name": "websites-minuet-kde-org",
+    "project_path": "websites/minuet-kde-org",
+    "repo_path": "websites/minuet-kde-org"
+  },
+  "websites-multimedia-kde-org": {
+    "description": "Website for KDE's multimedia software \u2014 multimedia.kde.org",
+    "name": "websites-multimedia-kde-org",
+    "project_path": "websites/multimedia-kde-org",
+    "repo_path": "websites/multimedia-kde-org"
+  },
+  "websites-my-kde-org": {
+    "description": "Unified identity management for KDE websites",
+    "name": "websites-my-kde-org",
+    "project_path": "websites/my-kde-org",
+    "repo_path": "websites/my-kde-org"
+  },
+  "websites-mykde-mediawiki": {
+    "description": "Mediawiki plugin for MyKDE",
+    "name": "websites-mykde-mediawiki",
+    "project_path": "websites/mykde-mediawiki",
+    "repo_path": "websites/mykde-mediawiki"
+  },
+  "websites-necessitas-kde-org": {
+    "description": "Website for the Necessitas project (Qt on Android)",
+    "name": "websites-necessitas-kde-org",
+    "project_path": "websites/necessitas-kde-org",
+    "repo_path": "websites/necessitas-kde-org"
+  },
+  "websites-neon-kde-org": {
+    "description": "Website for Neon \u2014 neon.kde.org",
+    "name": "websites-neon-kde-org",
+    "project_path": "websites/neon-kde-org",
+    "repo_path": "websites/neon-kde-org"
+  },
+  "websites-neverland": {
+    "description": "Attempt to create a simple and pleasant look and feel for KDE websites",
+    "name": "websites-neverland",
+    "project_path": "websites/neverland",
+    "repo_path": "websites/neverland"
+  },
+  "websites-okular-kde-org": {
+    "description": "Website for Okular \u2014 okular.kde.org",
+    "name": "websites-okular-kde-org",
+    "project_path": "websites/okular-kde-org",
+    "repo_path": "websites/okular-kde-org"
+  },
+  "websites-openraster-org": {
+    "description": "Sphinx setup for the Openraster.org (ORA specification) website",
+    "name": "websites-openraster-org",
+    "project_path": "websites/openraster-org",
+    "repo_path": "documentation/openraster-org"
+  },
+  "websites-paste-kde-org": {
+    "description": "KDE Paste, powered by the Sticky Notes pastebin engine",
+    "name": "websites-paste-kde-org",
+    "project_path": "websites/paste-kde-org",
+    "repo_path": "websites/paste-kde-org"
+  },
+  "websites-pe-kde-org": {
+    "description": "Website for the Peruvian KDE community \u2014 pe.kde.org",
+    "name": "websites-pe-kde-org",
+    "project_path": "websites/pe-kde-org",
+    "repo_path": "websites/pe-kde-org"
+  },
+  "websites-peruse-kde-org": {
+    "description": "Website for Peruse \u2014 peruse.kde.org",
+    "name": "websites-peruse-kde-org",
+    "project_path": "websites/peruse-kde-org",
+    "repo_path": "websites/peruse-kde-org"
+  },
+  "websites-phonon-kde-org": {
+    "description": "Website for Phonon",
+    "name": "websites-phonon-kde-org",
+    "project_path": "websites/phonon-kde-org",
+    "repo_path": "websites/phonon-kde-org"
+  },
+  "websites-planet-kde-org": {
+    "description": "Planet KDE website code and configuration \u2014 planet.kde.org",
+    "name": "websites-planet-kde-org",
+    "project_path": "websites/planet-kde-org",
+    "repo_path": "websites/planet-kde-org"
+  },
+  "websites-plasma-bigscreen-org": {
+    "description": "Website for Plasma BigScreen \u2014 plasma-bigscreen.org",
+    "name": "websites-plasma-bigscreen-org",
+    "project_path": "websites/plasma-bigscreen-org",
+    "repo_path": "websites/plasma-bigscreen-org"
+  },
+  "websites-plasma-kde-org": {
+    "description": "Website for Plasma",
+    "name": "websites-plasma-kde-org",
+    "project_path": "websites/plasma-kde-org",
+    "repo_path": "websites/plasma-kde-org"
+  },
+  "websites-plasma-mobile-org": {
+    "description": "Website for Plasma Mobile \u2014 plasma-mobile.org",
+    "name": "websites-plasma-mobile-org",
+    "project_path": "websites/plasma-mobile-org",
+    "repo_path": "websites/plasma-mobile-org"
+  },
+  "websites-product-screenshots": {
+    "description": "Screenshots of KDE software for promotional use \u2014 cdn.kde.org/screenshots",
+    "name": "websites-product-screenshots",
+    "project_path": "websites/product-screenshots",
+    "repo_path": "websites/product-screenshots"
+  },
+  "websites-projects-kde-org": {
+    "description": "KDE's customized version of Redmine, which used to power Projects",
+    "name": "websites-projects-kde-org",
+    "project_path": "websites/projects-kde-org",
+    "repo_path": "websites/projects-kde-org"
+  },
+  "websites-qtcon-org": {
+    "description": "Static copy of the QtCon website - qtcon.org",
+    "name": "websites-qtcon-org",
+    "project_path": "websites/qtcon-org",
+    "repo_path": "websites/qtcon-org"
+  },
+  "websites-quality-calligra-org": {
+    "description": "Website that provided quality statistics on Calligra",
+    "name": "websites-quality-calligra-org",
+    "project_path": "websites/quality-calligra-org",
+    "repo_path": "websites/quality-calligra-org"
+  },
+  "websites-quality-kde-org": {
+    "description": "Tools that make up the KDE Quality website",
+    "name": "websites-quality-kde-org",
+    "project_path": "websites/quality-kde-org",
+    "repo_path": "websites/quality-kde-org"
+  },
+  "websites-quickgit-kde-org": {
+    "description": "Quickgit Git repository browser (KDE-customized version of GitPHP)",
+    "name": "websites-quickgit-kde-org",
+    "project_path": "websites/quickgit-kde-org",
+    "repo_path": "websites/quickgit-kde-org"
+  },
+  "websites-rekonq-kde-org": {
+    "description": "Website for Rekonq",
+    "name": "websites-rekonq-kde-org",
+    "project_path": "websites/rekonq-kde-org",
+    "repo_path": "websites/rekonq-kde-org"
+  },
+  "websites-releases-neon-kde-org": {
+    "description": "Metadata of Neon releases \u2014 releases.neon.kde.org",
+    "name": "websites-releases-neon-kde-org",
+    "project_path": "websites/releases-neon-kde-org",
+    "repo_path": "websites/releases-neon-kde-org"
+  },
+  "websites-reports-kde-org": {
+    "description": "Website with reports about KDE projects and their activity",
+    "name": "websites-reports-kde-org",
+    "project_path": "websites/reports-kde-org",
+    "repo_path": "websites/reports-kde-org"
+  },
+  "websites-reservoir": {
+    "description": "Web application that was meant as replacement for Capacity",
+    "name": "websites-reservoir",
+    "project_path": "websites/reservoir",
+    "repo_path": "websites/reservoir"
+  },
+  "websites-rkward-kde-org": {
+    "description": "Website for RKWard \u2014 rkward.kde.org",
+    "name": "websites-rkward-kde-org",
+    "project_path": "websites/rkward-kde-org",
+    "repo_path": "websites/rkward-kde-org"
+  },
+  "websites-rolisteam-org": {
+    "description": "Website for Rolisteam \u2014 rolisteam.org",
+    "name": "websites-rolisteam-org",
+    "project_path": "websites/rolisteam-org",
+    "repo_path": "websites/rolisteam-org"
+  },
+  "websites-scripting-krita-org": {
+    "description": "Scripting School website for Krita",
+    "name": "websites-scripting-krita-org",
+    "project_path": "websites/scripting-krita-org",
+    "repo_path": "websites/scripting-krita-org"
+  },
+  "websites-season-kde-org": {
+    "description": "Website to organize programs like Season of KDE \u2014 season.kde.org",
+    "name": "websites-season-kde-org",
+    "project_path": "websites/season-kde-org",
+    "repo_path": "websites/season-kde-org"
+  },
+  "websites-simon-kde-org": {
+    "description": "Static copy of the Drupal-based Simon website \u2014 simon.kde.org",
+    "name": "websites-simon-kde-org",
+    "project_path": "websites/simon-kde-org",
+    "repo_path": "websites/simon-kde-org"
+  },
+  "websites-skrooge-org": {
+    "description": "Website for Skrooge \u2014 skrooge.org",
+    "name": "websites-skrooge-org",
+    "project_path": "websites/skrooge-org",
+    "repo_path": "websites/skrooge-org"
+  },
+  "websites-solid-kde-org": {
+    "description": "Website for Solid",
+    "name": "websites-solid-kde-org",
+    "project_path": "websites/solid-kde-org",
+    "repo_path": "websites/solid-kde-org"
+  },
+  "websites-sprint-kde-org": {
+    "description": "Web application to ease managing sprints",
+    "name": "websites-sprint-kde-org",
+    "project_path": "websites/sprint-kde-org",
+    "repo_path": "websites/sprint-kde-org"
+  },
+  "websites-sso-kde-org": {
+    "description": "Managed user identities for all KDE websites",
+    "name": "websites-sso-kde-org",
+    "project_path": "websites/sso-kde-org",
+    "repo_path": "websites/sso-kde-org"
+  },
+  "websites-subtitlecomposer-kde-org": {
+    "description": "Website for SubtitleComposer",
+    "name": "websites-subtitlecomposer-kde-org",
+    "project_path": "websites/subtitlecomposer-kde-org",
+    "repo_path": "websites/subtitlecomposer-kde-org"
+  },
+  "websites-sysadmin-kde-org-trellis": {
+    "description": "Customized Trellis Desk instance that was used by KDE Sysadmin",
+    "name": "websites-sysadmin-kde-org-trellis",
+    "project_path": "websites/sysadmin-kde-org-trellis",
+    "repo_path": "websites/sysadmin-kde-org-trellis"
+  },
+  "websites-telemetry-krita-org": {
+    "description": "Telemetry backend for Krita \u2014 telemetry.krita.org",
+    "name": "websites-telemetry-krita-org",
+    "project_path": "websites/telemetry-krita-org",
+    "repo_path": "websites/telemetry-krita-org"
+  },
+  "websites-timeline-kde-org": {
+    "description": "Website for community history timeline \u2014 timeline.kde.org",
+    "name": "websites-timeline-kde-org",
+    "project_path": "websites/timeline-kde-org",
+    "repo_path": "websites/timeline-kde-org"
+  },
+  "websites-tr-kde-org": {
+    "description": "Website for the Turkish KDE community / KDE T\u00fcrkiye Toplulu\u011fu i\u00e7in web sayfas\u0131",
+    "name": "websites-tr-kde-org",
+    "project_path": "websites/tr-kde-org",
+    "repo_path": "websites/tr-kde-org"
+  },
+  "websites-umbrello-kde-org": {
+    "description": "Website for Umbrello \u2014 umbrello.kde.org",
+    "name": "websites-umbrello-kde-org",
+    "project_path": "websites/umbrello-kde-org",
+    "repo_path": "websites/umbrello-kde-org"
+  },
+  "websites-utils-kde-org": {
+    "description": "Website for KDE's utilities \u2014 utils.kde.org",
+    "name": "websites-utils-kde-org",
+    "project_path": "websites/utils-kde-org",
+    "repo_path": "websites/utils-kde-org"
+  },
+  "websites-vdesign-kde-org": {
+    "description": "Website for KDE's Visual Design Group",
+    "name": "websites-vdesign-kde-org",
+    "project_path": "websites/vdesign-kde-org",
+    "repo_path": "websites/vdesign-kde-org"
+  },
+  "websites-video-subtitles": {
+    "description": "Subtitles for KDE video content",
+    "name": "websites-video-subtitles",
+    "project_path": "websites/video-subtitles",
+    "repo_path": "websites/video-subtitles"
+  },
+  "websites-volunteers-akademy-kde-org": {
+    "description": "Volunteer management and coordination system \u2014 volunteers.akademy.kde.org",
+    "name": "websites-volunteers-akademy-kde-org",
+    "project_path": "websites/volunteers-akademy-kde-org",
+    "repo_path": "websites/volunteers-akademy-kde-org"
+  },
+  "websites-vvave-kde-org": {
+    "description": "Website for Vvave \u2014 vvave.kde.org",
+    "name": "websites-vvave-kde-org",
+    "project_path": "websites/vvave-kde-org",
+    "repo_path": "websites/vvave-kde-org"
+  },
+  "websites-vvave-stream-kde-org": {
+    "description": "User-contributed content hub for Vvave",
+    "name": "websites-vvave-stream-kde-org",
+    "project_path": "websites/vvave-stream-kde-org",
+    "repo_path": "websites/vvave-stream-kde-org"
+  },
+  "websites-websvn-kde-org": {
+    "description": "KDE SVN repository browser \u2014 websvn.kde.org",
+    "name": "websites-websvn-kde-org",
+    "project_path": "websites/websvn-kde-org",
+    "repo_path": "websites/websvn-kde-org"
+  },
+  "websites-wiki-desktopsummit-org": {
+    "description": "Static copy of the DesktopSummit wiki \u2014 wiki.desktopsummit.org",
+    "name": "websites-wiki-desktopsummit-org",
+    "project_path": "websites/wiki-desktopsummit-org",
+    "repo_path": "websites/wiki-desktopsummit-org"
+  },
+  "websites-wiki-kde-org": {
+    "description": "Landing wiki list website \u2014 wiki.kde.org",
+    "name": "websites-wiki-kde-org",
+    "project_path": "websites/wiki-kde-org",
+    "repo_path": "websites/wiki-kde-org"
+  },
+  "websites-wiki-rolisteam-org": {
+    "description": "Rolisteam documentation (wiki) \u2014 doc.rolisteam.org",
+    "name": "websites-wiki-rolisteam-org",
+    "project_path": "websites/wiki-rolisteam-org",
+    "repo_path": "websites/wiki-rolisteam-org"
+  },
+  "websites-windows-kde-org": {
+    "description": "Website for the KDE Windows project",
+    "name": "websites-windows-kde-org",
+    "project_path": "websites/windows-kde-org",
+    "repo_path": "websites/windows-kde-org"
+  },
+  "websites-wordpress-koan-theme": {
+    "description": "Customised Koan theme for Wordpress",
+    "name": "websites-wordpress-koan-theme",
+    "project_path": "websites/wordpress-koan-theme",
+    "repo_path": "websites/wordpress-koan-theme"
+  },
+  "websites-yakuake-kde-org": {
+    "description": "Website for Yakuake",
+    "name": "websites-yakuake-kde-org",
+    "project_path": "websites/yakuake-kde-org",
+    "repo_path": "websites/yakuake-kde-org"
+  },
+  "websites-zanshin-kde-org": {
+    "description": "Website for Zanshin \u2014 zanshin.kde.org",
+    "name": "websites-zanshin-kde-org",
+    "project_path": "websites/zanshin-kde-org",
+    "repo_path": "websites/zanshin-kde-org"
+  },
+  "whoopsie-kcm": {
+    "description": "A KCM for talking to Ubuntu error tracker submission system Whoopsie",
+    "name": "whoopsie-kcm",
+    "project_path": "playground/base/whoopsie-kcm",
+    "repo_path": "system/whoopsie-kcm"
+  },
+  "wicd-kde": {
+    "description": "A Wicd client built on the KDE Development Platform.\n\n!http://kde-apps.org/CONTENT/content-pre1/132366-1.png!",
+    "name": "wicd-kde",
+    "project_path": "extragear/network/wicd-kde",
+    "repo_path": "unmaintained/wicd-kde"
+  },
+  "wiki-reader": {
+    "description": "A project for reading Wikipedia articles conveniently.",
+    "name": "wiki-reader",
+    "project_path": "unmaintained/wiki-reader",
+    "repo_path": "unmaintained/wiki-reader"
+  },
+  "wikidata-voice-application": {
+    "description": "Wikidata information voice application and mycroft skill for Plasma Bigscreen",
+    "name": "wikidata-voice-application",
+    "project_path": "playground/utils/wikidata-voice-application",
+    "repo_path": "plasma-bigscreen/wikidata-voice-application"
+  },
+  "wikitolearn-backend-for-frontend": {
+    "description": "Backend for the Frontend System of WIkiToLearn",
+    "name": "wikitolearn-backend-for-frontend",
+    "project_path": "playground/www/wikitolearn-backend-for-frontend",
+    "repo_path": "wikitolearn/wikitolearn-backend-for-frontend"
+  },
+  "wikitolearn-chapters-backend": {
+    "description": "Chapters Backend for WikiToLearn",
+    "name": "wikitolearn-chapters-backend",
+    "project_path": "playground/www/wikitolearn-chapters-backend",
+    "repo_path": "wikitolearn/wikitolearn-chapters-backend"
+  },
+  "wikitolearn-content-migration": {
+    "description": "Content Migration Assistants for WikiToLearn",
+    "name": "wikitolearn-content-migration",
+    "project_path": "playground/www/wikitolearn-content-migration",
+    "repo_path": "wikitolearn/wikitolearn-content-migration"
+  },
+  "wikitolearn-course-midtier": {
+    "description": "Mid Tier Course Support for WikiToLearn",
+    "name": "wikitolearn-course-midtier",
+    "project_path": "playground/www/wikitolearn-course-midtier",
+    "repo_path": "wikitolearn/wikitolearn-course-midtier"
+  },
+  "wikitolearn-courses-backend": {
+    "description": "Courses Backend for WikiToLearn",
+    "name": "wikitolearn-courses-backend",
+    "project_path": "playground/www/wikitolearn-courses-backend",
+    "repo_path": "wikitolearn/wikitolearn-courses-backend"
+  },
+  "wikitolearn-coursessecurity-backend": {
+    "description": "Backend Components of Course Security system for WikiToLearn",
+    "name": "wikitolearn-coursessecurity-backend",
+    "project_path": "playground/www/wikitolearn-coursessecurity-backend",
+    "repo_path": "wikitolearn/wikitolearn-coursessecurity-backend"
+  },
+  "wikitolearn-docs": {
+    "description": "Documentation for WikiToLearn",
+    "name": "wikitolearn-docs",
+    "project_path": "playground/www/wikitolearn-docs",
+    "repo_path": "wikitolearn/wikitolearn-docs"
+  },
+  "wikitolearn-docs-atundo": {
+    "description": "Atundo Documentation for WikiToLearn",
+    "name": "wikitolearn-docs-atundo",
+    "project_path": "playground/www/wikitolearn-docs-atundo",
+    "repo_path": "wikitolearn/wikitolearn-docs-atundo"
+  },
+  "wikitolearn-frontend": {
+    "description": "Frontend for WikiToLearn",
+    "name": "wikitolearn-frontend",
+    "project_path": "playground/www/wikitolearn-frontend",
+    "repo_path": "wikitolearn/wikitolearn-frontend"
+  },
+  "wikitolearn-keycloak-mediawiki-btypepassword-patch": {
+    "description": "btypepassword patch for Keycloak's Mediawiki integration",
+    "name": "wikitolearn-keycloak-mediawiki-btypepassword-patch",
+    "project_path": "playground/www/wikitolearn-keycloak-mediawiki-btypepassword-patch",
+    "repo_path": "wikitolearn/wikitolearn-keycloak-mediawiki-btypepassword-patch"
+  },
+  "wikitolearn-keycloak-theme": {
+    "description": "Keycloak Theme used by WikiToLearn",
+    "name": "wikitolearn-keycloak-theme",
+    "project_path": "playground/www/wikitolearn-keycloak-theme",
+    "repo_path": "wikitolearn/wikitolearn-keycloak-theme"
+  },
+  "wikitolearn-math-backend": {
+    "description": "Math Backend for WikiToLearn",
+    "name": "wikitolearn-math-backend",
+    "project_path": "playground/www/wikitolearn-math-backend",
+    "repo_path": "wikitolearn/wikitolearn-math-backend"
+  },
+  "wikitolearn-math-midtier": {
+    "description": "Mid Tier Math Support for WikiToLearn",
+    "name": "wikitolearn-math-midtier",
+    "project_path": "playground/www/wikitolearn-math-midtier",
+    "repo_path": "wikitolearn/wikitolearn-math-midtier"
+  },
+  "wikitolearn-media-midtier": {
+    "description": "Mid Tier Media Support for WikiToLearn",
+    "name": "wikitolearn-media-midtier",
+    "project_path": "playground/www/wikitolearn-media-midtier",
+    "repo_path": "wikitolearn/wikitolearn-media-midtier"
+  },
+  "wikitolearn-offline-extension": {
+    "description": "OfflineExtension is an extension for WikiToLearn that will add offline support to the current Wiki Editor.",
+    "name": "wikitolearn-offline-extension",
+    "project_path": "playground/www/wikitolearn-offline-extension",
+    "repo_path": "wikitolearn/wikitolearn-offline-extension"
+  },
+  "wikitolearn-pages-backend": {
+    "description": "Pages Backend for WikiToLearn",
+    "name": "wikitolearn-pages-backend",
+    "project_path": "playground/www/wikitolearn-pages-backend",
+    "repo_path": "wikitolearn/wikitolearn-pages-backend"
+  },
+  "wikitolearn-pdf-backend": {
+    "description": "PDF Backend for WikiToLearn",
+    "name": "wikitolearn-pdf-backend",
+    "project_path": "playground/www/wikitolearn-pdf-backend",
+    "repo_path": "wikitolearn/wikitolearn-pdf-backend"
+  },
+  "wikitolearn-pwa-gateway": {
+    "description": "PWA Gateway for WikiToLearn",
+    "name": "wikitolearn-pwa-gateway",
+    "project_path": "playground/www/wikitolearn-pwa-gateway",
+    "repo_path": "wikitolearn/wikitolearn-pwa-gateway"
+  },
+  "wikitolearn-sdk": {
+    "description": "SDK for WikiToLearn",
+    "name": "wikitolearn-sdk",
+    "project_path": "playground/www/wikitolearn-sdk",
+    "repo_path": "wikitolearn/wikitolearn-sdk"
+  },
+  "wikitolearn-shared-services": {
+    "description": "Shared Services for WikiToLearn",
+    "name": "wikitolearn-shared-services",
+    "project_path": "playground/www/wikitolearn-shared-services",
+    "repo_path": "wikitolearn/wikitolearn-shared-services"
+  },
+  "wikitolearn-shibboleth-discovery": {
+    "description": "Shibboleth discovery support for WikiToLearn",
+    "name": "wikitolearn-shibboleth-discovery",
+    "project_path": "playground/www/wikitolearn-shibboleth-discovery",
+    "repo_path": "wikitolearn/wikitolearn-shibboleth-discovery"
+  },
+  "wikitolearn-translation": {
+    "description": "Translation Support for WikiToLearn",
+    "name": "wikitolearn-translation",
+    "project_path": "playground/www/wikitolearn-translation",
+    "repo_path": "wikitolearn/wikitolearn-translation"
+  },
+  "xbuilder": {
+    "description": "SDK allowing creation of packages for Plasma Mobile",
+    "name": "xbuilder",
+    "project_path": "unmaintained/xbuilder",
+    "repo_path": "unmaintained/xbuilder"
+  },
+  "xdg-desktop-portal-kde": {
+    "description": "A backend implementation for xdg-desktop-portal that is using Qt/KDE",
+    "name": "xdg-desktop-portal-kde",
+    "project_path": "kde/workspace/xdg-desktop-portal-kde",
+    "repo_path": "plasma/xdg-desktop-portal-kde"
+  },
+  "xdg-portal-test-kde": {
+    "description": "Test application for Flatpak portals and Qt Flatpak platform plugin",
+    "name": "xdg-portal-test-kde",
+    "project_path": "playground/base/xdg-portal-test-kde",
+    "repo_path": "libraries/xdg-portal-test-kde"
+  },
+  "xsettings-kde": {
+    "description": "Allows XSettings aware applications (all GTK+ applications) to be informed instantly of changes in KDE configuration, such as theme name, default font and so on.",
+    "name": "xsettings-kde",
+    "project_path": "playground/base/xsettings-kde",
+    "repo_path": "unmaintained/xsettings-kde"
+  },
+  "xutils": {
+    "description": "Utilities for crossbuilding Plasma packages",
+    "name": "xutils",
+    "project_path": "unmaintained/xutils",
+    "repo_path": "unmaintained/xutils"
+  },
+  "xwaylandvideobridge": {
+    "description": "Utility to allow streaming Wayland windows to X applications",
+    "name": "xwaylandvideobridge",
+    "project_path": "system/xwaylandvideobridge",
+    "repo_path": "system/xwaylandvideobridge"
+  },
+  "yakuake": {
+    "description": "Drop-down terminal emulator based on Konsole technologies",
+    "name": "yakuake",
+    "project_path": "kde/applications/yakuake",
+    "repo_path": "utilities/yakuake"
+  },
+  "yocto-manifest": {
+    "description": "Tracking of Yocto meta-layers for use with KDE",
+    "name": "yocto-manifest",
+    "project_path": "playground/packaging/yocto-manifest",
+    "repo_path": "packaging/yocto-manifest"
+  },
+  "yocto-meta-kde": {
+    "description": "Yocto packaging metadata for KDE projects",
+    "name": "yocto-meta-kde",
+    "project_path": "playground/packaging/yocto-meta-kde",
+    "repo_path": "packaging/yocto-meta-kde"
+  },
+  "yocto-meta-kde-demo": {
+    "description": "Yocto Demo Image for KDE projects",
+    "name": "yocto-meta-kde-demo",
+    "project_path": "playground/packaging/yocto-meta-kde-demo",
+    "repo_path": "packaging/yocto-meta-kde-demo"
+  },
+  "yocto-meta-kf5": {
+    "description": "Yocto packaging metadata for KDE Frameworks",
+    "name": "yocto-meta-kf5",
+    "project_path": "playground/packaging/yocto-meta-kf5",
+    "repo_path": "packaging/yocto-meta-kf5"
+  },
+  "yocto-meta-kf6": {
+    "description": "Yocto packaging metadata for KDE Frameworks 6",
+    "name": "yocto-meta-kf6",
+    "project_path": "playground/packaging/yocto-meta-kf6",
+    "repo_path": "packaging/yocto-meta-kf6"
+  },
+  "youtube-voice-application": {
+    "description": "Youtube video player voice application and mycroft skill for Plasma Bigscreen",
+    "name": "youtube-voice-application",
+    "project_path": "playground/utils/youtube-voice-application",
+    "repo_path": "plasma-bigscreen/youtube-voice-application"
+  },
+  "zanshin": {
+    "description": "Getting Things Done application which aims at getting your mind like water",
+    "name": "zanshin",
+    "project_path": "kde/pim/zanshin",
+    "repo_path": "pim/zanshin"
+  },
+  "zxing-cpp": {
+    "description": null,
+    "name": "zxing-cpp",
+    "project_path": "third-party/zxing-cpp",
+    "repo_path": null
+  }
+}
\ No newline at end of file
diff --git a/pkgs/kde/generated/sources/frameworks.json b/pkgs/kde/generated/sources/frameworks.json
new file mode 100644
index 000000000000..a4e82300ac9a
--- /dev/null
+++ b/pkgs/kde/generated/sources/frameworks.json
@@ -0,0 +1,362 @@
+{
+  "attica": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/attica-6.0.0.tar.xz",
+    "hash": "sha256-7yHY5Xrq5HV7a0Df4NDpw4MCqXkWS05NSTtjG3wCPSM="
+  },
+  "baloo": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/baloo-6.0.0.tar.xz",
+    "hash": "sha256-6iHojR/iUtLcleC3roiRWUgizN2JjnqlbUbtns1iakE="
+  },
+  "bluez-qt": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/bluez-qt-6.0.0.tar.xz",
+    "hash": "sha256-NnmPHnoKRyYHQ1vrKDP2zHfWXLAG3srB7AsKOm9RQus="
+  },
+  "breeze-icons": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/breeze-icons-6.0.0.tar.xz",
+    "hash": "sha256-Rz6YUeT4SmTx6AjVj9h2AhmhsI/q9LUUoTmcjlyIncQ="
+  },
+  "extra-cmake-modules": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/extra-cmake-modules-6.0.0.tar.xz",
+    "hash": "sha256-I5kr8Z23FxVrfW3RMRjKp5/VfwkL6wYugwjbPAn3DQw="
+  },
+  "frameworkintegration": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/frameworkintegration-6.0.0.tar.xz",
+    "hash": "sha256-ND76Tk99HIBN4stqLKx6mAz383h/1PUj+iwtLRX2XZs="
+  },
+  "kapidox": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/kapidox-6.0.0.tar.xz",
+    "hash": "sha256-5M1FL+eWspU2wwtSVuD46oLcre/cspzigvLB6uo3ZLs="
+  },
+  "karchive": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/karchive-6.0.0.tar.xz",
+    "hash": "sha256-daWR2WSAJuuGgml05vOILn9iBZLs74+r6xkgbmOwTlA="
+  },
+  "kauth": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/kauth-6.0.0.tar.xz",
+    "hash": "sha256-ZgRmmNJYRpLVOXpuyAiyyfi3iCoPhSM76c1pKD0Dx2g="
+  },
+  "kbookmarks": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/kbookmarks-6.0.0.tar.xz",
+    "hash": "sha256-FbVDbDrb1RegFPM4A8ML1gZWu8y5orKm5G/U4iN9uaU="
+  },
+  "kcalendarcore": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/kcalendarcore-6.0.0.tar.xz",
+    "hash": "sha256-ZBNWrChsGlKHMnzo+iUpv1MEjkOdH/ZyySXUq34Ot8I="
+  },
+  "kcmutils": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/kcmutils-6.0.0.tar.xz",
+    "hash": "sha256-mwmxQMAT1Wii7jV/gkv7ZBReTf3RaJ2m+/tPQYxbpDs="
+  },
+  "kcodecs": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/kcodecs-6.0.0.tar.xz",
+    "hash": "sha256-zrpE3NwlHUQ7vWy3fRIZ2HavjMKuRxBHKqzngSI5Wr4="
+  },
+  "kcolorscheme": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/kcolorscheme-6.0.0.tar.xz",
+    "hash": "sha256-3kWCJDF1W+Oat66/y3y2/5C0kkV5wqTWauKPkdcKJg4="
+  },
+  "kcompletion": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/kcompletion-6.0.0.tar.xz",
+    "hash": "sha256-9kNAFOeXm2VFkG0f96KSDPq2VkE2mSHmnwCoGLju5Vk="
+  },
+  "kconfig": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/kconfig-6.0.0.tar.xz",
+    "hash": "sha256-P3weawSN9Ks9Z/vvAaWtHdAonJsVhkRmj7oCJcBQwFA="
+  },
+  "kconfigwidgets": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/kconfigwidgets-6.0.0.tar.xz",
+    "hash": "sha256-URvtDZXeGGs89ixxkru2AgRQ1IYfBcGlRTVhRPF95TI="
+  },
+  "kcontacts": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/kcontacts-6.0.0.tar.xz",
+    "hash": "sha256-F5xnSOVVxcAosCpLmxZe3hOgnPXq8OoBI2bJcn0jDsQ="
+  },
+  "kcoreaddons": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/kcoreaddons-6.0.0.tar.xz",
+    "hash": "sha256-6rg4IBtFrJjEEvZNI06J1iNX8nWumulm0HOmTGelJu8="
+  },
+  "kcrash": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/kcrash-6.0.0.tar.xz",
+    "hash": "sha256-9W8e1E5JRBe3BG5PlHka1N3QfGy48PcE8gU3F6RClvk="
+  },
+  "kdav": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/kdav-6.0.0.tar.xz",
+    "hash": "sha256-s8gfXjErPu7SyLfbIY9kuQ9n4bLQzjekT/JztSMoQ+k="
+  },
+  "kdbusaddons": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/kdbusaddons-6.0.0.tar.xz",
+    "hash": "sha256-EecNDHI5vYGJYtkc25SuupR0gFXHcAOk9k/xTasK6Yk="
+  },
+  "kdeclarative": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/kdeclarative-6.0.0.tar.xz",
+    "hash": "sha256-RnHrt+6bou16AtLHHd6Q/mgb5Qfn15E+eayxXfzntvk="
+  },
+  "kded": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/kded-6.0.0.tar.xz",
+    "hash": "sha256-xiQyM/KCeyexpCmHp6MFjxOFP30OK/KJwFXyRdDFxiU="
+  },
+  "kdesu": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/kdesu-6.0.0.tar.xz",
+    "hash": "sha256-JMynq22pYweZ5fAQe1RtN+5jWx+fS3wS61Ohs2GbLAw="
+  },
+  "kdnssd": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/kdnssd-6.0.0.tar.xz",
+    "hash": "sha256-BpSWS6Stt+IL0NEAdpRECimLQz9tqGR6JLwVHcNItnk="
+  },
+  "kdoctools": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/kdoctools-6.0.0.tar.xz",
+    "hash": "sha256-V5maTPAPDWHPKhfihXxyOUTR5I+3vq6wPkpRjaEiyLA="
+  },
+  "kfilemetadata": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/kfilemetadata-6.0.0.tar.xz",
+    "hash": "sha256-zxMNwbMqMaGSE/PhrGfyGAy3kxJA5cdVIRaG6TeS85M="
+  },
+  "kglobalaccel": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/kglobalaccel-6.0.0.tar.xz",
+    "hash": "sha256-WACesNC3DJPcDLCIaukp83VulyyEHXo+Rl34MH5bcUk="
+  },
+  "kguiaddons": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/kguiaddons-6.0.0.tar.xz",
+    "hash": "sha256-IK9Yq2OeqZ3wmsvXSvDIZ/IvHZ+RWVYjq0T7pYNOqmI="
+  },
+  "kholidays": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/kholidays-6.0.0.tar.xz",
+    "hash": "sha256-SC9jdf5TamO2e61FoK04gMdNdPySo6k17LeLKYMNm38="
+  },
+  "ki18n": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/ki18n-6.0.0.tar.xz",
+    "hash": "sha256-Fcv7c+8dOVTWIGdVtuapyG6ie+S02wyEPThJSFG8w1Q="
+  },
+  "kiconthemes": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/kiconthemes-6.0.0.tar.xz",
+    "hash": "sha256-9Ve9Jp+v5hfrjUt6wpWWCflszj6osbOsIxBjpyaSe7A="
+  },
+  "kidletime": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/kidletime-6.0.0.tar.xz",
+    "hash": "sha256-qoRrTPy8SNCENQ0fUlY4/PR2awNjvN5A/O+oio+9p7M="
+  },
+  "kimageformats": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/kimageformats-6.0.0.tar.xz",
+    "hash": "sha256-Hd0o8vuKwslVVveSQYwrYZCgQFCsMbJ6qC6hHBrwh5w="
+  },
+  "kio": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/kio-6.0.0.tar.xz",
+    "hash": "sha256-SVGt8EMpnkY4A8xj7TPVJhuBv/lp6xidwTNQ9JXLS0I="
+  },
+  "kirigami": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/kirigami-6.0.0.tar.xz",
+    "hash": "sha256-7Q9WyJJJ+5Kpr5mpT9E1Qqu65KjxYTqqor+rh5FLYBo="
+  },
+  "kitemmodels": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/kitemmodels-6.0.0.tar.xz",
+    "hash": "sha256-ibh5mBcighqRG7oXZRKIICF5RPp45UUjaRWO2XqDWzo="
+  },
+  "kitemviews": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/kitemviews-6.0.0.tar.xz",
+    "hash": "sha256-re12r3jWa8PpDzocraEX10eDtRmQTQSjlZG5h03zUkM="
+  },
+  "kjobwidgets": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/kjobwidgets-6.0.0.tar.xz",
+    "hash": "sha256-UjnQ1Hr4EYyWK1mBb87uu/+TCkOreSNDiYKsCNvLhL4="
+  },
+  "knewstuff": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/knewstuff-6.0.0.tar.xz",
+    "hash": "sha256-ApnbqYBZC9fHSHCnTGu2ynMq9HirLJukFJQ/YuoL4Po="
+  },
+  "knotifications": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/knotifications-6.0.0.tar.xz",
+    "hash": "sha256-Nf7YE/xZS76Ai8AbURstHv+QI5d7eYETfz/sgZhHE+g="
+  },
+  "knotifyconfig": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/knotifyconfig-6.0.0.tar.xz",
+    "hash": "sha256-Mj/nV6AeyySB2a0EsJAu/T3eE8sfwETuGsG39aKTaeY="
+  },
+  "kpackage": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/kpackage-6.0.0.tar.xz",
+    "hash": "sha256-0q7D3w3/tx6TrMA8RvLUylnFgmOpmJ33UQe/UiPp0bc="
+  },
+  "kparts": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/kparts-6.0.0.tar.xz",
+    "hash": "sha256-8IMIVW7s1tsL5yfsHSezu1M4gKUw0RK7FuwvCOrR9uE="
+  },
+  "kpeople": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/kpeople-6.0.0.tar.xz",
+    "hash": "sha256-IRmsnfqA9NkNbNBE1UTtXlAOmuSHzmFvJHXFjqqQbsM="
+  },
+  "kplotting": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/kplotting-6.0.0.tar.xz",
+    "hash": "sha256-3ENkS3YyNEvUE9dUqn3RBSo83pIwGTq/XaR94TQaY/8="
+  },
+  "kpty": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/kpty-6.0.0.tar.xz",
+    "hash": "sha256-xd81et/BczWT9s6zzZX/ej5YdwH5kLYx367gJ44N8XE="
+  },
+  "kquickcharts": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/kquickcharts-6.0.0.tar.xz",
+    "hash": "sha256-69mo9QG4DnKhL1DZhIR6aY9yg744lkT34kEzSEB2pqU="
+  },
+  "krunner": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/krunner-6.0.0.tar.xz",
+    "hash": "sha256-ItM/0nVno1CuTtrk/lZit0jo+r1TmGNEF5RVjmjzMT0="
+  },
+  "kservice": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/kservice-6.0.0.tar.xz",
+    "hash": "sha256-m0Ss9R0oDeqjEU7FlRimr11kXLHsLrrbXedGgciJG/4="
+  },
+  "kstatusnotifieritem": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/kstatusnotifieritem-6.0.0.tar.xz",
+    "hash": "sha256-tCYXbSy8b+gMdYtsR2pHNB2JqSy7M1XCvjdCikF3KQc="
+  },
+  "ksvg": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/ksvg-6.0.0.tar.xz",
+    "hash": "sha256-0FbLlrBsHxqKjznBNIWM8UN8VGudeanrGpL4kz0eNXk="
+  },
+  "ktexteditor": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/ktexteditor-6.0.0.tar.xz",
+    "hash": "sha256-YgJmwdKI0J967k0ryLFBxzVV1fAzxFK80uLbIGS4/UI="
+  },
+  "ktexttemplate": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/ktexttemplate-6.0.0.tar.xz",
+    "hash": "sha256-uWTmEtLWI7vPP1p2rkukQI+A3mxYgHTGfxiDS15IJ0w="
+  },
+  "ktextwidgets": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/ktextwidgets-6.0.0.tar.xz",
+    "hash": "sha256-sJP1cOo8LUMg5BtXWlQPt1rNW1+Bi8YhWl/bV3VLbEA="
+  },
+  "kunitconversion": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/kunitconversion-6.0.0.tar.xz",
+    "hash": "sha256-yISUrIlxwl3GvJoRGepEwPjtpE6dKIOt6aymUemWjV4="
+  },
+  "kuserfeedback": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/kuserfeedback-6.0.0.tar.xz",
+    "hash": "sha256-AvGvEI4lPIQlJtMcmXoXd7j3puW4aYtbEmfOHsEorys="
+  },
+  "kwallet": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/kwallet-6.0.0.tar.xz",
+    "hash": "sha256-urQ4I96LGwhtxLKtENEL1sTQ0uH4tf1f3V99Nl+45cw="
+  },
+  "kwidgetsaddons": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/kwidgetsaddons-6.0.0.tar.xz",
+    "hash": "sha256-p3cckjEKIagQW6ZN1hwGW6dHI4mcfM/E3itXsX5qa2M="
+  },
+  "kwindowsystem": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/kwindowsystem-6.0.0.tar.xz",
+    "hash": "sha256-GQbKpTt9WPwMTXijyNmfJaoFb8bQnF/BIe1eH4A5apQ="
+  },
+  "kxmlgui": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/kxmlgui-6.0.0.tar.xz",
+    "hash": "sha256-0mxizp9b6GQ/7UZVMUGPtn5NE+32F5epRtowGuuRWPI="
+  },
+  "modemmanager-qt": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/modemmanager-qt-6.0.0.tar.xz",
+    "hash": "sha256-79bqPq5SshJ5ve446A9mfDXZi5d6RC9L1rigpHH5D/M="
+  },
+  "networkmanager-qt": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/networkmanager-qt-6.0.0.tar.xz",
+    "hash": "sha256-Il/J9E4R0GaHziyla+fHRS8K0syFCyL1cVyLcB2rtwA="
+  },
+  "prison": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/prison-6.0.0.tar.xz",
+    "hash": "sha256-b/X7xvw4WBBy7kWQTgItW/Lns7H0msnR0MYCTXyj7Fo="
+  },
+  "purpose": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/purpose-6.0.0.tar.xz",
+    "hash": "sha256-T6hcvS2d1JIW7aZDO0PgW7sRQknaxR31UkIyj364+Xw="
+  },
+  "qqc2-desktop-style": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/qqc2-desktop-style-6.0.0.tar.xz",
+    "hash": "sha256-hIMF/4iA/brRm/V+2fEo5ZzXHsuKNvv5IKVbYPaKLJM="
+  },
+  "solid": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/solid-6.0.0.tar.xz",
+    "hash": "sha256-dcXSVO7OuRfDXLDjK+/3aizxRY93Ps0Od5W0fa1ardM="
+  },
+  "sonnet": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/sonnet-6.0.0.tar.xz",
+    "hash": "sha256-IIPfReenKaN6jWZCFF5qz0xT5rI1MDhD4xAxyNKQros="
+  },
+  "syndication": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/syndication-6.0.0.tar.xz",
+    "hash": "sha256-/15Rifz49vsSiYhuo3DCApXejAcmlSExbCVIuOcpS60="
+  },
+  "syntax-highlighting": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/syntax-highlighting-6.0.0.tar.xz",
+    "hash": "sha256-LvnmuK64VD5k9KNiivozHAZW/mxIXzV0xAdlHXwSplM="
+  },
+  "threadweaver": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/frameworks/6.0/threadweaver-6.0.0.tar.xz",
+    "hash": "sha256-up2uxuBpf9wqzPdKRqbVlAPl40DSgLzpFv1jVqZo3bM="
+  }
+}
\ No newline at end of file
diff --git a/pkgs/kde/generated/sources/gear.json b/pkgs/kde/generated/sources/gear.json
new file mode 100644
index 000000000000..ba2b94b119b9
--- /dev/null
+++ b/pkgs/kde/generated/sources/gear.json
@@ -0,0 +1,1232 @@
+{
+  "akonadi": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/akonadi-24.02.0.tar.xz",
+    "hash": "sha256-ooDLUIgGxAim5i0vkwQDqD5MOn2hCo7x6BGFTl65Bh0="
+  },
+  "akonadi-calendar": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/akonadi-calendar-24.02.0.tar.xz",
+    "hash": "sha256-wxXu+agOTtHuNimKWtTmllexirp3v810zdLVo9CH6j8="
+  },
+  "akonadi-calendar-tools": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/akonadi-calendar-tools-24.02.0.tar.xz",
+    "hash": "sha256-X9UbkWeptqDHo/Kz5FJFKg0J2EmTBH3Ene6zCtYOwFs="
+  },
+  "akonadiconsole": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/akonadiconsole-24.02.0.tar.xz",
+    "hash": "sha256-dcXQuNA8QABV2vqXgVfH5x0WxYnUaY9bPzPtFFcd36k="
+  },
+  "akonadi-contacts": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/akonadi-contacts-24.02.0.tar.xz",
+    "hash": "sha256-yv2cLcSOiNydB8hokupUoz7hm7IxuSp2z697p7ssLgQ="
+  },
+  "akonadi-import-wizard": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/akonadi-import-wizard-24.02.0.tar.xz",
+    "hash": "sha256-uOi+zHJ/8DmxoHwtvFAmBvu6kg58/dlKwuE4YEhgAos="
+  },
+  "akonadi-mime": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/akonadi-mime-24.02.0.tar.xz",
+    "hash": "sha256-y87KziJ7TIwuPzG34W4AF+II3NlOn1j4Dvk+K4jWkys="
+  },
+  "akonadi-notes": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/akonadi-notes-24.02.0.tar.xz",
+    "hash": "sha256-XmkE4VqAx5ompVQwa+Z9u06aYDk0uFzFzO1iYvcg3tg="
+  },
+  "akonadi-search": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/akonadi-search-24.02.0.tar.xz",
+    "hash": "sha256-5ks8Y5mDBfvZe5xgOTRfUUyDWFTd6vAwsFjR5MXVvKU="
+  },
+  "akregator": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/akregator-24.02.0.tar.xz",
+    "hash": "sha256-tQHuTKvdim1+ojBLdhqfYYelzrwyf5DA4QHbQ9Z7TgU="
+  },
+  "alligator": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/alligator-24.02.0.tar.xz",
+    "hash": "sha256-6nB+uUCCB2VYtExrY6dZOkXm3uPnv0AaKuayMZl8dNg="
+  },
+  "analitza": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/analitza-24.02.0.tar.xz",
+    "hash": "sha256-dEK3gEwCyFP3hjfPtLVRqxCGBtLWcxVhfVY4RgeRN7I="
+  },
+  "angelfish": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/angelfish-24.02.0.tar.xz",
+    "hash": "sha256-gg5uLbHddShRmXb/q8QqdN+NzTuhiddDwdJUjUGX6aA="
+  },
+  "arianna": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/arianna-24.02.0.tar.xz",
+    "hash": "sha256-+T65E6LQKhi3Jr8eUsIgUeqNCyXS6rtWF5GRXLwUQTU="
+  },
+  "ark": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/ark-24.02.0.tar.xz",
+    "hash": "sha256-/xH+k1LYqoAgeiHz4CThi0A1y75omrqtIKkf42xFVGk="
+  },
+  "artikulate": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/artikulate-24.02.0.tar.xz",
+    "hash": "sha256-z6yNeJzcgJz5T/89stBR7d1OfU44o8FEwTfjMYZZyHw="
+  },
+  "audiocd-kio": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/audiocd-kio-24.02.0.tar.xz",
+    "hash": "sha256-Y105es7pxSgSqfq7Z05W0v85EAHDWVlevtU9+v5Ex+0="
+  },
+  "audiotube": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/audiotube-24.02.0.tar.xz",
+    "hash": "sha256-XtbcPB9pF9Nabe2QxHlTgmPTxRlDs6c69KVGYCd7lUU="
+  },
+  "baloo-widgets": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/baloo-widgets-24.02.0.tar.xz",
+    "hash": "sha256-mJnW3Gw4PB9mY8EHs5rmHyIy+oPUtjPnkvY77O10yxw="
+  },
+  "blinken": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/blinken-24.02.0.tar.xz",
+    "hash": "sha256-nNV5c4W0BkT3Mpl8i/DTH3BcBofC7PrrlCwz1LKp/XQ="
+  },
+  "bomber": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/bomber-24.02.0.tar.xz",
+    "hash": "sha256-zVsnjGobs3GqH8mDL2M+bh3uCY7lzKmZGm0F8doeyU0="
+  },
+  "bovo": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/bovo-24.02.0.tar.xz",
+    "hash": "sha256-Zg/oKI+3qHa9zHsWsRlCdYhTS9ax6ahpOrcA5tWRu+E="
+  },
+  "calendarsupport": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/calendarsupport-24.02.0.tar.xz",
+    "hash": "sha256-5GW/iQNSQ5nGeenl2grUVOLF5aQnmgUWKzj4UlreUAU="
+  },
+  "calindori": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/calindori-24.02.0.tar.xz",
+    "hash": "sha256-umV2DaNV56clCRw93uOVdVtRpW/JN0ldbfj1/BTz3pM="
+  },
+  "cantor": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/cantor-24.02.0.tar.xz",
+    "hash": "sha256-FBMsAkFCf1tcv7eXoPtaXEqoJh0RB8+emsB2+ilJOBM="
+  },
+  "cervisia": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/cervisia-24.02.0.tar.xz",
+    "hash": "sha256-5gfIBPqqhCWtnjKxPJW5X7CncpMVpFv7DFhKG5cwoNk="
+  },
+  "colord-kde": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/colord-kde-24.02.0.tar.xz",
+    "hash": "sha256-tY9FuIWeFpT+xqgkowH+Uqb4yXhPg6xjGH80A+wLas8="
+  },
+  "dolphin": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/dolphin-24.02.0.tar.xz",
+    "hash": "sha256-EO8oRZfij5M9i06tddAnWaFd9LzJKO0QtU+AZbdDElc="
+  },
+  "dolphin-plugins": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/dolphin-plugins-24.02.0.tar.xz",
+    "hash": "sha256-ounGHd/4Q/CDpWhtmHGYQTdCh4Ne+PxeHRxDwi/RK+A="
+  },
+  "dragon": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/dragon-24.02.0.tar.xz",
+    "hash": "sha256-djHdZhIpgo1dziL+nHgsd3GD0GWd6vIs1n7UsroCRts="
+  },
+  "elisa": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/elisa-24.02.0.tar.xz",
+    "hash": "sha256-7LZwAFqjux3Q9AfCrAMxxwMZTPsrE0ZJL/wzYbhAuLQ="
+  },
+  "eventviews": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/eventviews-24.02.0.tar.xz",
+    "hash": "sha256-BBSMQ4ZdpR2+x1ZfJ5exNv2jW2mAAnJwhu1O2HjlWrs="
+  },
+  "falkon": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/falkon-24.02.0.tar.xz",
+    "hash": "sha256-vkmP2e9LF8+oB2HEeS54Ln3B3jqKhVtI/MfJx9c5Fhc="
+  },
+  "ffmpegthumbs": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/ffmpegthumbs-24.02.0.tar.xz",
+    "hash": "sha256-OD3G1adGS0Q8Fmy0KoUHtZYAaTVtooqRkH12qBeNefE="
+  },
+  "filelight": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/filelight-24.02.0.tar.xz",
+    "hash": "sha256-B/kH6/xe2zkYo+A5psEexc/GnQ8WhZ2iyBPJmKTCB5Y="
+  },
+  "ghostwriter": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/ghostwriter-24.02.0.tar.xz",
+    "hash": "sha256-Eool2WoiDLrGcpw3vI/T7mb03CFERbYoLIbdIPnAhUk="
+  },
+  "granatier": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/granatier-24.02.0.tar.xz",
+    "hash": "sha256-TBfFtGeozCPc8+yjQhav4E29a10ixLgfuf8JnlJRcTE="
+  },
+  "grantlee-editor": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/grantlee-editor-24.02.0.tar.xz",
+    "hash": "sha256-tyCZ7eCMHAN2hrgrtPM5A7qrHkA4A347Km3HBml2RmI="
+  },
+  "grantleetheme": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/grantleetheme-24.02.0.tar.xz",
+    "hash": "sha256-+3+rHO2P6RU+1KxuihNboTNfO2NDD35btgKIRz+evGg="
+  },
+  "gwenview": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/gwenview-24.02.0.tar.xz",
+    "hash": "sha256-A2BtPLoVIPBFVqySsqpEn4Xn2so2pjcWLTPAXsQrsLQ="
+  },
+  "incidenceeditor": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/incidenceeditor-24.02.0.tar.xz",
+    "hash": "sha256-m0AagRUFacYh52OhxbfqB9JD5KlEXS4m3L6QoUaT45g="
+  },
+  "isoimagewriter": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/isoimagewriter-24.02.0.tar.xz",
+    "hash": "sha256-SEu12ZECvXRGfBnHb1o7Ezbg9SlOBKNBEKExCucVn4Y="
+  },
+  "itinerary": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/itinerary-24.02.0.tar.xz",
+    "hash": "sha256-bWOrwT/OTNCATb/BybfGWVuDOXJ1i9jYIH4SEKXnyUM="
+  },
+  "juk": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/juk-24.02.0.tar.xz",
+    "hash": "sha256-YvDfysvTJJ8vmxPxUdTRbuLClnWvBJxAnt6st+nxiIE="
+  },
+  "k3b": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/k3b-24.02.0.tar.xz",
+    "hash": "sha256-LySlx84ps6u88Uqu6SR2I1bc8PXqwAUfg6kt75v3tRw="
+  },
+  "kaccounts-integration": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kaccounts-integration-24.02.0.tar.xz",
+    "hash": "sha256-V4hCWECE4TYop68C52cxIiRMmgMISoUmYfTc5MVtgA4="
+  },
+  "kaccounts-providers": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kaccounts-providers-24.02.0.tar.xz",
+    "hash": "sha256-z2WVslg4ebPwwNFFnczrD5L6MqNknxsSzQ8eAinJV+4="
+  },
+  "kaddressbook": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kaddressbook-24.02.0.tar.xz",
+    "hash": "sha256-ZJFhF7zun1SSOrvOr8cz2wClLDjjnhvJHi3Ibqq8yvU="
+  },
+  "kajongg": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kajongg-24.02.0.tar.xz",
+    "hash": "sha256-Z+jXMjDPZA7aHP3bi2z7yObjiiRibr5yylyZYxNdQws="
+  },
+  "kalarm": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kalarm-24.02.0.tar.xz",
+    "hash": "sha256-AbS/EHNMlH4ohh34ljytllPYsWyFXRvjk3y+v58pWeY="
+  },
+  "kalgebra": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kalgebra-24.02.0.tar.xz",
+    "hash": "sha256-j6aVhapPHfbSCb4lpWVfjsIRbp9SX/h7tx6EYFAmKM4="
+  },
+  "kalk": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kalk-24.02.0.tar.xz",
+    "hash": "sha256-ncrjNBgbtfUMDmSSV9M9xgSTnydDG3lvGlx2+eeV26k="
+  },
+  "kalzium": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kalzium-24.02.0.tar.xz",
+    "hash": "sha256-DuxtcEFqvoJrNygPdOBelvKftrmxtkV1W4CPxYptlak="
+  },
+  "kamera": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kamera-24.02.0.tar.xz",
+    "hash": "sha256-fU41VmagdArlDX0S/hkHG9RYfslutZvB1l2KWO1w5zI="
+  },
+  "kamoso": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kamoso-24.02.0.tar.xz",
+    "hash": "sha256-epVdLiMWDVUEG5bfdWdPLxPeJswJSwXUV3nBOY8/mrk="
+  },
+  "kanagram": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kanagram-24.02.0.tar.xz",
+    "hash": "sha256-Wgc3wkuJ16RmH73J80NXdOPhe7bbRA60NwjYH0zagZU="
+  },
+  "kapman": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kapman-24.02.0.tar.xz",
+    "hash": "sha256-VFzdFH0GWG1Q624zmQIWob45ezlIr9rWeEoeo769meg="
+  },
+  "kapptemplate": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kapptemplate-24.02.0.tar.xz",
+    "hash": "sha256-3XWfNVlUBrackatgMith9yyKtVsSgiIrFm1dvaOu3uE="
+  },
+  "kasts": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kasts-24.02.0.tar.xz",
+    "hash": "sha256-4h2+kJakb87fk7k+Ole7HYihk5zAUULk2ckN2XCHuec="
+  },
+  "kate": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kate-24.02.0.tar.xz",
+    "hash": "sha256-mx78zPTjbvzbwuraY5nNgSjOGHoZGCQAMTBi917jX0g="
+  },
+  "katomic": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/katomic-24.02.0.tar.xz",
+    "hash": "sha256-HCADUPHtuGBJCGpi8+r0NZEOmqXOfinMhanEgCcgCP4="
+  },
+  "kbackup": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kbackup-24.02.0.tar.xz",
+    "hash": "sha256-6zDO95RC7D1Dp9mrAYtRdeuez8PDKmm65PpNdlxekr0="
+  },
+  "kblackbox": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kblackbox-24.02.0.tar.xz",
+    "hash": "sha256-hw6ONCbMwWRN3+9614vM14m6Ctvl7Ws0P95cRRYQc00="
+  },
+  "kblocks": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kblocks-24.02.0.tar.xz",
+    "hash": "sha256-vVvjY9VfjNWMhNgA1y3n+nvx73p1GszZTJ6ZJyd1fXc="
+  },
+  "kbounce": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kbounce-24.02.0.tar.xz",
+    "hash": "sha256-X1B1rBy1D4CEcBT7VpRmIUS2C0in4KaZsESVFHH+8lg="
+  },
+  "kbreakout": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kbreakout-24.02.0.tar.xz",
+    "hash": "sha256-K5JdwUuyO517uUFIozLfaYcZ8ki8P0htz3rFqn/UHl4="
+  },
+  "kbruch": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kbruch-24.02.0.tar.xz",
+    "hash": "sha256-hC8ZOpn3PJ9dZQLA+czyHiORVx/tyJDi2D6QdM8m38U="
+  },
+  "kcachegrind": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kcachegrind-24.02.0.tar.xz",
+    "hash": "sha256-4R1RYWUKVNsiREsZPVIee9jJcLiwguFYgxmDdG4BZfU="
+  },
+  "kcalc": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kcalc-24.02.0.tar.xz",
+    "hash": "sha256-wZtjnWMr7h7fPp+DLnmB9WcaErRktGeLpS27H/8vx8U="
+  },
+  "kcalutils": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kcalutils-24.02.0.tar.xz",
+    "hash": "sha256-gXZ+Fd8kNPxDpcfLi/YAKrNVDONP1Hxtzlh49VuSuD8="
+  },
+  "kcharselect": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kcharselect-24.02.0.tar.xz",
+    "hash": "sha256-YTDOe4n1Fk/taeiZ8xuxGMgASKIRYdLiK5Tlwg0GjaQ="
+  },
+  "kclock": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kclock-24.02.0.tar.xz",
+    "hash": "sha256-WwoZuoUwZ6JhdpKbxlOVAx3pMFVVZgYtGaLuFPiIYkY="
+  },
+  "kcolorchooser": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kcolorchooser-24.02.0.tar.xz",
+    "hash": "sha256-Nic2tvUMD2EJtroFjRQUmifhaRgkvGQj5xhkldpBkSM="
+  },
+  "kcron": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kcron-24.02.0.tar.xz",
+    "hash": "sha256-X/hkM7avtAUMKEsfFf0lCBcreZWoZnY24nQqjZvPFaM="
+  },
+  "kdebugsettings": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kdebugsettings-24.02.0.tar.xz",
+    "hash": "sha256-Kk1DsnxGel6uS/pWyxecBnflYyMipu+qHjmCVBctZqo="
+  },
+  "kdeconnect-kde": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kdeconnect-kde-24.02.0.tar.xz",
+    "hash": "sha256-2VxbNpPRS5VPsJoi0vwXEoFapCR0DL9YcsQKWe1CTg0="
+  },
+  "kde-dev-scripts": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kde-dev-scripts-24.02.0.tar.xz",
+    "hash": "sha256-AOmjoUY5frMMQ2Oj1fsQVc0xDd5oRfBrWApgVmZ5tp0="
+  },
+  "kde-dev-utils": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kde-dev-utils-24.02.0.tar.xz",
+    "hash": "sha256-Ug4MlnOicBnOkGkHT3j/cujRiQ7ho/LpfFJyRPcEMUk="
+  },
+  "kdeedu-data": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kdeedu-data-24.02.0.tar.xz",
+    "hash": "sha256-Cl2akMYUdnn/NszV0PhgdZjj2J/RPlKawdZQksoX728="
+  },
+  "kdegraphics-mobipocket": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kdegraphics-mobipocket-24.02.0.tar.xz",
+    "hash": "sha256-fCNtFpIZJqvY0TuAk0UG0XglrsSU99gUEEjmKydIS4I="
+  },
+  "kdegraphics-thumbnailers": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kdegraphics-thumbnailers-24.02.0.tar.xz",
+    "hash": "sha256-GsDPFZgrHXcBKxOEXlJUwjCiYi0q/Z76d2lfaGElaos="
+  },
+  "kde-inotify-survey": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kde-inotify-survey-24.02.0.tar.xz",
+    "hash": "sha256-UPil14KZALlNu9dtqTCFR8qggT3pMz3G54GV6BqG0+E="
+  },
+  "kdenetwork-filesharing": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kdenetwork-filesharing-24.02.0.tar.xz",
+    "hash": "sha256-I/MUm00NLduYUFRDJm6vzYy1+XAJ6RMnG5QSyTaczm0="
+  },
+  "kdenlive": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kdenlive-24.02.0.tar.xz",
+    "hash": "sha256-E1qR6ZGOtjH+uCK2eGJfNVfpW2pehr3h06wd9jQBUUY="
+  },
+  "kdepim-addons": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kdepim-addons-24.02.0.tar.xz",
+    "hash": "sha256-AOUdgRbc1HIqLhaPhwBPYjyIyHX28CvbeMFmrBoLfCc="
+  },
+  "kdepim-runtime": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kdepim-runtime-24.02.0.tar.xz",
+    "hash": "sha256-XNqKp7PYp71Sb73SDfMPVqLc8QqETYim9xuRIgZ7qzU="
+  },
+  "kdesdk-kio": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kdesdk-kio-24.02.0.tar.xz",
+    "hash": "sha256-MMdAZZqtHukDGhnCo9dV/Xj4HwK7rCfJkM6iLezDoFk="
+  },
+  "kdesdk-thumbnailers": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kdesdk-thumbnailers-24.02.0.tar.xz",
+    "hash": "sha256-RPh4+mDQPeznFzSnu5LqN3Y+2hDWAjll+rFfwuojMwc="
+  },
+  "kdevelop": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kdevelop-24.02.0.tar.xz",
+    "hash": "sha256-ICrN+1Oxve65kV6rGgBW0ZAEDYgJA4lQvy7I1E+oHhk="
+  },
+  "kdev-php": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kdev-php-24.02.0.tar.xz",
+    "hash": "sha256-c/SC70a3Glz7eLiGwmz9DWGCdISGgeYEdSj6ypbQ60k="
+  },
+  "kdev-python": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kdev-python-24.02.0.tar.xz",
+    "hash": "sha256-qUsJfgsXoHBxWlG4f98xRWZ2frnlNaJ4Dt81Jl007Cs="
+  },
+  "kdf": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kdf-24.02.0.tar.xz",
+    "hash": "sha256-vJ9rEouG1m7ZwRjndGSQQKY0L7dnsyfc4h9UuK3Mw08="
+  },
+  "kdialog": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kdialog-24.02.0.tar.xz",
+    "hash": "sha256-d0odH6oCW2iC72XoBtc6fRlWClYOnBzerMAgKwHwvd0="
+  },
+  "kdiamond": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kdiamond-24.02.0.tar.xz",
+    "hash": "sha256-0yKSPPbSn83ewxlPF55FtEAZXG3eXR7lsypLvxx5epo="
+  },
+  "keditbookmarks": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/keditbookmarks-24.02.0.tar.xz",
+    "hash": "sha256-GLvT+HyhIlVIjXDipYiS6YOFeB8epo/qvU/JZXtVhgc="
+  },
+  "keysmith": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/keysmith-24.02.0.tar.xz",
+    "hash": "sha256-6V+kxaDMZuzGYoOSueOiszrN2zLZ/gV5JTQZWYv7IEs="
+  },
+  "kfind": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kfind-24.02.0.tar.xz",
+    "hash": "sha256-wrhF9gz4z8VH7RgAZ/IdrgFdzKySLTxwXesLn1lDAAc="
+  },
+  "kfourinline": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kfourinline-24.02.0.tar.xz",
+    "hash": "sha256-liP40dPpgoBr5uFnzHsCD7FDjHKOTemIQNV6lHrto3M="
+  },
+  "kgeography": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kgeography-24.02.0.tar.xz",
+    "hash": "sha256-CUVKlvIaUF7aC20A/Fx3GvR48/3FivY3/iRBHobxcbY="
+  },
+  "kget": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kget-24.02.0.tar.xz",
+    "hash": "sha256-Z4sJOWwHfKt/5euOJ1qFNElSKfMZW6xmldicV7i+Ru4="
+  },
+  "kgoldrunner": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kgoldrunner-24.02.0.tar.xz",
+    "hash": "sha256-9kEUKpW/YFUC5/8RwunRMGr/A0R8sUG1IlIK1pNDcBk="
+  },
+  "kgpg": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kgpg-24.02.0.tar.xz",
+    "hash": "sha256-G+Jh+Gax8epW0a18wGuRsC54TQHsB+lER5vgQn32eAc="
+  },
+  "khangman": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/khangman-24.02.0.tar.xz",
+    "hash": "sha256-DsBcVkZmEepMS4ba0vkNRtcyUp/R1LdJsPLxTS82pvE="
+  },
+  "khealthcertificate": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/khealthcertificate-24.02.0.tar.xz",
+    "hash": "sha256-sDjTpv1FzmwZuA0piU0P/gNvfLr4/Pz9kopfui5rpEk="
+  },
+  "khelpcenter": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/khelpcenter-24.02.0.tar.xz",
+    "hash": "sha256-+YKRgB6Do66nVs5jdciWRs7dcVaW9oypDFpXOHGSkMY="
+  },
+  "kidentitymanagement": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kidentitymanagement-24.02.0.tar.xz",
+    "hash": "sha256-/dTFko8UEiwztPl891h6B2iebRaLOlajG3+mDXFJBIw="
+  },
+  "kig": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kig-24.02.0.tar.xz",
+    "hash": "sha256-YLxI/ZxPybmoMP+AaZPfrLn2SwKmPgzliKFgxT+m4KM="
+  },
+  "kigo": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kigo-24.02.0.tar.xz",
+    "hash": "sha256-atr3+yK3mBjznenbcHoWuQXUYZs9++727QtggeF8Km0="
+  },
+  "killbots": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/killbots-24.02.0.tar.xz",
+    "hash": "sha256-zMNzSdlypSwSFMofkSHSwSJOTWyUHNSjLGppBcuemaE="
+  },
+  "kimagemapeditor": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kimagemapeditor-24.02.0.tar.xz",
+    "hash": "sha256-hBaiCHRMZ3WeK4eKnq+9fXCjwIdKJfTmUENVW4ip0ao="
+  },
+  "kimap": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kimap-24.02.0.tar.xz",
+    "hash": "sha256-5e/gxzfBjDArMThPQ4HcgmaNZw346uPfGFPdieojtwY="
+  },
+  "kio-admin": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kio-admin-24.02.0.tar.xz",
+    "hash": "sha256-z/rba5KQk00NkBpghVByi/X62o4FDY5fqUHDdaCHmQ8="
+  },
+  "kio-extras": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kio-extras-24.02.0.tar.xz",
+    "hash": "sha256-gFWWyWqZtSKzrraZK8YMFKHEzNIA4CcUPo3tlIyZYt8="
+  },
+  "kio-extras-kf5": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kio-extras-kf5-24.02.0.tar.xz",
+    "hash": "sha256-LxNk8XF1rRzhkbw/IhaFRX9YZKVH1GzLcqYWKD2ArFM="
+  },
+  "kio-gdrive": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kio-gdrive-24.02.0.tar.xz",
+    "hash": "sha256-ufTXGrtoZydhFRrmapKugC8If0Ek6n5qpzZUIiRxkBM="
+  },
+  "kio-zeroconf": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kio-zeroconf-24.02.0.tar.xz",
+    "hash": "sha256-vW6U6K+KGlgDznjyDUDMxpR9tOsE0Gf5Uj18hpYfcU8="
+  },
+  "kipi-plugins": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kipi-plugins-24.02.0.tar.xz",
+    "hash": "sha256-5Auv82sYRsypHu0KD2P2Wr9pfXYTxHM4iWJv8fPSGWA="
+  },
+  "kirigami-gallery": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kirigami-gallery-24.02.0.tar.xz",
+    "hash": "sha256-G+pLnuMoJU72rsrdrh0djhHAADThWHvIKyp2yi5iTIw="
+  },
+  "kiriki": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kiriki-24.02.0.tar.xz",
+    "hash": "sha256-4pbohCmFYQdO+KTAJ48/fCHxRFtkXW3H3mKVZe7FBrs="
+  },
+  "kiten": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kiten-24.02.0.tar.xz",
+    "hash": "sha256-et2aCiEidVKUc8Wc5OR/hsmHu8ITY9yW7VwjvglZYYE="
+  },
+  "kitinerary": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kitinerary-24.02.0.tar.xz",
+    "hash": "sha256-4YxiNjYH3XaQkunhX84+ACUNcG940cfYrSg1vGINl3o="
+  },
+  "kjournald": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kjournald-24.02.0.tar.xz",
+    "hash": "sha256-pPTLND/FD6UK7BYfKP9VznALXC9Fo4qrJtTNBCAounQ="
+  },
+  "kjumpingcube": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kjumpingcube-24.02.0.tar.xz",
+    "hash": "sha256-qfwO/Kmzxdalf+u0cS9pIXCJIt9HqfBG8IXVx5OoS7w="
+  },
+  "kldap": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kldap-24.02.0.tar.xz",
+    "hash": "sha256-AT2c3pSO84rZRRAT5FTDnbcD/Hw3w6kWcKmp5kX8VRo="
+  },
+  "kleopatra": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kleopatra-24.02.0.tar.xz",
+    "hash": "sha256-uRSG9ACE2IaCQzkwHfA434RjKj2BuSVNh3NCQNzZmDg="
+  },
+  "klettres": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/klettres-24.02.0.tar.xz",
+    "hash": "sha256-uNL+4Ady3ZLHyE9S+ACb2AFoFKdd35DZh3bgbsrvYXs="
+  },
+  "klickety": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/klickety-24.02.0.tar.xz",
+    "hash": "sha256-4FiMmSQgF1bo/jgTZwb+32K8hGLZj2SBkr1denfnNag="
+  },
+  "klines": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/klines-24.02.0.tar.xz",
+    "hash": "sha256-72TJ5HDcHIUcEAEqj6v10HEXBIfyfzyzHMahNgs8so4="
+  },
+  "kmag": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kmag-24.02.0.tar.xz",
+    "hash": "sha256-puRJXUqvOU7mDf+L3ysEtLLT1vzeEJJdiP3cn2WTK/w="
+  },
+  "kmahjongg": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kmahjongg-24.02.0.tar.xz",
+    "hash": "sha256-aNWmPk40em68VIQjXhA6CEACqxYmNcBfCchx3zzdBh4="
+  },
+  "kmail": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kmail-24.02.0.tar.xz",
+    "hash": "sha256-NDPwJTVR00DYoPI8HyotUQbhJ+DcnIK+PTCz/DPDd5k="
+  },
+  "kmail-account-wizard": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kmail-account-wizard-24.02.0.tar.xz",
+    "hash": "sha256-MShJn7xViuFpGQWgGr+OKPcQQm4VrPsoaOHKcWM0XcE="
+  },
+  "kmailtransport": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kmailtransport-24.02.0.tar.xz",
+    "hash": "sha256-0esQYgfuuIss9vKzs6R++IGD21ATmpFJ26DXKAXgT6o="
+  },
+  "kmbox": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kmbox-24.02.0.tar.xz",
+    "hash": "sha256-bqjqQ0g0idRGf1KBYxAa9PsZ6jNmTHKFeyq/6KRo9AM="
+  },
+  "kmime": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kmime-24.02.0.tar.xz",
+    "hash": "sha256-TxJRSE8Ytu7fYskhmlBOY1feWt/0AWzDSnFN0Mt0gGU="
+  },
+  "kmines": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kmines-24.02.0.tar.xz",
+    "hash": "sha256-iuyasRb2vN+5Qo+DkLW3LvULiDqMOHikluDJqzjn/cU="
+  },
+  "kmix": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kmix-24.02.0.tar.xz",
+    "hash": "sha256-kcmI6fq5xVPMWakgKzpkvQhmpOPDI2++1Hw4U7Z2gX8="
+  },
+  "kmousetool": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kmousetool-24.02.0.tar.xz",
+    "hash": "sha256-iLM2UIgD2/t26aPIlx2kZ0JHOMmsNwZMr+UARXepbOo="
+  },
+  "kmouth": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kmouth-24.02.0.tar.xz",
+    "hash": "sha256-7aRXYrRkOMnUIZG6Ks2IaTKL9IpmSfGzRZ2G9+XJ5Gw="
+  },
+  "kmplot": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kmplot-24.02.0.tar.xz",
+    "hash": "sha256-ui6FaOEBxKuXMHcqPg0+X04hwpk7rRee5hod+68EWHY="
+  },
+  "knavalbattle": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/knavalbattle-24.02.0.tar.xz",
+    "hash": "sha256-VxD8HBZTIeczXpjGV/WDw9Qt2nMEyVvQElDmNlNU4ZI="
+  },
+  "knetwalk": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/knetwalk-24.02.0.tar.xz",
+    "hash": "sha256-PiBdDwXA8NMJ8nMqBENjsZkiLqdi+81wzzniAfbvN1w="
+  },
+  "knights": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/knights-24.02.0.tar.xz",
+    "hash": "sha256-QjCT6HJOzjNtFHbgD8zhFSe9OuVVeCGdoxOGh4e+HfA="
+  },
+  "knotes": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/knotes-24.02.0.tar.xz",
+    "hash": "sha256-QELnoh1ac9ZvmhdyCxBBCDx9G6I+RfRlid+9eYMj/t0="
+  },
+  "koko": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/koko-24.02.0.tar.xz",
+    "hash": "sha256-b51ePO2XLLPB9UFinnFgLOJWy2omwzQH7xb+QCDL8do="
+  },
+  "kolf": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kolf-24.02.0.tar.xz",
+    "hash": "sha256-g28WB/Ynb5Fa+4gyV9tQriTudp4XiW87rTpRpKgLFC4="
+  },
+  "kollision": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kollision-24.02.0.tar.xz",
+    "hash": "sha256-945+1QG9Y1wEHz9R9jyhZgqjho6gznmhVLxmGDughT4="
+  },
+  "kolourpaint": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kolourpaint-24.02.0.tar.xz",
+    "hash": "sha256-TWUkBV91X13c66eXureQmubABLZpP7Svb8bw8incn08="
+  },
+  "kompare": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kompare-24.02.0.tar.xz",
+    "hash": "sha256-b1gwy6sew3OkOLVxkb/hzRKPcnGmHLNN3aU5O47iN74="
+  },
+  "kongress": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kongress-24.02.0.tar.xz",
+    "hash": "sha256-t4QsBIC8Bb3q5BZyG64qvxW1Vc5nF02ZZwXkqAvyJNk="
+  },
+  "konqueror": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/konqueror-24.02.0.tar.xz",
+    "hash": "sha256-eWMepFIch+Soam/VinRA3sWrunK9gVcvwq+uyLG1NkE="
+  },
+  "konquest": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/konquest-24.02.0.tar.xz",
+    "hash": "sha256-ez/sNbLqLjQK43QKNS9r7th9MghtBpyurF2vBGJ1m+c="
+  },
+  "konsole": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/konsole-24.02.0.tar.xz",
+    "hash": "sha256-KRXtzYVlUr1hme+yPcrxlGBe5PswfHXidgYZglPf3+A="
+  },
+  "kontact": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kontact-24.02.0.tar.xz",
+    "hash": "sha256-4kVTXlOvLk/aQxWIAjKfWAuMivFprFew4rrqLDkk5Yw="
+  },
+  "kontactinterface": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kontactinterface-24.02.0.tar.xz",
+    "hash": "sha256-c4WDAWz/AexNYGiNOzKUiyvJ2U9VvnZtQU6LTM9+484="
+  },
+  "kontrast": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kontrast-24.02.0.tar.xz",
+    "hash": "sha256-kZUHEuCNOSR4N+MqU73BFgP9SE10om3WNEQQ5oLGERw="
+  },
+  "konversation": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/konversation-24.02.0.tar.xz",
+    "hash": "sha256-yNdUoY/x9olK1YHJe5TDJj5L4jihfjL5woyWBkuBguk="
+  },
+  "kopeninghours": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kopeninghours-24.02.0.tar.xz",
+    "hash": "sha256-CVo8wVkB/EGBat0MrLmNpGQ1ZnrCS+GOxV9vugWBhHc="
+  },
+  "korganizer": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/korganizer-24.02.0.tar.xz",
+    "hash": "sha256-QlHvzihgYE2yOqAjSy/tq+4irqL2k3klm/7HOwzQCTI="
+  },
+  "kosmindoormap": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kosmindoormap-24.02.0.tar.xz",
+    "hash": "sha256-+Id+XQ4viBs16Jez1Y5Wue8jrs8eqL4MsvSwHLXXNjQ="
+  },
+  "kpat": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kpat-24.02.0.tar.xz",
+    "hash": "sha256-oPGn3s2Q9T5usfetmW2QqfxKtJzKpJdupNBA1XahxpI="
+  },
+  "kpimtextedit": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kpimtextedit-24.02.0.tar.xz",
+    "hash": "sha256-8T3ON2k8xMlaAFp6zoniAeoQD/leLlshXFVMKnjwXzM="
+  },
+  "kpkpass": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kpkpass-24.02.0.tar.xz",
+    "hash": "sha256-ouOv4Ezasv17JTbZsOzzQDbSdNKqNk3gN81WCfs7CN8="
+  },
+  "kpmcore": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kpmcore-24.02.0.tar.xz",
+    "hash": "sha256-TFxQqVCupwU2FvmqhtKcHS4PG9sSHBfMMefh5zpi3tE="
+  },
+  "kpublictransport": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kpublictransport-24.02.0.tar.xz",
+    "hash": "sha256-it3FzeMe1U2dGMckeq79ZpveEKjNdkA3hN0Lz/nNIvg="
+  },
+  "kqtquickcharts": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kqtquickcharts-24.02.0.tar.xz",
+    "hash": "sha256-fkgwCdCdZs6pkmBCqHO+u4Wx2Jcy2sAXRdEY2FghHM8="
+  },
+  "krdc": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/krdc-24.02.0.tar.xz",
+    "hash": "sha256-yA0xsjleWb2hXnp2Cx4dQUs2QWeREmCJKujh9gYyomE="
+  },
+  "krecorder": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/krecorder-24.02.0.tar.xz",
+    "hash": "sha256-Aelia5F4KOfdrJsCCJHLD6A519RkpiL8uYPf478CdV0="
+  },
+  "kreversi": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kreversi-24.02.0.tar.xz",
+    "hash": "sha256-w724cLuA8cZnE1NFmAj1qIN1YIIEwvcIS6KZbBjk880="
+  },
+  "krfb": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/krfb-24.02.0.tar.xz",
+    "hash": "sha256-rglGiRVq5Gz1z0QPH0QXx60HxeLhNW7yAyT00KmofDo="
+  },
+  "kross-interpreters": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kross-interpreters-24.02.0.tar.xz",
+    "hash": "sha256-Prit+XIbYbKF+g3BU9ikbyNEtufMYjP5yGHkq78IogE="
+  },
+  "kruler": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kruler-24.02.0.tar.xz",
+    "hash": "sha256-f9xZX0SwZ0O081hSWbcSfMISBXr1bpaq3tBOt6wPvNU="
+  },
+  "ksanecore": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/ksanecore-24.02.0.tar.xz",
+    "hash": "sha256-kwh3N/xzTFTPIySSG2terw94ZDBsRJaUKUS5NSzbIds="
+  },
+  "kshisen": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kshisen-24.02.0.tar.xz",
+    "hash": "sha256-nmaObTESP6O/uUAL/cm6h0iHI+WIHdpuiypp9AiyjA8="
+  },
+  "ksirk": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/ksirk-24.02.0.tar.xz",
+    "hash": "sha256-NBBpFUJ8TGlEywsU8VhzNd5Q690EPWdTTIX7SuWnIyg="
+  },
+  "ksmtp": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/ksmtp-24.02.0.tar.xz",
+    "hash": "sha256-Cp/7MrUGfJbZAuYl1Rolb7syn5gU8NpC07UWF7RYqQg="
+  },
+  "ksnakeduel": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/ksnakeduel-24.02.0.tar.xz",
+    "hash": "sha256-oJJ0kNVrROMTGEbCuBRATby/40v2DtPrMnsylhIx9tw="
+  },
+  "kspaceduel": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kspaceduel-24.02.0.tar.xz",
+    "hash": "sha256-tGLVSZcKlE2QNFe4ByV87jeA2hhXJQPkxjPARq2YyvE="
+  },
+  "ksquares": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/ksquares-24.02.0.tar.xz",
+    "hash": "sha256-q5ISgFe3KKSFNgyTpAcCu54rdLlEJR8QOld/jVEfUJo="
+  },
+  "ksudoku": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/ksudoku-24.02.0.tar.xz",
+    "hash": "sha256-l9acSyIMd1NfAvWDtWPut3KIrjnBes3OCKLwhQ8SwCY="
+  },
+  "ksystemlog": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/ksystemlog-24.02.0.tar.xz",
+    "hash": "sha256-digHzjZOgBQtG3GuG0jXkyCSBe17F6vIOPUUqLd3WB4="
+  },
+  "kteatime": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kteatime-24.02.0.tar.xz",
+    "hash": "sha256-S/g5mERK1NPOXnxqk2HkxjQHzad2mq+H6QSLWEUzY34="
+  },
+  "ktimer": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/ktimer-24.02.0.tar.xz",
+    "hash": "sha256-cJM+CATWOSUrEb2MTWXBiFSHoriTPMgX/o26uOBzvV4="
+  },
+  "ktnef": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/ktnef-24.02.0.tar.xz",
+    "hash": "sha256-t+GnG81B3aO3kjrvOeFbiZiFjWgMPXegAf7HAnE++xA="
+  },
+  "ktorrent": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/ktorrent-24.02.0.tar.xz",
+    "hash": "sha256-A4Rafv53jU3H7TlvKE8J1nB9UG1rOmQDnsZLrKWJMFo="
+  },
+  "ktouch": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/ktouch-24.02.0.tar.xz",
+    "hash": "sha256-fWaMAVhzGN1LeknttVXpblgYblhGbHKIuxeRZscjW1s="
+  },
+  "ktrip": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/ktrip-24.02.0.tar.xz",
+    "hash": "sha256-RPJv4m8r+jNCSXBRywS/NCEKp+/thhXaxFW7TznX+7s="
+  },
+  "ktuberling": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/ktuberling-24.02.0.tar.xz",
+    "hash": "sha256-73ODxkH6QxYI9O2wNwCO7cHdNQhwFqzUzBxrFuGfX6o="
+  },
+  "kturtle": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kturtle-24.02.0.tar.xz",
+    "hash": "sha256-rK1KUkW9iFcPpHJ4DleLwGXjPACtcsL6Lg/AojKHLPA="
+  },
+  "kubrick": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kubrick-24.02.0.tar.xz",
+    "hash": "sha256-nVJHXUFodsFhHtEVZtNKJYGCViHPKiCaddXscwfQgUs="
+  },
+  "kwalletmanager": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kwalletmanager-24.02.0.tar.xz",
+    "hash": "sha256-/EgwCPzay6WdobJYauZ8tJ6rF/g/+RRcnJlVqIzUOLI="
+  },
+  "kwave": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kwave-24.02.0.tar.xz",
+    "hash": "sha256-9dRFHIBWD1+UOoVJ2mKCy9gwW5y41tdItDSUfMXI3vk="
+  },
+  "kweather": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kweather-24.02.0.tar.xz",
+    "hash": "sha256-hr6rcTLj0HSLfEApAu0JJbVz15tMY6ShlB5YiYRozK8="
+  },
+  "kwordquiz": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/kwordquiz-24.02.0.tar.xz",
+    "hash": "sha256-ps3PCCOncBxuGTDX1RpxekyleUeBBU04zyeMZuDgL6Q="
+  },
+  "libgravatar": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/libgravatar-24.02.0.tar.xz",
+    "hash": "sha256-0/5VBt3WgCj6IW9c0FADXmjI687MG5/SJNbtMrPntUk="
+  },
+  "libkcddb": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/libkcddb-24.02.0.tar.xz",
+    "hash": "sha256-/aFpBy8m0T2oU3N6iFO2wcxKux1MWxTRuNEw26FH7c8="
+  },
+  "libkcompactdisc": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/libkcompactdisc-24.02.0.tar.xz",
+    "hash": "sha256-yQrLDIhQ6sfdQOlcpsxb1+dOUqg5C0ImAoq2EffXn1M="
+  },
+  "libkdcraw": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/libkdcraw-24.02.0.tar.xz",
+    "hash": "sha256-0TckttdYckBCEJh5ZgbWP3v1Ur6hYlgpSCuvLfmaqxo="
+  },
+  "libkdegames": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/libkdegames-24.02.0.tar.xz",
+    "hash": "sha256-PRE0ItxlQ0iyAl3l/h3iVtBqPFW+nHsQQlPiVZWy4rE="
+  },
+  "libkdepim": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/libkdepim-24.02.0.tar.xz",
+    "hash": "sha256-1BJBnRdPy8X2qkaDHyyoFxjw2KeZcpNfoJfFS48u5+A="
+  },
+  "libkeduvocdocument": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/libkeduvocdocument-24.02.0.tar.xz",
+    "hash": "sha256-PItMxVX08jt3BEYVz4LLqRq4Z2RFtdJcE4+WIXrd4xs="
+  },
+  "libkexiv2": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/libkexiv2-24.02.0.tar.xz",
+    "hash": "sha256-Ko1zP2Duee/4xZmL5jKqNppwURU5A/Acp01gOAlch04="
+  },
+  "libkgapi": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/libkgapi-24.02.0.tar.xz",
+    "hash": "sha256-7x+XLmKerhKQEDm7/Ld9E2WzzzBdjZeA9ySD7/OrOwo="
+  },
+  "libkipi": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/libkipi-24.02.0.tar.xz",
+    "hash": "sha256-Ig9IWMF+fZuFMzLmSB3jUYKhE7QSr38tSf5PIJ7gOR4="
+  },
+  "libkleo": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/libkleo-24.02.0.tar.xz",
+    "hash": "sha256-reQo2spUR5gxSjpbV37+hBfG0hgvdOQn89fHnDyhuWw="
+  },
+  "libkmahjongg": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/libkmahjongg-24.02.0.tar.xz",
+    "hash": "sha256-pld2Ae17ry8cQhMK4ubRm5nqkm0U+CoEYaRrN0wZZ8U="
+  },
+  "libkomparediff2": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/libkomparediff2-24.02.0.tar.xz",
+    "hash": "sha256-bNNk3ADzblPwsdZv+OWvGAXdWXNY6bK64+na9uxNVLg="
+  },
+  "libksane": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/libksane-24.02.0.tar.xz",
+    "hash": "sha256-jo9ZpawoD/dRLHcStGdfd4/KO4Apb7u9+NjPZQsXGrU="
+  },
+  "libksieve": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/libksieve-24.02.0.tar.xz",
+    "hash": "sha256-3vqFYnNCuqQYS7iALrGoui6KzZro3GRBHfinEqg3zK0="
+  },
+  "libktorrent": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/libktorrent-24.02.0.tar.xz",
+    "hash": "sha256-iGZX//AS4iVUMLHLKVWeT3k8L1TkfW7UhEIVQNl1uJo="
+  },
+  "lokalize": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/lokalize-24.02.0.tar.xz",
+    "hash": "sha256-WznIX/27WZ+UW5YErYgIitJUs0A3+hn777wzcaUVCt0="
+  },
+  "lskat": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/lskat-24.02.0.tar.xz",
+    "hash": "sha256-kVALtkeet6C9w9pVm204nq+v4H5S63OSbJiE4qn4x2U="
+  },
+  "mailcommon": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/mailcommon-24.02.0.tar.xz",
+    "hash": "sha256-d/kMdC5VeQp43LdbNKtNgi4cOF45KBeqceEf0cDCQ9o="
+  },
+  "mailimporter": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/mailimporter-24.02.0.tar.xz",
+    "hash": "sha256-3Z1rNH52BzidcBVfXmAyTnRfubqOnybu6skY8ImOdZU="
+  },
+  "marble": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/marble-24.02.0.tar.xz",
+    "hash": "sha256-kpkHPKYXJDUPMjbJkW6oHUvURQCexltzZmCkvwFu+Wo="
+  },
+  "markdownpart": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/markdownpart-24.02.0.tar.xz",
+    "hash": "sha256-a79yKY8hxQIgiu0/76VTAticUGpe510lZdRkU0U0S8k="
+  },
+  "mbox-importer": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/mbox-importer-24.02.0.tar.xz",
+    "hash": "sha256-LOLwaNlk9T7967HEy/+zimaXzy/jEIj6/JuyJrzIiXs="
+  },
+  "merkuro": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/merkuro-24.02.0.tar.xz",
+    "hash": "sha256-oxu1ZAfJCtTi5d+wGxee32WJ6b/G5hTYMXJjmsrUv1E="
+  },
+  "messagelib": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/messagelib-24.02.0.tar.xz",
+    "hash": "sha256-/0jfAZvD+aZVMhlpWpR+gwPRtW16oYW1Hz8klzQujz0="
+  },
+  "mimetreeparser": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/mimetreeparser-24.02.0.tar.xz",
+    "hash": "sha256-XQVGxJ6P1dY5umiuCnkCYKrl4dBoc3WH8r3FwRD/l+8="
+  },
+  "minuet": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/minuet-24.02.0.tar.xz",
+    "hash": "sha256-eFrJR+LOW2f9anvA+9j1BdMwBN4MwZn8hlhitjsJFdM="
+  },
+  "neochat": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/neochat-24.02.0.tar.xz",
+    "hash": "sha256-JOeLm8y90qQHJuO2g7XUHf370G1JA8tHT1mJ/4/gcDI="
+  },
+  "okular": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/okular-24.02.0.tar.xz",
+    "hash": "sha256-/CZVSPhZVixUzUBYf/PGocLQ95JmF5UbBuYUXR9Ck4w="
+  },
+  "palapeli": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/palapeli-24.02.0.tar.xz",
+    "hash": "sha256-0F3kZGY2QIWcyuEaylrfW17Vz1UROc9oViLZxz36tTI="
+  },
+  "parley": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/parley-24.02.0.tar.xz",
+    "hash": "sha256-/b3RBQo/2D6u7wQjj3jU/10NTmRVQkw7ZKm7mC6ZDxc="
+  },
+  "partitionmanager": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/partitionmanager-24.02.0.tar.xz",
+    "hash": "sha256-suxJFlgFvKW4BvZrTsU91KmN1GYzrtVOafBAod8VpKw="
+  },
+  "picmi": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/picmi-24.02.0.tar.xz",
+    "hash": "sha256-/SeGR/MuCTQgVuS0NQ/JjccPTBW0D1XPUu90bIs8IM8="
+  },
+  "pimcommon": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/pimcommon-24.02.0.tar.xz",
+    "hash": "sha256-Yypu3thy6A6Y/BHYv67KgoO34gn2ifJcT9toEsxpkxw="
+  },
+  "pim-data-exporter": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/pim-data-exporter-24.02.0.tar.xz",
+    "hash": "sha256-XmT0wgdRhbL9Ryq851MoF+n0zxD2UPiTR97gt7sDj78="
+  },
+  "pim-sieve-editor": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/pim-sieve-editor-24.02.0.tar.xz",
+    "hash": "sha256-hJCWNj3IIuzNsxQqceqabCsFDBEambr6UUhv7k7zyeQ="
+  },
+  "plasmatube": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/plasmatube-24.02.0.tar.xz",
+    "hash": "sha256-pTR53BqHz5hS44GVPy1aQ5v9Umaf7cn+7QqxTAn/eRk="
+  },
+  "poxml": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/poxml-24.02.0.tar.xz",
+    "hash": "sha256-psDlllkWEHOWtPzwEeMvbAIqHn25Vx/cZIZj+Sb+1To="
+  },
+  "qmlkonsole": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/qmlkonsole-24.02.0.tar.xz",
+    "hash": "sha256-dzCe7Zv0t6G/P8JrAiU/C5212uWWxDNLFoiEQiqqigY="
+  },
+  "rocs": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/rocs-24.02.0.tar.xz",
+    "hash": "sha256-Othj1cCeK/I1sNUEimsdvTwrArecH/xZ5Q0z86tgEwI="
+  },
+  "signon-kwallet-extension": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/signon-kwallet-extension-24.02.0.tar.xz",
+    "hash": "sha256-62lx+1Ef1su7Ng+xolsAMzE7clOPcJUK2NLK+qr7nW4="
+  },
+  "skanlite": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/skanlite-24.02.0.tar.xz",
+    "hash": "sha256-wV7o3vz7Bdof0d7qLJqqPMb7MkiXlPVx7Andi02TiqY="
+  },
+  "skanpage": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/skanpage-24.02.0.tar.xz",
+    "hash": "sha256-ifaShgBg6rDlPibDQPuLsu/dSZm6vx7JVy+moUT9by8="
+  },
+  "spectacle": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/spectacle-24.02.0.tar.xz",
+    "hash": "sha256-YUsQyZC1weKvU5xvYNpcq40ZdbbBeiwkWKgbldLkw9E="
+  },
+  "step": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/step-24.02.0.tar.xz",
+    "hash": "sha256-SfIQVPQjzEuDTzegc29ljm89GcJNuhXvIw2FfaH/HBM="
+  },
+  "svgpart": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/svgpart-24.02.0.tar.xz",
+    "hash": "sha256-JGjS2Cf1M8Mw2X28jrC4PPLYHHhfC7WUKNvOT/z6CGU="
+  },
+  "sweeper": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/sweeper-24.02.0.tar.xz",
+    "hash": "sha256-MtiaAsfpbSSBe4Q0DW1YvP8glecU1c3pYUbk6SWGIow="
+  },
+  "telly-skout": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/telly-skout-24.02.0.tar.xz",
+    "hash": "sha256-u0y0kue+gaWQ4TF5o5J7PFfW7sjsNBkh6tyCraDIi7M="
+  },
+  "tokodon": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/tokodon-24.02.0.tar.xz",
+    "hash": "sha256-DXSOQ/qBse39tBvCPzCeTQ6f1vJTPGY+z7DYw5AOz98="
+  },
+  "umbrello": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/umbrello-24.02.0.tar.xz",
+    "hash": "sha256-AMuUHmihDvZNfU23Fr/OwGjhZV09VSCvl5Rv8z3tE8c="
+  },
+  "yakuake": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/yakuake-24.02.0.tar.xz",
+    "hash": "sha256-jwubjyV5jQpYriB+E8isVch+IgX6bIZRua8/l8AC9qQ="
+  },
+  "zanshin": {
+    "version": "24.02.0",
+    "url": "mirror://kde/stable/release-service/24.02.0/src/zanshin-24.02.0.tar.xz",
+    "hash": "sha256-lgw1cPYmHbfbdEvVzpMe3qZH874suUY9CGm6/DDLZGU="
+  }
+}
\ No newline at end of file
diff --git a/pkgs/kde/generated/sources/plasma.json b/pkgs/kde/generated/sources/plasma.json
new file mode 100644
index 000000000000..605ff3d9fb96
--- /dev/null
+++ b/pkgs/kde/generated/sources/plasma.json
@@ -0,0 +1,317 @@
+{
+  "bluedevil": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/bluedevil-6.0.0.tar.xz",
+    "hash": "sha256-gxRzBpx78HGHryrLsQHTpsdHVVh+SQFCCY1aoFTuYmU="
+  },
+  "breeze": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/breeze-6.0.0.tar.xz",
+    "hash": "sha256-vHKhaxFre+q/G06aRRAZ+QSOe+awWsc6RifyWywgWeo="
+  },
+  "breeze-grub": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/breeze-grub-6.0.0.tar.xz",
+    "hash": "sha256-bsSL/16nneLcQgdr5ROGb9zV10K0ZytpDK8u3OXLcNY="
+  },
+  "breeze-gtk": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/breeze-gtk-6.0.0.tar.xz",
+    "hash": "sha256-zsTK8cIpvDDKAMZgXbTbmKllAhZ/NKm3fKArJrSZqzY="
+  },
+  "breeze-plymouth": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/breeze-plymouth-6.0.0.tar.xz",
+    "hash": "sha256-J3eGWAwBDAmqGS+I0JZFmvYKKv/yWpDo/TldOlInpkw="
+  },
+  "discover": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/discover-6.0.0.tar.xz",
+    "hash": "sha256-e6gl/kd5pJX/7UaStQ5xFw4gIz25kB7L4VKO3Dqz37A="
+  },
+  "drkonqi": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/drkonqi-6.0.0.tar.xz",
+    "hash": "sha256-oI1SR63vWJ5K+8ow3xSPjxgjfFDWThOkzphb93h9MQY="
+  },
+  "flatpak-kcm": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/flatpak-kcm-6.0.0.tar.xz",
+    "hash": "sha256-3u5cNcxTHAkuSJjmvJUInDOzJ5z1mPk0RjY8bYD7cSE="
+  },
+  "kactivitymanagerd": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/kactivitymanagerd-6.0.0.tar.xz",
+    "hash": "sha256-khCzkcMpAY5FrGXG46d/ZFMvPgF2xYm812RgwgMBAvw="
+  },
+  "kde-cli-tools": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/kde-cli-tools-6.0.0.tar.xz",
+    "hash": "sha256-Q3DJO7XCBe8yv0i8APJj6qOQt/G0bfh1pC/L/79Ch0E="
+  },
+  "kdecoration": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/kdecoration-6.0.0.tar.xz",
+    "hash": "sha256-NjpdI9kJUqXi4yvH+/Qf9Nu7fM/xOL7xnUiz2tEfFVE="
+  },
+  "kde-gtk-config": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/kde-gtk-config-6.0.0.tar.xz",
+    "hash": "sha256-YAcf/LVCeBilDKqVsickidoQgFwyuXXTggJsB4+NhFM="
+  },
+  "kdeplasma-addons": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/kdeplasma-addons-6.0.0.tar.xz",
+    "hash": "sha256-vQ1ZBmRGTIhv4URHvjjBYakntw+2yc4opwkPkJAmDPc="
+  },
+  "kgamma": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/kgamma-6.0.0.tar.xz",
+    "hash": "sha256-lwTTLITibYwzAX8LDFYrdBu7ZpW4n6OIKfyEN1pQVmU="
+  },
+  "kglobalacceld": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/kglobalacceld-6.0.0.tar.xz",
+    "hash": "sha256-qn6zTz36/cL0dbsg7WqFY6Lp+/sGRwiQ4SfckFT5Rao="
+  },
+  "kinfocenter": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/kinfocenter-6.0.0.tar.xz",
+    "hash": "sha256-byma0LoUOGQSDazzZUSGOkkGg1pZFcHLiRcGzzmjfnk="
+  },
+  "kmenuedit": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/kmenuedit-6.0.0.tar.xz",
+    "hash": "sha256-+moJ6P7DQ2gNWNR9rt8NWCZ/i5kPEuLFCqcrq8ljrF8="
+  },
+  "kpipewire": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/kpipewire-6.0.0.tar.xz",
+    "hash": "sha256-3Vhe5N47W83BDzb+XfkZZkR8pxZXDWtOoVFg2x8dc7w="
+  },
+  "kscreen": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/kscreen-6.0.0.tar.xz",
+    "hash": "sha256-+XwEV2MLzg2Q/bwPbEXx4rIaYBRL0YLYtB9Yk5v9c0Y="
+  },
+  "kscreenlocker": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/kscreenlocker-6.0.0.tar.xz",
+    "hash": "sha256-JQL6qFyHRgpLXqu5J2nTPBls0zc7PzpSHtOW5QTSKrY="
+  },
+  "ksshaskpass": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/ksshaskpass-6.0.0.tar.xz",
+    "hash": "sha256-tdkYWBTLYsZMVfTA67KQ0jn3Pqr3IVjEWOVkM4xV7cY="
+  },
+  "ksystemstats": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/ksystemstats-6.0.0.tar.xz",
+    "hash": "sha256-qFAYXmObZ4kt6lGy/7cadJj9BJ/8KNFz5u58atPzzro="
+  },
+  "kwallet-pam": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/kwallet-pam-6.0.0.tar.xz",
+    "hash": "sha256-GTqIHaQf8VG84ejt86CUqzUbUi/ZDjenNX0aGV7wBno="
+  },
+  "kwayland": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/kwayland-6.0.0.tar.xz",
+    "hash": "sha256-ADEglGgZZqTPaSKIOYBHokE28bzhMjBzBNDf+hz57Xk="
+  },
+  "kwayland-integration": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/kwayland-integration-6.0.0.tar.xz",
+    "hash": "sha256-BOLLxF6jxLbxiroWYQ/Sx/ogsmPKYGKQsbJ1RmUBAek="
+  },
+  "kwin": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/kwin-6.0.0.tar.xz",
+    "hash": "sha256-sZR8K0TeYZCQhGLIHorIn/nHMmqHZB/rZebM2FJipNs="
+  },
+  "kwrited": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/kwrited-6.0.0.tar.xz",
+    "hash": "sha256-9kHAA98JHE83lsTG8xUdVieoo4UxAITi5/T8rPT3SmI="
+  },
+  "layer-shell-qt": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/layer-shell-qt-6.0.0.tar.xz",
+    "hash": "sha256-FaV6gtnMsNUgtVihc/Mxs5d1yADAsoSB2oCBFeHSirQ="
+  },
+  "libkscreen": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/libkscreen-6.0.0.tar.xz",
+    "hash": "sha256-xCpykMiZ/IuIeJCnsD79cgtHbXrG/JHGTm8D2t/wm0Q="
+  },
+  "libksysguard": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/libksysguard-6.0.0.tar.xz",
+    "hash": "sha256-a3LM++1p8nvOwNhkFO14CHAQmAHMIMUFkBZXyFw2RN0="
+  },
+  "libplasma": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/libplasma-6.0.0.tar.xz",
+    "hash": "sha256-sdj0cBoAndGHl8v2jwa9xFo+haJDsEGQiQtLQEQJJ9I="
+  },
+  "milou": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/milou-6.0.0.tar.xz",
+    "hash": "sha256-yOqST3w5FeHeqlIgugByOFJrPfkCmzrJjsoVjlVSs0o="
+  },
+  "ocean-sound-theme": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/ocean-sound-theme-6.0.0.tar.xz",
+    "hash": "sha256-IqDtyoacebSb5aJVtsPfsNJYTJ72jbt5BhOKfJb2efo="
+  },
+  "oxygen": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/oxygen-6.0.0.tar.xz",
+    "hash": "sha256-+5NjfGeceeuPdkPn1IQiVfN/kluWW84v1Vf4Ct/6weg="
+  },
+  "oxygen-sounds": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/oxygen-sounds-6.0.0.tar.xz",
+    "hash": "sha256-dWWuHsxtOVvK9DaH7/lPVu2opCidDG/19KV1E5HG5Y8="
+  },
+  "plasma5support": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/plasma5support-6.0.0.tar.xz",
+    "hash": "sha256-qhMUh/8sdciSzoxSgTtuH+LWpJ9S7QjzhwDiLA6Z6+0="
+  },
+  "plasma-activities": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/plasma-activities-6.0.0.tar.xz",
+    "hash": "sha256-8L0Hu82QIscuVkBGBGAps59x0cxbRnufUJFIEwQ7J5U="
+  },
+  "plasma-activities-stats": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/plasma-activities-stats-6.0.0.tar.xz",
+    "hash": "sha256-Xmqw/l88XbDeLr5q3NecJhcLkq3cBWzzXwSE+0UAfS4="
+  },
+  "plasma-browser-integration": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/plasma-browser-integration-6.0.0.tar.xz",
+    "hash": "sha256-IdX3JyJKnhxUhqc0UELbQoLqpC4JpoUvt3tbATX09kE="
+  },
+  "plasma-desktop": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/plasma-desktop-6.0.0.tar.xz",
+    "hash": "sha256-kkzgTbLIjPeuGiPxmzjrRSl3CHtuk37QVozlOXvMkn0="
+  },
+  "plasma-disks": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/plasma-disks-6.0.0.tar.xz",
+    "hash": "sha256-uC/+Mn227ddGxCL3HgBxUjcT3m2bL0b7DhLQMAKHTyo="
+  },
+  "plasma-firewall": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/plasma-firewall-6.0.0.tar.xz",
+    "hash": "sha256-MrC04kHmfXqrKt5eo0VnDwlFhQ4iDWWro8blX2AYV5Y="
+  },
+  "plasma-integration": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/plasma-integration-6.0.0.tar.xz",
+    "hash": "sha256-Ez/2bspjY7eYtRUuluNwQAIT5aK8KL1jPYtpFAawLEE="
+  },
+  "plasma-mobile": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/plasma-mobile-6.0.0.tar.xz",
+    "hash": "sha256-128H4RR/0utqMuNdfLTIR5XtoysWHLCmCgRnah6ab/M="
+  },
+  "plasma-nano": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/plasma-nano-6.0.0.tar.xz",
+    "hash": "sha256-mfxE3tTdO0TEX4k+2SIaphJt3p1Paty3JwTAOpMgfCc="
+  },
+  "plasma-nm": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/plasma-nm-6.0.0.tar.xz",
+    "hash": "sha256-Us+Wc4zur85l8YOjRXMlrrWx8YpDNs7t5aImVW5unrQ="
+  },
+  "plasma-pa": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/plasma-pa-6.0.0.tar.xz",
+    "hash": "sha256-tJq7K7dEAbIs2uHZkhAddktIOhjGAIfCAvbmlRRdAiw="
+  },
+  "plasma-sdk": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/plasma-sdk-6.0.0.tar.xz",
+    "hash": "sha256-jLLeV6og30Qzp9lRMGpjfMKErOuuKzTPpxxQ7j7eKqo="
+  },
+  "plasma-systemmonitor": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/plasma-systemmonitor-6.0.0.tar.xz",
+    "hash": "sha256-WJ/QTx/g2Wv6KXpP4D7rAVx7X4OZMlvyMyd9/nnmb5k="
+  },
+  "plasma-thunderbolt": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/plasma-thunderbolt-6.0.0.tar.xz",
+    "hash": "sha256-BHjvWduv56m0l00o8Ukcud37OZ+DHW3BulqwN1zoqJ8="
+  },
+  "plasma-vault": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/plasma-vault-6.0.0.tar.xz",
+    "hash": "sha256-ZB3XHds51dFb6E1LDCTVoODEG0zityVzj6cuWcRS7ak="
+  },
+  "plasma-welcome": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/plasma-welcome-6.0.0.tar.xz",
+    "hash": "sha256-xihVGMLHIQfGgnqdcZj5Oh8wrsb5mZPCoxHjE3/T5mw="
+  },
+  "plasma-workspace": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/plasma-workspace-6.0.0.tar.xz",
+    "hash": "sha256-R92HtMDgnBvLNBYreq4+WjuaSquhuf7Q9NaBuz+f67o="
+  },
+  "plasma-workspace-wallpapers": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/plasma-workspace-wallpapers-6.0.0.tar.xz",
+    "hash": "sha256-Tde+PXqq8Bt8mmKGX/BITnSvEbJGhcVCMaMV90r2uB0="
+  },
+  "plymouth-kcm": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/plymouth-kcm-6.0.0.tar.xz",
+    "hash": "sha256-D79i6jP593fdbe4JPQlALUtNmF2Ghuc1S7xDavqJLeM="
+  },
+  "polkit-kde-agent-1": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/polkit-kde-agent-1-6.0.0.tar.xz",
+    "hash": "sha256-LM/EGoPP74ybMxH+H5OrUtBi9jsPblpjsIJA7RFTqk4="
+  },
+  "powerdevil": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/powerdevil-6.0.0.tar.xz",
+    "hash": "sha256-EmNCdg4bjKS5j6hXmryqQVuFnX1tGAKzagJWSGcssFA="
+  },
+  "print-manager": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/print-manager-6.0.0.tar.xz",
+    "hash": "sha256-vZBXi5HmyQoTxa/PlLwW1XvHo7feiURb+gFfDE54FP0="
+  },
+  "qqc2-breeze-style": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/qqc2-breeze-style-6.0.0.tar.xz",
+    "hash": "sha256-pDDhl8ITxJif4Q/CSeTwrkYu4dP11vvJWPQus4sEySc="
+  },
+  "sddm-kcm": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/sddm-kcm-6.0.0.tar.xz",
+    "hash": "sha256-iBIFJOqFFY5nhPNSP7cGQ8KmXBn+cu4NXwQAc6wih48="
+  },
+  "systemsettings": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/systemsettings-6.0.0.tar.xz",
+    "hash": "sha256-Vh+QE7oHBxwK3Xd4WOyF1AqN3fzIOhD18Ess4QFmZrw="
+  },
+  "wacomtablet": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/wacomtablet-6.0.0.tar.xz",
+    "hash": "sha256-1/MYJz6HWKOiJAFuEJMIc/uO1wnZzWrMJm1lp47k0Ww="
+  },
+  "xdg-desktop-portal-kde": {
+    "version": "6.0.0",
+    "url": "mirror://kde/stable/plasma/6.0.0/xdg-desktop-portal-kde-6.0.0.tar.xz",
+    "hash": "sha256-xW7ePlFI33RoOWGLdLCuOPsPtrEM0Eo1xxvJL41X3Wo="
+  }
+}
\ No newline at end of file
diff --git a/pkgs/kde/lib/mk-kde-derivation.nix b/pkgs/kde/lib/mk-kde-derivation.nix
new file mode 100644
index 000000000000..714a81ce4420
--- /dev/null
+++ b/pkgs/kde/lib/mk-kde-derivation.nix
@@ -0,0 +1,123 @@
+self: {
+  lib,
+  stdenv,
+  makeSetupHook,
+  fetchurl,
+  cmake,
+  qt6,
+}: let
+  dependencies = (lib.importJSON ../generated/dependencies.json).dependencies;
+  projectInfo = lib.importJSON ../generated/projects.json;
+
+  licenseInfo = lib.importJSON ../generated/licenses.json;
+  licensesBySpdxId =
+    (lib.mapAttrs' (_: v: {
+        name = v.spdxId or "unknown";
+        value = v;
+      })
+      lib.licenses)
+    // {
+      # https://community.kde.org/Policies/Licensing_Policy
+      "LicenseRef-KDE-Accepted-GPL" = lib.licenses.gpl3Plus;
+      "LicenseRef-KFQF-Accepted-GPL" = lib.licenses.gpl3Plus;
+      "LicenseRef-KDE-Accepted-LGPL" = lib.licenses.lgpl3Plus;
+
+      # https://sjfonts.sourceforge.net/
+      "LicenseRef-SJFonts" = lib.licenses.gpl2Plus;
+
+      # https://invent.kde.org/education/kiten/-/blob/master/LICENSES/LicenseRef-EDRDG.txt
+      "LicenseRef-EDRDG" = lib.licenses.cc-by-sa-30;
+
+      # https://invent.kde.org/kdevelop/kdevelop/-/blob/master/LICENSES/LicenseRef-MIT-KDevelop-Ideal.txt
+      "LicenseRef-MIT-KDevelop-Ideal" = lib.licenses.mit;
+
+      "FSFAP" = {
+        spdxId = "FSFAP";
+        fullName = "FSF All Permissive License";
+      };
+
+      "FSFULLR" = {
+        spdxId = "FSFULLR";
+        fullName = "FSF Unlimited License (with License Retention)";
+      };
+
+      "W3C-20150513" = {
+        spdxId = "W3C-20150513";
+        fullName = "W3C Software Notice and Document License (2015-05-13)";
+      };
+
+      # Technically not exact
+      "bzip2-1.0.6" = lib.licenses.bsdOriginal;
+
+      # FIXME: typo lol
+      "ICS" = lib.licenses.isc;
+
+      # These are only relevant to Qt commercial users
+      "Qt-Commercial-exception-1.0" = null;
+      "LicenseRef-Qt-Commercial" = null;
+      "LicenseRef-Qt-Commercial-exception-1.0" = null;
+
+      # FIXME: ???
+      "Qt-GPL-exception-1.0" = null;
+      "LicenseRef-Qt-LGPL-exception-1.0" = null;
+      "Qt-LGPL-exception-1.1" = null;
+      "LicenseRef-Qt-exception" = null;
+      "GCC-exception-3.1" = null;
+      "Bison-exception-2.2" = null;
+      "Font-exception-2.0" = null;
+      None = null;
+    };
+
+  moveDevHook = makeSetupHook {name = "kf6-move-dev-hook";} ./move-dev-hook.sh;
+in
+  {
+    pname,
+    version ? self.sources.${pname}.version,
+    src ? self.sources.${pname},
+    extraBuildInputs ? [],
+    extraNativeBuildInputs ? [],
+    extraPropagatedBuildInputs ? [],
+    extraCmakeFlags ? [],
+    meta ? {},
+    ...
+  } @ args: let
+    # FIXME(later): this is wrong for cross, some of these things really need to go into nativeBuildInputs,
+    # but cross is currently very broken anyway, so we can figure this out later.
+    deps = map (dep: self.${dep}) (dependencies.${pname} or []);
+
+    defaultArgs = {
+      inherit version src;
+
+      outputs = ["out" "dev"];
+
+      nativeBuildInputs = [cmake qt6.wrapQtAppsHook moveDevHook] ++ extraNativeBuildInputs;
+      buildInputs = [qt6.qtbase] ++ extraBuildInputs;
+
+      # FIXME: figure out what to propagate here
+      propagatedBuildInputs = deps ++ extraPropagatedBuildInputs;
+      strictDeps = true;
+
+      dontFixCmake = true;
+      cmakeFlags = ["-DQT_MAJOR_VERSION=6"] ++ extraCmakeFlags;
+
+      separateDebugInfo = true;
+
+      meta =
+        {
+          description = projectInfo.${pname}.description;
+          homepage = "https://invent.kde.org/${projectInfo.${pname}.repo_path}";
+          license = lib.filter (l: l != null) (map (l: licensesBySpdxId.${l}) licenseInfo.${pname});
+          maintainers = lib.teams.qt-kde.members;
+        }
+        // meta;
+    };
+
+    cleanArgs = builtins.removeAttrs args [
+      "extraBuildInputs"
+      "extraNativeBuildInputs"
+      "extraPropagatedBuildInputs"
+      "extraCmakeFlags"
+      "meta"
+    ];
+  in
+    stdenv.mkDerivation (defaultArgs // cleanArgs)
diff --git a/pkgs/kde/lib/move-dev-hook.sh b/pkgs/kde/lib/move-dev-hook.sh
new file mode 100644
index 000000000000..da5770e1bba1
--- /dev/null
+++ b/pkgs/kde/lib/move-dev-hook.sh
@@ -0,0 +1,8 @@
+# shellcheck shell=bash
+# shellcheck disable=SC2154
+
+moveKF6DevTools() {
+    moveToOutput "${qtPluginPrefix}/designer" "${!outputDev}"
+}
+
+postInstallHooks+=('moveKF6DevTools')
diff --git a/pkgs/kde/misc/alpaka/default.nix b/pkgs/kde/misc/alpaka/default.nix
new file mode 100644
index 000000000000..6e4154c495d8
--- /dev/null
+++ b/pkgs/kde/misc/alpaka/default.nix
@@ -0,0 +1,25 @@
+{
+  lib,
+  mkKdeDerivation,
+  fetchFromGitLab,
+}:
+mkKdeDerivation {
+  pname = "alpaka";
+  version = "unstable-2024-02-27";
+
+  src = fetchFromGitLab {
+    domain = "invent.kde.org";
+    owner = "utilities";
+    repo = "alpaka";
+    rev = "64ef70f062920e2d62b5a9337485ccbf0eb86b97";
+    hash = "sha256-YDn86+byjvCK525EQsGTCKf88Ovhvii848nTJHGP1bg=";
+  };
+
+  meta.license = with lib.licenses; [
+    bsd3
+    cc0
+    gpl2Only
+    gpl2Plus
+    gpl3Only
+  ];
+}
diff --git a/pkgs/kde/misc/kdiagram/default.nix b/pkgs/kde/misc/kdiagram/default.nix
new file mode 100644
index 000000000000..f396db7a3378
--- /dev/null
+++ b/pkgs/kde/misc/kdiagram/default.nix
@@ -0,0 +1,20 @@
+{
+  lib,
+  mkKdeDerivation,
+  fetchurl,
+  qttools,
+  qtsvg,
+}:
+mkKdeDerivation rec {
+  pname = "kdiagram";
+  version = "3.0.1";
+
+  src = fetchurl {
+    url = "mirror://kde/stable/kdiagram/${version}/kdiagram-${version}.tar.xz";
+    hash = "sha256-Rlmwws2dsYFD9avZyAYJHDqrarwalWu/goFas9MYnG0=";
+  };
+
+  extraNativeBuildInputs = [qttools qtsvg];
+
+  meta.license = [lib.licenses.gpl2];
+}
diff --git a/pkgs/kde/misc/kdsoap-ws-discovery-client/default.nix b/pkgs/kde/misc/kdsoap-ws-discovery-client/default.nix
new file mode 100644
index 000000000000..f4c2637a9600
--- /dev/null
+++ b/pkgs/kde/misc/kdsoap-ws-discovery-client/default.nix
@@ -0,0 +1,19 @@
+{
+  lib,
+  mkKdeDerivation,
+  fetchurl,
+  doxygen,
+}:
+mkKdeDerivation rec {
+  pname = "kdsoap-ws-discovery-client";
+  version = "0.4.0";
+
+  src = fetchurl {
+    url = "mirror://kde/stable/kdsoap-ws-discovery-client/kdsoap-ws-discovery-client-${version}.tar.xz";
+    hash = "sha256-LNJHwBPnX0EGWbrDcq/5PSLXHFpUwFnhN7lESvizQno=";
+  };
+
+  extraNativeBuildInputs = [doxygen];
+
+  meta.license = [lib.licenses.gpl3Plus];
+}
diff --git a/pkgs/kde/misc/kio-fuse/default.nix b/pkgs/kde/misc/kio-fuse/default.nix
new file mode 100644
index 000000000000..b5461fd02de0
--- /dev/null
+++ b/pkgs/kde/misc/kio-fuse/default.nix
@@ -0,0 +1,21 @@
+{
+  lib,
+  mkKdeDerivation,
+  fetchurl,
+  pkg-config,
+  fuse3,
+}:
+mkKdeDerivation rec {
+  pname = "kio-fuse";
+  version = "5.1.0";
+
+  src = fetchurl {
+    url = "mirror://kde/stable/kio-fuse/kio-fuse-${version}.tar.xz";
+    hash = "sha256-fRBFgSJ9Whm0JLM/QWjRgVVrEBXW3yIY4BqI1kRJ6Us=";
+  };
+
+  extraNativeBuildInputs = [pkg-config];
+  extraBuildInputs = [fuse3];
+
+  meta.license = with lib.licenses; [gpl3Plus];
+}
diff --git a/pkgs/kde/misc/kirigami-addons/default.nix b/pkgs/kde/misc/kirigami-addons/default.nix
new file mode 100644
index 000000000000..14852d56f5b1
--- /dev/null
+++ b/pkgs/kde/misc/kirigami-addons/default.nix
@@ -0,0 +1,31 @@
+{
+  lib,
+  mkKdeDerivation,
+  fetchurl,
+  qtdeclarative,
+  qt5compat,
+}:
+mkKdeDerivation rec {
+  pname = "kirigami-addons";
+  version = "1.0.1";
+
+  src = fetchurl {
+    url = "mirror://kde/stable/kirigami-addons/kirigami-addons-${version}.tar.xz";
+    hash = "sha256-nQE4R++wBIxqJ5nuDtKBsU7uFTFKwg1/uoUxl+RfKbc=";
+  };
+
+  extraBuildInputs = [qtdeclarative];
+  extraPropagatedBuildInputs = [qt5compat];
+
+  meta.license = with lib.licenses; [
+    bsd2
+    cc-by-sa-40
+    cc0
+    gpl2Plus
+    lgpl2Only
+    lgpl2Plus
+    lgpl21Only
+    lgpl21Plus
+    lgpl3Only
+  ];
+}
diff --git a/pkgs/kde/misc/ktextaddons/default.nix b/pkgs/kde/misc/ktextaddons/default.nix
new file mode 100644
index 000000000000..086608f2b662
--- /dev/null
+++ b/pkgs/kde/misc/ktextaddons/default.nix
@@ -0,0 +1,27 @@
+{
+  lib,
+  mkKdeDerivation,
+  fetchurl,
+  qtspeech,
+  qttools,
+  kxmlgui,
+}:
+mkKdeDerivation rec {
+  pname = "ktextaddons";
+  version = "1.5.3";
+
+  src = fetchurl {
+    url = "mirror://kde/stable/ktextaddons/ktextaddons-${version}.tar.xz";
+    hash = "sha256-ilLbir+oqdaNLSkfsPi+IGWf14mZh7Tcr98kaNsJF9w=";
+  };
+
+  extraBuildInputs = [qtspeech qttools kxmlgui];
+
+  meta.license = with lib.licenses; [
+    bsd3
+    cc0
+    gpl2Plus
+    lgpl2Plus
+    lgpl21Plus
+  ];
+}
diff --git a/pkgs/kde/misc/kunifiedpush/default.nix b/pkgs/kde/misc/kunifiedpush/default.nix
new file mode 100644
index 000000000000..54f902913901
--- /dev/null
+++ b/pkgs/kde/misc/kunifiedpush/default.nix
@@ -0,0 +1,24 @@
+{
+  lib,
+  mkKdeDerivation,
+  fetchFromGitLab,
+  qtwebsockets,
+  kdeclarative,
+  kpackage,
+}:
+mkKdeDerivation {
+  pname = "kunifiedpush";
+  version = "unstable-2024-02-19";
+
+  src = fetchFromGitLab {
+    domain = "invent.kde.org";
+    owner = "libraries";
+    repo = "kunifiedpush";
+    rev = "b89a31fb4f333a4e5d6c475a030147c8bdcffec6";
+    hash = "sha256-bhlsEP7cLuA6Rj6nrpp5iC3uolc02twNMLsWl+d/BXo=";
+  };
+
+  extraBuildInputs = [qtwebsockets kdeclarative kpackage];
+
+  meta.license = with lib.licenses; [bsd2 bsd3 cc0 lgpl2Plus];
+}
diff --git a/pkgs/kde/misc/kweathercore/default.nix b/pkgs/kde/misc/kweathercore/default.nix
new file mode 100644
index 000000000000..31dbf598dcfd
--- /dev/null
+++ b/pkgs/kde/misc/kweathercore/default.nix
@@ -0,0 +1,19 @@
+{
+  lib,
+  mkKdeDerivation,
+  fetchurl,
+  qtpositioning,
+}:
+mkKdeDerivation rec {
+  pname = "kweathercore";
+  version = "0.8.0";
+
+  src = fetchurl {
+    url = "mirror://kde/stable/kweathercore/${version}/kweathercore-${version}.tar.xz";
+    hash = "sha256-m8rBPa+YcF4vDVsGshoahpSWIHj84b9iDbvDZIc6Dv4=";
+  };
+
+  extraBuildInputs = [qtpositioning];
+
+  meta.license = with lib.licenses; [cc-by-40 cc0 lgpl2Plus];
+}
diff --git a/pkgs/kde/misc/mpvqt/default.nix b/pkgs/kde/misc/mpvqt/default.nix
new file mode 100644
index 000000000000..4ec52aba0793
--- /dev/null
+++ b/pkgs/kde/misc/mpvqt/default.nix
@@ -0,0 +1,23 @@
+{
+  lib,
+  mkKdeDerivation,
+  fetchFromGitLab,
+  mpv,
+  qtdeclarative,
+}:
+mkKdeDerivation rec {
+  pname = "mpvqt";
+  version = "1.0.0";
+
+  src = fetchFromGitLab {
+    domain = "invent.kde.org";
+    owner = "libraries";
+    repo = "mpvqt";
+    rev = "v${version}";
+    hash = "sha256-XHiCxH7dJxJamloM2SJbiFHDt8j4rVfv/M9PaBzvgM4=";
+  };
+
+  extraBuildInputs = [mpv qtdeclarative];
+
+  meta.license = with lib.licenses; [bsd2 bsd3 cc-by-sa-40 cc0 lgpl21Only lgpl3Only lgpl3Plus mit];
+}
diff --git a/pkgs/kde/misc/oxygen-icons/default.nix b/pkgs/kde/misc/oxygen-icons/default.nix
new file mode 100644
index 000000000000..91144f0c0bcf
--- /dev/null
+++ b/pkgs/kde/misc/oxygen-icons/default.nix
@@ -0,0 +1,18 @@
+{
+  lib,
+  mkKdeDerivation,
+  fetchurl,
+}:
+mkKdeDerivation rec {
+  pname = "oxygen-icons";
+  version = "6.0.0";
+
+  src = fetchurl {
+    url = "mirror://kde/stable/oxygen-icons/oxygen-icons-${version}.tar.xz";
+    hash = "sha256-KOwYKHXcwV2SePRc7RECaqOSR28fRUhxueLINwCOV3Q=";
+  };
+
+  dontStrip = true;
+
+  meta.license = [lib.licenses.lgpl3Plus];
+}
diff --git a/pkgs/kde/misc/phonon-vlc/default.nix b/pkgs/kde/misc/phonon-vlc/default.nix
new file mode 100644
index 000000000000..bd828172bf8d
--- /dev/null
+++ b/pkgs/kde/misc/phonon-vlc/default.nix
@@ -0,0 +1,23 @@
+{
+  lib,
+  mkKdeDerivation,
+  fetchurl,
+  qttools,
+  libvlc,
+}:
+mkKdeDerivation rec {
+  pname = "phonon-vlc";
+  version = "0.12.0";
+
+  src = fetchurl {
+    url = "mirror://kde/stable/phonon/phonon-backend-vlc/${version}/phonon-backend-vlc-${version}.tar.xz";
+    hash = "sha256-M4R53EUeS5SzyltXje90Hc+C9cYmooB9NiNb4tznyaU=";
+  };
+
+  extraNativeBuildInputs = [qttools];
+  extraBuildInputs = [libvlc];
+
+  cmakeFlags = ["-DPHONON_BUILD_QT5=0" "-DPHONON_BUILD_QT6=1"];
+
+  meta.license = with lib.licenses; [lgpl21Plus];
+}
diff --git a/pkgs/kde/misc/phonon/default.nix b/pkgs/kde/misc/phonon/default.nix
new file mode 100644
index 000000000000..4706dd159ea5
--- /dev/null
+++ b/pkgs/kde/misc/phonon/default.nix
@@ -0,0 +1,36 @@
+{
+  lib,
+  mkKdeDerivation,
+  fetchurl,
+  libGLU,
+  libGL,
+  pkg-config,
+  libpulseaudio,
+  qt5compat,
+  qttools,
+}:
+mkKdeDerivation rec {
+  pname = "phonon";
+  version = "4.12.0";
+
+  src = fetchurl {
+    url = "mirror://kde/stable/phonon/${version}/phonon-${version}.tar.xz";
+    hash = "sha256-Mof/4PvMLUqhNj+eFXRzAtCwgAkP525fIR2AnstD85o=";
+  };
+
+  extraBuildInputs = [
+    libGLU
+    libGL
+    libpulseaudio
+    qt5compat
+  ];
+
+  extraNativeBuildInputs = [
+    pkg-config
+    qttools
+  ];
+
+  cmakeFlags = ["-DPHONON_BUILD_QT5=0" "-DPHONON_BUILD_QT6=1"];
+
+  meta.license = with lib.licenses; [lgpl21Plus gpl2Plus];
+}
diff --git a/pkgs/kde/misc/polkit-qt-1/default.nix b/pkgs/kde/misc/polkit-qt-1/default.nix
new file mode 100644
index 000000000000..432cc5da8059
--- /dev/null
+++ b/pkgs/kde/misc/polkit-qt-1/default.nix
@@ -0,0 +1,24 @@
+{
+  mkKdeDerivation,
+  lib,
+  fetchurl,
+  pkg-config,
+  polkit,
+  glib,
+}:
+mkKdeDerivation rec {
+  pname = "polkit-qt-1";
+  version = "0.200.0";
+
+  src = fetchurl {
+    url = "mirror://kde/stable/polkit-qt-1/polkit-qt-1-${version}.tar.xz";
+    sha256 = "sha256-XTthHAYtK3apN1C7EMkHv9IdH/CNChXcLPY+J44Wd/s=";
+  };
+
+  patches = [./full-paths.patch];
+
+  extraNativeBuildInputs = [pkg-config];
+  extraBuildInputs = [glib polkit];
+
+  meta.license = with lib.licenses; [bsd3 gpl2Plus lgpl2Plus];
+}
diff --git a/pkgs/kde/misc/polkit-qt-1/full-paths.patch b/pkgs/kde/misc/polkit-qt-1/full-paths.patch
new file mode 100644
index 000000000000..72654d2d8ca9
--- /dev/null
+++ b/pkgs/kde/misc/polkit-qt-1/full-paths.patch
@@ -0,0 +1,184 @@
+diff --git a/PolkitQt-1Config.cmake.in b/PolkitQt-1Config.cmake.in
+index e09678c..57d465a 100644
+--- a/PolkitQt-1Config.cmake.in
++++ b/PolkitQt-1Config.cmake.in
+@@ -20,9 +20,9 @@ if(NOT POLKITQT-1_INSTALL_DIR)
+    set(POLKITQT-1_INSTALL_DIR "@CMAKE_INSTALL_PREFIX@")
+ endif(NOT POLKITQT-1_INSTALL_DIR)
+ 
+-set_and_check(POLKITQT-1_INCLUDE_DIR "@PACKAGE_CMAKE_INSTALL_INCLUDEDIR@/@POLKITQT-1_INCLUDE_PATH@")
++set_and_check(POLKITQT-1_INCLUDE_DIR "@CMAKE_INSTALL_FULL_INCLUDEDIR@/@POLKITQT-1_INCLUDE_PATH@")
+ set_and_check(POLKITQT-1_INCLUDE_DIRS "${POLKITQT-1_INCLUDE_DIR}")
+-set_and_check(POLKITQT-1_LIB_DIR "@PACKAGE_CMAKE_INSTALL_LIBDIR@")
++set_and_check(POLKITQT-1_LIB_DIR "@CMAKE_INSTALL_FULL_LIBDIR@")
+ set(POLKITQT-1_POLICY_FILES_INSTALL_DIR "${POLKITQT-1_INSTALL_DIR}/share/polkit-1/actions")
+ ##################################
+ 
+diff --git a/polkit-qt-1.pc.cmake b/polkit-qt-1.pc.cmake
+index ba8e46e..2d7ea64 100644
+--- a/polkit-qt-1.pc.cmake
++++ b/polkit-qt-1.pc.cmake
+@@ -1,7 +1,7 @@
+ prefix=@CMAKE_INSTALL_PREFIX@
+ exec_prefix=@CMAKE_INSTALL_PREFIX@
+-libdir=${exec_prefix}/@CMAKE_INSTALL_LIBDIR@
+-includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@/@POLKITQT-1_INCLUDE_PATH@
++libdir=@CMAKE_INSTALL_FULL_LIBDIR@
++includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@/@POLKITQT-1_INCLUDE_PATH@
+ 
+ Name: @POLKITQT-1_PCNAME@
+ Description: Convenience library for using polkit with a Qt-styled API
+diff --git a/polkit-qt-agent-1.pc.cmake b/polkit-qt-agent-1.pc.cmake
+index 23b2cae..86670a7 100644
+--- a/polkit-qt-agent-1.pc.cmake
++++ b/polkit-qt-agent-1.pc.cmake
+@@ -1,7 +1,7 @@
+ prefix=@CMAKE_INSTALL_PREFIX@
+ exec_prefix=@CMAKE_INSTALL_PREFIX@
+-libdir=${exec_prefix}/@CMAKE_INSTALL_LIBDIR@
+-includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@/@POLKITQT-1_INCLUDE_PATH@
++libdir=@CMAKE_INSTALL_FULL_LIBDIR@
++includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@/@POLKITQT-1_INCLUDE_PATH@
+ 
+ Name: @POLKITQT-1_AGENT_PCNAME@
+ Description: Convenience library for using polkit Agent with a Qt-styled API
+diff --git a/polkit-qt-core-1.pc.cmake b/polkit-qt-core-1.pc.cmake
+index fa501f0..61faa63 100644
+--- a/polkit-qt-core-1.pc.cmake
++++ b/polkit-qt-core-1.pc.cmake
+@@ -1,7 +1,7 @@
+ prefix=@CMAKE_INSTALL_PREFIX@
+ exec_prefix=@CMAKE_INSTALL_PREFIX@
+-libdir=${exec_prefix}/@CMAKE_INSTALL_LIBDIR@
+-includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@/@POLKITQT-1_INCLUDE_PATH@
++libdir=@CMAKE_INSTALL_FULL_LIBDIR@
++includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@/@POLKITQT-1_INCLUDE_PATH@
+ 
+ Name: @POLKITQT-1_CORE_PCNAME@
+ Description: Convenience library for using polkit with a Qt-styled API, non-GUI classes
+diff --git a/polkit-qt-gui-1.pc.cmake b/polkit-qt-gui-1.pc.cmake
+index 7261b0c..8c633bb 100644
+--- a/polkit-qt-gui-1.pc.cmake
++++ b/polkit-qt-gui-1.pc.cmake
+@@ -1,7 +1,7 @@
+ prefix=@CMAKE_INSTALL_PREFIX@
+ exec_prefix=@CMAKE_INSTALL_PREFIX@
+-libdir=${exec_prefix}/@CMAKE_INSTALL_LIBDIR@
+-includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@/@POLKITQT-1_INCLUDE_PATH@
++libdir=@CMAKE_INSTALL_FULL_LIBDIR@
++includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@/@POLKITQT-1_INCLUDE_PATH@
+ 
+ Name: @POLKITQT-1_GUI_PCNAME@
+ Description: Convenience library for using polkit with a Qt-styled API, GUI classes
+diff --git a/polkit-qt5-1.pc.cmake b/polkit-qt5-1.pc.cmake
+index ba8e46e..2d7ea64 100644
+--- a/polkit-qt5-1.pc.cmake
++++ b/polkit-qt5-1.pc.cmake
+@@ -1,7 +1,7 @@
+ prefix=@CMAKE_INSTALL_PREFIX@
+ exec_prefix=@CMAKE_INSTALL_PREFIX@
+-libdir=${exec_prefix}/@CMAKE_INSTALL_LIBDIR@
+-includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@/@POLKITQT-1_INCLUDE_PATH@
++libdir=@CMAKE_INSTALL_FULL_LIBDIR@
++includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@/@POLKITQT-1_INCLUDE_PATH@
+ 
+ Name: @POLKITQT-1_PCNAME@
+ Description: Convenience library for using polkit with a Qt-styled API
+diff --git a/polkit-qt5-agent-1.pc.cmake b/polkit-qt5-agent-1.pc.cmake
+index 60b22d5..ee8b80b 100644
+--- a/polkit-qt5-agent-1.pc.cmake
++++ b/polkit-qt5-agent-1.pc.cmake
+@@ -1,7 +1,7 @@
+ prefix=@CMAKE_INSTALL_PREFIX@
+ exec_prefix=@CMAKE_INSTALL_PREFIX@
+-libdir=${exec_prefix}/@CMAKE_INSTALL_LIBDIR@
+-includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@/@POLKITQT-1_INCLUDE_PATH@
++libdir=@CMAKE_INSTALL_FULL_LIBDIR@
++includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@/@POLKITQT-1_INCLUDE_PATH@
+ 
+ Name: @POLKITQT-1_AGENT_PCNAME@
+ Description: Convenience library for using polkit Agent with a Qt-styled API
+diff --git a/polkit-qt5-core-1.pc.cmake b/polkit-qt5-core-1.pc.cmake
+index 2f5d562..387c64b 100644
+--- a/polkit-qt5-core-1.pc.cmake
++++ b/polkit-qt5-core-1.pc.cmake
+@@ -1,7 +1,7 @@
+ prefix=@CMAKE_INSTALL_PREFIX@
+ exec_prefix=@CMAKE_INSTALL_PREFIX@
+-libdir=${exec_prefix}/@CMAKE_INSTALL_LIBDIR@
+-includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@/@POLKITQT-1_INCLUDE_PATH@
++libdir=@CMAKE_INSTALL_FULL_LIBDIR@
++includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@/@POLKITQT-1_INCLUDE_PATH@
+ 
+ Name: @POLKITQT-1_CORE_PCNAME@
+ Description: Convenience library for using polkit with a Qt-styled API, non-GUI classes
+diff --git a/polkit-qt5-gui-1.pc.cmake b/polkit-qt5-gui-1.pc.cmake
+index 1d208fb..dd95f52 100644
+--- a/polkit-qt5-gui-1.pc.cmake
++++ b/polkit-qt5-gui-1.pc.cmake
+@@ -1,7 +1,7 @@
+ prefix=@CMAKE_INSTALL_PREFIX@
+ exec_prefix=@CMAKE_INSTALL_PREFIX@
+-libdir=${exec_prefix}/@CMAKE_INSTALL_LIBDIR@
+-includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@/@POLKITQT-1_INCLUDE_PATH@
++libdir=@CMAKE_INSTALL_FULL_LIBDIR@
++includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@/@POLKITQT-1_INCLUDE_PATH@
+ 
+ Name: @POLKITQT-1_GUI_PCNAME@
+ Description: Convenience library for using polkit with a Qt-styled API, GUI classes
+diff --git a/polkit-qt6-1.pc.cmake b/polkit-qt6-1.pc.cmake
+index ba8e46e..2d7ea64 100644
+--- a/polkit-qt6-1.pc.cmake
++++ b/polkit-qt6-1.pc.cmake
+@@ -1,7 +1,7 @@
+ prefix=@CMAKE_INSTALL_PREFIX@
+ exec_prefix=@CMAKE_INSTALL_PREFIX@
+-libdir=${exec_prefix}/@CMAKE_INSTALL_LIBDIR@
+-includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@/@POLKITQT-1_INCLUDE_PATH@
++libdir=@CMAKE_INSTALL_FULL_LIBDIR@
++includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@/@POLKITQT-1_INCLUDE_PATH@
+ 
+ Name: @POLKITQT-1_PCNAME@
+ Description: Convenience library for using polkit with a Qt-styled API
+diff --git a/polkit-qt6-agent-1.pc.cmake b/polkit-qt6-agent-1.pc.cmake
+index 60b22d5..ee8b80b 100644
+--- a/polkit-qt6-agent-1.pc.cmake
++++ b/polkit-qt6-agent-1.pc.cmake
+@@ -1,7 +1,7 @@
+ prefix=@CMAKE_INSTALL_PREFIX@
+ exec_prefix=@CMAKE_INSTALL_PREFIX@
+-libdir=${exec_prefix}/@CMAKE_INSTALL_LIBDIR@
+-includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@/@POLKITQT-1_INCLUDE_PATH@
++libdir=@CMAKE_INSTALL_FULL_LIBDIR@
++includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@/@POLKITQT-1_INCLUDE_PATH@
+ 
+ Name: @POLKITQT-1_AGENT_PCNAME@
+ Description: Convenience library for using polkit Agent with a Qt-styled API
+diff --git a/polkit-qt6-core-1.pc.cmake b/polkit-qt6-core-1.pc.cmake
+index 2f5d562..387c64b 100644
+--- a/polkit-qt6-core-1.pc.cmake
++++ b/polkit-qt6-core-1.pc.cmake
+@@ -1,7 +1,7 @@
+ prefix=@CMAKE_INSTALL_PREFIX@
+ exec_prefix=@CMAKE_INSTALL_PREFIX@
+-libdir=${exec_prefix}/@CMAKE_INSTALL_LIBDIR@
+-includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@/@POLKITQT-1_INCLUDE_PATH@
++libdir=@CMAKE_INSTALL_FULL_LIBDIR@
++includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@/@POLKITQT-1_INCLUDE_PATH@
+ 
+ Name: @POLKITQT-1_CORE_PCNAME@
+ Description: Convenience library for using polkit with a Qt-styled API, non-GUI classes
+diff --git a/polkit-qt6-gui-1.pc.cmake b/polkit-qt6-gui-1.pc.cmake
+index 1d208fb..dd95f52 100644
+--- a/polkit-qt6-gui-1.pc.cmake
++++ b/polkit-qt6-gui-1.pc.cmake
+@@ -1,7 +1,7 @@
+ prefix=@CMAKE_INSTALL_PREFIX@
+ exec_prefix=@CMAKE_INSTALL_PREFIX@
+-libdir=${exec_prefix}/@CMAKE_INSTALL_LIBDIR@
+-includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@/@POLKITQT-1_INCLUDE_PATH@
++libdir=@CMAKE_INSTALL_FULL_LIBDIR@
++includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@/@POLKITQT-1_INCLUDE_PATH@
+ 
+ Name: @POLKITQT-1_GUI_PCNAME@
+ Description: Convenience library for using polkit with a Qt-styled API, GUI classes
diff --git a/pkgs/kde/misc/pulseaudio-qt/default.nix b/pkgs/kde/misc/pulseaudio-qt/default.nix
new file mode 100644
index 000000000000..7f4ee4a39b41
--- /dev/null
+++ b/pkgs/kde/misc/pulseaudio-qt/default.nix
@@ -0,0 +1,21 @@
+{
+  lib,
+  mkKdeDerivation,
+  fetchurl,
+  pkg-config,
+  pulseaudio,
+}:
+mkKdeDerivation rec {
+  pname = "pulseaudio-qt";
+  version = "1.4.0";
+
+  src = fetchurl {
+    url = "mirror://kde/stable/pulseaudio-qt/pulseaudio-qt-${version}.tar.xz";
+    hash = "sha256-2MpiTs8hMIVrhZz5NBF39v74xR8g93KNgH0JxxUO0GU=";
+  };
+
+  extraNativeBuildInputs = [pkg-config];
+  extraBuildInputs = [pulseaudio];
+
+  meta.license = with lib.licenses; [lgpl21Only lgpl3Only];
+}
diff --git a/pkgs/kde/plasma/bluedevil/default.nix b/pkgs/kde/plasma/bluedevil/default.nix
new file mode 100644
index 000000000000..993d121d1f37
--- /dev/null
+++ b/pkgs/kde/plasma/bluedevil/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  shared-mime-info,
+}:
+mkKdeDerivation {
+  pname = "bluedevil";
+
+  extraNativeBuildInputs = [shared-mime-info];
+}
diff --git a/pkgs/kde/plasma/breeze-grub/default.nix b/pkgs/kde/plasma/breeze-grub/default.nix
new file mode 100644
index 000000000000..a5fe01b4cad7
--- /dev/null
+++ b/pkgs/kde/plasma/breeze-grub/default.nix
@@ -0,0 +1,17 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "breeze-grub";
+
+  # doesn't actually use cmake or anything
+  nativeBuildInputs = [];
+  buildInputs = [];
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p "$out/grub/themes"
+    mv breeze "$out/grub/themes"
+
+    runHook postInstall
+  '';
+}
diff --git a/pkgs/kde/plasma/breeze-gtk/0001-fix-add-executable-bit.patch b/pkgs/kde/plasma/breeze-gtk/0001-fix-add-executable-bit.patch
new file mode 100644
index 000000000000..8ed822220598
--- /dev/null
+++ b/pkgs/kde/plasma/breeze-gtk/0001-fix-add-executable-bit.patch
@@ -0,0 +1,25 @@
+From da6a4651f74625f4c7f3c31f1125cfa4e774780b Mon Sep 17 00:00:00 2001
+From: Yaroslav Bolyukin <iam@lach.pw>
+Date: Mon, 27 Sep 2021 22:45:58 +0300
+Subject: [PATCH] fix: add executable bit
+
+Signed-off-by: Yaroslav Bolyukin <iam@lach.pw>
+---
+ src/CMakeLists.txt | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
+index 79ff12d..4f3d746 100644
+--- a/src/CMakeLists.txt
++++ b/src/CMakeLists.txt
+@@ -2,7 +2,7 @@ file(GLOB_RECURSE SCSS_SOURCES "*.scss")
+ file(GLOB CSS_SOURCES "*.css")
+ file(GLOB_RECURSE GTK2_SOURCES "gtk2/*")
+ 
+-configure_file(build_theme.sh.cmake ${CMAKE_CURRENT_BINARY_DIR}/build_theme.sh @ONLY)
++configure_file(build_theme.sh.cmake ${CMAKE_CURRENT_BINARY_DIR}/build_theme.sh FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE @ONLY)
+ 
+ set(SOURCES
+     ${SCSS_SOURCES}
+-- 
+2.33.0
diff --git a/pkgs/kde/plasma/breeze-gtk/default.nix b/pkgs/kde/plasma/breeze-gtk/default.nix
new file mode 100644
index 000000000000..fc0bc4759d48
--- /dev/null
+++ b/pkgs/kde/plasma/breeze-gtk/default.nix
@@ -0,0 +1,14 @@
+{
+  mkKdeDerivation,
+  sass,
+  python3,
+  python3Packages,
+}:
+mkKdeDerivation {
+  pname = "breeze-gtk";
+
+  # FIXME(later): upstream
+  patches = [./0001-fix-add-executable-bit.patch];
+
+  extraNativeBuildInputs = [sass python3 python3Packages.pycairo];
+}
diff --git a/pkgs/kde/plasma/breeze-plymouth/default.nix b/pkgs/kde/plasma/breeze-plymouth/default.nix
new file mode 100644
index 000000000000..7551eca94e3a
--- /dev/null
+++ b/pkgs/kde/plasma/breeze-plymouth/default.nix
@@ -0,0 +1,52 @@
+{
+  lib,
+  mkKdeDerivation,
+  pkg-config,
+  plymouth,
+  imagemagick,
+  netpbm,
+  perl,
+  logoName ? null,
+  logoFile ? null,
+  osName ? null,
+  osVersion ? null,
+  topColor ? "black",
+  bottomColor ? "black",
+}: let
+  validColors = ["black" "cardboard_grey" "charcoal_grey" "icon_blue" "paper_white" "plasma_blue" "neon_blue" "neon_green"];
+  resolvedLogoName =
+    if (logoFile != null && logoName == null)
+    then lib.strings.removeSuffix ".png" (baseNameOf (toString logoFile))
+    else logoName;
+in
+  assert lib.asserts.assertOneOf "topColor" topColor validColors;
+  assert lib.asserts.assertOneOf "bottomColor" bottomColor validColors;
+    mkKdeDerivation {
+      pname = "breeze-plymouth";
+
+      # FIXME(later): discuss with upstream
+      patches = [./install-paths.patch];
+
+      extraNativeBuildInputs = [pkg-config] ++ lib.optionals (logoFile != null) [imagemagick netpbm perl];
+      extraBuildInputs = [plymouth];
+
+      extraCmakeFlags =
+        []
+        ++ lib.optional (osName != null) "-DDISTRO_NAME=${osName}"
+        ++ lib.optional (osVersion != null) "-DDISTRO_VERSION=${osVersion}"
+        ++ lib.optional (logoName != null) "-DDISTRO_LOGO=${logoName}"
+        ++ lib.optional (topColor != null) "-DBACKGROUND_TOP_COLOR=${topColor}"
+        ++ lib.optional (bottomColor != null) "-DBACKGROUND_BOTTOM_COLOR=${bottomColor}";
+
+      postPatch =
+        ''
+          substituteInPlace cmake/FindPlymouth.cmake --subst-var out
+        ''
+        + lib.optionalString (logoFile != null) ''
+          cp ${logoFile} breeze/images/${resolvedLogoName}.logo.png
+
+          # conversion for 16bit taken from the breeze-plymouth readme
+          convert ${logoFile} -alpha Background -background "#000000" -fill "#000000" -flatten tmp.png
+          pngtopnm tmp.png | pnmquant 16 | pnmtopng > breeze/images/16bit/${resolvedLogoName}.logo.png
+        '';
+    }
diff --git a/pkgs/kde/plasma/breeze-plymouth/install-paths.patch b/pkgs/kde/plasma/breeze-plymouth/install-paths.patch
new file mode 100644
index 000000000000..5d5856d122dd
--- /dev/null
+++ b/pkgs/kde/plasma/breeze-plymouth/install-paths.patch
@@ -0,0 +1,19 @@
+Index: breeze-plymouth-5.7.3/cmake/FindPlymouth.cmake
+===================================================================
+--- breeze-plymouth-5.7.3.orig/cmake/FindPlymouth.cmake
++++ breeze-plymouth-5.7.3/cmake/FindPlymouth.cmake
+@@ -24,12 +24,8 @@
+ include(FindPkgConfig)
+ 
+ pkg_check_modules(Plymouth ply-boot-client ply-splash-core)
+-exec_program(${PKG_CONFIG_EXECUTABLE}
+-    ARGS ply-splash-core --variable=pluginsdir
+-    OUTPUT_VARIABLE Plymouth_PLUGINSDIR)
+-exec_program(${PKG_CONFIG_EXECUTABLE}
+-    ARGS ply-splash-core --variable=themesdir
+-    OUTPUT_VARIABLE Plymouth_THEMESDIR)
++set(Plymouth_PLUGINSDIR "@out@/lib/plymouth")
++set(Plymouth_THEMESDIR "@out@/share/plymouth/themes")
+ 
+ find_package_handle_standard_args(Plymouth
+     FOUND_VAR
diff --git a/pkgs/kde/plasma/breeze/default.nix b/pkgs/kde/plasma/breeze/default.nix
new file mode 100644
index 000000000000..72dcbcae91f4
--- /dev/null
+++ b/pkgs/kde/plasma/breeze/default.nix
@@ -0,0 +1,44 @@
+{
+  mkKdeDerivation,
+  qtbase,
+  libsForQt5,
+}:
+mkKdeDerivation {
+  pname = "breeze";
+
+  outputs = ["out" "dev" "qt5"];
+
+  # We can't add qt5 stuff to dependencies or the hooks blow up,
+  # so manually point everything to everything. Oof.
+  extraCmakeFlags = [
+    "-DQt5_DIR=${libsForQt5.qtbase.dev}/lib/cmake/Qt5"
+    "-DQt5Core_DIR=${libsForQt5.qtbase.dev}/lib/cmake/Qt5Core"
+    "-DQt5DBus_DIR=${libsForQt5.qtbase.dev}/lib/cmake/Qt5DBus"
+    "-DQt5Gui_DIR=${libsForQt5.qtbase.dev}/lib/cmake/Qt5Gui"
+    "-DQt5Network_DIR=${libsForQt5.qtbase.dev}/lib/cmake/Qt5Network"
+    "-DQt5Qml_DIR=${libsForQt5.qtdeclarative.dev}/lib/cmake/Qt5Qml"
+    "-DQt5QmlModels_DIR=${libsForQt5.qtdeclarative.dev}/lib/cmake/Qt5QmlModels"
+    "-DQt5Quick_DIR=${libsForQt5.qtdeclarative.dev}/lib/cmake/Qt5Quick"
+    "-DQt5Widgets_DIR=${libsForQt5.qtbase.dev}/lib/cmake/Qt5Widgets"
+    "-DQt5X11Extras_DIR=${libsForQt5.qtx11extras.dev}/lib/cmake/Qt5X11Extras"
+    "-DQt5Xml_DIR=${libsForQt5.qtbase.dev}/lib/cmake/Qt5Xml"
+
+    "-DKF5Auth_DIR=${libsForQt5.kauth.dev}/lib/cmake/KF5Auth"
+    "-DKF5Codecs_DIR=${libsForQt5.kcodecs.dev}/lib/cmake/KF5Codecs"
+    "-DKF5Config_DIR=${libsForQt5.kconfig.dev}/lib/cmake/KF5Config"
+    "-DKF5ConfigWidgets_DIR=${libsForQt5.kconfigwidgets.dev}/lib/cmake/KF5ConfigWidgets"
+    "-DKF5CoreAddons_DIR=${libsForQt5.kcoreaddons.dev}/lib/cmake/KF5CoreAddons"
+    "-DKF5FrameworkIntegration_DIR=${libsForQt5.frameworkintegration.dev}/lib/cmake/KF5FrameworkIntegration"
+    "-DKF5GuiAddons_DIR=${libsForQt5.kguiaddons.dev}/lib/cmake/KF5GuiAddons"
+    "-DKF5IconThemes_DIR=${libsForQt5.kiconthemes.dev}/lib/cmake/KF5IconThemes"
+    "-DKF5Kirigami2_DIR=${libsForQt5.kirigami2.dev}/lib/cmake/KF5Kirigami2"
+    "-DKF5WidgetsAddons_DIR=${libsForQt5.kwidgetsaddons.dev}/lib/cmake/KF5WidgetsAddons"
+    "-DKF5WindowSystem_DIR=${libsForQt5.kwindowsystem.dev}/lib/cmake/KF5WindowSystem"
+  ];
+
+  # Move Qt5 plugin to Qt5 plugin path
+  postInstall = ''
+    mkdir -p $qt5/${libsForQt5.qtbase.qtPluginPrefix}/styles
+    mv $out/${qtbase.qtPluginPrefix}/styles/breeze5.so $qt5/${libsForQt5.qtbase.qtPluginPrefix}/styles
+  '';
+}
diff --git a/pkgs/kde/plasma/default.nix b/pkgs/kde/plasma/default.nix
new file mode 100644
index 000000000000..b50dc05b2fa4
--- /dev/null
+++ b/pkgs/kde/plasma/default.nix
@@ -0,0 +1,65 @@
+{callPackage}: {
+  bluedevil = callPackage ./bluedevil {};
+  breeze = callPackage ./breeze {};
+  breeze-grub = callPackage ./breeze-grub {};
+  breeze-gtk = callPackage ./breeze-gtk {};
+  breeze-plymouth = callPackage ./breeze-plymouth {};
+  discover = callPackage ./discover {};
+  drkonqi = callPackage ./drkonqi {};
+  flatpak-kcm = callPackage ./flatpak-kcm {};
+  kactivitymanagerd = callPackage ./kactivitymanagerd {};
+  kde-cli-tools = callPackage ./kde-cli-tools {};
+  kdecoration = callPackage ./kdecoration {};
+  kde-gtk-config = callPackage ./kde-gtk-config {};
+  kdeplasma-addons = callPackage ./kdeplasma-addons {};
+  kgamma = callPackage ./kgamma {};
+  kglobalacceld = callPackage ./kglobalacceld {};
+  kinfocenter = callPackage ./kinfocenter {};
+  kmenuedit = callPackage ./kmenuedit {};
+  kpipewire = callPackage ./kpipewire {};
+  kscreen = callPackage ./kscreen {};
+  kscreenlocker = callPackage ./kscreenlocker {};
+  ksshaskpass = callPackage ./ksshaskpass {};
+  ksystemstats = callPackage ./ksystemstats {};
+  kwallet-pam = callPackage ./kwallet-pam {};
+  kwayland = callPackage ./kwayland {};
+  kwayland-integration = callPackage ./kwayland-integration {};
+  kwin = callPackage ./kwin {};
+  kwrited = callPackage ./kwrited {};
+  layer-shell-qt = callPackage ./layer-shell-qt {};
+  libkscreen = callPackage ./libkscreen {};
+  libksysguard = callPackage ./libksysguard {};
+  libplasma = callPackage ./libplasma {};
+  milou = callPackage ./milou {};
+  ocean-sound-theme = callPackage ./ocean-sound-theme {};
+  oxygen = callPackage ./oxygen {};
+  oxygen-sounds = callPackage ./oxygen-sounds {};
+  plasma5support = callPackage ./plasma5support {};
+  plasma-activities = callPackage ./plasma-activities {};
+  plasma-activities-stats = callPackage ./plasma-activities-stats {};
+  plasma-browser-integration = callPackage ./plasma-browser-integration {};
+  plasma-desktop = callPackage ./plasma-desktop {};
+  plasma-disks = callPackage ./plasma-disks {};
+  plasma-firewall = callPackage ./plasma-firewall {};
+  plasma-integration = callPackage ./plasma-integration {};
+  plasma-mobile = callPackage ./plasma-mobile {};
+  plasma-nano = callPackage ./plasma-nano {};
+  plasma-nm = callPackage ./plasma-nm {};
+  plasma-pa = callPackage ./plasma-pa {};
+  plasma-sdk = callPackage ./plasma-sdk {};
+  plasma-systemmonitor = callPackage ./plasma-systemmonitor {};
+  plasma-thunderbolt = callPackage ./plasma-thunderbolt {};
+  plasma-vault = callPackage ./plasma-vault {};
+  plasma-welcome = callPackage ./plasma-welcome {};
+  plasma-workspace = callPackage ./plasma-workspace {};
+  plasma-workspace-wallpapers = callPackage ./plasma-workspace-wallpapers {};
+  plymouth-kcm = callPackage ./plymouth-kcm {};
+  polkit-kde-agent-1 = callPackage ./polkit-kde-agent-1 {};
+  powerdevil = callPackage ./powerdevil {};
+  print-manager = callPackage ./print-manager {};
+  qqc2-breeze-style = callPackage ./qqc2-breeze-style {};
+  sddm-kcm = callPackage ./sddm-kcm {};
+  systemsettings = callPackage ./systemsettings {};
+  wacomtablet = callPackage ./wacomtablet {};
+  xdg-desktop-portal-kde = callPackage ./xdg-desktop-portal-kde {};
+}
diff --git a/pkgs/kde/plasma/discover/default.nix b/pkgs/kde/plasma/discover/default.nix
new file mode 100644
index 000000000000..2795f3d1414e
--- /dev/null
+++ b/pkgs/kde/plasma/discover/default.nix
@@ -0,0 +1,14 @@
+{
+  mkKdeDerivation,
+  qtwebview,
+  pkg-config,
+  discount,
+  flatpak,
+  fwupd,
+}:
+mkKdeDerivation {
+  pname = "discover";
+
+  extraNativeBuildInputs = [pkg-config];
+  extraBuildInputs = [qtwebview discount flatpak fwupd];
+}
diff --git a/pkgs/kde/plasma/drkonqi/default.nix b/pkgs/kde/plasma/drkonqi/default.nix
new file mode 100644
index 000000000000..392e1fae71e9
--- /dev/null
+++ b/pkgs/kde/plasma/drkonqi/default.nix
@@ -0,0 +1,41 @@
+{
+  mkKdeDerivation,
+  pkg-config,
+  systemd,
+  gdb,
+  python3,
+  substituteAll,
+  coreutils,
+}: let
+  gdb' = gdb.override {
+    hostCpuOnly = true;
+    python3 = python3.withPackages (ps: [
+      ps.psutil
+      ps.pygdbmi
+      ps.sentry-sdk
+    ]);
+  };
+in
+  mkKdeDerivation {
+    pname = "drkonqi";
+
+    patches = [
+      (substituteAll {
+        src = ./gdb-path.patch;
+        gdb = "${gdb'}/bin/gdb";
+      })
+    ];
+
+    postPatch = ''
+      substituteInPlace src/coredump/processor/drkonqi-coredump-pickup.service.cmake \
+        --replace /usr/bin/sleep ${coreutils}/bin/sleep
+    '';
+
+    extraNativeBuildInputs = [pkg-config];
+    extraBuildInputs = [systemd];
+
+    extraCmakeFlags = [
+      "-DWITH_GDB12=1"
+      "-DWITH_PYTHON_VENDORING=0"
+    ];
+  }
diff --git a/pkgs/kde/plasma/drkonqi/gdb-path.patch b/pkgs/kde/plasma/drkonqi/gdb-path.patch
new file mode 100644
index 000000000000..a49816d96f7b
--- /dev/null
+++ b/pkgs/kde/plasma/drkonqi/gdb-path.patch
@@ -0,0 +1,28 @@
+diff --git a/src/data/debuggers/internal/gdbrc b/src/data/debuggers/internal/gdbrc
+index 9a5c8fee..c32b1510 100644
+--- a/src/data/debuggers/internal/gdbrc
++++ b/src/data/debuggers/internal/gdbrc
+@@ -72,17 +72,18 @@ Name[wa]=gdb
+ Name[x-test]=xxgdbxx
+ Name[zh_CN]=gdb
+ Name[zh_TW]=gdb
+-TryExec=gdb
++TryExec=@gdb@
++CodeName=gdb
+ Backends=KCrash|coredump-core
+ 
+ [KCrash]
+-Exec=gdb -nw -n -batch -x %preamblefile -x %tempfile -p %pid %execpath
+-ExecWithSymbolResolution=gdb -nw -n -batch --init-eval-command='set debuginfod enabled on' -x %preamblefile -x %tempfile -p %pid %execpath
++Exec=@gdb@ -nw -n -batch -x %preamblefile -x %tempfile -p %pid %execpath
++ExecWithSymbolResolution=@gdb@ -nw -n -batch --init-eval-command='set debuginfod enabled on' -x %preamblefile -x %tempfile -p %pid %execpath
+ PreambleCommands=set width 200\nsource %drkonqi_datadir/python/gdb_preamble/preamble.py\npy print_preamble()
+ BatchCommands=thread\nthread apply all bt
+ 
+ [coredump-core]
+-Exec=gdb --nw --nx --batch --command=%preamblefile --command=%tempfile --core=%corefile %execpath
+-ExecWithSymbolResolution=gdb --nw --nx --batch --init-eval-command='set debuginfod enabled on' --command=%preamblefile --command=%tempfile --core=%corefile %execpath
++Exec=@gdb@ --nw --nx --batch --command=%preamblefile --command=%tempfile --core=%corefile %execpath
++ExecWithSymbolResolution=@gdb@ --nw --nx --batch --init-eval-command='set debuginfod enabled on' --command=%preamblefile --command=%tempfile --core=%corefile %execpath
+ PreambleCommands=set width 200\nsource %drkonqi_datadir/python/gdb_preamble/preamble.py\npy print_preamble()
+ BatchCommands=thread\nthread apply all bt
diff --git a/pkgs/kde/plasma/flatpak-kcm/default.nix b/pkgs/kde/plasma/flatpak-kcm/default.nix
new file mode 100644
index 000000000000..a43447a15413
--- /dev/null
+++ b/pkgs/kde/plasma/flatpak-kcm/default.nix
@@ -0,0 +1,12 @@
+{
+  mkKdeDerivation,
+  pkg-config,
+  qtsvg,
+  flatpak,
+}:
+mkKdeDerivation {
+  pname = "flatpak-kcm";
+
+  extraNativeBuildInputs = [pkg-config];
+  extraBuildInputs = [flatpak qtsvg];
+}
diff --git a/pkgs/kde/plasma/kactivitymanagerd/default.nix b/pkgs/kde/plasma/kactivitymanagerd/default.nix
new file mode 100644
index 000000000000..b0d2fea109cc
--- /dev/null
+++ b/pkgs/kde/plasma/kactivitymanagerd/default.nix
@@ -0,0 +1,10 @@
+{
+  mkKdeDerivation,
+  qt5compat,
+  boost,
+}:
+mkKdeDerivation {
+  pname = "kactivitymanagerd";
+
+  extraBuildInputs = [qt5compat boost];
+}
diff --git a/pkgs/kde/plasma/kde-cli-tools/default.nix b/pkgs/kde/plasma/kde-cli-tools/default.nix
new file mode 100644
index 000000000000..cbaddad84169
--- /dev/null
+++ b/pkgs/kde/plasma/kde-cli-tools/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qtsvg,
+}:
+mkKdeDerivation {
+  pname = "kde-cli-tools";
+
+  extraBuildInputs = [qtsvg];
+}
diff --git a/pkgs/kde/plasma/kde-gtk-config/0001-gsettings-schemas-path.patch b/pkgs/kde/plasma/kde-gtk-config/0001-gsettings-schemas-path.patch
new file mode 100644
index 000000000000..2fe4672f6757
--- /dev/null
+++ b/pkgs/kde/plasma/kde-gtk-config/0001-gsettings-schemas-path.patch
@@ -0,0 +1,21 @@
+diff --git a/kded/gtkconfig.cpp b/kded/gtkconfig.cpp
+index 5303636..199c4d5 100644
+--- a/kded/gtkconfig.cpp
++++ b/kded/gtkconfig.cpp
+@@ -41,6 +41,16 @@ GtkConfig::GtkConfig(QObject *parent, const QVariantList&) :
+     kdeglobalsConfigWatcher(KConfigWatcher::create(KSharedConfig::openConfig(QStringLiteral("kdeglobals")))),
+     kwinConfigWatcher(KConfigWatcher::create(KSharedConfig::openConfig(QStringLiteral("kwinrc"))))
+ {
++    // Add GSETTINGS_SCHEMAS_PATH to the front of XDG_DATA_DIRS.
++    // Normally this would be done by wrapGAppsHook, but this plugin
++    // (shared object) cannot be wrapped.
++    QByteArray xdgdata = qgetenv("XDG_DATA_DIRS");
++    if (!xdgdata.isEmpty()) {
++        xdgdata.push_front(":");
++    }
++    xdgdata.push_front(QByteArray(GSETTINGS_SCHEMAS_PATH));
++    qputenv("XDG_DATA_DIRS", xdgdata);
++
+     QDBusConnection dbus = QDBusConnection::sessionBus();
+     dbus.registerService(QStringLiteral("org.kde.GtkConfig"));
+     dbus.registerObject(QStringLiteral("/GtkConfig"), this, QDBusConnection::ExportScriptableSlots);
diff --git a/pkgs/kde/plasma/kde-gtk-config/default.nix b/pkgs/kde/plasma/kde-gtk-config/default.nix
new file mode 100644
index 000000000000..0101a56e93c6
--- /dev/null
+++ b/pkgs/kde/plasma/kde-gtk-config/default.nix
@@ -0,0 +1,24 @@
+{
+  mkKdeDerivation,
+  pkg-config,
+  wrapGAppsHook,
+  sass,
+  qtsvg,
+  gsettings-desktop-schemas,
+}:
+mkKdeDerivation {
+  pname = "kde-gtk-config";
+
+  # The gtkconfig KDED module will crash the daemon if the GSettings schemas
+  # aren't found.
+  patches = [./0001-gsettings-schemas-path.patch];
+  preConfigure = ''
+    NIX_CFLAGS_COMPILE+=" -DGSETTINGS_SCHEMAS_PATH=\"$GSETTINGS_SCHEMAS_PATH\""
+  '';
+
+  extraNativeBuildInputs = [pkg-config wrapGAppsHook sass];
+  extraBuildInputs = [qtsvg];
+  dontWrapGApps = true; # There is nothing to wrap
+
+  extraCmakeFlags = ["-DGLIB_SCHEMAS_DIR=${gsettings-desktop-schemas.out}/"];
+}
diff --git a/pkgs/kde/plasma/kdecoration/default.nix b/pkgs/kde/plasma/kdecoration/default.nix
new file mode 100644
index 000000000000..9f879b1cea17
--- /dev/null
+++ b/pkgs/kde/plasma/kdecoration/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kdecoration";
+}
diff --git a/pkgs/kde/plasma/kdeplasma-addons/default.nix b/pkgs/kde/plasma/kdeplasma-addons/default.nix
new file mode 100644
index 000000000000..afb0708e8e6b
--- /dev/null
+++ b/pkgs/kde/plasma/kdeplasma-addons/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qtwebengine,
+}:
+mkKdeDerivation {
+  pname = "kdeplasma-addons";
+
+  extraBuildInputs = [qtwebengine];
+}
diff --git a/pkgs/kde/plasma/kgamma/default.nix b/pkgs/kde/plasma/kgamma/default.nix
new file mode 100644
index 000000000000..dcd119ace8ec
--- /dev/null
+++ b/pkgs/kde/plasma/kgamma/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  xorg,
+}:
+mkKdeDerivation {
+  pname = "kgamma";
+
+  extraBuildInputs = [xorg.libXxf86vm];
+}
diff --git a/pkgs/kde/plasma/kglobalacceld/default.nix b/pkgs/kde/plasma/kglobalacceld/default.nix
new file mode 100644
index 000000000000..caafb6c91347
--- /dev/null
+++ b/pkgs/kde/plasma/kglobalacceld/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kglobalacceld";
+}
diff --git a/pkgs/kde/plasma/kinfocenter/0001-tool-paths.patch b/pkgs/kde/plasma/kinfocenter/0001-tool-paths.patch
new file mode 100644
index 000000000000..543aecdec43f
--- /dev/null
+++ b/pkgs/kde/plasma/kinfocenter/0001-tool-paths.patch
@@ -0,0 +1,51 @@
+diff --git a/Modules/kwinsupportinfo/kcm_kwinsupportinfo.json.in b/Modules/kwinsupportinfo/kcm_kwinsupportinfo.json.in
+index 0de6973e..30035768 100644
+--- a/Modules/kwinsupportinfo/kcm_kwinsupportinfo.json.in
++++ b/Modules/kwinsupportinfo/kcm_kwinsupportinfo.json.in
+@@ -85,6 +85,6 @@
+         "Name[zh_CN]": "窗口管理器",
+         "Name[zh_TW]": "視窗管理員"
+     },
+-    "TryExec": "@QtBinariesDir@/qdbus",
++    "TryExec": "@qdbus@",
+     "X-KDE-KInfoCenter-Category": "graphical_information"
+ }
+diff --git a/Modules/kwinsupportinfo/main.cpp b/Modules/kwinsupportinfo/main.cpp
+index 6ae168b5..89d0a2ff 100644
+--- a/Modules/kwinsupportinfo/main.cpp
++++ b/Modules/kwinsupportinfo/main.cpp
+@@ -18,7 +18,7 @@ public:
+     explicit KCMKWinSupportInfo(QObject *parent, const KPluginMetaData &data)
+         : KQuickConfigModule(parent, data)
+     {
+-        m_outputContext = new CommandOutputContext(QLibraryInfo::location(QLibraryInfo::BinariesPath) + QStringLiteral("/qdbus"),
++        m_outputContext = new CommandOutputContext(QStringLiteral("@qdbus@"),
+                                                    {QStringLiteral("org.kde.KWin"), QStringLiteral("/KWin"), QStringLiteral("supportInformation")},
+                                                    parent);
+     }
+diff --git a/Modules/xserver/kcm_xserver.json b/Modules/xserver/kcm_xserver.json
+index b3f1ce24..dc610932 100644
+--- a/Modules/xserver/kcm_xserver.json
++++ b/Modules/xserver/kcm_xserver.json
+@@ -141,7 +141,7 @@
+         "Name[zh_CN]": "X 服务器",
+         "Name[zh_TW]": "X 伺服器"
+     },
+-    "TryExec": "xdpyinfo",
++    "TryExec": "@xdpyinfo@",
+     "X-DocPath": "kinfocenter/graphical.html#xserver",
+     "X-KDE-KInfoCenter-Category": "graphical_information",
+     "X-KDE-Keywords": "X,X-Server,XServer,XFree86,Display,VideoCard,System Information",
+diff --git a/Modules/xserver/main.cpp b/Modules/xserver/main.cpp
+index 6d4d1e25..d39fe19e 100644
+--- a/Modules/xserver/main.cpp
++++ b/Modules/xserver/main.cpp
+@@ -16,7 +16,7 @@ public:
+     explicit KCMXServer(QObject *parent, const KPluginMetaData &data)
+         : KQuickConfigModule(parent, data)
+     {
+-        m_outputContext = new CommandOutputContext(QStringLiteral("xdpyinfo"), {}, parent);
++        m_outputContext = new CommandOutputContext(QStringLiteral("@xdpyinfo@"), {}, parent);
+     }
+     CommandOutputContext *outputContext() const
+     {
diff --git a/pkgs/kde/plasma/kinfocenter/default.nix b/pkgs/kde/plasma/kinfocenter/default.nix
new file mode 100644
index 000000000000..cc216dd22a7b
--- /dev/null
+++ b/pkgs/kde/plasma/kinfocenter/default.nix
@@ -0,0 +1,29 @@
+{
+  lib,
+  mkKdeDerivation,
+  substituteAll,
+  qttools,
+  xdpyinfo,
+  systemsettings,
+  libusb1,
+}:
+mkKdeDerivation {
+  pname = "kinfocenter";
+
+  patches = [
+    (substituteAll {
+      src = ./0001-tool-paths.patch;
+      qdbus = "${lib.getBin qttools}/bin/qdbus";
+      xdpyinfo = lib.getExe xdpyinfo;
+    })
+  ];
+
+  # fix wrong symlink of infocenter pointing to a 'systemsettings5' binary in
+  # the same directory, while it is actually located in a completely different
+  # store path
+  preFixup = ''
+    ln -sf ${systemsettings}/bin/systemsettings $out/bin/kinfocenter
+  '';
+
+  extraBuildInputs = [libusb1];
+}
diff --git a/pkgs/kde/plasma/kmenuedit/default.nix b/pkgs/kde/plasma/kmenuedit/default.nix
new file mode 100644
index 000000000000..2cfd932af1bf
--- /dev/null
+++ b/pkgs/kde/plasma/kmenuedit/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kmenuedit";
+}
diff --git a/pkgs/kde/plasma/kpipewire/default.nix b/pkgs/kde/plasma/kpipewire/default.nix
new file mode 100644
index 000000000000..c79bfc792d51
--- /dev/null
+++ b/pkgs/kde/plasma/kpipewire/default.nix
@@ -0,0 +1,15 @@
+{
+  mkKdeDerivation,
+  qtquick3d,
+  pkg-config,
+  pipewire,
+  ffmpeg,
+  mesa,
+  libva,
+}:
+mkKdeDerivation {
+  pname = "kpipewire";
+
+  extraNativeBuildInputs = [pkg-config];
+  extraBuildInputs = [qtquick3d pipewire ffmpeg mesa libva];
+}
diff --git a/pkgs/kde/plasma/kscreen/default.nix b/pkgs/kde/plasma/kscreen/default.nix
new file mode 100644
index 000000000000..480912fe7fcb
--- /dev/null
+++ b/pkgs/kde/plasma/kscreen/default.nix
@@ -0,0 +1,15 @@
+{
+  mkKdeDerivation,
+  qtsensors,
+  dbus,
+}:
+mkKdeDerivation {
+  pname = "kscreen";
+
+  extraBuildInputs = [qtsensors];
+
+  postFixup = ''
+    substituteInPlace $out/share/kglobalaccel/org.kde.kscreen.desktop \
+      --replace-fail dbus-send ${dbus}/bin/dbus-send
+  '';
+}
diff --git a/pkgs/kde/plasma/kscreenlocker/default.nix b/pkgs/kde/plasma/kscreenlocker/default.nix
new file mode 100644
index 000000000000..e7ee0a18b8e5
--- /dev/null
+++ b/pkgs/kde/plasma/kscreenlocker/default.nix
@@ -0,0 +1,10 @@
+{
+  mkKdeDerivation,
+  pam,
+  qqc2-breeze-style,
+}:
+mkKdeDerivation {
+  pname = "kscreenlocker";
+
+  extraBuildInputs = [pam qqc2-breeze-style];
+}
diff --git a/pkgs/kde/plasma/ksshaskpass/default.nix b/pkgs/kde/plasma/ksshaskpass/default.nix
new file mode 100644
index 000000000000..86834f8fa7c2
--- /dev/null
+++ b/pkgs/kde/plasma/ksshaskpass/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "ksshaskpass";
+}
diff --git a/pkgs/kde/plasma/ksystemstats/default.nix b/pkgs/kde/plasma/ksystemstats/default.nix
new file mode 100644
index 000000000000..1d098b10b023
--- /dev/null
+++ b/pkgs/kde/plasma/ksystemstats/default.nix
@@ -0,0 +1,16 @@
+{
+  mkKdeDerivation,
+  pkg-config,
+  libksysguard,
+  networkmanager-qt,
+  lm_sensors,
+  libnl,
+}:
+mkKdeDerivation {
+  pname = "ksystemstats";
+
+  extraNativeBuildInputs = [pkg-config];
+  extraBuildInputs = [networkmanager-qt lm_sensors libnl];
+
+  cmakeFlags = ["-DSYSTEMSTATS_DBUS_INTERFACE=${libksysguard}/share/dbus-1/interfaces/org.kde.ksystemstats1.xml"];
+}
diff --git a/pkgs/kde/plasma/kwallet-pam/default.nix b/pkgs/kde/plasma/kwallet-pam/default.nix
new file mode 100644
index 000000000000..4b3cdd678dee
--- /dev/null
+++ b/pkgs/kde/plasma/kwallet-pam/default.nix
@@ -0,0 +1,16 @@
+{
+  lib,
+  mkKdeDerivation,
+  pam,
+  libgcrypt,
+  socat,
+}:
+mkKdeDerivation {
+  pname = "kwallet-pam";
+
+  postPatch = ''
+    sed -i pam_kwallet_init -e "s|socat|${lib.getBin socat}/bin/socat|"
+  '';
+
+  extraBuildInputs = [pam libgcrypt];
+}
diff --git a/pkgs/kde/plasma/kwayland-integration/default.nix b/pkgs/kde/plasma/kwayland-integration/default.nix
new file mode 100644
index 000000000000..0274068f7f79
--- /dev/null
+++ b/pkgs/kde/plasma/kwayland-integration/default.nix
@@ -0,0 +1,6 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kwayland-integration";
+  # FIXME(qt5)
+  meta.broken = true;
+}
diff --git a/pkgs/kde/plasma/kwayland/default.nix b/pkgs/kde/plasma/kwayland/default.nix
new file mode 100644
index 000000000000..341fd8d35608
--- /dev/null
+++ b/pkgs/kde/plasma/kwayland/default.nix
@@ -0,0 +1,12 @@
+{
+  mkKdeDerivation,
+  pkg-config,
+  qtwayland,
+  wayland-protocols,
+}:
+mkKdeDerivation {
+  pname = "kwayland";
+
+  extraNativeBuildInputs = [pkg-config];
+  extraBuildInputs = [qtwayland wayland-protocols];
+}
diff --git a/pkgs/kde/plasma/kwin/0001-NixOS-Unwrap-executable-name-for-.desktop-search.patch b/pkgs/kde/plasma/kwin/0001-NixOS-Unwrap-executable-name-for-.desktop-search.patch
new file mode 100644
index 000000000000..896c5dcff20b
--- /dev/null
+++ b/pkgs/kde/plasma/kwin/0001-NixOS-Unwrap-executable-name-for-.desktop-search.patch
@@ -0,0 +1,114 @@
+From 29ec6fada935ef966e5859082435ed57daa9522d Mon Sep 17 00:00:00 2001
+From: Samuel Dionne-Riel <samuel@dionne-riel.com>
+Date: Tue, 16 Mar 2021 15:03:59 -0400
+Subject: [PATCH] [NixOS] Unwrap executable name for .desktop search
+
+Why is this necessary even though -a "$0" is used in the wrapper?
+Because it's completely bypassing argv0! This looks at the executable
+file in-use according to the kernel!
+
+Wrappers cannot affect the `/proc/.../exe` symlink!
+
+Co-authored-by: Yaroslav Bolyukin <iam@lach.pw>
+---
+ src/nixos_utils.h     | 41 +++++++++++++++++++++++++++++++++++++++++
+ src/service_utils.h   |  4 +++-
+ src/waylandwindow.cpp |  5 ++++-
+ 3 files changed, 48 insertions(+), 2 deletions(-)
+ create mode 100644 src/nixos_utils.h
+
+diff --git a/src/nixos_utils.h b/src/nixos_utils.h
+new file mode 100644
+index 0000000..726065d
+--- /dev/null
++++ b/src/nixos_utils.h
+@@ -0,0 +1,41 @@
++#ifndef NIXOS_UTILS_H
++#define NIXOS_UTILS_H
++
++// kwin
++// #include <kwinglobals.h>
++
++namespace KWin
++{
++
++static QString unwrapExecutablePath(const QString &in_executablePath)
++{
++    // NixOS fixes many packaging issues through "wrapper" scripts that manipulates the environment or does
++    // miscellaneous trickeries and mischievous things to make the programs work.
++    // In turn, programs often employs different mischievous schemes and trickeries to do *other things.
++    // It often happens that they conflict.
++    // Here, `kwin` tries to detect the .desktop file for a given process.
++    // `kwin` followed the process `/proc/.../exe` up to the actual binary running.
++    // It normally would be fine, e.g. /usr/bin/foobar is what's in the desktop file.
++    // But it's not the truth here! It's extremely likely the resolved path is /nix/store/.../bin/.foobar-wrapped
++    // rather than what the desktop file points to, something like /nix/store/.../bin/foobar !!
++    // Since the wrappers for Nixpkgs *always* prepend a dot and append -wrapped, we assume here that we can keep
++    // `/^(.*)\/\.([^/]*)-wrapped/` until the (equivalent) regex does not match.
++    // This should canonicalize the wrapper name to the expected name to look for in the desktop file.
++
++    // Use a copy of the const string
++    QString executablePath(in_executablePath);
++
++    // While the parts needed are present, "unwrap" one layer of wrapper names.
++    while (executablePath.endsWith("-wrapped") && executablePath[executablePath.lastIndexOf("/")+1] == QChar('.')) {
++        // Approximately equivalent to s/-wrapped$//
++        executablePath.remove(executablePath.length() - 8, 8);
++        // Approximately equivalent to s;/\.;/;
++        executablePath.remove(executablePath.lastIndexOf("/")+1, 1);
++    }
++
++    return executablePath;
++}
++
++}// namespace
++
++#endif // NIXOS_UTILS_H
+diff --git a/src/utils/serviceutils.h b/src/utils/serviceutils.h
+index 8a70c1f..475b15d 100644
+--- a/src/utils/serviceutils.h
++++ b/src/utils/serviceutils.h
+@@ -19,6 +19,7 @@
+ #include <QLoggingCategory>
+ //KF
+ #include <KApplicationTrader>
++#include "nixos_utils.h"
+ 
+ namespace KWin
+ {
+@@ -26,8 +27,9 @@ namespace KWin
+ const static QString s_waylandInterfaceName = QStringLiteral("X-KDE-Wayland-Interfaces");
+ const static QString s_dbusRestrictedInterfaceName = QStringLiteral("X-KDE-DBUS-Restricted-Interfaces");
+ 
+-static QStringList fetchProcessServiceField(const QString &executablePath, const QString &fieldName)
++static QStringList fetchProcessServiceField(const QString &in_executablePath, const QString &fieldName)
+ {
++    const QString executablePath = unwrapExecutablePath(in_executablePath);
+     // needed to be able to use the logging category in a header static function
+     static QLoggingCategory KWIN_UTILS ("KWIN_UTILS", QtWarningMsg);
+     const auto servicesFound = KApplicationTrader::query([&executablePath] (const KService::Ptr &service) {
+diff --git a/src/waylandwindow.cpp b/src/waylandwindow.cpp
+index fd2c0c1..ae8cf96 100644
+--- a/src/waylandwindow.cpp
++++ b/src/waylandwindow.cpp
+@@ -10,6 +10,7 @@
+ #include "screens.h"
+ #include "wayland_server.h"
+ #include "workspace.h"
++#include "nixos_utils.h"
+ 
+ #include <KWaylandServer/display.h>
+ #include <KWaylandServer/clientbuffer.h>
+@@ -173,7 +174,9 @@ void WaylandWindow::updateIcon()
+ 
+ void WaylandWindow::updateResourceName()
+ {
+-    const QFileInfo fileInfo(surface()->client()->executablePath());
++    const QString in_path = surface()->client()->executablePath();
++    const QString path = unwrapExecutablePath(in_path);
++    const QFileInfo fileInfo(path);
+     if (fileInfo.exists()) {
+         const QByteArray executableFileName = fileInfo.fileName().toUtf8();
+         setResourceClass(executableFileName, executableFileName);
+-- 
+2.32.0
diff --git a/pkgs/kde/plasma/kwin/0001-follow-symlinks.patch b/pkgs/kde/plasma/kwin/0001-follow-symlinks.patch
new file mode 100644
index 000000000000..efde4f4dcf04
--- /dev/null
+++ b/pkgs/kde/plasma/kwin/0001-follow-symlinks.patch
@@ -0,0 +1,25 @@
+From af569c9ed8079169b524b31461e2789baa09ef7a Mon Sep 17 00:00:00 2001
+From: Thomas Tuegel <ttuegel@mailbox.org>
+Date: Mon, 27 Jan 2020 05:31:13 -0600
+Subject: [PATCH 1/3] follow symlinks
+
+---
+ src/plugins/kdecorations/aurorae/src/aurorae.cpp | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/plugins/kdecorations/aurorae/src/aurorae.cpp b/src/plugins/kdecorations/aurorae/src/aurorae.cpp
+index 5242cb7..2e4ddae 100644
+--- a/src/plugins/kdecorations/aurorae/src/aurorae.cpp
++++ b/src/plugins/kdecorations/aurorae/src/aurorae.cpp
+@@ -201,7 +201,7 @@ void Helper::init()
+     // so let's try to locate our plugin:
+     QString pluginPath;
+     for (const QString &path : m_engine->importPathList()) {
+-        QDirIterator it(path, QDirIterator::Subdirectories);
++        QDirIterator it(path, QDirIterator::Subdirectories | QDirIterator::FollowSymlinks);
+         while (it.hasNext()) {
+             it.next();
+             QFileInfo fileInfo = it.fileInfo();
+-- 
+2.29.2
+
diff --git a/pkgs/kde/plasma/kwin/0003-plugins-qpa-allow-using-nixos-wrapper.patch b/pkgs/kde/plasma/kwin/0003-plugins-qpa-allow-using-nixos-wrapper.patch
new file mode 100644
index 000000000000..d0be721b044c
--- /dev/null
+++ b/pkgs/kde/plasma/kwin/0003-plugins-qpa-allow-using-nixos-wrapper.patch
@@ -0,0 +1,26 @@
+From 8d49f5ef8692c352a62f4f8b1bc68e6e210bbee6 Mon Sep 17 00:00:00 2001
+From: Yaroslav  Bolyukin <iam@lach.pw>
+Date: Wed, 23 Dec 2020 18:02:14 +0300
+Subject: [PATCH 3/3] plugins/qpa: allow using nixos wrapper
+
+Signed-off-by: Yaroslav  Bolyukin <iam@lach.pw>
+---
+ src/plugins/qpa/main.cpp | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/plugins/qpa/main.cpp b/src/plugins/qpa/main.cpp
+index efd236b..a69c046 100644
+--- a/src/plugins/qpa/main.cpp
++++ b/src/plugins/qpa/main.cpp
+@@ -23,7 +23,7 @@ public:
+
+ QPlatformIntegration *KWinIntegrationPlugin::create(const QString &system, const QStringList &paramList)
+ {
+-    if (!QCoreApplication::applicationFilePath().endsWith(QLatin1String("kwin_wayland")) && !qEnvironmentVariableIsSet("KWIN_FORCE_OWN_QPA")) {
++    if (!QCoreApplication::applicationFilePath().endsWith(QLatin1String("kwin_wayland")) && !QCoreApplication::applicationFilePath().endsWith(QLatin1String(".kwin_wayland-wrapped")) && !qEnvironmentVariableIsSet("KWIN_FORCE_OWN_QPA")) {
+         // Not KWin
+         return nullptr;
+     }
+-- 
+2.29.2
+
diff --git a/pkgs/kde/plasma/kwin/default.nix b/pkgs/kde/plasma/kwin/default.nix
new file mode 100644
index 000000000000..fc5f00991d9e
--- /dev/null
+++ b/pkgs/kde/plasma/kwin/default.nix
@@ -0,0 +1,54 @@
+{
+  mkKdeDerivation,
+  pkg-config,
+  qtquick3d,
+  qtsensors,
+  qttools,
+  qtvirtualkeyboard,
+  qtwayland,
+  libinput,
+  xorg,
+  libdisplay-info,
+  mesa,
+  lcms2,
+  libcap,
+  pipewire,
+  krunner,
+  python3,
+}:
+mkKdeDerivation {
+  pname = "kwin";
+
+  patches = [
+    # Follow symlinks when searching for aurorae configs
+    # FIXME(later): upstream?
+    ./0001-follow-symlinks.patch
+    # The rest are NixOS-specific hacks
+    ./0003-plugins-qpa-allow-using-nixos-wrapper.patch
+    ./0001-NixOS-Unwrap-executable-name-for-.desktop-search.patch
+  ];
+
+  postPatch = ''
+    patchShebangs src/plugins/strip-effect-metadata.py
+  '';
+
+  extraNativeBuildInputs = [pkg-config python3];
+  extraBuildInputs = [
+    qtquick3d
+    qtsensors
+    qttools
+    qtvirtualkeyboard
+    qtwayland
+
+    krunner
+
+    mesa # libgbm
+    lcms2
+    libcap
+    libdisplay-info
+    libinput
+    pipewire
+
+    xorg.libxcvt
+  ];
+}
diff --git a/pkgs/kde/plasma/kwrited/default.nix b/pkgs/kde/plasma/kwrited/default.nix
new file mode 100644
index 000000000000..262f3b7c6493
--- /dev/null
+++ b/pkgs/kde/plasma/kwrited/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "kwrited";
+}
diff --git a/pkgs/kde/plasma/layer-shell-qt/default.nix b/pkgs/kde/plasma/layer-shell-qt/default.nix
new file mode 100644
index 000000000000..9783220cddf2
--- /dev/null
+++ b/pkgs/kde/plasma/layer-shell-qt/default.nix
@@ -0,0 +1,13 @@
+{
+  mkKdeDerivation,
+  qtwayland,
+  pkg-config,
+  wayland,
+  wayland-protocols,
+}:
+mkKdeDerivation {
+  pname = "layer-shell-qt";
+
+  extraNativeBuildInputs = [pkg-config];
+  extraBuildInputs = [qtwayland wayland wayland-protocols];
+}
diff --git a/pkgs/kde/plasma/libkscreen/default.nix b/pkgs/kde/plasma/libkscreen/default.nix
new file mode 100644
index 000000000000..d6fdd87c7e9b
--- /dev/null
+++ b/pkgs/kde/plasma/libkscreen/default.nix
@@ -0,0 +1,12 @@
+{
+  mkKdeDerivation,
+  qtwayland,
+  qttools,
+  jq,
+}:
+mkKdeDerivation {
+  pname = "libkscreen";
+
+  extraNativeBuildInputs = [qttools qtwayland jq];
+  extraBuildInputs = [qtwayland];
+}
diff --git a/pkgs/kde/plasma/libksysguard/default.nix b/pkgs/kde/plasma/libksysguard/default.nix
new file mode 100644
index 000000000000..9dae888737ab
--- /dev/null
+++ b/pkgs/kde/plasma/libksysguard/default.nix
@@ -0,0 +1,14 @@
+{
+  mkKdeDerivation,
+  qtwebchannel,
+  qtwebengine,
+  qttools,
+  libpcap,
+  libnl,
+  lm_sensors,
+}:
+mkKdeDerivation {
+  pname = "libksysguard";
+
+  extraBuildInputs = [qtwebchannel qtwebengine qttools libpcap libnl lm_sensors];
+}
diff --git a/pkgs/kde/plasma/libplasma/default.nix b/pkgs/kde/plasma/libplasma/default.nix
new file mode 100644
index 000000000000..1ff05b92ef0e
--- /dev/null
+++ b/pkgs/kde/plasma/libplasma/default.nix
@@ -0,0 +1,13 @@
+{
+  mkKdeDerivation,
+  qtsvg,
+  qtwayland,
+  wayland,
+  pkg-config,
+}:
+mkKdeDerivation {
+  pname = "libplasma";
+
+  extraNativeBuildInputs = [pkg-config];
+  extraBuildInputs = [qtsvg qtwayland wayland];
+}
diff --git a/pkgs/kde/plasma/lightdm-greeter-kde/default.nix b/pkgs/kde/plasma/lightdm-greeter-kde/default.nix
new file mode 100644
index 000000000000..9d508409f9d3
--- /dev/null
+++ b/pkgs/kde/plasma/lightdm-greeter-kde/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "lightdm-greeter-kde";
+}
diff --git a/pkgs/kde/plasma/milou/default.nix b/pkgs/kde/plasma/milou/default.nix
new file mode 100644
index 000000000000..555c7cbee2c7
--- /dev/null
+++ b/pkgs/kde/plasma/milou/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "milou";
+}
diff --git a/pkgs/kde/plasma/ocean-sound-theme/default.nix b/pkgs/kde/plasma/ocean-sound-theme/default.nix
new file mode 100644
index 000000000000..72adf43e3604
--- /dev/null
+++ b/pkgs/kde/plasma/ocean-sound-theme/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "ocean-sound-theme";
+}
diff --git a/pkgs/kde/plasma/oxygen-sounds/default.nix b/pkgs/kde/plasma/oxygen-sounds/default.nix
new file mode 100644
index 000000000000..68ee47d20eb8
--- /dev/null
+++ b/pkgs/kde/plasma/oxygen-sounds/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "oxygen-sounds";
+}
diff --git a/pkgs/kde/plasma/oxygen/default.nix b/pkgs/kde/plasma/oxygen/default.nix
new file mode 100644
index 000000000000..5b5de64af90f
--- /dev/null
+++ b/pkgs/kde/plasma/oxygen/default.nix
@@ -0,0 +1,6 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "oxygen";
+  # FIXME(qt5)
+  meta.broken = true;
+}
diff --git a/pkgs/kde/plasma/plasma-activities-stats/default.nix b/pkgs/kde/plasma/plasma-activities-stats/default.nix
new file mode 100644
index 000000000000..dff496e4f631
--- /dev/null
+++ b/pkgs/kde/plasma/plasma-activities-stats/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "plasma-activities-stats";
+}
diff --git a/pkgs/kde/plasma/plasma-activities/default.nix b/pkgs/kde/plasma/plasma-activities/default.nix
new file mode 100644
index 000000000000..9ddd163e9fbb
--- /dev/null
+++ b/pkgs/kde/plasma/plasma-activities/default.nix
@@ -0,0 +1,10 @@
+{
+  mkKdeDerivation,
+  qtdeclarative,
+  boost,
+}:
+mkKdeDerivation {
+  pname = "plasma-activities";
+
+  extraBuildInputs = [qtdeclarative boost];
+}
diff --git a/pkgs/kde/plasma/plasma-browser-integration/default.nix b/pkgs/kde/plasma/plasma-browser-integration/default.nix
new file mode 100644
index 000000000000..6277071f9a76
--- /dev/null
+++ b/pkgs/kde/plasma/plasma-browser-integration/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "plasma-browser-integration";
+}
diff --git a/pkgs/kde/plasma/plasma-desktop/default.nix b/pkgs/kde/plasma/plasma-desktop/default.nix
new file mode 100644
index 000000000000..8ee90dee3a67
--- /dev/null
+++ b/pkgs/kde/plasma/plasma-desktop/default.nix
@@ -0,0 +1,67 @@
+{
+  lib,
+  mkKdeDerivation,
+  runCommandLocal,
+  makeWrapper,
+  glib,
+  gsettings-desktop-schemas,
+  substituteAll,
+  util-linux,
+  pkg-config,
+  qtsvg,
+  qtwayland,
+  kaccounts-integration,
+  SDL2,
+  xkeyboard_config,
+  xorg,
+  libcanberra,
+  libxkbfile,
+  ibus,
+}: let
+  # run gsettings with desktop schemas for using in "kcm_access" kcm
+  # and in kaccess
+  gsettings-wrapper = runCommandLocal "gsettings-wrapper" {nativeBuildInputs = [makeWrapper];} ''
+    mkdir -p $out/bin
+    makeWrapper ${glib}/bin/gsettings $out/bin/gsettings --prefix XDG_DATA_DIRS : ${gsettings-desktop-schemas.out}/share/gsettings-schemas/${gsettings-desktop-schemas.name}
+  '';
+in
+  mkKdeDerivation {
+    pname = "plasma-desktop";
+
+    patches = [
+      (substituteAll {
+        src = ./hwclock-path.patch;
+        hwclock = "${lib.getBin util-linux}/bin/hwclock";
+      })
+      (substituteAll {
+        src = ./kcm-access.patch;
+        gsettings = "${gsettings-wrapper}/bin/gsettings";
+      })
+      ./tzdir.patch
+      ./no-discover-shortcut.patch
+    ];
+
+    extraNativeBuildInputs = [pkg-config];
+    extraBuildInputs = [
+      qtsvg
+      qtwayland
+
+      kaccounts-integration
+
+      SDL2
+      libcanberra
+      libxkbfile
+      xkeyboard_config
+
+      xorg.libXcursor
+      xorg.libXft
+      xorg.xf86inputlibinput
+      xorg.xf86inputevdev
+      xorg.xorgserver
+
+      ibus
+    ];
+
+    # wrap kaccess with wrapped gsettings so it can access accessibility schemas
+    qtWrapperArgs = ["--prefix PATH : ${lib.makeBinPath [gsettings-wrapper]}"];
+  }
diff --git a/pkgs/kde/plasma/plasma-desktop/hwclock-path.patch b/pkgs/kde/plasma/plasma-desktop/hwclock-path.patch
new file mode 100644
index 000000000000..4c0891db97a6
--- /dev/null
+++ b/pkgs/kde/plasma/plasma-desktop/hwclock-path.patch
@@ -0,0 +1,24 @@
+Index: plasma-desktop-5.8.5/kcms/dateandtime/helper.cpp
+===================================================================
+--- plasma-desktop-5.8.5.orig/kcms/dateandtime/helper.cpp
++++ plasma-desktop-5.8.5/kcms/dateandtime/helper.cpp
+@@ -48,10 +48,6 @@
+ #include <sys/types.h>
+ #endif
+
+-// We cannot rely on the $PATH environment variable, because D-Bus activation
+-// clears it. So we have to use a reasonable default.
+-static const QString exePath = QStringLiteral("/usr/sbin:/usr/bin:/sbin:/bin");
+-
+ int ClockHelper::ntp(const QStringList &ntpServers, bool ntpEnabled)
+ {
+     int ret = 0;
+@@ -227,7 +223,7 @@ int ClockHelper::tzreset()
+ 
+ void ClockHelper::toHwclock()
+ {
+-    QString hwclock = QStandardPaths::findExecutable(QStringLiteral("hwclock"), exePath.split(QLatin1Char(':')));
++    QString hwclock = QLatin1String("@hwclock@");
+     if (!hwclock.isEmpty()) {
+         KProcess::execute(hwclock, QStringList() << QStringLiteral("--systohc"));
+     }
diff --git a/pkgs/kde/plasma/plasma-desktop/kcm-access.patch b/pkgs/kde/plasma/plasma-desktop/kcm-access.patch
new file mode 100644
index 000000000000..91f5847e88a5
--- /dev/null
+++ b/pkgs/kde/plasma/plasma-desktop/kcm-access.patch
@@ -0,0 +1,13 @@
+diff --git a/kcms/access/kcmaccess.cpp b/kcms/access/kcmaccess.cpp
+index 4f8d3e2..a96f755 100644
+--- a/kcms/access/kcmaccess.cpp
++++ b/kcms/access/kcmaccess.cpp
+@@ -176,7 +176,7 @@ void KAccessConfig::launchOrcaConfiguration()
+                                       QStringLiteral("screen-reader-enabled"),
+                                       QStringLiteral("true")};
+ 
+-    int ret = QProcess::execute(QStringLiteral("gsettings"), gsettingArgs);
++    int ret = QProcess::execute(QStringLiteral("@gsettings@"), gsettingArgs);
+     if (ret) {
+         const QString errorStr = QLatin1String("gsettings ") + gsettingArgs.join(QLatin1Char(' '));
+         setOrcaLaunchFeedback(i18n("Could not set gsettings for Orca: \"%1\" failed", errorStr));
diff --git a/pkgs/kde/plasma/plasma-desktop/no-discover-shortcut.patch b/pkgs/kde/plasma/plasma-desktop/no-discover-shortcut.patch
new file mode 100644
index 000000000000..f186671c9cc5
--- /dev/null
+++ b/pkgs/kde/plasma/plasma-desktop/no-discover-shortcut.patch
@@ -0,0 +1,13 @@
+diff --git a/applets/taskmanager/package/contents/config/main.xml b/applets/taskmanager/package/contents/config/main.xml
+index 6bb27695d..25e621810 100644
+--- a/applets/taskmanager/package/contents/config/main.xml
++++ b/applets/taskmanager/package/contents/config/main.xml
+@@ -85,7 +85,7 @@
+     </entry>
+     <entry name="launchers" type="StringList">
+       <label>The list of launcher tasks on the widget. Usually .desktop file or executable URLs. Special URLs such as preferred://browser that expand to default applications are supported.</label>
+-      <default>applications:systemsettings.desktop,applications:org.kde.discover.desktop,preferred://filemanager,preferred://browser</default>
++      <default>applications:systemsettings.desktop,preferred://filemanager,preferred://browser</default>
+     </entry>
+     <entry name="middleClickAction" type="Enum">
+       <label>What to do on middle-mouse click on a task button.</label>
diff --git a/pkgs/kde/plasma/plasma-desktop/tzdir.patch b/pkgs/kde/plasma/plasma-desktop/tzdir.patch
new file mode 100644
index 000000000000..97504b330fed
--- /dev/null
+++ b/pkgs/kde/plasma/plasma-desktop/tzdir.patch
@@ -0,0 +1,18 @@
+Index: plasma-desktop-5.8.5/kcms/dateandtime/helper.cpp
+===================================================================
+--- plasma-desktop-5.8.5.orig/kcms/dateandtime/helper.cpp
++++ plasma-desktop-5.8.5/kcms/dateandtime/helper.cpp
+@@ -181,7 +181,12 @@ int ClockHelper::tz( const QString& sele
+ 
+     val = selectedzone;
+ #else
+-    QString tz = "/usr/share/zoneinfo/" + selectedzone;
++    QString tzdir = QString::fromLocal8Bit(qgetenv("TZDIR"));
++    QString tz = tzdir + "/" + selectedzone;
++    if (tzdir.isEmpty()) {
++      // Standard Linux path
++      tz = "/usr/share/zoneinfo/" + selectedzone;
++    }
+ 
+     if (QFile::exists(tz)) { // make sure the new TZ really exists
+         QFile::remove(QStringLiteral("/etc/localtime"));
diff --git a/pkgs/kde/plasma/plasma-disks/default.nix b/pkgs/kde/plasma/plasma-disks/default.nix
new file mode 100644
index 000000000000..5941fe0dec54
--- /dev/null
+++ b/pkgs/kde/plasma/plasma-disks/default.nix
@@ -0,0 +1,16 @@
+{
+  mkKdeDerivation,
+  lib,
+  substituteAll,
+  smartmontools,
+}:
+mkKdeDerivation {
+  pname = "plasma-disks";
+
+  patches = [
+    (substituteAll {
+      smartctl = lib.getExe smartmontools;
+      src = ./smartctl-path.patch;
+    })
+  ];
+}
diff --git a/pkgs/kde/plasma/plasma-disks/smartctl-path.patch b/pkgs/kde/plasma/plasma-disks/smartctl-path.patch
new file mode 100644
index 000000000000..71d4c5e7f8f5
--- /dev/null
+++ b/pkgs/kde/plasma/plasma-disks/smartctl-path.patch
@@ -0,0 +1,13 @@
+diff --git a/src/helper.cpp b/src/helper.cpp
+index 102ebc5..4cde9da 100644
+--- a/src/helper.cpp
++++ b/src/helper.cpp
+@@ -69,7 +69,7 @@ ActionReply SMARTHelper::smartctl(const QVariantMap &args)
+     // PATH is super minimal when invoked through dbus
+     setenv("PATH", "/usr/sbin:/sbin:/usr/local/sbin", 1);
+ 
+-    const QString command = QStringLiteral("smartctl");
++    const QString command = QStringLiteral("@smartctl@");
+     const QString all = QStringLiteral("--all");
+ 
+     // JSON output.
diff --git a/pkgs/kde/plasma/plasma-firewall/default.nix b/pkgs/kde/plasma/plasma-firewall/default.nix
new file mode 100644
index 000000000000..202d3ea089b2
--- /dev/null
+++ b/pkgs/kde/plasma/plasma-firewall/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "plasma-firewall";
+}
diff --git a/pkgs/kde/plasma/plasma-integration/default.nix b/pkgs/kde/plasma/plasma-integration/default.nix
new file mode 100644
index 000000000000..a626b9447934
--- /dev/null
+++ b/pkgs/kde/plasma/plasma-integration/default.nix
@@ -0,0 +1,67 @@
+{
+  mkKdeDerivation,
+  qtbase,
+  qtwayland,
+  libsForQt5,
+  xorg,
+}:
+mkKdeDerivation {
+  pname = "plasma-integration";
+
+  # force it to check our custom import path too
+  patches = [./qml-path.patch];
+
+  outputs = ["out" "dev" "qt5"];
+
+  # We can't add qt5 stuff to dependencies or the hooks blow up,
+  # so manually point everything to everything. Oof.
+  extraCmakeFlags = [
+    "-DQt5_DIR=${libsForQt5.qtbase.dev}/lib/cmake/Qt5"
+    "-DQt5Concurrent_DIR=${libsForQt5.qtbase.dev}/lib/cmake/Qt5Concurrent"
+    "-DQt5Core_DIR=${libsForQt5.qtbase.dev}/lib/cmake/Qt5Core"
+    "-DQt5DBus_DIR=${libsForQt5.qtbase.dev}/lib/cmake/Qt5DBus"
+    "-DQt5Gui_DIR=${libsForQt5.qtbase.dev}/lib/cmake/Qt5Gui"
+    "-DQt5Network_DIR=${libsForQt5.qtbase.dev}/lib/cmake/Qt5Network"
+    "-DQt5Qml_DIR=${libsForQt5.qtdeclarative.dev}/lib/cmake/Qt5Qml"
+    "-DQt5QmlModels_DIR=${libsForQt5.qtdeclarative.dev}/lib/cmake/Qt5QmlModels"
+    "-DQt5Quick_DIR=${libsForQt5.qtdeclarative.dev}/lib/cmake/Qt5Quick"
+    "-DQt5QuickControls2_DIR=${libsForQt5.qtquickcontrols2.dev}/lib/cmake/Qt5QuickControls2"
+    "-DQt5ThemeSupport_LIBRARY=${libsForQt5.qtbase.out}/lib/libQt5ThemeSupport.a"
+    "-DQt5ThemeSupport_INCLUDE_DIR=${libsForQt5.qtbase.dev}/include/QtThemeSupport/${libsForQt5.qtbase.version}"
+    "-DQt5WaylandClient_DIR=${libsForQt5.qtwayland.dev}/lib/cmake/Qt5WaylandClient"
+    "-DQt5WaylandScanner_EXECUTABLE=${libsForQt5.qtwayland.dev}/bin/qtwaylandscanner"
+    "-DQt5Widgets_DIR=${libsForQt5.qtbase.dev}/lib/cmake/Qt5Widgets"
+    "-DQt5X11Extras_DIR=${libsForQt5.qtx11extras.dev}/lib/cmake/Qt5X11Extras"
+    "-DQt5Xml_DIR=${libsForQt5.qtbase.dev}/lib/cmake/Qt5Xml"
+    "-DQtWaylandScanner_EXECUTABLE=${libsForQt5.qtwayland.dev}/bin/qtwaylandscanner"
+
+    "-DKF5Auth_DIR=${libsForQt5.kauth.dev}/lib/cmake/KF5Auth"
+    "-DKF5Bookmarks_DIR=${libsForQt5.kbookmarks.dev}/lib/cmake/KF5Bookmarks"
+    "-DKF5Codecs_DIR=${libsForQt5.kcodecs.dev}/lib/cmake/KF5Codecs"
+    "-DKF5Completion_DIR=${libsForQt5.kcompletion.dev}/lib/cmake/KF5Completion"
+    "-DKF5Config_DIR=${libsForQt5.kconfig.dev}/lib/cmake/KF5Config"
+    "-DKF5ConfigWidgets_DIR=${libsForQt5.kconfigwidgets.dev}/lib/cmake/KF5ConfigWidgets"
+    "-DKF5CoreAddons_DIR=${libsForQt5.kcoreaddons.dev}/lib/cmake/KF5CoreAddons"
+    "-DKF5GuiAddons_DIR=${libsForQt5.kguiaddons.dev}/lib/cmake/KF5GuiAddons"
+    "-DKF5I18n_DIR=${libsForQt5.ki18n.dev}/lib/cmake/KF5I18n"
+    "-DKF5IconThemes_DIR=${libsForQt5.kiconthemes.dev}/lib/cmake/KF5IconThemes"
+    "-DKF5ItemViews_DIR=${libsForQt5.kitemviews.dev}/lib/cmake/KF5ItemViews"
+    "-DKF5JobWidgets_DIR=${libsForQt5.kjobwidgets.dev}/lib/cmake/KF5JobWidgets"
+    "-DKF5KIO_DIR=${libsForQt5.kio.dev}/lib/cmake/KF5KIO"
+    "-DKF5Notifications_DIR=${libsForQt5.knotifications.dev}/lib/cmake/KF5Notifications"
+    "-DKF5Service_DIR=${libsForQt5.kservice.dev}/lib/cmake/KF5Service"
+    "-DKF5Solid_DIR=${libsForQt5.solid.dev}/lib/cmake/KF5Solid"
+    "-DKF5Wayland_DIR=${libsForQt5.kwayland.dev}/lib/cmake/KF5Wayland"
+    "-DKF5WidgetsAddons_DIR=${libsForQt5.kwidgetsaddons.dev}/lib/cmake/KF5WidgetsAddons"
+    "-DKF5WindowSystem_DIR=${libsForQt5.kwindowsystem.dev}/lib/cmake/KF5WindowSystem"
+    "-DKF5XmlGui_DIR=${libsForQt5.kxmlgui.dev}/lib/cmake/KF5XmlGui"
+  ];
+
+  extraBuildInputs = [qtwayland xorg.libXcursor];
+
+  # Move Qt5 plugin to Qt5 plugin path
+  postInstall = ''
+    mkdir -p $qt5/${libsForQt5.qtbase.qtPluginPrefix}/platformthemes
+    mv $out/${qtbase.qtPluginPrefix}/platformthemes/KDEPlasmaPlatformTheme5.so $qt5/${libsForQt5.qtbase.qtPluginPrefix}/platformthemes
+  '';
+}
diff --git a/pkgs/kde/plasma/plasma-integration/qml-path.patch b/pkgs/kde/plasma/plasma-integration/qml-path.patch
new file mode 100644
index 000000000000..33af3fe9d8ea
--- /dev/null
+++ b/pkgs/kde/plasma/plasma-integration/qml-path.patch
@@ -0,0 +1,12 @@
+diff --git a/qt6/src/platformtheme/kdeplatformtheme.cpp b/qt6/src/platformtheme/kdeplatformtheme.cpp
+index fea04b5..7efafd1 100644
+--- a/qt6/src/platformtheme/kdeplatformtheme.cpp
++++ b/qt6/src/platformtheme/kdeplatformtheme.cpp
+@@ -551,6 +551,7 @@ bool KdePlatformTheme::checkIfThemeExists(const QString &themePath)
+     // QML_IMPORT_PATH is the new one, but QML2_IMPORT_PATH is still used
+     checkEnvironmentVariable("QML2_IMPORT_PATH");
+     checkEnvironmentVariable("QML_IMPORT_PATH");
++    checkEnvironmentVariable("NIXPKGS_QT6_QML_IMPORT_PATH");
+ 
+     for (const QString &path : moduleSearchPaths) {
+         if (QDir(path + themePath).exists()) {
diff --git a/pkgs/kde/plasma/plasma-mobile/default.nix b/pkgs/kde/plasma/plasma-mobile/default.nix
new file mode 100644
index 000000000000..92bb1d66d5e3
--- /dev/null
+++ b/pkgs/kde/plasma/plasma-mobile/default.nix
@@ -0,0 +1,11 @@
+{
+  mkKdeDerivation,
+  pkg-config,
+  qtsensors,
+}:
+mkKdeDerivation {
+  pname = "plasma-mobile";
+
+  extraNativeBuildInputs = [pkg-config];
+  extraBuildInputs = [qtsensors];
+}
diff --git a/pkgs/kde/plasma/plasma-nano/default.nix b/pkgs/kde/plasma/plasma-nano/default.nix
new file mode 100644
index 000000000000..9cdb24f013e7
--- /dev/null
+++ b/pkgs/kde/plasma/plasma-nano/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qtsvg,
+}:
+mkKdeDerivation {
+  pname = "plasma-nano";
+
+  extraBuildInputs = [qtsvg];
+}
diff --git a/pkgs/kde/plasma/plasma-nm/0002-openvpn-binary-path.patch b/pkgs/kde/plasma/plasma-nm/0002-openvpn-binary-path.patch
new file mode 100644
index 000000000000..c32e73bc2c6c
--- /dev/null
+++ b/pkgs/kde/plasma/plasma-nm/0002-openvpn-binary-path.patch
@@ -0,0 +1,13 @@
+diff --git a/vpn/openvpn/openvpnadvancedwidget.cpp b/vpn/openvpn/openvpnadvancedwidget.cpp
+index 2f11ba1d..310f11b4 100644
+--- a/vpn/openvpn/openvpnadvancedwidget.cpp
++++ b/vpn/openvpn/openvpnadvancedwidget.cpp
+@@ -75,7 +75,7 @@ OpenVpnAdvancedWidget::OpenVpnAdvancedWidget(const NetworkManager::VpnSetting::P
+     connect(m_ui->cmbProxyType, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this, &OpenVpnAdvancedWidget::proxyTypeChanged);
+ 
+     // start openVPN process and get its cipher list
+-    const QString openVpnBinary = QStandardPaths::findExecutable("openvpn", QStringList{"/sbin", "/usr/sbin"});
++    const QString openVpnBinary = "@openvpn@/bin/openvpn";
+     const QStringList ciphersArgs(QLatin1String("--show-ciphers"));
+     const QStringList versionArgs(QLatin1String("--version"));
+ 
diff --git a/pkgs/kde/plasma/plasma-nm/default.nix b/pkgs/kde/plasma/plasma-nm/default.nix
new file mode 100644
index 000000000000..a53ec99a8bed
--- /dev/null
+++ b/pkgs/kde/plasma/plasma-nm/default.nix
@@ -0,0 +1,26 @@
+{
+  mkKdeDerivation,
+  substituteAll,
+  pkg-config,
+  qtwebengine,
+  mobile-broadband-provider-info,
+  openconnect,
+  openvpn,
+}:
+mkKdeDerivation {
+  pname = "plasma-nm";
+
+  patches = [
+    (substituteAll {
+      src = ./0002-openvpn-binary-path.patch;
+      inherit openvpn;
+    })
+  ];
+
+  extraNativeBuildInputs = [pkg-config];
+  extraBuildInputs = [
+    qtwebengine
+    mobile-broadband-provider-info
+    openconnect
+  ];
+}
diff --git a/pkgs/kde/plasma/plasma-pa/default.nix b/pkgs/kde/plasma/plasma-pa/default.nix
new file mode 100644
index 000000000000..4d721ecc711b
--- /dev/null
+++ b/pkgs/kde/plasma/plasma-pa/default.nix
@@ -0,0 +1,12 @@
+{
+  mkKdeDerivation,
+  pkg-config,
+  libcanberra,
+  pulseaudio,
+}:
+mkKdeDerivation {
+  pname = "plasma-pa";
+
+  extraNativeBuildInputs = [pkg-config];
+  extraBuildInputs = [libcanberra pulseaudio];
+}
diff --git a/pkgs/kde/plasma/plasma-sdk/default.nix b/pkgs/kde/plasma/plasma-sdk/default.nix
new file mode 100644
index 000000000000..68f5a30fc936
--- /dev/null
+++ b/pkgs/kde/plasma/plasma-sdk/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qtsvg,
+}:
+mkKdeDerivation {
+  pname = "plasma-sdk";
+
+  extraBuildInputs = [qtsvg];
+}
diff --git a/pkgs/kde/plasma/plasma-systemmonitor/default.nix b/pkgs/kde/plasma/plasma-systemmonitor/default.nix
new file mode 100644
index 000000000000..8a8bff96ecff
--- /dev/null
+++ b/pkgs/kde/plasma/plasma-systemmonitor/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "plasma-systemmonitor";
+}
diff --git a/pkgs/kde/plasma/plasma-thunderbolt/default.nix b/pkgs/kde/plasma/plasma-thunderbolt/default.nix
new file mode 100644
index 000000000000..5b1b682ac9bc
--- /dev/null
+++ b/pkgs/kde/plasma/plasma-thunderbolt/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "plasma-thunderbolt";
+}
diff --git a/pkgs/kde/plasma/plasma-vault/0001-encfs-path.patch b/pkgs/kde/plasma/plasma-vault/0001-encfs-path.patch
new file mode 100644
index 000000000000..a5e9d8c531e1
--- /dev/null
+++ b/pkgs/kde/plasma/plasma-vault/0001-encfs-path.patch
@@ -0,0 +1,31 @@
+From fef6bfe87db4411e3dda2f96741cd8204fe41d85 Mon Sep 17 00:00:00 2001
+From: Thomas Tuegel <ttuegel@mailbox.org>
+Date: Tue, 2 Nov 2021 05:57:50 -0500
+Subject: [PATCH 1/3] encfs path
+
+---
+ kded/engine/backends/encfs/encfsbackend.cpp | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/kded/engine/backends/encfs/encfsbackend.cpp b/kded/engine/backends/encfs/encfsbackend.cpp
+index 2d15fa2..3f49867 100644
+--- a/kded/engine/backends/encfs/encfsbackend.cpp
++++ b/kded/engine/backends/encfs/encfsbackend.cpp
+@@ -101,12 +101,12 @@ QProcess *EncFsBackend::encfs(const QStringList &arguments) const
+     auto config = KSharedConfig::openConfig(PLASMAVAULT_CONFIG_FILE);
+     KConfigGroup backendConfig(config, "EncfsBackend");
+ 
+-    return process("encfs", arguments + backendConfig.readEntry("extraMountOptions", QStringList{}), {});
++    return process(NIXPKGS_ENCFS, arguments + backendConfig.readEntry("extraMountOptions", QStringList{}), {});
+ }
+ 
+ QProcess *EncFsBackend::encfsctl(const QStringList &arguments) const
+ {
+-    return process("encfsctl", arguments, {});
++    return process(NIXPKGS_ENCFSCTL, arguments, {});
+ }
+ 
+ } // namespace PlasmaVault
+-- 
+2.33.1
+
diff --git a/pkgs/kde/plasma/plasma-vault/0002-cryfs-path.patch b/pkgs/kde/plasma/plasma-vault/0002-cryfs-path.patch
new file mode 100644
index 000000000000..4c7567b15076
--- /dev/null
+++ b/pkgs/kde/plasma/plasma-vault/0002-cryfs-path.patch
@@ -0,0 +1,25 @@
+From a89a0d3f9088d272c01ccb9b730d1dbb500f9cb8 Mon Sep 17 00:00:00 2001
+From: Thomas Tuegel <ttuegel@mailbox.org>
+Date: Tue, 2 Nov 2021 05:59:34 -0500
+Subject: [PATCH 2/3] cryfs path
+
+---
+ kded/engine/backends/cryfs/cryfsbackend.cpp | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/kded/engine/backends/cryfs/cryfsbackend.cpp b/kded/engine/backends/cryfs/cryfsbackend.cpp
+index 64138b6..1a9fde2 100644
+--- a/kded/engine/backends/cryfs/cryfsbackend.cpp
++++ b/kded/engine/backends/cryfs/cryfsbackend.cpp
+@@ -207,7 +207,7 @@ QProcess *CryFsBackend::cryfs(const QStringList &arguments) const
+     auto config = KSharedConfig::openConfig(PLASMAVAULT_CONFIG_FILE);
+     KConfigGroup backendConfig(config, "CryfsBackend");
+ 
+-    return process("cryfs", arguments + backendConfig.readEntry("extraMountOptions", QStringList{}), {{"CRYFS_FRONTEND", "noninteractive"}});
++    return process(NIXPKGS_CRYFS, arguments + backendConfig.readEntry("extraMountOptions", QStringList{}), {{"CRYFS_FRONTEND", "noninteractive"}});
+ }
+ 
+ } // namespace PlasmaVault
+-- 
+2.33.1
+
diff --git a/pkgs/kde/plasma/plasma-vault/0003-fusermount-path.patch b/pkgs/kde/plasma/plasma-vault/0003-fusermount-path.patch
new file mode 100644
index 000000000000..0d4481c70541
--- /dev/null
+++ b/pkgs/kde/plasma/plasma-vault/0003-fusermount-path.patch
@@ -0,0 +1,25 @@
+From 63571e28c65935f32567c0b179a096d62726b778 Mon Sep 17 00:00:00 2001
+From: Thomas Tuegel <ttuegel@mailbox.org>
+Date: Tue, 2 Nov 2021 06:00:32 -0500
+Subject: [PATCH 3/3] fusermount path
+
+---
+ kded/engine/fusebackend_p.cpp | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/kded/engine/fusebackend_p.cpp b/kded/engine/fusebackend_p.cpp
+index 91f3523..1c19d88 100644
+--- a/kded/engine/fusebackend_p.cpp
++++ b/kded/engine/fusebackend_p.cpp
+@@ -86,7 +86,7 @@ QProcess *FuseBackend::process(const QString &executable, const QStringList &arg
+ 
+ QProcess *FuseBackend::fusermount(const QStringList &arguments) const
+ {
+-    return process("fusermount", arguments, {});
++    return process(NIXPKGS_FUSERMOUNT, arguments, {});
+ }
+ 
+ FutureResult<> FuseBackend::initialize(const QString &name, const Device &device, const MountPoint &mountPoint, const Vault::Payload &payload)
+-- 
+2.33.1
+
diff --git a/pkgs/kde/plasma/plasma-vault/0004-gocryptfs-path.patch b/pkgs/kde/plasma/plasma-vault/0004-gocryptfs-path.patch
new file mode 100644
index 000000000000..8790f877ff07
--- /dev/null
+++ b/pkgs/kde/plasma/plasma-vault/0004-gocryptfs-path.patch
@@ -0,0 +1,13 @@
+diff --git a/kded/engine/backends/gocryptfs/gocryptfsbackend.cpp b/kded/engine/backends/gocryptfs/gocryptfsbackend.cpp
+index 2d6df94..3e8ec9a 100644
+--- a/kded/engine/backends/gocryptfs/gocryptfsbackend.cpp
++++ b/kded/engine/backends/gocryptfs/gocryptfsbackend.cpp
+@@ -202,7 +202,7 @@ QProcess *GocryptfsBackend::gocryptfs(const QStringList &arguments) const
+     auto config = KSharedConfig::openConfig(PLASMAVAULT_CONFIG_FILE);
+     KConfigGroup backendConfig(config, "GocryptfsBackend");
+ 
+-    return process("gocryptfs", arguments + backendConfig.readEntry("extraMountOptions", QStringList{}), {});
++    return process(NIXPKGS_GOCRYPTFS, arguments + backendConfig.readEntry("extraMountOptions", QStringList{}), {});
+ }
+ 
+ QString GocryptfsBackend::getConfigFilePath(const Device &device) const
diff --git a/pkgs/kde/plasma/plasma-vault/default.nix b/pkgs/kde/plasma/plasma-vault/default.nix
new file mode 100644
index 000000000000..9ab545ab87b8
--- /dev/null
+++ b/pkgs/kde/plasma/plasma-vault/default.nix
@@ -0,0 +1,29 @@
+{
+  lib,
+  mkKdeDerivation,
+  pkg-config,
+  gocryptfs,
+  fuse,
+  cryfs,
+  encfs,
+}:
+mkKdeDerivation {
+  pname = "plasma-vault";
+
+  patches = [
+    ./0001-encfs-path.patch
+    ./0002-cryfs-path.patch
+    ./0003-fusermount-path.patch
+    ./0004-gocryptfs-path.patch
+  ];
+
+  CXXFLAGS = [
+    ''-DNIXPKGS_ENCFS=\"${lib.getBin encfs}/bin/encfs\"''
+    ''-DNIXPKGS_ENCFSCTL=\"${lib.getBin encfs}/bin/encfsctl\"''
+    ''-DNIXPKGS_CRYFS=\"${lib.getBin cryfs}/bin/cryfs\"''
+    ''-DNIXPKGS_FUSERMOUNT=\"${lib.getBin fuse}/bin/fusermount\"''
+    ''-DNIXPKGS_GOCRYPTFS=\"${lib.getBin gocryptfs}/bin/gocryptfs\"''
+  ];
+
+  extraNativeBuildInputs = [pkg-config];
+}
diff --git a/pkgs/kde/plasma/plasma-welcome/default.nix b/pkgs/kde/plasma/plasma-welcome/default.nix
new file mode 100644
index 000000000000..976a788a16e9
--- /dev/null
+++ b/pkgs/kde/plasma/plasma-welcome/default.nix
@@ -0,0 +1,10 @@
+{
+  mkKdeDerivation,
+  qtsvg,
+  kuserfeedback,
+}:
+mkKdeDerivation {
+  pname = "plasma-welcome";
+
+  extraBuildInputs = [qtsvg kuserfeedback];
+}
diff --git a/pkgs/kde/plasma/plasma-workspace-wallpapers/default.nix b/pkgs/kde/plasma/plasma-workspace-wallpapers/default.nix
new file mode 100644
index 000000000000..af8c89249274
--- /dev/null
+++ b/pkgs/kde/plasma/plasma-workspace-wallpapers/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  extra-cmake-modules,
+}:
+mkKdeDerivation {
+  pname = "plasma-workspace-wallpapers";
+
+  extraBuildInputs = [extra-cmake-modules];
+}
diff --git a/pkgs/kde/plasma/plasma-workspace/default.nix b/pkgs/kde/plasma/plasma-workspace/default.nix
new file mode 100644
index 000000000000..24e41b971cf0
--- /dev/null
+++ b/pkgs/kde/plasma/plasma-workspace/default.nix
@@ -0,0 +1,54 @@
+{
+  lib,
+  mkKdeDerivation,
+  substituteAll,
+  xorg,
+  pkg-config,
+  spirv-tools,
+  qtsvg,
+  qtwayland,
+  libcanberra,
+  libqalculate,
+  pipewire,
+  breeze,
+  qttools,
+  qqc2-breeze-style,
+  gpsd,
+}:
+mkKdeDerivation {
+  pname = "plasma-workspace";
+
+  patches = [
+    (substituteAll {
+      src = ./tool-paths.patch;
+      xmessage = "${lib.getBin xorg.xmessage}/bin/xmessage";
+      xsetroot = "${lib.getBin xorg.xsetroot}/bin/xsetroot";
+      qdbus = "${lib.getBin qttools}/bin/qdbus";
+    })
+    (substituteAll {
+      src = ./wallpaper-paths.patch;
+      wallpapers = "${lib.getBin breeze}/share/wallpapers";
+    })
+  ];
+
+  extraNativeBuildInputs = [pkg-config spirv-tools];
+  extraBuildInputs = [
+    qtsvg
+    qtwayland
+
+    qqc2-breeze-style
+
+    libcanberra
+    libqalculate
+    pipewire
+
+    xorg.libSM
+    xorg.libXcursor
+    xorg.libXtst
+    xorg.libXft
+
+    gpsd
+  ];
+
+  passthru.providedSessions = ["plasma" "plasmax11"];
+}
diff --git a/pkgs/kde/plasma/plasma-workspace/tool-paths.patch b/pkgs/kde/plasma/plasma-workspace/tool-paths.patch
new file mode 100644
index 000000000000..d750028200b2
--- /dev/null
+++ b/pkgs/kde/plasma/plasma-workspace/tool-paths.patch
@@ -0,0 +1,68 @@
+diff --git a/kcms/krdb/krdb.cpp b/kcms/krdb/krdb.cpp
+index 46363ddcb..d787f9993 100644
+--- a/kcms/krdb/krdb.cpp
++++ b/kcms/krdb/krdb.cpp
+@@ -468,7 +468,7 @@ void runRdb(unsigned int flags)
+     proc.execute();
+ 
+     // Needed for applications that don't set their own cursor.
+-    QProcess::execute(QStringLiteral("xsetroot"), {QStringLiteral("-cursor_name"), QStringLiteral("left_ptr")});
++    QProcess::execute(QStringLiteral("@xsetroot@"), {QStringLiteral("-cursor_name"), QStringLiteral("left_ptr")});
+ 
+     applyGtkStyles(1);
+     applyGtkStyles(2);
+diff --git a/startkde/startplasma.cpp b/startkde/startplasma.cpp
+index b0158c97d..c8f7fe223 100644
+--- a/startkde/startplasma.cpp
++++ b/startkde/startplasma.cpp
+@@ -50,7 +50,7 @@ void sigtermHandler(int signalNumber)
+ void messageBox(const QString &text)
+ {
+     out << text;
+-    runSync(QStringLiteral("xmessage"), {QStringLiteral("-geometry"), QStringLiteral("500x100"), text});
++    runSync(QStringLiteral("@xmessage@"), {QStringLiteral("-geometry"), QStringLiteral("500x100"), text});
+ }
+ 
+ QStringList allServices(const QLatin1String &prefix)
+@@ -484,7 +484,7 @@ QProcess *setupKSplash()
+         if (ksplashCfg.readEntry("Engine", QStringLiteral("KSplashQML")) == QLatin1String("KSplashQML")) {
+             p = new QProcess;
+             p->setProcessChannelMode(QProcess::ForwardedChannels);
+-            p->start(QStringLiteral("ksplashqml"), {ksplashCfg.readEntry("Theme", QStringLiteral("Breeze"))});
++            p->start(QStringLiteral(CMAKE_INSTALL_FULL_BINDIR "/ksplashqml"), {ksplashCfg.readEntry("Theme", QStringLiteral("Breeze"))});
+         }
+     }
+     return p;
+diff --git a/ksmserver/plasma-restoresession.service.in b/ksmserver/plasma-restoresession.service.in
+index 2c52a4b87..fd7fdc8ac 100644
+--- a/ksmserver/plasma-restoresession.service.in
++++ b/ksmserver/plasma-restoresession.service.in
+@@ -5,5 +5,5 @@ RefuseManualStart=yes
+
+ [Service]
+ Type=oneshot
+-ExecStart=-@QtBinariesDir@/qdbus org.kde.ksmserver /KSMServer org.kde.KSMServerInterface.restoreSession
++ExecStart=-@qdbus@ org.kde.ksmserver /KSMServer org.kde.KSMServerInterface.restoreSession
+ Slice=session.slice
+diff --git a/startkde/kcminit/plasma-kcminit-phase1.service.in b/startkde/kcminit/plasma-kcminit-phase1.service.in
+index 7218628ce..9126475ea 100644
+--- a/startkde/kcminit/plasma-kcminit-phase1.service.in
++++ b/startkde/kcminit/plasma-kcminit-phase1.service.in
+@@ -6,5 +6,5 @@ PartOf=graphical-session.target
+
+ [Service]
+ Type=oneshot
+-ExecStart=@QtBinariesDir@/qdbus org.kde.kcminit /kcminit org.kde.KCMInit.runPhase1
++ExecStart=@qdbus@ org.kde.kcminit /kcminit org.kde.KCMInit.runPhase1
+ Slice=session.slice
+diff --git a/startkde/systemd/plasma-ksplash-ready.service.in b/startkde/systemd/plasma-ksplash-ready.service.in
+index 3f6744f37..c51266794 100644
+--- a/startkde/systemd/plasma-ksplash-ready.service.in
++++ b/startkde/systemd/plasma-ksplash-ready.service.in
+@@ -6,5 +6,5 @@ PartOf=graphical-session.target
+
+ [Service]
+ Type=oneshot
+-ExecStart=-@QtBinariesDir@/qdbus org.kde.KSplash /KSplash org.kde.KSplash.setStage ready
++ExecStart=-@qdbus@ org.kde.KSplash /KSplash org.kde.KSplash.setStage ready
+ Slice=session.slice
diff --git a/pkgs/kde/plasma/plasma-workspace/wallpaper-paths.patch b/pkgs/kde/plasma/plasma-workspace/wallpaper-paths.patch
new file mode 100644
index 000000000000..050200a8411f
--- /dev/null
+++ b/pkgs/kde/plasma/plasma-workspace/wallpaper-paths.patch
@@ -0,0 +1,9 @@
+--- a/lookandfeel/sddm-theme/theme.conf.cmake
++++ b/lookandfeel/sddm-theme/theme.conf.cmake
+@@ -4,5 +4,5 @@ logo=${KDE_INSTALL_FULL_DATADIR}/sddm/themes/breeze/default-logo.svg
+ type=image
+ color=#1d99f3
+ fontSize=10
+-background=${KDE_INSTALL_FULL_WALLPAPERDIR}/Next/contents/images/5120x2880.png
++background=@wallpapers@/Next/contents/images/5120x2880.png
+ needsFullUserModel=false
diff --git a/pkgs/kde/plasma/plasma5support/default.nix b/pkgs/kde/plasma/plasma5support/default.nix
new file mode 100644
index 000000000000..385626aeedc0
--- /dev/null
+++ b/pkgs/kde/plasma/plasma5support/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "plasma5support";
+}
diff --git a/pkgs/kde/plasma/plymouth-kcm/default.nix b/pkgs/kde/plasma/plymouth-kcm/default.nix
new file mode 100644
index 000000000000..dcf339dd9b2e
--- /dev/null
+++ b/pkgs/kde/plasma/plymouth-kcm/default.nix
@@ -0,0 +1,11 @@
+{
+  mkKdeDerivation,
+  pkg-config,
+  plymouth,
+}:
+mkKdeDerivation {
+  pname = "plymouth-kcm";
+
+  extraNativeBuildInputs = [pkg-config];
+  extraBuildInputs = [plymouth];
+}
diff --git a/pkgs/kde/plasma/polkit-kde-agent-1/default.nix b/pkgs/kde/plasma/polkit-kde-agent-1/default.nix
new file mode 100644
index 000000000000..6c4bf0653f09
--- /dev/null
+++ b/pkgs/kde/plasma/polkit-kde-agent-1/default.nix
@@ -0,0 +1,9 @@
+{
+  mkKdeDerivation,
+  qtdeclarative,
+}:
+mkKdeDerivation {
+  pname = "polkit-kde-agent-1";
+
+  extraBuildInputs = [qtdeclarative];
+}
diff --git a/pkgs/kde/plasma/powerdevil/default.nix b/pkgs/kde/plasma/powerdevil/default.nix
new file mode 100644
index 000000000000..8b0c270e85c6
--- /dev/null
+++ b/pkgs/kde/plasma/powerdevil/default.nix
@@ -0,0 +1,11 @@
+{
+  mkKdeDerivation,
+  pkg-config,
+  libcap,
+}:
+mkKdeDerivation {
+  pname = "powerdevil";
+
+  extraNativeBuildInputs = [pkg-config];
+  extraBuildInputs = [libcap];
+}
diff --git a/pkgs/kde/plasma/print-manager/default.nix b/pkgs/kde/plasma/print-manager/default.nix
new file mode 100644
index 000000000000..fce60dcb968b
--- /dev/null
+++ b/pkgs/kde/plasma/print-manager/default.nix
@@ -0,0 +1,10 @@
+{
+  mkKdeDerivation,
+  cups,
+}:
+mkKdeDerivation {
+  pname = "print-manager";
+
+  # FIXME: cups-smb?
+  extraBuildInputs = [cups];
+}
diff --git a/pkgs/kde/plasma/qqc2-breeze-style/default.nix b/pkgs/kde/plasma/qqc2-breeze-style/default.nix
new file mode 100644
index 000000000000..2d950f63e0c5
--- /dev/null
+++ b/pkgs/kde/plasma/qqc2-breeze-style/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "qqc2-breeze-style";
+}
diff --git a/pkgs/kde/plasma/sddm-kcm/default.nix b/pkgs/kde/plasma/sddm-kcm/default.nix
new file mode 100644
index 000000000000..d60c5e4e6ff7
--- /dev/null
+++ b/pkgs/kde/plasma/sddm-kcm/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "sddm-kcm";
+}
diff --git a/pkgs/kde/plasma/systemsettings/default.nix b/pkgs/kde/plasma/systemsettings/default.nix
new file mode 100644
index 000000000000..2dd529b9380e
--- /dev/null
+++ b/pkgs/kde/plasma/systemsettings/default.nix
@@ -0,0 +1,4 @@
+{mkKdeDerivation}:
+mkKdeDerivation {
+  pname = "systemsettings";
+}
diff --git a/pkgs/kde/plasma/wacomtablet/default.nix b/pkgs/kde/plasma/wacomtablet/default.nix
new file mode 100644
index 000000000000..c24e8739f746
--- /dev/null
+++ b/pkgs/kde/plasma/wacomtablet/default.nix
@@ -0,0 +1,12 @@
+{
+  mkKdeDerivation,
+  pkg-config,
+  libwacom,
+  xf86_input_wacom,
+}:
+mkKdeDerivation {
+  pname = "wacomtablet";
+
+  extraNativeBuildInputs = [pkg-config];
+  extraBuildInputs = [libwacom xf86_input_wacom];
+}
diff --git a/pkgs/kde/plasma/xdg-desktop-portal-kde/default.nix b/pkgs/kde/plasma/xdg-desktop-portal-kde/default.nix
new file mode 100644
index 000000000000..9d5be65fe097
--- /dev/null
+++ b/pkgs/kde/plasma/xdg-desktop-portal-kde/default.nix
@@ -0,0 +1,14 @@
+{
+  mkKdeDerivation,
+  pkg-config,
+  qtwayland,
+  wayland,
+  wayland-protocols,
+  cups,
+}:
+mkKdeDerivation {
+  pname = "xdg-desktop-portal-kde";
+
+  extraNativeBuildInputs = [pkg-config];
+  extraBuildInputs = [qtwayland wayland wayland-protocols cups];
+}
diff --git a/pkgs/misc/cups/drivers/mfcj470dwcupswrapper/default.nix b/pkgs/misc/cups/drivers/mfcj470dwcupswrapper/default.nix
index dc54611d335a..767597548991 100644
--- a/pkgs/misc/cups/drivers/mfcj470dwcupswrapper/default.nix
+++ b/pkgs/misc/cups/drivers/mfcj470dwcupswrapper/default.nix
@@ -1,4 +1,4 @@
-{ lib, stdenv, fetchurl, mfcj470dwlpr, makeWrapper}:
+{ lib, stdenv, fetchurl, mfcj470dwlpr, makeWrapper, bash }:
 
 stdenv.mkDerivation rec {
   pname = "mfcj470dw-cupswrapper";
@@ -10,27 +10,27 @@ stdenv.mkDerivation rec {
   };
 
   nativeBuildInputs = [ makeWrapper ];
-  buildInputs = [ mfcj470dwlpr ];
+  buildInputs = [
+    bash # shebang
+  ];
 
-  patchPhase = ''
+  makeFlags = [ "-C" "brcupsconfpt1" "all" ];
+
+  postPatch = ''
     WRAPPER=cupswrapper/cupswrappermfcj470dw
 
     substituteInPlace $WRAPPER \
-    --replace /opt "${mfcj470dwlpr}/opt" \
-    --replace /usr "${mfcj470dwlpr}/usr" \
-    --replace /etc "$out/etc"
+      --replace-fail /opt "${mfcj470dwlpr}/opt" \
+      --replace-fail /usr "${mfcj470dwlpr}/usr" \
+      --replace-fail /etc "$out/etc"
 
     substituteInPlace $WRAPPER \
-    --replace "cp " "cp -p "
-    '';
-
-  buildPhase = ''
-    cd brcupsconfpt1
-    make all
-    cd ..
-    '';
+      --replace-fail "cp " "cp -p "
+  '';
 
   installPhase = ''
+    runHook preInstall
+
     TARGETFOLDER=$out/opt/brother/Printers/mfcj470dw/cupswrapper/
     PPDFOLDER=$out/share/cups/model/
     FILTERFOLDER=$out/lib/cups/filter/
@@ -44,12 +44,9 @@ stdenv.mkDerivation rec {
     cp PPD/brother_mfcj470dw_printer_en.ppd $PPDFOLDER
 
     ln -s ${mfcj470dwlpr}/lib/cups/filter/brother_lpdwrapper_mfcj470dw $FILTERFOLDER/
-    '';
 
-  cleanPhase = ''
-    cd brcupsconfpt1
-    make clean
-    '';
+    runHook postInstall
+  '';
 
   meta = {
     homepage = "http://www.brother.com/";
diff --git a/pkgs/misc/cups/drivers/mfcj6510dwcupswrapper/default.nix b/pkgs/misc/cups/drivers/mfcj6510dwcupswrapper/default.nix
index 1653ced85c5a..4e6f37112087 100644
--- a/pkgs/misc/cups/drivers/mfcj6510dwcupswrapper/default.nix
+++ b/pkgs/misc/cups/drivers/mfcj6510dwcupswrapper/default.nix
@@ -1,4 +1,4 @@
-{ lib, stdenv, fetchurl, mfcj6510dwlpr, makeWrapper}:
+{ lib, stdenv, fetchurl, mfcj6510dwlpr, makeWrapper, bash }:
 
 stdenv.mkDerivation rec {
   pname = "mfcj6510dw-cupswrapper";
@@ -10,15 +10,15 @@ stdenv.mkDerivation rec {
   };
 
   nativeBuildInputs = [ makeWrapper ];
-  buildInputs = [ mfcj6510dwlpr ];
+  buildInputs = [
+    bash # shebang
+  ];
 
-  buildPhase = ''
-    cd brcupsconfig
-    make all
-    cd ..
-    '';
+  makeFlags = [ "-C" "brcupsconfig" "all" ];
 
   installPhase = ''
+    runHook preInstall
+
     TARGETFOLDER=$out/opt/brother/Printers/mfcj6510dw/cupswrapper
     mkdir -p $TARGETFOLDER
     cp PPD/brother_mfcj6510dw_printer_en.ppd $TARGETFOLDER
@@ -26,7 +26,7 @@ stdenv.mkDerivation rec {
     cp scripts/cupswrappermfcj6510dw $TARGETFOLDER
     sed -i -e '26,304d' $TARGETFOLDER/cupswrappermfcj6510dw
     substituteInPlace $TARGETFOLDER/cupswrappermfcj6510dw \
-      --replace "\$ppd_file_name" "$TARGETFOLDER/brother_mfcj6510dw_printer_en.ppd"
+      --replace-fail "\$ppd_file_name" "$TARGETFOLDER/brother_mfcj6510dw_printer_en.ppd"
 
     CPUSFILTERFOLDER=$out/lib/cups/filter
     mkdir -p $TARGETFOLDER $CPUSFILTERFOLDER
@@ -37,22 +37,19 @@ stdenv.mkDerivation rec {
     #sed -i -e '33,40d' $CPUSFILTERFOLDER/brother_lpdwrapper_mfcj6510dw
     #sed -i -e '34,35d' $CPUSFILTERFOLDER/brother_lpdwrapper_mfcj6510dw
     #substituteInPlace $CPUSFILTERFOLDER/brother_lpdwrapper_mfcj6510dw \
-    #  --replace "/opt/brother/$``{device_model``}/$``{printer_model``}/lpd/filter$``{printer_model``}" \
+    #  --replace-fail "/opt/brother/$``{device_model``}/$``{printer_model``}/lpd/filter$``{printer_model``}" \
     #    "${mfcj6510dwlpr}/opt/brother/Printers/mfcj6510dw/lpd/filtermfcj6510dw" \
-    #  --replace "/opt/brother/Printers/$``{printer_model``}/inf/br$``{printer_model``}rc" \
+    #  --replace-fail "/opt/brother/Printers/$``{printer_model``}/inf/br$``{printer_model``}rc" \
     #    "${mfcj6510dwlpr}/opt/brother/Printers/mfcj6510dw/inf/brmfcj6510dwrc" \
-    #  --replace "/opt/brother/$``{device_model``}/$``{printer_model``}/cupswrapper/brcupsconfpt1" \
+    #  --replace-fail "/opt/brother/$``{device_model``}/$``{printer_model``}/cupswrapper/brcupsconfpt1" \
     #    "$out/opt/brother/Printers/mfcj6510dw/cupswrapper/brcupsconfpt1" \
-    #  --replace "/usr/share/cups/model/Brother/brother_" "$out/opt/brother/Printers/mfcj6510dw/cupswrapper/brother_"
+    #  --replace-fail "/usr/share/cups/model/Brother/brother_" "$out/opt/brother/Printers/mfcj6510dw/cupswrapper/brother_"
     #substituteInPlace $CPUSFILTERFOLDER/brother_lpdwrapper_mfcj6510dw \
-    #  --replace "$``{printer_model``}" "mfcj6510dw" \
-    #  --replace "$``{printer_name``}" "MFCJ6510DW"
-    '';
+    #  --replace-fail "$``{printer_model``}" "mfcj6510dw" \
+    #  --replace-fail "$``{printer_name``}" "MFCJ6510DW"
 
-  cleanPhase = ''
-    cd brcupsconfpt1
-    make clean
-    '';
+    runHook postInstall
+  '';
 
   meta = with lib; {
     homepage = "http://www.brother.com/";
diff --git a/pkgs/os-specific/darwin/hexfiend/default.nix b/pkgs/os-specific/darwin/hexfiend/default.nix
index 29767a1154d5..df81d7882d00 100644
--- a/pkgs/os-specific/darwin/hexfiend/default.nix
+++ b/pkgs/os-specific/darwin/hexfiend/default.nix
@@ -1,12 +1,19 @@
 { stdenv, lib, fetchurl, undmg }:
 
+let
+  urlSuffix = version: if lib.versions.patch == 0 then
+    lib.versions.majorMinor version
+  else
+    version
+  ;
+in
 stdenv.mkDerivation rec {
   pname = "hexfiend";
-  version = "2.16.0";
+  version = "2.17.1";
 
   src = fetchurl {
-    url = "https://github.com/HexFiend/HexFiend/releases/download/v${version}/Hex_Fiend_${lib.versions.majorMinor version}.dmg";
-    sha256 = "sha256-jO57bW5TyuQ0mjKKsSwDoGLp2TZ1d+m159flVGaVrLc=";
+    url = "https://github.com/HexFiend/HexFiend/releases/download/v${version}/Hex_Fiend_${urlSuffix version}.dmg";
+    hash = "sha256-QpGmpxDpdS+sJtsNtp0VSAd9WJXaZiKTH4yDsDK8FSk=";
   };
 
   sourceRoot = "Hex Fiend.app";
diff --git a/pkgs/os-specific/linux/openvswitch/default.nix b/pkgs/os-specific/linux/openvswitch/default.nix
index 89149027d3b8..0ea5b6391605 100644
--- a/pkgs/os-specific/linux/openvswitch/default.nix
+++ b/pkgs/os-specific/linux/openvswitch/default.nix
@@ -1,4 +1,4 @@
 import ./generic.nix {
-  version = "3.2.2";
-  hash = "sha256-BCesNAYE3RyxfBAzK2/6+PcV1W+1ZEZQKVSLSq/pWC8=";
+  version = "3.3.0";
+  hash = "sha256-Gvy4H7lHwL6IWGaZXWwIjmHfQ1YRFXiSBqKzP3vBsF8=";
 }
diff --git a/pkgs/os-specific/linux/uhk-agent/default.nix b/pkgs/os-specific/linux/uhk-agent/default.nix
index 931d9edc8c37..28afb1ef4d20 100644
--- a/pkgs/os-specific/linux/uhk-agent/default.nix
+++ b/pkgs/os-specific/linux/uhk-agent/default.nix
@@ -12,12 +12,12 @@
 
 let
   pname = "uhk-agent";
-  version = "3.3.0";
+  version = "4.0.0";
 
   src = fetchurl {
     url = "https://github.com/UltimateHackingKeyboard/agent/releases/download/v${version}/UHK.Agent-${version}-linux-x86_64.AppImage";
     name = "${pname}-${version}.AppImage";
-    sha256 = "sha256-jkIuXKTm8imq1U7kbQhK7LkEeI2qz0Gu7rWuDn6Ex+c=";
+    sha256 = "sha256-Vf01OANE5mow7ogmzPg0cJgw0fA02DF5SqZ49n9xa5U=";
   };
 
   appimageContents = appimageTools.extract {
diff --git a/pkgs/pkgs-lib/formats.nix b/pkgs/pkgs-lib/formats.nix
index c78bd82e01ef..1b72270b43ca 100644
--- a/pkgs/pkgs-lib/formats.nix
+++ b/pkgs/pkgs-lib/formats.nix
@@ -95,29 +95,13 @@ rec {
 
   };
 
-  ini = {
-    # Represents lists as duplicate keys
-    listsAsDuplicateKeys ? false,
-    # Alternative to listsAsDuplicateKeys, converts list to non-list
-    # listToValue :: [IniAtom] -> IniAtom
-    listToValue ? null,
-    ...
-    }@args:
-    assert !listsAsDuplicateKeys || listToValue == null;
-    {
-
-    type = with lib.types; let
-
-      singleIniAtom = nullOr (oneOf [
-        bool
-        int
-        float
-        str
-      ]) // {
+  # the ini formats share a lot of code
+  inherit (
+    let
+      singleIniAtom = with lib.types; nullOr (oneOf [ bool int float str ]) // {
         description = "INI atom (null, bool, int, float or string)";
       };
-
-      iniAtom =
+      iniAtom = with lib.types; { listsAsDuplicateKeys, listToValue }:
         if listsAsDuplicateKeys then
           coercedTo singleIniAtom lib.singleton (listOf singleIniAtom) // {
             description = singleIniAtom.description + " or a list of them for duplicate keys";
@@ -128,21 +112,79 @@ rec {
           }
         else
           singleIniAtom;
+      iniSection = with lib.types; { listsAsDuplicateKeys, listToValue }@args:
+        attrsOf (iniAtom args) // {
+          description = "section of an INI file (attrs of " + (iniAtom args).description + ")";
+        };
 
-    in attrsOf (attrsOf iniAtom);
+      maybeToList = listToValue: if listToValue != null then lib.mapAttrs (key: val: if lib.isList val then listToValue val else val) else lib.id;
+    in {
+      ini = {
+        # Represents lists as duplicate keys
+        listsAsDuplicateKeys ? false,
+        # Alternative to listsAsDuplicateKeys, converts list to non-list
+        # listToValue :: [IniAtom] -> IniAtom
+        listToValue ? null,
+        ...
+        }@args:
+        assert listsAsDuplicateKeys -> listToValue == null;
+        {
 
-    generate = name: value:
-      let
-        transformedValue =
-          if listToValue != null
-          then
-            lib.mapAttrs (section: lib.mapAttrs (key: val:
-              if lib.isList val then listToValue val else val
-            )) value
-          else value;
-      in pkgs.writeText name (lib.generators.toINI (removeAttrs args ["listToValue"]) transformedValue);
+        type = lib.types.attrsOf (iniSection { listsAsDuplicateKeys = listsAsDuplicateKeys; listToValue = listToValue; });
 
-  };
+        generate = name: value:
+          lib.pipe value
+          [
+            (lib.mapAttrs (_: maybeToList listToValue))
+            (lib.generators.toINI (removeAttrs args ["listToValue"]))
+            (pkgs.writeText name)
+          ];
+      };
+
+      iniWithGlobalSection = {
+        # Represents lists as duplicate keys
+        listsAsDuplicateKeys ? false,
+        # Alternative to listsAsDuplicateKeys, converts list to non-list
+        # listToValue :: [IniAtom] -> IniAtom
+        listToValue ? null,
+        ...
+        }@args:
+        assert listsAsDuplicateKeys -> listToValue == null;
+        {
+          type = lib.types.submodule {
+            options = {
+              sections = lib.mkOption rec {
+                type = lib.types.attrsOf (iniSection { listsAsDuplicateKeys = listsAsDuplicateKeys; listToValue = listToValue; });
+                default = {};
+                description = type.description;
+              };
+              globalSection = lib.mkOption rec {
+                type = iniSection { listsAsDuplicateKeys = listsAsDuplicateKeys; listToValue = listToValue; };
+                default = {};
+                description = "global " + type.description;
+              };
+            };
+          };
+          generate = name: { sections ? {}, globalSection ? {}, ... }:
+            pkgs.writeText name (lib.generators.toINIWithGlobalSection (removeAttrs args ["listToValue"])
+            {
+              globalSection = maybeToList listToValue globalSection;
+              sections = lib.mapAttrs (_: maybeToList listToValue) sections;
+            });
+        };
+
+      gitIni = { listsAsDuplicateKeys ? false, ... }@args: {
+        type = let
+          atom = iniAtom {
+            listsAsDuplicateKeys = listsAsDuplicateKeys;
+            listToValue = null;
+          };
+        in with lib.types; attrsOf (attrsOf (either atom (attrsOf atom)));
+
+        generate = name: value: pkgs.writeText name (lib.generators.toGitINI value);
+      };
+
+    }) ini iniWithGlobalSection gitIni;
 
   # As defined by systemd.syntax(7)
   #
@@ -166,7 +208,7 @@ rec {
     listToValue ? null,
     ...
     }@args:
-    assert !listsAsDuplicateKeys || listToValue == null;
+    assert listsAsDuplicateKeys -> listToValue == null;
     {
 
     type = with lib.types; let
@@ -207,17 +249,6 @@ rec {
 
   };
 
-  gitIni = { listsAsDuplicateKeys ? false, ... }@args: {
-
-    type = with lib.types; let
-
-      iniAtom = (ini args).type/*attrsOf*/.functor.wrapped/*attrsOf*/.functor.wrapped;
-
-    in attrsOf (attrsOf (either iniAtom (attrsOf iniAtom)));
-
-    generate = name: value: pkgs.writeText name (lib.generators.toGitINI value);
-  };
-
   toml = {}: json {} // {
     type = with lib.types; let
       valueType = oneOf [
diff --git a/pkgs/pkgs-lib/tests/formats.nix b/pkgs/pkgs-lib/tests/formats.nix
index b7e100dd73bc..3243f4058e68 100644
--- a/pkgs/pkgs-lib/tests/formats.nix
+++ b/pkgs/pkgs-lib/tests/formats.nix
@@ -1,24 +1,21 @@
 { pkgs }:
 let
   inherit (pkgs) lib formats;
-in
-with lib;
-let
 
-  evalFormat = format: args: def:
-    let
-      formatSet = format args;
-      config = formatSet.type.merge [] (imap1 (n: def: {
-        # We check the input values, so that
-        #  - we don't write nonsensical tests that will impede progress
-        #  - the test author has a slightly more realistic view of the
-        #    final format during development.
-        value = lib.throwIfNot (formatSet.type.check def) (builtins.trace def "definition does not pass the type's check function") def;
-        file = "def${toString n}";
-      }) [ def ]);
-    in formatSet.generate "test-format-file" config;
-
-  runBuildTest = name: { drv, expected }: pkgs.runCommand name {
+  # merging allows us to add metadata to the input
+  # this makes error messages more readable during development
+  mergeInput = name: format: input:
+    format.type.merge [] [
+      {
+        # explicitly throw here to trigger the code path that prints the error message for users
+        value = lib.throwIfNot (format.type.check input) (builtins.trace input "definition does not pass the type's check function") input;
+        # inject the name
+        file = "format-test-${name}";
+      }
+    ];
+
+  # run a diff between expected and real output
+  runDiff = name: drv: expected: pkgs.runCommand name {
     passAsFile = ["expected"];
     inherit expected drv;
   } ''
@@ -31,12 +28,66 @@ let
     fi
   '';
 
-  runBuildTests = tests: pkgs.linkFarm "nixpkgs-pkgs-lib-format-tests" (mapAttrsToList (name: value: { inherit name; path = runBuildTest name value; }) (filterAttrs (name: value: value != null) tests));
+  # use this to check for proper serialization
+  # in practice you do not have to supply the name parameter as this one will be added by runBuildTests
+  shouldPass = { format, input, expected }: name: {
+    name = "pass-${name}";
+    path = runDiff "test-format-${name}" (format.generate "test-format-${name}" (mergeInput name format input)) expected;
+  };
+
+  # use this function to assert that a type check must fail
+  # in practice you do not have to supply the name parameter as this one will be added by runBuildTests
+  # note that as per 352e7d330a26 and 352e7d330a26 the type checking of attrsets and lists are not strict
+  # this means that the code below needs to properly merge the module type definition and also evaluate the (lazy) return value
+  shouldFail = { format, input }: name:
+    let
+      # trigger a deep type check using the module system
+      typeCheck = lib.modules.mergeDefinitions
+        [ "tests" name ]
+        format.type
+        [
+          {
+            file = "format-test-${name}";
+            value = input;
+          }
+        ];
+      # actually use the return value to trigger the evaluation
+      eval = builtins.tryEval (typeCheck.mergedValue == input);
+      # the check failing is what we want, so don't do anything here
+      typeFails = pkgs.runCommand "test-format-${name}" {} "touch $out";
+      # bail with some verbose information in case the type check passes
+      typeSucceeds = pkgs.runCommand "test-format-${name}" {
+          passAsFile = [ "inputText" ];
+          testName = name;
+          # this will fail if the input contains functions as values
+          # however that should get caught by the type check already
+          inputText = builtins.toJSON input;
+        }
+        ''
+          echo "Type check $testName passed when it shouldn't."
+          echo "The following data was used as input:"
+          echo
+          cat "$inputTextPath"
+          exit 1
+        '';
+    in {
+      name = "fail-${name}";
+      path = if eval.success then typeSucceeds else typeFails;
+    };
+
+  # this function creates a linkFarm for all the tests below such that the results are easily visible in the filesystem after a build
+  # the parameters are an attrset of name: test pairs where the name is automatically passed to the test
+  # the test therefore is an invocation of ShouldPass or shouldFail with the attrset parameters but *not* the name (which this adds for convenience)
+  runBuildTests = (lib.flip lib.pipe) [
+    (lib.mapAttrsToList (name: value: value name))
+    (pkgs.linkFarm "nixpkgs-pkgs-lib-format-tests")
+  ];
 
 in runBuildTests {
 
-  testJsonAtoms = {
-    drv = evalFormat formats.json {} {
+  jsonAtoms = shouldPass {
+    format = formats.json {};
+    input = {
       null = null;
       false = false;
       true = true;
@@ -67,8 +118,9 @@ in runBuildTests {
     '';
   };
 
-  testYamlAtoms = {
-    drv = evalFormat formats.yaml {} {
+  yamlAtoms = shouldPass {
+    format = formats.yaml {};
+    input = {
       null = null;
       false = false;
       true = true;
@@ -93,8 +145,9 @@ in runBuildTests {
     '';
   };
 
-  testIniAtoms = {
-    drv = evalFormat formats.ini {} {
+  iniAtoms = shouldPass {
+    format = formats.ini {};
+    input = {
       foo = {
         bool = true;
         int = 10;
@@ -111,8 +164,29 @@ in runBuildTests {
     '';
   };
 
-  testIniDuplicateKeys = {
-    drv = evalFormat formats.ini { listsAsDuplicateKeys = true; } {
+  iniInvalidAtom = shouldFail {
+    format = formats.ini {};
+    input = {
+      foo = {
+        function = _: 1;
+      };
+    };
+  };
+
+  iniDuplicateKeysWithoutList = shouldFail {
+    format = formats.ini {};
+    input = {
+      foo = {
+        bar = [ null true "test" 1.2 10 ];
+        baz = false;
+        qux = "qux";
+      };
+    };
+  };
+
+  iniDuplicateKeys = shouldPass {
+    format = formats.ini { listsAsDuplicateKeys = true; };
+    input = {
       foo = {
         bar = [ null true "test" 1.2 10 ];
         baz = false;
@@ -131,8 +205,9 @@ in runBuildTests {
     '';
   };
 
-  testIniListToValue = {
-    drv = evalFormat formats.ini { listToValue = concatMapStringsSep ", " (generators.mkValueStringDefault {}); } {
+  iniListToValue = shouldPass {
+    format = formats.ini { listToValue = lib.concatMapStringsSep ", " (lib.generators.mkValueStringDefault {}); };
+    input = {
       foo = {
         bar = [ null true "test" 1.2 10 ];
         baz = false;
@@ -147,8 +222,104 @@ in runBuildTests {
     '';
   };
 
-  testKeyValueAtoms = {
-    drv = evalFormat formats.keyValue {} {
+  iniWithGlobalNoSections = shouldPass {
+    format = formats.iniWithGlobalSection {};
+    input = {};
+    expected = "";
+  };
+
+  iniWithGlobalOnlySections = shouldPass {
+    format = formats.iniWithGlobalSection {};
+    input = {
+      sections = {
+        foo = {
+          bar = "baz";
+        };
+      };
+    };
+    expected = ''
+      [foo]
+      bar=baz
+    '';
+  };
+
+  iniWithGlobalOnlyGlobal = shouldPass {
+    format = formats.iniWithGlobalSection {};
+    input = {
+      globalSection = {
+        bar = "baz";
+      };
+    };
+    expected = ''
+      bar=baz
+
+    '';
+  };
+
+  iniWithGlobalWrongSections = shouldFail {
+    format = formats.iniWithGlobalSection {};
+    input = {
+      foo = {};
+    };
+  };
+
+  iniWithGlobalEverything = shouldPass {
+    format = formats.iniWithGlobalSection {};
+    input = {
+      globalSection = {
+        bar = true;
+      };
+      sections = {
+        foo = {
+          bool = true;
+          int = 10;
+          float = 3.141;
+          str = "string";
+        };
+      };
+    };
+    expected = ''
+      bar=true
+
+      [foo]
+      bool=true
+      float=3.141000
+      int=10
+      str=string
+    '';
+  };
+
+  iniWithGlobalListToValue = shouldPass {
+    format = formats.iniWithGlobalSection { listToValue = lib.concatMapStringsSep ", " (lib.generators.mkValueStringDefault {}); };
+    input = {
+      globalSection = {
+        bar = [ null true "test" 1.2 10 ];
+        baz = false;
+        qux = "qux";
+      };
+      sections = {
+        foo = {
+          bar = [ null true "test" 1.2 10 ];
+          baz = false;
+          qux = "qux";
+        };
+      };
+    };
+    expected = ''
+      bar=null, true, test, 1.200000, 10
+      baz=false
+      qux=qux
+
+      [foo]
+      bar=null, true, test, 1.200000, 10
+      baz=false
+      qux=qux
+    '';
+  };
+
+  keyValueAtoms = shouldPass {
+    format = formats.keyValue {};
+    input = {
       bool = true;
       int = 10;
       float = 3.141;
@@ -162,8 +333,9 @@ in runBuildTests {
     '';
   };
 
-  testKeyValueDuplicateKeys = {
-    drv = evalFormat formats.keyValue { listsAsDuplicateKeys = true; } {
+  keyValueDuplicateKeys = shouldPass {
+    format = formats.keyValue { listsAsDuplicateKeys = true; };
+    input = {
       bar = [ null true "test" 1.2 10 ];
       baz = false;
       qux = "qux";
@@ -179,8 +351,9 @@ in runBuildTests {
     '';
   };
 
-  testKeyValueListToValue = {
-    drv = evalFormat formats.keyValue { listToValue = concatMapStringsSep ", " (generators.mkValueStringDefault {}); } {
+  keyValueListToValue = shouldPass {
+    format = formats.keyValue { listToValue = lib.concatMapStringsSep ", " (lib.generators.mkValueStringDefault {}); };
+    input = {
       bar = [ null true "test" 1.2 10 ];
       baz = false;
       qux = "qux";
@@ -192,8 +365,9 @@ in runBuildTests {
     '';
   };
 
-  testTomlAtoms = {
-    drv = evalFormat formats.toml {} {
+  tomlAtoms = shouldPass {
+    format = formats.toml {};
+    input = {
       false = false;
       true = true;
       int = 10;
@@ -222,8 +396,9 @@ in runBuildTests {
   #   1. testing type coercions
   #   2. providing a more readable example test
   # Whereas java-properties/default.nix tests the low level escaping, etc.
-  testJavaProperties = {
-    drv = evalFormat formats.javaProperties {} {
+  javaProperties = shouldPass {
+    format = formats.javaProperties {};
+    input = {
       floaty = 3.1415;
       tautologies = true;
       contradictions = false;
diff --git a/pkgs/servers/home-assistant/component-packages.nix b/pkgs/servers/home-assistant/component-packages.nix
index 42002c5e75a1..6cc484b64a59 100644
--- a/pkgs/servers/home-assistant/component-packages.nix
+++ b/pkgs/servers/home-assistant/component-packages.nix
@@ -2,7 +2,7 @@
 # Do not edit!
 
 {
-  version = "2024.2.4";
+  version = "2024.2.5";
   components = {
     "3_day_blinds" = ps: with ps; [
     ];
diff --git a/pkgs/servers/home-assistant/default.nix b/pkgs/servers/home-assistant/default.nix
index 8f820485682b..1d0809edf320 100644
--- a/pkgs/servers/home-assistant/default.nix
+++ b/pkgs/servers/home-assistant/default.nix
@@ -31,6 +31,15 @@ let
     # Override the version of some packages pinned in Home Assistant's setup.py and requirements_all.txt
 
     (self: super: {
+      aemet-opendata = super.aemet-opendata.overridePythonAttrs (oldAttrs: rec {
+        version = "0.4.7";
+        src = fetchFromGitHub {
+          inherit (oldAttrs.src) owner repo;
+          rev = "refs/tags/${version}";
+          hash = "sha256-kmU2HtNyYhfwWQv6asOtDpLZ6+O+eEICzBNLxUhAwaY=";
+        };
+      });
+
       aiogithubapi = super.aiogithubapi.overridePythonAttrs (oldAttrs: rec {
         version = "22.10.1";
         src = fetchFromGitHub {
@@ -453,7 +462,7 @@ let
   extraBuildInputs = extraPackages python.pkgs;
 
   # Don't forget to run parse-requirements.py after updating
-  hassVersion = "2024.2.4";
+  hassVersion = "2024.2.5";
 
 in python.pkgs.buildPythonApplication rec {
   pname = "homeassistant";
@@ -471,13 +480,13 @@ in python.pkgs.buildPythonApplication rec {
     owner = "home-assistant";
     repo = "core";
     rev = "refs/tags/${version}";
-    hash = "sha256-k1Rfx8TsMBbLFfaY6FAn5ebyZlHbxg0k/HYXVRIkNMU=";
+    hash = "sha256-RRoxWNcubpxzmExzrifRKhgNm0IM5OuNZYHz6tp9zm8=";
   };
 
   # Secondary source is pypi sdist for translations
   sdist = fetchPypi {
     inherit pname version;
-    hash = "sha256-rkD1rZz4sYV1L78c2gc4g/cGoxJRYqK41SUOskeoqYg=";
+    hash = "sha256-qhUfOMSM4FKUQ9LdeoHLLrVm5cWFrlTER02s+tLVAMU=";
   };
 
   nativeBuildInputs = with python.pkgs; [
diff --git a/pkgs/servers/home-assistant/stubs.nix b/pkgs/servers/home-assistant/stubs.nix
index 1a1428df5f1b..602e04aacdbc 100644
--- a/pkgs/servers/home-assistant/stubs.nix
+++ b/pkgs/servers/home-assistant/stubs.nix
@@ -8,7 +8,7 @@
 
 buildPythonPackage rec {
   pname = "homeassistant-stubs";
-  version = "2024.2.4";
+  version = "2024.2.5";
   format = "pyproject";
 
   disabled = python.version != home-assistant.python.version;
@@ -17,7 +17,7 @@ buildPythonPackage rec {
     owner = "KapJI";
     repo = "homeassistant-stubs";
     rev = "refs/tags/${version}";
-    hash = "sha256-cKVVP69IIY/KPnEsM3ann0oZ2GUNN+2Ee8EnqjcFTDk=";
+    hash = "sha256-izXAm9lK5mhjc8vVTRflDdxYQesqnkBJtFonOHoht9c=";
   };
 
   nativeBuildInputs = [
diff --git a/pkgs/servers/mail/rspamd/default.nix b/pkgs/servers/mail/rspamd/default.nix
index 4cd063df9df2..2675ab7cbdd1 100644
--- a/pkgs/servers/mail/rspamd/default.nix
+++ b/pkgs/servers/mail/rspamd/default.nix
@@ -27,13 +27,13 @@ assert withHyperscan -> stdenv.isx86_64;
 
 stdenv.mkDerivation rec {
   pname = "rspamd";
-  version = "3.8.3";
+  version = "3.8.4";
 
   src = fetchFromGitHub {
     owner = "rspamd";
     repo = "rspamd";
     rev = version;
-    hash = "sha256-LX37HE4xr3tJqAXBDbi2O8N9tt8DazslIfmqG9hNiKw=";
+    hash = "sha256-3skF+aQv8Y3ATujV+WH4DxwyQ2hXR6CDZz77CkaRso0=";
   };
 
   hardeningEnable = [ "pie" ];
diff --git a/pkgs/servers/monitoring/prometheus/alertmanager.nix b/pkgs/servers/monitoring/prometheus/alertmanager.nix
index 3d15b33b48eb..ba1c35ee294d 100644
--- a/pkgs/servers/monitoring/prometheus/alertmanager.nix
+++ b/pkgs/servers/monitoring/prometheus/alertmanager.nix
@@ -7,17 +7,17 @@
 
 buildGoModule rec {
   pname = "alertmanager";
-  version = "0.26.0";
+  version = "0.27.0";
   rev = "v${version}";
 
   src = fetchFromGitHub {
     inherit rev;
     owner = "prometheus";
     repo = "alertmanager";
-    hash = "sha256-DCVxXSgoa4PrW4qBBWa1SOPN1GwcJFERz7+itsCdtGI=";
+    hash = "sha256-soE2D/PLesV1+Kif9myB54a9zIFIa94i0BrmywJPTbI=";
   };
 
-  vendorHash = "sha256-GCcoT7Db0bQf+IGUP54GdxRmHCp1k2261B3T2htmbjk=";
+  vendorHash = "sha256-zkHIdEdAy44iV2F929NB3ISuUbxdecaeZcsNQQGd06E=";
 
   subPackages = [ "cmd/alertmanager" "cmd/amtool" ];
 
diff --git a/pkgs/servers/sql/postgresql/ext/pgroonga.nix b/pkgs/servers/sql/postgresql/ext/pgroonga.nix
index d4d316dd6547..28303612fef3 100644
--- a/pkgs/servers/sql/postgresql/ext/pgroonga.nix
+++ b/pkgs/servers/sql/postgresql/ext/pgroonga.nix
@@ -2,11 +2,11 @@
 
 stdenv.mkDerivation rec {
   pname = "pgroonga";
-  version = "3.1.7";
+  version = "3.1.8";
 
   src = fetchurl {
     url = "https://packages.groonga.org/source/${pname}/${pname}-${version}.tar.gz";
-    hash = "sha256-13hRe7nooWvx0VhQ1fvZs6ytu30AwJFBwDGjAawDRBI=";
+    hash = "sha256-Wjh0NJK6IfcI30R7HKCsB87/lxXZYEqiMD9t2nldCW4=";
   };
 
   nativeBuildInputs = [ pkg-config ];
diff --git a/pkgs/shells/nushell/default.nix b/pkgs/shells/nushell/default.nix
index 8f215945dd41..33089063e68a 100644
--- a/pkgs/shells/nushell/default.nix
+++ b/pkgs/shells/nushell/default.nix
@@ -13,7 +13,9 @@
 , Security
 , nghttp2
 , libgit2
-, doCheck ? true
+# string interpolation dependends on a date that is erroring out
+# this will be fixed in releases after 0.90.1
+, doCheck ? false
 , withDefaultFeatures ? true
 , additionalFeatures ? (p: p)
 , testers
@@ -22,7 +24,7 @@
 }:
 
 let
-  version = "0.89.0";
+  version = "0.90.1";
 in
 
 rustPlatform.buildRustPackage {
@@ -33,10 +35,10 @@ rustPlatform.buildRustPackage {
     owner = "nushell";
     repo = "nushell";
     rev = version;
-    hash = "sha256-sBS24FOdEhb+MPu33lpFxLd2/r2AvLUXka+7W3lUIvo=";
+    hash = "sha256-MODd2BT2g6g5H6/1EG5OjIoYm18yBSvYTR83RuYDMec=";
   };
 
-  cargoHash = "sha256-B1Sd4dLacIIVNQDnBFw74nX+LaQnzYwCKXv3oJIbu4M=";
+  cargoHash = "sha256-35KPY5t4aozHIcukmeS00g6tzZA9ZsS/44u9vpZ3oGQ=";
 
   nativeBuildInputs = [ pkg-config ]
     ++ lib.optionals (withDefaultFeatures && stdenv.isLinux) [ python3 ]
diff --git a/pkgs/shells/nushell/plugins/formats.nix b/pkgs/shells/nushell/plugins/formats.nix
index 75927a606ef9..1e3a3a5b2a03 100644
--- a/pkgs/shells/nushell/plugins/formats.nix
+++ b/pkgs/shells/nushell/plugins/formats.nix
@@ -12,7 +12,7 @@
 rustPlatform.buildRustPackage rec {
   pname = "nushell_plugin_formats";
   inherit (nushell) version src;
-  cargoHash = "sha256-81U7Ul6LPubTshxW2/c+Pmz8UolmM42sFEt2igmDgGY=";
+  cargoHash = "sha256-lMxI+tw5B6Q/ZXW1ANl+Oi/x37ds2IEuOkdPIV1zXLA=";
 
   env = lib.optionalAttrs stdenv.cc.isClang {
     LIBCLANG_PATH = "${libclang.lib}/lib";
diff --git a/pkgs/shells/nushell/plugins/gstat.nix b/pkgs/shells/nushell/plugins/gstat.nix
index 1957799a9ce4..20edc7fd7b22 100644
--- a/pkgs/shells/nushell/plugins/gstat.nix
+++ b/pkgs/shells/nushell/plugins/gstat.nix
@@ -12,7 +12,7 @@
 rustPlatform.buildRustPackage rec {
   pname = "nushell_plugin_gstat";
   inherit (nushell) version src;
-  cargoHash = "sha256-YUr//URKoN99Pc5tJx9eGopKqy4Yu83jPBhLu5UYgiY=";
+  cargoHash = "sha256-/viATLt2CixUCUa45YWo4fod2/iI/qvqB/BP8L8qrvY=";
 
   env = lib.optionalAttrs stdenv.cc.isClang {
     LIBCLANG_PATH = "${libclang.lib}/lib";
diff --git a/pkgs/shells/nushell/plugins/query.nix b/pkgs/shells/nushell/plugins/query.nix
index c65f6544a235..dedd7944cdb8 100644
--- a/pkgs/shells/nushell/plugins/query.nix
+++ b/pkgs/shells/nushell/plugins/query.nix
@@ -11,7 +11,7 @@
 rustPlatform.buildRustPackage {
   pname = "nushell_plugin_query";
   inherit (nushell) version src;
-  cargoHash = "sha256-IAMfd76+Sx01d4axn3qcLvXZW6nxu0fjy9CvupUTHBM=";
+  cargoHash = "sha256-pDsjKpb4c9nnYA81sQm4RCYhIoKJe+vcV1hs8KCSP9Q=";
 
   env = lib.optionalAttrs stdenv.cc.isClang {
     LIBCLANG_PATH = "${libclang.lib}/lib";
diff --git a/pkgs/test/default.nix b/pkgs/test/default.nix
index f66b05b9f6f1..9868bbc6033b 100644
--- a/pkgs/test/default.nix
+++ b/pkgs/test/default.nix
@@ -177,4 +177,6 @@ with pkgs;
   auto-patchelf-hook = callPackage ./auto-patchelf-hook { };
 
   systemd = callPackage ./systemd { };
+
+  substitute = recurseIntoAttrs (callPackage ./substitute { });
 }
diff --git a/pkgs/test/substitute/default.nix b/pkgs/test/substitute/default.nix
new file mode 100644
index 000000000000..3ff346b14658
--- /dev/null
+++ b/pkgs/test/substitute/default.nix
@@ -0,0 +1,96 @@
+{ substitute, testers, runCommand }:
+let
+  # Ofborg doesn't allow any traces on stderr,
+  # so mock `lib` to not trace warnings,
+  # because substitute gives a deprecation warning
+  substituteSilent = substitute.override (prevArgs: {
+    lib = prevArgs.lib.extend (finalLib: prevLib: {
+      trivial = prevLib.trivial // {
+        warn = msg: value: value;
+      };
+    });
+  });
+in {
+
+  substitutions = testers.testEqualContents {
+    assertion = "substitutions-spaces";
+    actual = substitute {
+      src = builtins.toFile "source" ''
+        Hello world!
+      '';
+      substitutions = [
+        "--replace-fail"
+        "Hello world!"
+        "Yo peter!"
+      ];
+    };
+    expected = builtins.toFile "expected" ''
+      Yo peter!
+    '';
+  };
+
+  legacySingleReplace = testers.testEqualContents {
+    assertion = "substitute-single-replace";
+    actual = substituteSilent {
+      src = builtins.toFile "source" ''
+        Hello world!
+      '';
+      replacements = [
+        "--replace-fail" "world" "paul"
+      ];
+    };
+    expected = builtins.toFile "expected" ''
+      Hello paul!
+    '';
+  };
+
+  legacyString = testers.testEqualContents {
+    assertion = "substitute-string";
+    actual = substituteSilent {
+      src = builtins.toFile "source" ''
+        Hello world!
+      '';
+      # Not great that this works at all, but is supported
+      replacements = "--replace-fail world string";
+    };
+    expected = builtins.toFile "expected" ''
+      Hello string!
+    '';
+  };
+
+  legacySingleArg = testers.testEqualContents {
+    assertion = "substitute-single-arg";
+    actual = substituteSilent {
+      src = builtins.toFile "source" ''
+        Hello world!
+      '';
+      # Not great that this works at all, but is supported
+      replacements = [
+        "--replace-fail world list"
+      ];
+    };
+    expected = builtins.toFile "expected" ''
+      Hello list!
+    '';
+  };
+
+  legacyVar = testers.testEqualContents {
+    assertion = "substitute-var";
+    actual = substituteSilent {
+      src = builtins.toFile "source" ''
+        @greeting@ @name@!
+      '';
+      # Not great that this works at all, but is supported
+      replacements = [
+        "--subst-var name"
+        "--subst-var-by greeting Yo"
+      ];
+      name = "peter";
+    };
+    expected = builtins.toFile "expected" ''
+      Yo peter!
+    '';
+  };
+
+
+}
diff --git a/pkgs/tools/admin/lxd/wrapper.nix b/pkgs/tools/admin/lxd/wrapper.nix
index b197cd496b1a..9edfefd57ccd 100644
--- a/pkgs/tools/admin/lxd/wrapper.nix
+++ b/pkgs/tools/admin/lxd/wrapper.nix
@@ -76,20 +76,11 @@ let
 
   ovmf-2mb = OVMF.override {
     secureBoot = true;
-    csmSupport = false;
     fdSize2MB = true;
   };
 
   ovmf-4mb = OVMF.override {
     secureBoot = true;
-    csmSupport = false;
-    fdSize4MB = true;
-  };
-
-  ovmf-4mb-csm = OVMF.override {
-    secureBoot = true;
-    csmSupport = false;
-    fdSize2MB = false;
     fdSize4MB = true;
   };
 
@@ -99,13 +90,11 @@ let
   # also found in /snap/lxd/current/share/qemu/ on a snap install
   ovmf = linkFarm "lxd-ovmf" [
     { name = "OVMF_CODE.2MB.fd"; path = "${ovmf-2mb.fd}/FV/${ovmf-prefix}_CODE.fd"; }
-    { name = "OVMF_CODE.4MB.CSM.fd"; path = "${ovmf-4mb-csm.fd}/FV/${ovmf-prefix}_CODE.fd"; }
     { name = "OVMF_CODE.4MB.fd"; path = "${ovmf-4mb.fd}/FV/${ovmf-prefix}_CODE.fd"; }
     { name = "OVMF_CODE.fd"; path = "${ovmf-2mb.fd}/FV/${ovmf-prefix}_CODE.fd"; }
 
     { name = "OVMF_VARS.2MB.fd"; path = "${ovmf-2mb.fd}/FV/${ovmf-prefix}_VARS.fd"; }
     { name = "OVMF_VARS.2MB.ms.fd"; path = "${ovmf-2mb.fd}/FV/${ovmf-prefix}_VARS.fd"; }
-    { name = "OVMF_VARS.4MB.CSM.fd"; path = "${ovmf-4mb-csm.fd}/FV/${ovmf-prefix}_VARS.fd"; }
     { name = "OVMF_VARS.4MB.fd"; path = "${ovmf-4mb.fd}/FV/${ovmf-prefix}_VARS.fd"; }
     { name = "OVMF_VARS.4MB.ms.fd"; path = "${ovmf-4mb.fd}/FV/${ovmf-prefix}_VARS.fd"; }
     { name = "OVMF_VARS.fd"; path = "${ovmf-2mb.fd}/FV/${ovmf-prefix}_VARS.fd"; }
diff --git a/pkgs/tools/graphics/asymptote/default.nix b/pkgs/tools/graphics/asymptote/default.nix
index a5968425f5d8..30681663a7ce 100644
--- a/pkgs/tools/graphics/asymptote/default.nix
+++ b/pkgs/tools/graphics/asymptote/default.nix
@@ -9,14 +9,14 @@
 }:
 
 stdenv.mkDerivation rec {
-  version = "2.86";
+  version = "2.87";
   pname = "asymptote";
 
   src = fetchFromGitHub {
     owner = "vectorgraphics";
     repo = pname;
     rev = version;
-    hash = "sha256-Bk8/WIQTfrbOo9b2hw580vJwiK6P1OBV5HMqMH+LkuE=";
+    hash = "sha256-xzRZ7NOWeu+uC5WeTxwh5MFm7psXMhxrxucT4PVtRxM=";
   };
 
   nativeBuildInputs = [
diff --git a/pkgs/tools/misc/audible-cli/default.nix b/pkgs/tools/misc/audible-cli/default.nix
index 297917b6a92a..4d0134e8eaee 100644
--- a/pkgs/tools/misc/audible-cli/default.nix
+++ b/pkgs/tools/misc/audible-cli/default.nix
@@ -27,6 +27,7 @@ python3Packages.buildPythonApplication rec {
     packaging
     pillow
     questionary
+    setuptools
     tabulate
     toml
     tqdm
diff --git a/pkgs/tools/misc/ksnip/default.nix b/pkgs/tools/misc/ksnip/default.nix
index 60ba06a29930..8e5cc40740cc 100644
--- a/pkgs/tools/misc/ksnip/default.nix
+++ b/pkgs/tools/misc/ksnip/default.nix
@@ -3,6 +3,7 @@
 , cmake
 , extra-cmake-modules
 , fetchFromGitHub
+, fetchpatch
 , kcolorpicker
 , kimageannotator
 , wrapQtAppsHook
@@ -22,6 +23,18 @@ stdenv.mkDerivation rec {
     sha256 = "sha256-n7YwDXd73hyrzb6L8utZFuHh9HnjVtkU6CC4jfWPj/I=";
   };
 
+  patches = [
+    # Fix build with latest kImageAnnotator
+    (fetchpatch {
+      url = "https://github.com/ksnip/ksnip/commit/76f4b381971eead6ff31b8bf3bb64bb5717469c3.patch";
+      hash = "sha256-JWoI974qDNZIzr/8oksI8m6g3XNWEaQRGsqSfvQrmao=";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace src/CMakeLists.txt --replace-fail "kColorPicker::kColorPicker" "kColorPicker::kColorPicker-Qt5"
+  '';
+
   nativeBuildInputs = [
     cmake
     extra-cmake-modules
diff --git a/pkgs/tools/misc/mise/default.nix b/pkgs/tools/misc/mise/default.nix
index 4afa360df25b..959be1430da5 100644
--- a/pkgs/tools/misc/mise/default.nix
+++ b/pkgs/tools/misc/mise/default.nix
@@ -17,16 +17,16 @@
 
 rustPlatform.buildRustPackage rec {
   pname = "mise";
-  version = "2024.2.18";
+  version = "2024.2.19";
 
   src = fetchFromGitHub {
     owner = "jdx";
     repo = "mise";
     rev = "v${version}";
-    hash = "sha256-YidcjhPgaDODtz0EpktIsRmnRMryvGJKQ2vx/MEQG9s=";
+    hash = "sha256-SDGXSjCDdtjKn474s2SQm9YDHofMOmHuodLS2iu10Co=";
   };
 
-  cargoHash = "sha256-QXtjM2yGOCf1nGOvrJCcLlI+MAGiu6bfsc/hSENNd1k=";
+  cargoHash = "sha256-4MEBIZOXjcLEyW0TB+AXWsEc24VZz8bGCkduHqbazuo=";
 
   nativeBuildInputs = [ installShellFiles pkg-config ];
   buildInputs = [ openssl ] ++ lib.optionals stdenv.isDarwin [ Security SystemConfiguration ];
diff --git a/pkgs/tools/misc/nautilus-open-any-terminal/default.nix b/pkgs/tools/misc/nautilus-open-any-terminal/default.nix
index 54e85c063633..b200731ab8f2 100644
--- a/pkgs/tools/misc/nautilus-open-any-terminal/default.nix
+++ b/pkgs/tools/misc/nautilus-open-any-terminal/default.nix
@@ -14,14 +14,14 @@
 
 python3.pkgs.buildPythonPackage rec {
   pname = "nautilus-open-any-terminal";
-  version = "0.5.0";
+  version = "0.5.1";
   pyproject = true;
 
   src = fetchFromGitHub {
     owner = "Stunkymonkey";
     repo = pname;
-    rev = version;
-    hash = "sha256-fcTbt8O/7KEme5+GlDD7hMMcE2RaYqFdfojzJ1KhnA0=";
+    rev = "refs/tags/${version}";
+    hash = "sha256-liyzgbZGl08gHLVpsy8NbTiTytNdiMdymF70ik4cPXs=";
   };
 
   patches = [ ./hardcode-gsettings.patch ];
diff --git a/pkgs/tools/misc/parallel/default.nix b/pkgs/tools/misc/parallel/default.nix
index d196de07f648..488039c80763 100644
--- a/pkgs/tools/misc/parallel/default.nix
+++ b/pkgs/tools/misc/parallel/default.nix
@@ -2,11 +2,11 @@
 
 stdenv.mkDerivation rec {
   pname = "parallel";
-  version = "20240122";
+  version = "20240222";
 
   src = fetchurl {
     url = "mirror://gnu/parallel/${pname}-${version}.tar.bz2";
-    sha256 = "sha256-hZaIy7VkHNe2sWsrlgviSqTjfmVcyP/NivlxzX1bRJ8=";
+    sha256 = "sha256-66Cban4jj2Iik/fUYVl/NQdctW8XDQpzFI9T0lnshVY=";
   };
 
   outputs = [ "out" "man" "doc" ];
diff --git a/pkgs/tools/misc/rauc/default.nix b/pkgs/tools/misc/rauc/default.nix
index d6e8486681ac..8f244839803c 100644
--- a/pkgs/tools/misc/rauc/default.nix
+++ b/pkgs/tools/misc/rauc/default.nix
@@ -17,13 +17,13 @@
 
 stdenv.mkDerivation rec {
   pname = "rauc";
-  version = "1.11.1";
+  version = "1.11.2";
 
   src = fetchFromGitHub {
     owner = pname;
     repo = pname;
     rev = "v${version}";
-    sha256 = "sha256-xvuBMOAXnuRYCkripjwfv64BCTLySNxebyHF3sB8EQw=";
+    sha256 = "sha256-IWfYjn8CCgYK2hna59Awr5tzWnXCtR6c1XpV5fCiSE4=";
   };
 
   passthru = {
diff --git a/pkgs/tools/networking/muffet/default.nix b/pkgs/tools/networking/muffet/default.nix
index c363df34e8f7..a9fe4398afd7 100644
--- a/pkgs/tools/networking/muffet/default.nix
+++ b/pkgs/tools/networking/muffet/default.nix
@@ -5,16 +5,16 @@
 
 buildGoModule rec {
   pname = "muffet";
-  version = "2.9.3";
+  version = "2.10.0";
 
   src = fetchFromGitHub {
     owner = "raviqqe";
     repo = "muffet";
     rev = "v${version}";
-    hash = "sha256-w9PoKGxZdP/sKdlTlnWBMqDPDLUvcYubkCyNHUm3AAc=";
+    hash = "sha256-kwEHabQYAaxC8nKewc5XHZnSvUSEQRw7qg0jtJoOw9g=";
   };
 
-  vendorHash = "sha256-2an4xj1gqQqj9NrSdTAss7hn6SiWoiq3RQ2xxUlSuaE=";
+  vendorHash = "sha256-GNwyQHqyfuzKnNAv5gpZFmhSq+jIHdfeceLSD9UphdA=";
 
   meta = with lib; {
     description = "A website link checker which scrapes and inspects all pages in a website recursively";
diff --git a/pkgs/tools/networking/sing-box/default.nix b/pkgs/tools/networking/sing-box/default.nix
index b98f1c4b492a..8cef901c88bc 100644
--- a/pkgs/tools/networking/sing-box/default.nix
+++ b/pkgs/tools/networking/sing-box/default.nix
@@ -11,16 +11,16 @@
 
 buildGoModule rec {
   pname = "sing-box";
-  version = "1.8.6";
+  version = "1.8.7";
 
   src = fetchFromGitHub {
     owner = "SagerNet";
     repo = pname;
     rev = "v${version}";
-    hash = "sha256-t7P1W1iw5nCdACrByZormeq3r2KGAnZRFoXTRNjGztg=";
+    hash = "sha256-SZd67DyDsKZZ9hKgRtbQLJzfft+vl49k9J/+Xv8ghHs=";
   };
 
-  vendorHash = "sha256-J6+b0uZwBoxwc43+5PXFwztXC1abHvtK4ejg5vA757E=";
+  vendorHash = "sha256-9aH8KHn+8brGT/eJS9SWVYBMxDI1R3Q+pORfnjUI7ms=";
 
   tags = [
     "with_quic"
diff --git a/pkgs/tools/nix/nixdoc/default.nix b/pkgs/tools/nix/nixdoc/default.nix
index e757e79f4684..1d5014a1c700 100644
--- a/pkgs/tools/nix/nixdoc/default.nix
+++ b/pkgs/tools/nix/nixdoc/default.nix
@@ -2,16 +2,16 @@
 
 rustPlatform.buildRustPackage rec {
   pname = "nixdoc";
-  version = "2.7.0";
+  version = "3.0.1";
 
   src = fetchFromGitHub {
     owner = "nix-community";
     repo = "nixdoc";
     rev = "v${version}";
-    sha256 = "sha256-0cyKI8KHFsMXYca3hzbqxmBpxGdhl4/i183kfUQr8pg=";
+    sha256 = "sha256-PnvVGw0DMBg/l7+QpcXW5AFfR6MeXBiUYdVAZuue1jA=";
   };
 
-  cargoHash = "sha256-9dqjNExxLDgVsu14yDQOJP1qxKy2ACiUH+pbX77iT70=";
+  cargoHash = "sha256-qLTUyhoEVtjgh+ilEv+pQLXLYWlW9gVsCiA5rPfymZY=";
 
   buildInputs = lib.optionals stdenv.isDarwin [ darwin.Security ];
 
diff --git a/pkgs/tools/package-management/poetry/default.nix b/pkgs/tools/package-management/poetry/default.nix
index 75cede5df7d3..d7442d74674f 100644
--- a/pkgs/tools/package-management/poetry/default.nix
+++ b/pkgs/tools/package-management/poetry/default.nix
@@ -12,12 +12,12 @@ let
       # We keep the override around even when the versions match, as
       # it's likely to become relevant again after the next Poetry update.
       poetry-core = super.poetry-core.overridePythonAttrs (old: rec {
-        version = "1.8.1";
+        version = "1.9.0";
         src = fetchFromGitHub {
           owner = "python-poetry";
           repo = "poetry-core";
-          rev = version;
-          hash = "sha256-RnCJ67jaL2knwv+Uo7p0zOejHAT73f40weaJnfqOYoM=";
+          rev = "refs/tags/${version}";
+          hash = "sha256-vvwKbzGlvv2LTbXfJxQVM3nUXFGntgJxsku6cbRxCzw=";
         };
       });
     } // (plugins self);
diff --git a/pkgs/tools/package-management/poetry/unwrapped.nix b/pkgs/tools/package-management/poetry/unwrapped.nix
index f13a7715464b..cf4b0334dcd6 100644
--- a/pkgs/tools/package-management/poetry/unwrapped.nix
+++ b/pkgs/tools/package-management/poetry/unwrapped.nix
@@ -4,7 +4,6 @@
 , pythonOlder
 , fetchFromGitHub
 , installShellFiles
-, pythonRelaxDepsHook
 , build
 , cachecontrol
 , cleo
@@ -29,41 +28,30 @@
 , xattr
 , tomli
 , importlib-metadata
-, cachy
 , deepdiff
-, flatdict
 , pytestCheckHook
 , httpretty
 , pytest-mock
 , pytest-xdist
-, pythonAtLeast
 , darwin
 }:
 
 buildPythonPackage rec {
   pname = "poetry";
-  version = "1.7.1";
+  version = "1.8.1";
   format = "pyproject";
 
   disabled = pythonOlder "3.8";
 
   src = fetchFromGitHub {
     owner = "python-poetry";
-    repo = pname;
+    repo = "poetry";
     rev = "refs/tags/${version}";
-    hash = "sha256-PM3FIZYso7p0Oe0RpiPuxHrQrgnMlkT5SVeaJPK/J94=";
+    hash = "sha256-tHtd5vO3TMjO0gqyECuS0FUAcE90nkKZwOm3ne6poFQ=";
   };
 
   nativeBuildInputs = [
     installShellFiles
-    pythonRelaxDepsHook
-  ];
-
-  pythonRelaxDeps = [
-    # platformdirs 4.x is backwards compatible; https://github.com/python-poetry/poetry/commit/eb80d10846f7336b0b2a66ce2964e72dffee9a1c
-    "platformdirs"
-    # xattr 1.0 is backwards compatible modulo dropping Python 2 support: https://github.com/xattr/xattr/compare/v0.10.0...v1.0.0
-    "xattr"
   ];
 
   propagatedBuildInputs = [
@@ -104,9 +92,7 @@ buildPythonPackage rec {
   '';
 
   nativeCheckInputs = [
-    cachy
     deepdiff
-    flatdict
     pytestCheckHook
     httpretty
     pytest-mock
@@ -127,32 +113,14 @@ buildPythonPackage rec {
   '';
 
   disabledTests = [
+    "test_builder_should_execute_build_scripts"
     "test_env_system_packages_are_relative_to_lib"
+    "test_executor_known_hashes"
     "test_install_warning_corrupt_root"
-    "test_installer_with_pypi_repository"
-    # touches network
-    "git"
-    "solver"
-    "load"
-    "vcs"
-    "prereleases_if_they_are_compatible"
-    "test_builder_setup_generation_runs_with_pip_editable"
-    "test_executor"
-    # requires git history to work correctly
-    "default_with_excluded_data"
-    # toml ordering has changed
-    "lock"
-    # fs permission errors
-    "test_builder_should_execute_build_scripts"
-    # poetry.installation.chef.ChefBuildError: Backend 'poetry.core.masonry.api' is not available.
-    "test_isolated_env_install_success"
-    "test_prepare_sdist"
-    "test_prepare_directory"
-    "test_prepare_directory_with_extensions"
-    "test_prepare_directory_editable"
-  ] ++ lib.optionals (pythonAtLeast "3.10") [
-    # RuntimeError: 'auto_spec' might be a typo; use unsafe=True if this is intended
-    "test_info_setup_complex_pep517_error"
+  ];
+
+  pytestFlagsArray = [
+    "-m 'not network'"
   ];
 
   # Allow for package to use pep420's native namespaces
diff --git a/pkgs/tools/security/exploitdb/default.nix b/pkgs/tools/security/exploitdb/default.nix
index 117a02a040e3..6e7a553cf167 100644
--- a/pkgs/tools/security/exploitdb/default.nix
+++ b/pkgs/tools/security/exploitdb/default.nix
@@ -6,13 +6,13 @@
 
 stdenv.mkDerivation rec {
   pname = "exploitdb";
-  version = "2024-02-22";
+  version = "2024-02-27";
 
   src = fetchFromGitLab {
     owner = "exploit-database";
     repo = pname;
     rev = "refs/tags/${version}";
-    hash = "sha256-+5N7qe7YuNNBiizzI2aBKZCsl64ODkit5Y9QlhNWVMw=";
+    hash = "sha256-bFCh1kNm7D71PoRoSHdm1qYGGNvYnEb9cLbZerVy5vw=";
   };
 
   nativeBuildInputs = [
diff --git a/pkgs/tools/virtualization/distrobuilder/nixos-generator.patch b/pkgs/tools/virtualization/distrobuilder/nixos-generator.patch
index 6194f33e1918..3c0d726e610d 100644
--- a/pkgs/tools/virtualization/distrobuilder/nixos-generator.patch
+++ b/pkgs/tools/virtualization/distrobuilder/nixos-generator.patch
@@ -1,5 +1,5 @@
 diff --git a/distrobuilder/lxc.generator b/distrobuilder/lxc.generator
-index 0ad81d1..69dbfe7 100644
+index 0ad81d1..21ddb39 100644
 --- a/distrobuilder/lxc.generator
 +++ b/distrobuilder/lxc.generator
 @@ -25,16 +25,6 @@ is_incus_vm() {
@@ -73,9 +73,22 @@ index 0ad81d1..69dbfe7 100644
  
  	mkdir -p /run/systemd/system/systemd-udev-trigger.service.d
  	cat <<-EOF > /run/systemd/system/systemd-udev-trigger.service.d/zzz-lxc-override.conf
-@@ -145,24 +97,12 @@ EOF
+@@ -132,37 +84,13 @@ ExecStart=-${cmd} trigger --type=devices --action=add
+ EOF
  }
  
+-# fix_systemd_sysctl overrides the systemd-sysctl.service to use "ExecStart=-" instead of "ExecStart=".
+-fix_systemd_sysctl() {
+-	cmd=/usr/lib/systemd/systemd-sysctl
+-	! [ -e "${cmd}" ] && cmd=/lib/systemd/systemd-sysctl
+-	mkdir -p /run/systemd/system/systemd-sysctl.service.d
+-	cat <<-EOF > /run/systemd/system/systemd-sysctl.service.d/zzz-lxc-override.conf
+-[Service]
+-ExecStart=
+-ExecStart=-${cmd}
+-EOF
+-}
+-
  ## Main logic
 -# Nothing to do in Incus VM but deployed in case it is later converted to a container
 -is_incus_vm || is_lxd_vm && exit 0
@@ -99,7 +112,15 @@ index 0ad81d1..69dbfe7 100644
  
  # Determine distro name and release
  ID=""
-@@ -222,11 +162,6 @@ ACTION=="add|change|move", ENV{ID_NET_DRIVER}=="veth", ENV{INTERFACE}=="eth[0-9]
+@@ -192,7 +120,6 @@ fi
+ 
+ # Ignore failures on some units.
+ fix_systemd_udev_trigger
+-fix_systemd_sysctl
+ 
+ # Mask some units.
+ fix_systemd_mask dev-hugepages.mount
+@@ -222,11 +149,6 @@ ACTION=="add|change|move", ENV{ID_NET_DRIVER}=="veth", ENV{INTERFACE}=="eth[0-9]
  EOF
  fi
  
diff --git a/pkgs/top-level/aliases.nix b/pkgs/top-level/aliases.nix
index d991c3cbe8d2..cce25da849d9 100644
--- a/pkgs/top-level/aliases.nix
+++ b/pkgs/top-level/aliases.nix
@@ -714,6 +714,7 @@ mapAliases ({
   mod_pkcs12 = apacheHttpdPackages.mod_pkcs12; # Added 2019-12-24
   mod_timestamp = apacheHttpdPackages.mod_timestamp; # Added 2019-12-24
   monero = monero-cli; # Added 2021-11-28
+  moneyplex = throw "'moneyplex' has been removed, as it was broken and unmaintained"; # Added 2024-02-28
   mongodb-4_0 = throw "mongodb-4_0 has been removed, it's end of life since April 2022"; # Added 2023-01-05
   mongodb-4_2 = throw "mongodb-4_2 has been removed, it's end of life since April 2023"; # Added 2023-06-06
   moonlander = throw "'moonlander' has been removed due to it being broken and unmaintained"; # Added 2023-11-26
diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix
index beb2474b6912..40979ce54ae4 100644
--- a/pkgs/top-level/all-packages.nix
+++ b/pkgs/top-level/all-packages.nix
@@ -726,6 +726,8 @@ with pkgs;
 
   inspec = callPackage ../tools/misc/inspec { };
 
+  kdePackages = callPackage ../kde { };
+
   buildcatrust = with python3.pkgs; toPythonApplication buildcatrust;
 
   probe-rs = callPackage ../development/tools/rust/probe-rs {
@@ -10891,8 +10893,6 @@ with pkgs;
 
   molotov = callPackage ../applications/video/molotov { };
 
-  moneyplex = callPackage ../applications/office/moneyplex { };
-
   monit = callPackage ../tools/system/monit { };
 
   monocraft = callPackage ../data/fonts/monocraft { };
@@ -13257,8 +13257,6 @@ with pkgs;
 
   smpq = callPackage ../applications/misc/smpq { };
 
-  sn0int = callPackage ../tools/security/sn0int { };
-
   snabb = callPackage ../tools/networking/snabb { };
 
   snallygaster = callPackage ../tools/security/snallygaster { };
@@ -14510,8 +14508,6 @@ with pkgs;
 
   wimboot = callPackage ../tools/misc/wimboot { };
 
-  wit-bindgen = callPackage ../tools/misc/wit-bindgen { };
-
   wire = callPackage ../development/tools/wire { };
 
   wireguard-tools = callPackage ../tools/networking/wireguard-tools { };
@@ -16971,7 +16967,6 @@ with pkgs;
     inherit (darwin.apple_sdk.frameworks) CoreServices Security;
   };
   cargo-limit = callPackage ../development/tools/rust/cargo-limit { };
-  cargo-make = callPackage ../development/tools/rust/cargo-make { };
   cargo-modules = callPackage ../development/tools/rust/cargo-modules { };
   cargo-mommy = callPackage ../development/tools/rust/cargo-mommy { };
   cargo-msrv = callPackage ../development/tools/rust/cargo-msrv {
@@ -35330,6 +35325,10 @@ with pkgs;
     plasmoidSupport = false;
     systemdSupport = true;
   };
+  syncthingtray-qt6 = kdePackages.callPackage ../applications/misc/syncthingtray {
+    # renamed in KF5 -> KF6
+    plasma-framework = kdePackages.libplasma;
+  };
 
   synergy = libsForQt5.callPackage ../applications/misc/synergy {
     stdenv = if stdenv.isDarwin then darwin.apple_sdk_11_0.stdenv else stdenv;
@@ -35976,8 +35975,6 @@ with pkgs;
 
   vkeybd = callPackage ../applications/audio/vkeybd { };
 
-  vlc = libsForQt5.callPackage ../applications/video/vlc { };
-
   libvlc = vlc.override {
     withQt5 = false;
     onlyLibVLC = true;
@@ -36806,11 +36803,11 @@ with pkgs;
 
   lightning-pool = callPackage ../applications/blockchains/lightning-pool { };
 
-  litecoin  = disable-warnings-if-gcc13 (libsForQt5.callPackage ../applications/blockchains/litecoin {
+  litecoin  = libsForQt5.callPackage ../applications/blockchains/litecoin {
     inherit (darwin.apple_sdk.frameworks) AppKit;
     boost = pkgs.boost177;
-  });
-  litecoind = disable-warnings-if-gcc13 (litecoin.override { withGui = false; });
+  };
+  litecoind = litecoin.override { withGui = false; };
 
   livedl = callPackage ../tools/misc/livedl { };
 
diff --git a/pkgs/top-level/darwin-packages.nix b/pkgs/top-level/darwin-packages.nix
index 73943fb3b8a3..78ad4434f1c3 100644
--- a/pkgs/top-level/darwin-packages.nix
+++ b/pkgs/top-level/darwin-packages.nix
@@ -234,7 +234,7 @@ impure-cmds // appleSourcePackages // chooseLibs // {
 
   discrete-scroll = callPackage ../os-specific/darwin/discrete-scroll { };
 
-  # See doc/builders/special/darwin-builder.section.md
+  # See doc/packages/darwin-builder.section.md
   linux-builder = lib.makeOverridable ({ modules }:
     let
       toGuest = builtins.replaceStrings [ "darwin" ] [ "linux" ];
diff --git a/pkgs/top-level/python-packages.nix b/pkgs/top-level/python-packages.nix
index 6a610e36779a..b3f7679595d7 100644
--- a/pkgs/top-level/python-packages.nix
+++ b/pkgs/top-level/python-packages.nix
@@ -9748,6 +9748,8 @@ self: super: with self; {
 
   python-tado = callPackage ../development/python-modules/python-tado { };
 
+  python-idzip = callPackage ../development/python-modules/python-idzip { };
+
   pythonfinder = callPackage ../development/python-modules/pythonfinder { };
 
   pytomorrowio = callPackage ../development/python-modules/pytomorrowio { };
diff --git a/pkgs/top-level/qt6-packages.nix b/pkgs/top-level/qt6-packages.nix
index 3732386d8688..f346dec9f603 100644
--- a/pkgs/top-level/qt6-packages.nix
+++ b/pkgs/top-level/qt6-packages.nix
@@ -29,10 +29,14 @@ makeScopeWithSplicing' {
   inherit stdenv;
 
   # LIBRARIES
+  accounts-qt = callPackage ../development/libraries/accounts-qt { };
   appstream-qt = callPackage ../development/libraries/appstream/qt.nix { };
 
   kdsoap = callPackage ../development/libraries/kdsoap { };
 
+  kcolorpicker = callPackage ../development/libraries/kcolorpicker { };
+  kimageannotator = callPackage ../development/libraries/kimageannotator { };
+
   futuresql = callPackage ../development/libraries/futuresql { };
   kquickimageedit = callPackage ../development/libraries/kquickimageedit { };
   libqaccessibilityclient = callPackage ../development/libraries/libqaccessibilityclient { };
@@ -88,6 +92,8 @@ makeScopeWithSplicing' {
   # is, to allow users to choose the right build if needed.
   sddm = callPackage ../applications/display-managers/sddm {};
 
+  signond = callPackage ../development/libraries/signond {};
+
   waylib = callPackage ../development/libraries/waylib { };
 
   wayqt = callPackage ../development/libraries/wayqt { };