about summary refs log tree commit diff
path: root/pkgs
diff options
context:
space:
mode:
authorK900 <me@0upti.me>2024-02-05 18:43:41 +0300
committerK900 <me@0upti.me>2024-02-28 18:49:23 +0300
commitce77225e21f9cf8726d197897ad9a6882a3daecc (patch)
tree64d68e597c2a1875962305608ec42e3b02016b8a /pkgs
parentfc40d637fe78d717b7909e710ccb310458c2410f (diff)
downloadnixlib-ce77225e21f9cf8726d197897ad9a6882a3daecc.tar
nixlib-ce77225e21f9cf8726d197897ad9a6882a3daecc.tar.gz
nixlib-ce77225e21f9cf8726d197897ad9a6882a3daecc.tar.bz2
nixlib-ce77225e21f9cf8726d197897ad9a6882a3daecc.tar.lz
nixlib-ce77225e21f9cf8726d197897ad9a6882a3daecc.tar.xz
nixlib-ce77225e21f9cf8726d197897ad9a6882a3daecc.tar.zst
nixlib-ce77225e21f9cf8726d197897ad9a6882a3daecc.zip
pkgs/kde: init at 6.0.0 / 24.02.0, the Nix bits
This is the thing you want to look at.
Diffstat (limited to 'pkgs')
-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.nix14
-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/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/top-level/all-packages.nix2
438 files changed, 6375 insertions, 0 deletions
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..5a0b7b7d714a
--- /dev/null
+++ b/pkgs/kde/gear/itinerary/default.nix
@@ -0,0 +1,14 @@
+{
+  mkKdeDerivation,
+  pkg-config,
+  qtlocation,
+  qtpositioning,
+  shared-mime-info,
+  libical,
+}:
+mkKdeDerivation {
+  pname = "itinerary";
+
+  extraNativeBuildInputs = [pkg-config shared-mime-info];
+  extraBuildInputs = [qtlocation qtpositioning libical];
+}
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/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/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix
index dd3614351591..8eee283f5aac 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 {