about summary refs log tree commit diff
path: root/pkgs/by-name
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/by-name')
-rw-r--r--pkgs/by-name/_2/_2ship2harkinian/package.nix6
-rw-r--r--pkgs/by-name/ac/accerciser/package.nix77
-rw-r--r--pkgs/by-name/ad/adwaita-icon-theme/package.nix54
-rw-r--r--pkgs/by-name/ba/baobab/package.nix63
-rw-r--r--pkgs/by-name/bi/bitwarden-desktop/package.nix4
-rw-r--r--pkgs/by-name/ch/cheese/package.nix107
-rw-r--r--pkgs/by-name/co/coyim/package.nix4
-rw-r--r--pkgs/by-name/dc/dconf-editor/package.nix79
-rw-r--r--pkgs/by-name/dc/dconf-editor/schema-override-variable.patch14
-rw-r--r--pkgs/by-name/de/devhelp/package.nix87
-rw-r--r--pkgs/by-name/eo/eog/fix-gir-lib-path.patch13
-rw-r--r--pkgs/by-name/eo/eog/package.nix126
-rw-r--r--pkgs/by-name/ep/epiphany/package.nix109
-rw-r--r--pkgs/by-name/ev/evince/package.nix144
-rw-r--r--pkgs/by-name/ev/evolution-data-server/drop-tentative-settings-constructor.patch40
-rw-r--r--pkgs/by-name/ev/evolution-data-server/fix-paths.patch11
-rw-r--r--pkgs/by-name/ev/evolution-data-server/hardcode-gsettings.patch652
-rw-r--r--pkgs/by-name/ev/evolution-data-server/package.nix189
-rw-r--r--pkgs/by-name/fi/file-roller/package.nix78
-rw-r--r--pkgs/by-name/fo/font-manager/package.nix4
-rw-r--r--pkgs/by-name/ge/geary/package.nix156
-rw-r--r--pkgs/by-name/gh/ghex/package.nix86
-rw-r--r--pkgs/by-name/gi/gitg/package.nix99
-rw-r--r--pkgs/by-name/gi/github-desktop/package.nix4
-rw-r--r--pkgs/by-name/gn/gnome-autoar/package.nix59
-rw-r--r--pkgs/by-name/gn/gnome-calculator/package.nix80
-rw-r--r--pkgs/by-name/gn/gnome-calendar/package.nix66
-rw-r--r--pkgs/by-name/gn/gnome-common/package.nix21
-rw-r--r--pkgs/by-name/gn/gnome-dictionary/package.nix86
-rw-r--r--pkgs/by-name/gn/gnome-disk-utility/package.nix81
-rw-r--r--pkgs/by-name/gn/gnome-font-viewer/package.nix65
-rw-r--r--pkgs/by-name/gn/gnome-keyring/package.nix108
-rw-r--r--pkgs/by-name/gn/gnome-packagekit/package.nix59
-rw-r--r--pkgs/by-name/gn/gnome-pomodoro/fix-schema-path.patch40
-rw-r--r--pkgs/by-name/gn/gnome-pomodoro/package.nix83
-rw-r--r--pkgs/by-name/gn/gnome-screenshot/package.nix83
-rw-r--r--pkgs/by-name/gn/gnome-system-monitor/fix-paths.patch12
-rw-r--r--pkgs/by-name/gn/gnome-system-monitor/package.nix80
-rw-r--r--pkgs/by-name/gn/gnome-terminal/package.nix97
-rw-r--r--pkgs/by-name/gn/gnome-themes-extra/package.nix33
-rw-r--r--pkgs/by-name/gn/gnome-tweaks/package.nix94
-rw-r--r--pkgs/by-name/gn/gnome-user-share/package.nix72
-rw-r--r--pkgs/by-name/go/google-chrome/package.nix4
-rw-r--r--pkgs/by-name/gp/gpaste/fix-paths.patch16
-rw-r--r--pkgs/by-name/gp/gpaste/package.nix88
-rw-r--r--pkgs/by-name/gp/gpaste/wrapper.js5
-rw-r--r--pkgs/by-name/gu/gucharmap/package.nix114
-rw-r--r--pkgs/by-name/ht/htb-toolkit/package.nix4
-rw-r--r--pkgs/by-name/in/insync-nautilus/package.nix4
-rw-r--r--pkgs/by-name/ir/ironbar/package.nix4
-rw-r--r--pkgs/by-name/na/nautilus-open-in-blackbox/package.nix4
-rw-r--r--pkgs/by-name/na/nautilus-python/fix-paths.patch14
-rw-r--r--pkgs/by-name/na/nautilus-python/package.nix71
-rw-r--r--pkgs/by-name/na/nautilus/extension_dir.patch24
-rw-r--r--pkgs/by-name/na/nautilus/fix-paths.patch13
-rw-r--r--pkgs/by-name/na/nautilus/package.nix140
-rw-r--r--pkgs/by-name/pa/papers/package.nix4
-rw-r--r--pkgs/by-name/ry/rygel/add-option-for-installation-sysconfdir.patch35
-rw-r--r--pkgs/by-name/ry/rygel/package.nix107
-rw-r--r--pkgs/by-name/se/seahorse/package.nix114
-rw-r--r--pkgs/by-name/si/simple-scan/package.nix89
-rw-r--r--pkgs/by-name/sm/smartgithg/package.nix4
-rw-r--r--pkgs/by-name/su/sushi/package.nix86
-rw-r--r--pkgs/by-name/sv/svp/package.nix4
-rw-r--r--pkgs/by-name/th/thcrap-steam-proton-wrapper/package.nix4
-rw-r--r--pkgs/by-name/to/totem/package.nix138
-rw-r--r--pkgs/by-name/tr/trigger-control/package.nix6
-rw-r--r--pkgs/by-name/tu/tuifimanager/package.nix4
-rw-r--r--pkgs/by-name/wi/wifi-qr/package.nix4
-rw-r--r--pkgs/by-name/ye/yelp-xsl/package.nix51
-rw-r--r--pkgs/by-name/ye/yelp/package.nix64
-rw-r--r--pkgs/by-name/ze/zenity/package.nix56
72 files changed, 4662 insertions, 38 deletions
diff --git a/pkgs/by-name/_2/_2ship2harkinian/package.nix b/pkgs/by-name/_2/_2ship2harkinian/package.nix
index 0be042d174f23..c0c9ee4a7fa82 100644
--- a/pkgs/by-name/_2/_2ship2harkinian/package.nix
+++ b/pkgs/by-name/_2/_2ship2harkinian/package.nix
@@ -15,7 +15,7 @@
   libpulseaudio,
   libpng,
   imagemagick,
-  gnome,
+  zenity,
   makeWrapper,
   imgui,
   stormlib,
@@ -122,7 +122,7 @@ stdenv.mkDerivation (finalAttrs: {
     SDL2
     libpulseaudio
     libpng
-    gnome.zenity
+    zenity
     imgui'
     stormlib'
     libzip
@@ -183,7 +183,7 @@ stdenv.mkDerivation (finalAttrs: {
   '';
 
   fixupPhase = ''
-    wrapProgram $out/2s2h/2s2h.elf --prefix PATH ":" ${lib.makeBinPath [ gnome.zenity ]}
+    wrapProgram $out/2s2h/2s2h.elf --prefix PATH ":" ${lib.makeBinPath [ zenity ]}
   '';
 
   desktopItems = [
diff --git a/pkgs/by-name/ac/accerciser/package.nix b/pkgs/by-name/ac/accerciser/package.nix
new file mode 100644
index 0000000000000..7493c6a0bfa4d
--- /dev/null
+++ b/pkgs/by-name/ac/accerciser/package.nix
@@ -0,0 +1,77 @@
+{ lib
+, fetchurl
+, pkg-config
+, gnome
+, gtk3
+, wrapGAppsHook3
+, gobject-introspection
+, itstool
+, libxml2
+, python3
+, at-spi2-core
+, dbus
+, gettext
+, libwnck
+, adwaita-icon-theme
+, librsvg
+}:
+
+python3.pkgs.buildPythonApplication rec {
+  pname = "accerciser";
+  version = "3.42.0";
+
+  format = "other";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
+    sha256 = "d2m9T09j3ImhQ+hs3ET+rr1/jJab6lwfWoaskxGQL0g=";
+  };
+
+  nativeBuildInputs = [
+    gettext
+    gobject-introspection # For setup hook
+    itstool
+    libxml2
+    pkg-config
+    dbus
+    wrapGAppsHook3
+  ];
+
+  buildInputs = [
+    adwaita-icon-theme
+    at-spi2-core
+    gtk3
+    libwnck
+    librsvg
+  ];
+
+  propagatedBuildInputs = with python3.pkgs; [
+    ipython
+    pyatspi
+    pycairo
+    pygobject3
+    setuptools
+  ];
+
+  dontWrapGApps = true;
+
+  preFixup = ''
+    makeWrapperArgs+=("''${gappsWrapperArgs[@]}")
+  '';
+
+  passthru = {
+    updateScript = gnome.updateScript {
+      packageName = "accerciser";
+      versionPolicy = "odd-unstable";
+    };
+  };
+
+  meta = with lib; {
+    homepage = "https://gitlab.gnome.org/GNOME/accerciser";
+    description = "Interactive Python accessibility explorer";
+    mainProgram = "accerciser";
+    maintainers = teams.gnome.members;
+    license = licenses.bsd3;
+    platforms = platforms.linux;
+  };
+}
diff --git a/pkgs/by-name/ad/adwaita-icon-theme/package.nix b/pkgs/by-name/ad/adwaita-icon-theme/package.nix
new file mode 100644
index 0000000000000..ac39b2f703596
--- /dev/null
+++ b/pkgs/by-name/ad/adwaita-icon-theme/package.nix
@@ -0,0 +1,54 @@
+{ lib
+, stdenv
+, fetchurl
+, meson
+, ninja
+, pkg-config
+, gnome
+, gtk3
+, gdk-pixbuf
+, librsvg
+, hicolor-icon-theme
+}:
+
+stdenv.mkDerivation rec {
+  pname = "adwaita-icon-theme";
+  version = "46.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/adwaita-icon-theme/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    hash = "sha256-S8tTm9ddZNo4XW+gjLqp3erOtqyOgrhbpsQRF79bpk4=";
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    gtk3
+  ];
+
+  buildInputs = [
+    gdk-pixbuf
+    librsvg
+  ];
+
+  propagatedBuildInputs = [
+    # For convenience, we can specify adwaita-icon-theme only in packages
+    hicolor-icon-theme
+  ];
+
+  dontDropIconThemeCache = true;
+
+  passthru = {
+    updateScript = gnome.updateScript {
+      packageName = "adwaita-icon-theme";
+    };
+  };
+
+  meta = with lib; {
+    homepage = "https://gitlab.gnome.org/GNOME/adwaita-icon-theme";
+    platforms = with platforms; linux ++ darwin;
+    maintainers = teams.gnome.members;
+    license = licenses.cc-by-sa-30;
+  };
+}
diff --git a/pkgs/by-name/ba/baobab/package.nix b/pkgs/by-name/ba/baobab/package.nix
new file mode 100644
index 0000000000000..3978661baabb8
--- /dev/null
+++ b/pkgs/by-name/ba/baobab/package.nix
@@ -0,0 +1,63 @@
+{ stdenv
+, lib
+, gettext
+, fetchurl
+, vala
+, desktop-file-utils
+, meson
+, ninja
+, pkg-config
+, gtk4
+, libadwaita
+, glib
+, libxml2
+, wrapGAppsHook4
+, itstool
+, gnome
+}:
+
+stdenv.mkDerivation rec {
+  pname = "baobab";
+  version = "46.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    hash = "sha256-zk3vXILQVnGlAJ9768+FrJhnXZ2BYNKK2RgbJppy43w=";
+  };
+
+  nativeBuildInputs = [
+    desktop-file-utils
+    gettext
+    glib
+    itstool
+    libxml2
+    meson
+    ninja
+    pkg-config
+    vala
+    wrapGAppsHook4
+  ];
+
+  buildInputs = [
+    gtk4
+    libadwaita
+    glib
+  ];
+
+  doCheck = true;
+
+  passthru = {
+    updateScript = gnome.updateScript {
+      packageName = pname;
+    };
+  };
+
+  meta = with lib; {
+    description = "Graphical application to analyse disk usage in any GNOME environment";
+    mainProgram = "baobab";
+    homepage = "https://apps.gnome.org/Baobab/";
+    license = licenses.gpl2Plus;
+    maintainers = teams.gnome.members;
+    platforms = platforms.unix;
+  };
+}
diff --git a/pkgs/by-name/bi/bitwarden-desktop/package.nix b/pkgs/by-name/bi/bitwarden-desktop/package.nix
index ca6c93cac7b57..60e212bf475a1 100644
--- a/pkgs/by-name/bi/bitwarden-desktop/package.nix
+++ b/pkgs/by-name/bi/bitwarden-desktop/package.nix
@@ -6,7 +6,7 @@
 , electron_29
 , fetchFromGitHub
 , glib
-, gnome
+, gnome-keyring
 , gtk3
 , jq
 , libsecret
@@ -127,7 +127,7 @@ in buildNpmPackage rec {
 
   nativeCheckInputs = [
     dbus
-    (gnome.gnome-keyring.override { useWrappedDaemon = false; })
+    (gnome-keyring.override { useWrappedDaemon = false; })
   ];
 
   checkFlags = [
diff --git a/pkgs/by-name/ch/cheese/package.nix b/pkgs/by-name/ch/cheese/package.nix
new file mode 100644
index 0000000000000..9ac53092c1144
--- /dev/null
+++ b/pkgs/by-name/ch/cheese/package.nix
@@ -0,0 +1,107 @@
+{ lib
+, stdenv
+, gettext
+, fetchurl
+, wrapGAppsHook3
+, gnome-video-effects
+, libcanberra-gtk3
+, pkg-config
+, gtk3
+, glib
+, clutter-gtk
+, clutter-gst
+, gst_all_1
+, itstool
+, vala
+, docbook_xml_dtd_43
+, docbook-xsl-nons
+, appstream-glib
+, libxslt
+, gtk-doc
+, adwaita-icon-theme
+, librsvg
+, totem
+, gdk-pixbuf
+, gnome
+, gnome-desktop
+, libxml2
+, meson
+, ninja
+, dbus
+, pipewire
+}:
+
+stdenv.mkDerivation rec {
+  pname = "cheese";
+  version = "44.1";
+
+  outputs = [ "out" "man" "devdoc" ];
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/cheese/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "XyGFxMmeVN3yuLr2DIKBmVDlSVLhMuhjmHXz7cv49o4=";
+  };
+
+  nativeBuildInputs = [
+    appstream-glib
+    docbook_xml_dtd_43
+    docbook-xsl-nons
+    gettext
+    gtk-doc
+    itstool
+    libxml2
+    libxslt # for xsltproc
+    meson
+    ninja
+    pkg-config
+    vala
+    wrapGAppsHook3
+    glib # for glib-compile-schemas
+  ];
+
+  buildInputs = [
+    adwaita-icon-theme
+    clutter-gst
+    clutter-gtk
+    dbus
+    gdk-pixbuf
+    glib
+    gnome-desktop
+    gnome-video-effects
+    gst_all_1.gst-plugins-bad
+    gst_all_1.gst-plugins-base
+    gst_all_1.gst-plugins-good
+    gst_all_1.gstreamer
+    gtk3
+    libcanberra-gtk3
+    librsvg
+    pipewire # PipeWire provides a gstreamer plugin for using PipeWire for video
+  ];
+
+  preFixup = ''
+    gappsWrapperArgs+=(
+      # Effects
+      --prefix XDG_DATA_DIRS : "${gnome-video-effects}/share"
+      # vp8enc preset
+      --prefix GST_PRESET_PATH : "${gst_all_1.gst-plugins-good}/share/gstreamer-1.0/presets"
+      # Thumbnailers
+      --prefix XDG_DATA_DIRS : "${gdk-pixbuf}/share"
+      --prefix XDG_DATA_DIRS : "${totem}/share"
+    )
+  '';
+
+  passthru = {
+    updateScript = gnome.updateScript {
+      packageName = "cheese";
+    };
+  };
+
+  meta = with lib; {
+    homepage = "https://gitlab.gnome.org/GNOME/cheese";
+    description = "Take photos and videos with your webcam, with fun graphical effects";
+    mainProgram = "cheese";
+    maintainers = [ ];
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+  };
+}
diff --git a/pkgs/by-name/co/coyim/package.nix b/pkgs/by-name/co/coyim/package.nix
index 2906d324c2ae6..9e8991b5fbe0e 100644
--- a/pkgs/by-name/co/coyim/package.nix
+++ b/pkgs/by-name/co/coyim/package.nix
@@ -6,7 +6,7 @@
 , cairo
 , gdk-pixbuf
 , glib
-, gnome
+, adwaita-icon-theme
 , wrapGAppsHook3
 , gtk3
 }:
@@ -26,7 +26,7 @@ buildGoModule {
 
   nativeBuildInputs = [ pkg-config wrapGAppsHook3 ];
 
-  buildInputs = [ glib cairo gdk-pixbuf gtk3 gnome.adwaita-icon-theme ];
+  buildInputs = [ glib cairo gdk-pixbuf gtk3 adwaita-icon-theme ];
 
   meta = {
     description = "Safe and secure chat client";
diff --git a/pkgs/by-name/dc/dconf-editor/package.nix b/pkgs/by-name/dc/dconf-editor/package.nix
new file mode 100644
index 0000000000000..44fca17bec32c
--- /dev/null
+++ b/pkgs/by-name/dc/dconf-editor/package.nix
@@ -0,0 +1,79 @@
+{ lib
+, stdenv
+, fetchurl
+, fetchpatch
+, desktop-file-utils
+, meson
+, ninja
+, vala
+, libxslt
+, pkg-config
+, glib
+, gtk3
+, libhandy
+, gnome
+, dconf
+, libxml2
+, gettext
+, docbook-xsl-nons
+, wrapGAppsHook3
+, gobject-introspection
+}:
+
+stdenv.mkDerivation rec {
+  pname = "dconf-editor";
+  version = "45.0.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "sha256-EYApdnju2uYhfMUUomOMGH0vHR7ycgy5B5t0DEKZQd0=";
+  };
+
+  patches = [
+    # Fix crash with GSETTINGS_SCHEMA_DIR env var.
+    (fetchpatch {
+      url = "https://gitlab.gnome.org/GNOME/dconf-editor/-/commit/baf183737d459dcde065c9f8f6fe5be7ed874de6.patch";
+      hash = "sha256-Vp0qjJChDr6IarUD+tZPLJhdI8v8r6EzWNfqFSnGvqQ=";
+    })
+
+    # Look for compiled schemas in NIX_GSETTINGS_OVERRIDES_DIR
+    # environment variable, to match what we patched GLib to do.
+    ./schema-override-variable.patch
+  ];
+
+  nativeBuildInputs = [
+    desktop-file-utils
+    meson
+    ninja
+    vala
+    libxslt
+    pkg-config
+    wrapGAppsHook3
+    gettext
+    docbook-xsl-nons
+    libxml2
+    gobject-introspection
+  ];
+
+  buildInputs = [
+    glib
+    gtk3
+    libhandy
+    dconf
+  ];
+
+  passthru = {
+    updateScript = gnome.updateScript {
+      packageName = pname;
+    };
+  };
+
+  meta = with lib; {
+    description = "GSettings editor for GNOME";
+    mainProgram = "dconf-editor";
+    homepage = "https://apps.gnome.org/DconfEditor/";
+    license = licenses.gpl3Plus;
+    maintainers = teams.gnome.members;
+    platforms = platforms.unix;
+  };
+}
diff --git a/pkgs/by-name/dc/dconf-editor/schema-override-variable.patch b/pkgs/by-name/dc/dconf-editor/schema-override-variable.patch
new file mode 100644
index 0000000000000..06896d1aa4ee8
--- /dev/null
+++ b/pkgs/by-name/dc/dconf-editor/schema-override-variable.patch
@@ -0,0 +1,14 @@
+diff --git a/editor/source-manager.vala b/editor/source-manager.vala
+index 27b2b17a..87f7ba86 100644
+--- a/editor/source-manager.vala
++++ b/editor/source-manager.vala
+@@ -121,6 +121,9 @@ private class SourceManager : Object
+             source = try_prepend_dir (source, Path.build_filename (system_data_dirs [i], "glib-2.0", "schemas"));
+         string user_data_dir = GLib.Environment.get_user_data_dir ();
+         source = try_prepend_dir (source, Path.build_filename (user_data_dir, "glib-2.0", "schemas"));
++        string? nix_var_schema_dir = GLib.Environment.get_variable ("NIX_GSETTINGS_OVERRIDES_DIR");
++        if (nix_var_schema_dir != null)
++            source = try_prepend_dir (source, (!) nix_var_schema_dir);
+         string? var_schema_dir = GLib.Environment.get_variable ("GSETTINGS_SCHEMA_DIR");
+         if (var_schema_dir != null) {
+             string[] extra_schema_dirs = ((!) var_schema_dir).split (Path.SEARCHPATH_SEPARATOR_S);
diff --git a/pkgs/by-name/de/devhelp/package.nix b/pkgs/by-name/de/devhelp/package.nix
new file mode 100644
index 0000000000000..97795c1d9f7a0
--- /dev/null
+++ b/pkgs/by-name/de/devhelp/package.nix
@@ -0,0 +1,87 @@
+{ stdenv
+, lib
+, fetchurl
+, meson
+, ninja
+, pkg-config
+, gnome
+, adwaita-icon-theme
+, gtk3
+, wrapGAppsHook3
+, glib
+, gobject-introspection
+, gi-docgen
+, webkitgtk_4_1
+, gettext
+, itstool
+, gsettings-desktop-schemas
+, shared-mime-info
+}:
+
+stdenv.mkDerivation rec {
+  pname = "devhelp";
+  version = "43.0";
+
+  outputs = [ "out" "devdoc" ];
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/devhelp/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "Y87u/QU5LgIESIHvHs1yQpNVPaVzW378CCstE/6F3QQ=";
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    gettext
+    itstool
+    wrapGAppsHook3
+    gobject-introspection
+    gi-docgen
+    # post install script
+    glib
+    gtk3
+  ];
+
+  buildInputs = [
+    glib
+    gtk3
+    webkitgtk_4_1
+    adwaita-icon-theme
+    gsettings-desktop-schemas
+  ];
+
+  mesonFlags = [
+    "-Dgtk_doc=true"
+  ];
+
+  doCheck = true;
+
+  preFixup = ''
+    gappsWrapperArgs+=(
+      # Fix pages being blank
+      # https://gitlab.gnome.org/GNOME/devhelp/issues/14
+      --prefix XDG_DATA_DIRS : "${shared-mime-info}/share"
+    )
+  '';
+
+  postFixup = ''
+    # Cannot be in postInstall, otherwise _multioutDocs hook in preFixup will move right back.
+    moveToOutput share/doc/devhelp-3 "$devdoc"
+  '';
+
+  passthru = {
+    updateScript = gnome.updateScript {
+      packageName = "devhelp";
+    };
+  };
+
+  meta = with lib; {
+    description = "API documentation browser for GNOME";
+    mainProgram = "devhelp";
+    homepage = "https://apps.gnome.org/Devhelp/";
+    license = licenses.gpl3Plus;
+    maintainers = teams.gnome.members;
+    platforms = platforms.linux;
+  };
+}
diff --git a/pkgs/by-name/eo/eog/fix-gir-lib-path.patch b/pkgs/by-name/eo/eog/fix-gir-lib-path.patch
new file mode 100644
index 0000000000000..eb087b58a3176
--- /dev/null
+++ b/pkgs/by-name/eo/eog/fix-gir-lib-path.patch
@@ -0,0 +1,13 @@
+diff --git a/src/meson.build b/src/meson.build
+index cc9d3856..f909836d 100644
+--- a/src/meson.build
++++ b/src/meson.build
+@@ -165,7 +165,7 @@ libeog = shared_library(
+   link_args: ldflags,
+   link_depends: symbol_map,
+   install: true,
+-  install_dir: eog_pkglibdir,
++  install_dir: eog_prefix / eog_pkglibdir,
+ )
+ 
+ libeog_dep = declare_dependency(
diff --git a/pkgs/by-name/eo/eog/package.nix b/pkgs/by-name/eo/eog/package.nix
new file mode 100644
index 0000000000000..ec1e7f61ee512
--- /dev/null
+++ b/pkgs/by-name/eo/eog/package.nix
@@ -0,0 +1,126 @@
+{ lib
+, stdenv
+, fetchurl
+, meson
+, ninja
+, gettext
+, itstool
+, pkg-config
+, libxml2
+, libjpeg
+, libpeas
+, libportal-gtk3
+, gnome
+, gtk3
+, libhandy
+, glib
+, gsettings-desktop-schemas
+, gnome-desktop
+, lcms2
+, gdk-pixbuf
+, exempi
+, shared-mime-info
+, wrapGAppsHook3
+, libjxl
+, librsvg
+, webp-pixbuf-loader
+, libheif
+, libexif
+, gobject-introspection
+, gi-docgen
+}:
+
+stdenv.mkDerivation rec {
+  pname = "eog";
+  version = "45.3";
+
+  outputs = [ "out" "dev" "devdoc" ];
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "sha256-hlD2YtSSHYOnkE9rucokW69zX3F7R/rFs38NkOXokag=";
+  };
+
+  patches = [
+    # Fix path to libeog.so in the gir file.
+    # We patch gobject-introspection to hardcode absolute paths but
+    # our Meson patch will only pass the info when install_dir is absolute as well.
+    ./fix-gir-lib-path.patch
+  ];
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    gettext
+    itstool
+    wrapGAppsHook3
+    libxml2 # for xmllint for xml-stripblanks
+    gobject-introspection
+    gi-docgen
+  ];
+
+  buildInputs = [
+    libjpeg
+    libportal-gtk3
+    gtk3
+    libhandy
+    gdk-pixbuf
+    glib
+    libpeas
+    librsvg
+    lcms2
+    gnome-desktop
+    libexif
+    exempi
+    gsettings-desktop-schemas
+    shared-mime-info
+  ];
+
+  mesonFlags = [
+    "-Dgtk_doc=true"
+  ];
+
+  postInstall = ''
+    # Pull in WebP and JXL support for gnome-backgrounds.
+    # In postInstall to run before gappsWrapperArgsHook.
+    export GDK_PIXBUF_MODULE_FILE="${gnome._gdkPixbufCacheBuilder_DO_NOT_USE {
+      extraLoaders = [
+        libjxl
+        librsvg
+        webp-pixbuf-loader
+        libheif.out
+      ];
+    }}"
+  '';
+
+  preFixup = ''
+    gappsWrapperArgs+=(
+      # Thumbnailers
+      --prefix XDG_DATA_DIRS : "${gdk-pixbuf}/share"
+      --prefix XDG_DATA_DIRS : "${libjxl}/share"
+      --prefix XDG_DATA_DIRS : "${librsvg}/share"
+      --prefix XDG_DATA_DIRS : "${shared-mime-info}/share"
+    )
+  '';
+
+  postFixup = ''
+    # Cannot be in postInstall, otherwise _multioutDocs hook in preFixup will move right back.
+    moveToOutput "share/doc" "$devdoc"
+  '';
+
+  passthru = {
+    updateScript = gnome.updateScript {
+      packageName = pname;
+    };
+  };
+
+  meta = with lib; {
+    description = "GNOME image viewer";
+    homepage = "https://gitlab.gnome.org/GNOME/eog";
+    license = licenses.gpl2Plus;
+    maintainers = teams.gnome.members;
+    platforms = platforms.unix;
+    mainProgram = "eog";
+  };
+}
diff --git a/pkgs/by-name/ep/epiphany/package.nix b/pkgs/by-name/ep/epiphany/package.nix
new file mode 100644
index 0000000000000..c4edd298aff75
--- /dev/null
+++ b/pkgs/by-name/ep/epiphany/package.nix
@@ -0,0 +1,109 @@
+{ lib
+, stdenv
+, meson
+, ninja
+, gettext
+, fetchurl
+, pkg-config
+, gtk4
+, glib
+, icu
+, wrapGAppsHook4
+, gnome
+, libportal-gtk4
+, libxml2
+, itstool
+, webkitgtk_6_0
+, libsoup_3
+, glib-networking
+, libsecret
+, gnome-desktop
+, libarchive
+, p11-kit
+, sqlite
+, gcr_4
+, isocodes
+, desktop-file-utils
+, nettle
+, gdk-pixbuf
+, gst_all_1
+, json-glib
+, libadwaita
+, buildPackages
+, withPantheon ? false
+, pantheon
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "epiphany";
+  version = "46.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/epiphany/${lib.versions.major finalAttrs.version}/epiphany-${finalAttrs.version}.tar.xz";
+    hash = "sha256-Jg+BRp7WR0bCsRQ/Lzi+3NloR3hlZ7CX2fcv072dsUI=";
+  };
+
+  nativeBuildInputs = [
+    desktop-file-utils
+    gettext
+    itstool
+    meson
+    ninja
+    pkg-config
+    wrapGAppsHook4
+    buildPackages.glib
+    buildPackages.gtk4
+  ];
+
+  buildInputs = [
+    gcr_4
+    gdk-pixbuf
+    glib
+    glib-networking
+    gnome-desktop
+    gst_all_1.gst-libav
+    gst_all_1.gst-plugins-bad
+    gst_all_1.gst-plugins-base
+    gst_all_1.gst-plugins-good
+    gst_all_1.gst-plugins-ugly
+    gst_all_1.gstreamer
+    gtk4
+    icu
+    isocodes
+    json-glib
+    libadwaita
+    libportal-gtk4
+    libarchive
+    libsecret
+    libsoup_3
+    libxml2
+    nettle
+    p11-kit
+    sqlite
+    webkitgtk_6_0
+  ] ++ lib.optionals withPantheon [
+    pantheon.granite7
+  ];
+
+  # Tests need an X display
+  mesonFlags = [
+    "-Dunit_tests=disabled"
+  ] ++ lib.optionals withPantheon [
+    "-Dgranite=enabled"
+  ];
+
+  passthru = {
+    updateScript = gnome.updateScript {
+      packageName = "epiphany";
+    };
+  };
+
+  meta = with lib; {
+    homepage = "https://apps.gnome.org/Epiphany/";
+    description = "WebKit based web browser for GNOME";
+    mainProgram = "epiphany";
+    maintainers = teams.gnome.members ++ teams.pantheon.members;
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+  };
+})
diff --git a/pkgs/by-name/ev/evince/package.nix b/pkgs/by-name/ev/evince/package.nix
new file mode 100644
index 0000000000000..a9192f33d000a
--- /dev/null
+++ b/pkgs/by-name/ev/evince/package.nix
@@ -0,0 +1,144 @@
+{ lib
+, stdenv
+, fetchurl
+, meson
+, ninja
+, pkg-config
+, gettext
+, libxml2
+, appstream
+, desktop-file-utils
+, glib
+, gtk3
+, pango
+, atk
+, gdk-pixbuf
+, shared-mime-info
+, itstool
+, gnome
+, poppler
+, ghostscriptX
+, djvulibre
+, libspectre
+, libarchive
+, libhandy
+, libsecret
+, wrapGAppsHook3
+, librsvg
+, gobject-introspection
+, yelp-tools
+, gspell
+, gsettings-desktop-schemas
+, gnome-desktop
+, dbus
+, texlive
+, gst_all_1
+, gi-docgen
+, supportMultimedia ? true # PDF multimedia
+, libgxps
+, supportXPS ? true # Open XML Paper Specification via libgxps
+, withLibsecret ? true
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "evince";
+  version = "46.3";
+
+  outputs = [ "out" "dev" "devdoc" ];
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/evince/${lib.versions.major finalAttrs.version}/evince-${finalAttrs.version}.tar.xz";
+    hash = "sha256-vA0dQbnX/8di6Z0qv6+sv3RRgvCzHYbbXuyMZ/XzAGs=";
+  };
+
+  depsBuildBuild = [
+    pkg-config
+  ];
+
+  nativeBuildInputs = [
+    appstream
+    desktop-file-utils
+    gettext
+    gobject-introspection
+    gi-docgen
+    itstool
+    meson
+    ninja
+    pkg-config
+    wrapGAppsHook3
+    yelp-tools
+  ];
+
+  buildInputs = [
+    atk
+    dbus # only needed to find the service directory
+    djvulibre
+    gdk-pixbuf
+    ghostscriptX
+    glib
+    gnome-desktop
+    gsettings-desktop-schemas
+    gspell
+    gtk3
+    libarchive
+    libhandy
+    librsvg
+    libspectre
+    libxml2
+    pango
+    poppler
+    texlive.bin.core # kpathsea for DVI support
+  ] ++ lib.optionals withLibsecret [
+    libsecret
+  ] ++ lib.optionals supportXPS [
+    libgxps
+  ] ++ lib.optionals supportMultimedia (with gst_all_1; [
+    gstreamer
+    gst-plugins-base
+    gst-plugins-good
+    gst-plugins-bad
+    gst-plugins-ugly
+    gst-libav
+  ]);
+
+  mesonFlags = [
+    "-Dnautilus=false"
+    "-Dps=enabled"
+  ] ++ lib.optionals (!withLibsecret) [
+    "-Dkeyring=disabled"
+  ] ++ lib.optionals (!supportMultimedia) [
+    "-Dmultimedia=disabled"
+  ];
+
+  preFixup = ''
+    gappsWrapperArgs+=(--prefix XDG_DATA_DIRS : "${shared-mime-info}/share")
+  '';
+
+  postFixup = ''
+    # Cannot be in postInstall, otherwise _multioutDocs hook in preFixup will move right back.
+    moveToOutput "share/doc" "$devdoc"
+  '';
+
+  passthru = {
+    updateScript = gnome.updateScript {
+      packageName = "evince";
+    };
+  };
+
+  meta = with lib; {
+    homepage = "https://apps.gnome.org/Evince/";
+    description = "GNOME's document viewer";
+
+    longDescription = ''
+      Evince is a document viewer for multiple document formats.  It
+      currently supports PDF, PostScript, DjVu, TIFF and DVI.  The goal
+      of Evince is to replace the multiple document viewers that exist
+      on the GNOME Desktop with a single simple application.
+    '';
+
+    license = licenses.gpl2Plus;
+    platforms = platforms.unix;
+    mainProgram = "evince";
+    maintainers = teams.gnome.members ++ teams.pantheon.members;
+  };
+})
diff --git a/pkgs/by-name/ev/evolution-data-server/drop-tentative-settings-constructor.patch b/pkgs/by-name/ev/evolution-data-server/drop-tentative-settings-constructor.patch
new file mode 100644
index 0000000000000..a86d1966eb6bc
--- /dev/null
+++ b/pkgs/by-name/ev/evolution-data-server/drop-tentative-settings-constructor.patch
@@ -0,0 +1,40 @@
+diff --git a/src/calendar/libecal/e-reminder-watcher.c b/src/calendar/libecal/e-reminder-watcher.c
+index f1614f2..c01e8b2 100644
+--- a/src/calendar/libecal/e-reminder-watcher.c
++++ b/src/calendar/libecal/e-reminder-watcher.c
+@@ -2609,26 +2609,6 @@ e_reminder_watcher_load_clock_format (EReminderWatcher *watcher)
+ 	g_free (clock_format);
+ }
+ 
+-static GSettings*
+-e_reminder_watcher_load_settings_tentative (const gchar *schema_id)
+-{
+-	GSettings *settings;
+-	GSettingsSchemaSource *schema_source;
+-	GSettingsSchema *schema;
+-
+-	schema_source = g_settings_schema_source_get_default ();
+-	schema = g_settings_schema_source_lookup (schema_source, schema_id, TRUE);
+-
+-	if (schema == NULL) {
+-		return NULL;
+-	}
+-
+-	settings = g_settings_new (schema_id);
+-	/* only unref after g_settings_new() to avoid needless realloc */
+-	g_settings_schema_unref (schema);
+-	return settings;
+-}
+-
+ static void
+ e_reminder_watcher_init (EReminderWatcher *watcher)
+ {
+@@ -2647,7 +2627,7 @@ e_reminder_watcher_init (EReminderWatcher *watcher)
+ 	watcher->priv = e_reminder_watcher_get_instance_private (watcher);
+ 	watcher->priv->cancellable = g_cancellable_new ();
+ 	watcher->priv->settings = g_settings_new ("org.gnome.evolution-data-server.calendar");
+-	watcher->priv->desktop_settings = e_reminder_watcher_load_settings_tentative ("org.gnome.desktop.interface");
++	watcher->priv->desktop_settings = g_settings_new ("org.gnome.desktop.interface");
+ 	if (watcher->priv->desktop_settings) {
+ 		g_signal_connect_object (
+ 			watcher->priv->desktop_settings,
diff --git a/pkgs/by-name/ev/evolution-data-server/fix-paths.patch b/pkgs/by-name/ev/evolution-data-server/fix-paths.patch
new file mode 100644
index 0000000000000..334235516591f
--- /dev/null
+++ b/pkgs/by-name/ev/evolution-data-server/fix-paths.patch
@@ -0,0 +1,11 @@
+--- a/src/calendar/libecal/e-cal-system-timezone.c
++++ b/src/calendar/libecal/e-cal-system-timezone.c
+@@ -26,7 +26,7 @@
+ #ifdef HAVE_SOLARIS
+ #define SYSTEM_ZONEINFODIR "/usr/share/lib/zoneinfo/tab"
+ #else
+-#define SYSTEM_ZONEINFODIR "/usr/share/zoneinfo"
++#define SYSTEM_ZONEINFODIR "@tzdata@/share/zoneinfo"
+ #endif
+ 
+ #define ETC_TIMEZONE        "/etc/timezone"
diff --git a/pkgs/by-name/ev/evolution-data-server/hardcode-gsettings.patch b/pkgs/by-name/ev/evolution-data-server/hardcode-gsettings.patch
new file mode 100644
index 0000000000000..140e124fe4bbb
--- /dev/null
+++ b/pkgs/by-name/ev/evolution-data-server/hardcode-gsettings.patch
@@ -0,0 +1,652 @@
+diff --git a/src/addressbook/libebook/e-book-client.c b/src/addressbook/libebook/e-book-client.c
+index 5e65ec8..8ca28c6 100644
+--- a/src/addressbook/libebook/e-book-client.c
++++ b/src/addressbook/libebook/e-book-client.c
+@@ -1924,7 +1924,18 @@ e_book_client_get_self (ESourceRegistry *registry,
+ 
+ 	*out_client = book_client;
+ 
+-	settings = g_settings_new (SELF_UID_PATH_ID);
++	{
++		g_autoptr(GSettingsSchemaSource) schema_source;
++		g_autoptr(GSettingsSchema) schema;
++		schema_source = g_settings_schema_source_new_from_directory("@EDS@",
++									    g_settings_schema_source_get_default(),
++									    TRUE,
++									    NULL);
++		schema = g_settings_schema_source_lookup(schema_source,
++							 SELF_UID_PATH_ID,
++							 FALSE);
++		settings = g_settings_new_full(schema, NULL, NULL);
++	}
+ 	uid = g_settings_get_string (settings, SELF_UID_KEY);
+ 	g_object_unref (settings);
+ 
+@@ -1992,7 +2003,18 @@ e_book_client_set_self (EBookClient *client,
+ 	g_return_val_if_fail (
+ 		e_contact_get_const (contact, E_CONTACT_UID) != NULL, FALSE);
+ 
+-	settings = g_settings_new (SELF_UID_PATH_ID);
++	{
++		g_autoptr(GSettingsSchemaSource) schema_source;
++		g_autoptr(GSettingsSchema) schema;
++		schema_source = g_settings_schema_source_new_from_directory("@EDS@",
++									    g_settings_schema_source_get_default(),
++									    TRUE,
++									    NULL);
++		schema = g_settings_schema_source_lookup(schema_source,
++							 SELF_UID_PATH_ID,
++							 FALSE);
++		settings = g_settings_new_full(schema, NULL, NULL);
++	}
+ 	g_settings_set_string (
+ 		settings, SELF_UID_KEY,
+ 		e_contact_get_const (contact, E_CONTACT_UID));
+@@ -2028,8 +2050,18 @@ e_book_client_is_self (EContact *contact)
+ 	 * unfortunately the API doesn't allow that.
+ 	 */
+ 	g_mutex_lock (&mutex);
+-	if (!settings)
+-		settings = g_settings_new (SELF_UID_PATH_ID);
++	if (!settings) {
++		g_autoptr(GSettingsSchemaSource) schema_source;
++		g_autoptr(GSettingsSchema) schema;
++		schema_source = g_settings_schema_source_new_from_directory("@EDS@",
++									    g_settings_schema_source_get_default(),
++									    TRUE,
++									    NULL);
++		schema = g_settings_schema_source_lookup(schema_source,
++							 SELF_UID_PATH_ID,
++							 FALSE);
++		settings = g_settings_new_full(schema, NULL, NULL);
++	}
+ 	uid = g_settings_get_string (settings, SELF_UID_KEY);
+ 	g_mutex_unlock (&mutex);
+ 
+diff --git a/src/addressbook/libebook/e-book.c b/src/addressbook/libebook/e-book.c
+index e85a56b..59d3fe2 100644
+--- a/src/addressbook/libebook/e-book.c
++++ b/src/addressbook/libebook/e-book.c
+@@ -2587,7 +2587,18 @@ e_book_get_self (ESourceRegistry *registry,
+ 		return FALSE;
+ 	}
+ 
+-	settings = g_settings_new (SELF_UID_PATH_ID);
++	{
++		g_autoptr(GSettingsSchemaSource) schema_source;
++		g_autoptr(GSettingsSchema) schema;
++		schema_source = g_settings_schema_source_new_from_directory("@EDS@",
++									    g_settings_schema_source_get_default(),
++									    TRUE,
++									    NULL);
++		schema = g_settings_schema_source_lookup(schema_source,
++							 SELF_UID_PATH_ID,
++							 FALSE);
++		settings = g_settings_new_full(schema, NULL, NULL);
++	}
+ 	uid = g_settings_get_string (settings, SELF_UID_KEY);
+ 	g_object_unref (settings);
+ 
+@@ -2642,7 +2653,18 @@ e_book_set_self (EBook *book,
+ 	g_return_val_if_fail (E_IS_BOOK (book), FALSE);
+ 	g_return_val_if_fail (E_IS_CONTACT (contact), FALSE);
+ 
+-	settings = g_settings_new (SELF_UID_PATH_ID);
++	{
++		g_autoptr(GSettingsSchemaSource) schema_source;
++		g_autoptr(GSettingsSchema) schema;
++		schema_source = g_settings_schema_source_new_from_directory("@EDS@",
++									    g_settings_schema_source_get_default(),
++									    TRUE,
++									    NULL);
++		schema = g_settings_schema_source_lookup(schema_source,
++							 SELF_UID_PATH_ID,
++							 FALSE);
++		settings = g_settings_new_full(schema, NULL, NULL);
++	}
+ 	g_settings_set_string (
+ 		settings, SELF_UID_KEY,
+ 		e_contact_get_const (contact, E_CONTACT_UID));
+@@ -2670,7 +2692,18 @@ e_book_is_self (EContact *contact)
+ 
+ 	g_return_val_if_fail (E_IS_CONTACT (contact), FALSE);
+ 
+-	settings = g_settings_new (SELF_UID_PATH_ID);
++	{
++		g_autoptr(GSettingsSchemaSource) schema_source;
++		g_autoptr(GSettingsSchema) schema;
++		schema_source = g_settings_schema_source_new_from_directory("@EDS@",
++									    g_settings_schema_source_get_default(),
++									    TRUE,
++									    NULL);
++		schema = g_settings_schema_source_lookup(schema_source,
++							 SELF_UID_PATH_ID,
++							 FALSE);
++		settings = g_settings_new_full(schema, NULL, NULL);
++	}
+ 	uid = g_settings_get_string (settings, SELF_UID_KEY);
+ 	g_object_unref (settings);
+ 
+diff --git a/src/addressbook/libedata-book/e-book-meta-backend.c b/src/addressbook/libedata-book/e-book-meta-backend.c
+index 5b4debf..77c8d9c 100644
+--- a/src/addressbook/libedata-book/e-book-meta-backend.c
++++ b/src/addressbook/libedata-book/e-book-meta-backend.c
+@@ -144,7 +144,18 @@ ebmb_is_power_saver_enabled (void)
+ 	GSettings *settings;
+ 	gboolean enabled = FALSE;
+ 
+-	settings = g_settings_new ("org.gnome.evolution-data-server");
++	{
++		g_autoptr(GSettingsSchemaSource) schema_source;
++		g_autoptr(GSettingsSchema) schema;
++		schema_source = g_settings_schema_source_new_from_directory("@EDS@",
++									    g_settings_schema_source_get_default(),
++									    TRUE,
++									    NULL);
++		schema = g_settings_schema_source_lookup(schema_source,
++							 "org.gnome.evolution-data-server",
++							 FALSE);
++		settings = g_settings_new_full(schema, NULL, NULL);
++	}
+ 
+ 	if (g_settings_get_boolean (settings, "limit-operations-in-power-saver-mode")) {
+ 		GPowerProfileMonitor *power_monitor;
+diff --git a/src/calendar/backends/contacts/e-cal-backend-contacts.c b/src/calendar/backends/contacts/e-cal-backend-contacts.c
+index 43bd383..4dce824 100644
+--- a/src/calendar/backends/contacts/e-cal-backend-contacts.c
++++ b/src/calendar/backends/contacts/e-cal-backend-contacts.c
+@@ -1369,7 +1369,18 @@ e_cal_backend_contacts_init (ECalBackendContacts *cbc)
+ 		(GDestroyNotify) g_free,
+ 		(GDestroyNotify) contact_record_free);
+ 
+-	cbc->priv->settings = g_settings_new ("org.gnome.evolution-data-server.calendar");
++	{
++		g_autoptr(GSettingsSchemaSource) schema_source;
++		g_autoptr(GSettingsSchema) schema;
++		schema_source = g_settings_schema_source_new_from_directory("@EDS@",
++									    g_settings_schema_source_get_default(),
++									    TRUE,
++									    NULL);
++		schema = g_settings_schema_source_lookup(schema_source,
++							 "org.gnome.evolution-data-server.calendar",
++							 FALSE);
++		cbc->priv->settings = g_settings_new_full(schema, NULL, NULL);
++	}
+ 	cbc->priv->notifyid = 0;
+ 	cbc->priv->update_alarms_id = 0;
+ 	cbc->priv->alarm_enabled = FALSE;
+diff --git a/src/calendar/backends/file/e-cal-backend-file.c b/src/calendar/backends/file/e-cal-backend-file.c
+index 2525856..7ecc1a8 100644
+--- a/src/calendar/backends/file/e-cal-backend-file.c
++++ b/src/calendar/backends/file/e-cal-backend-file.c
+@@ -3682,7 +3682,20 @@ e_cal_backend_file_receive_objects (ECalBackendSync *backend,
+ 			if (is_declined) {
+ 				GSettings *settings;
+ 
+-				settings = g_settings_new ("org.gnome.evolution-data-server.calendar");
++				{
++					g_autoptr(GSettingsSchemaSource) schema_source;
++					g_autoptr(GSettingsSchema) schema;
++					schema_source = g_settings_schema_source_new_from_directory("@EDS@",
++												    g_settings_schema_source_get_default(),
++												    TRUE,
++												    NULL);
++					schema = g_settings_schema_source_lookup(schema_source,
++										 "org.gnome.evolution-data-server.calendar",
++										 FALSE);
++					settings = g_settings_new_full(schema,
++								       NULL,
++								       NULL);
++				}
+ 				can_delete = g_settings_get_boolean (settings, "delete-meeting-on-decline");
+ 				g_clear_object (&settings);
+ 			}
+diff --git a/src/calendar/libecal/e-reminder-watcher.c b/src/calendar/libecal/e-reminder-watcher.c
+index 44ba49c..dfac2a2 100644
+--- a/src/calendar/libecal/e-reminder-watcher.c
++++ b/src/calendar/libecal/e-reminder-watcher.c
+@@ -2826,8 +2826,33 @@ e_reminder_watcher_init (EReminderWatcher *watcher)
+ 
+ 	watcher->priv = e_reminder_watcher_get_instance_private (watcher);
+ 	watcher->priv->cancellable = g_cancellable_new ();
+-	watcher->priv->settings = g_settings_new ("org.gnome.evolution-data-server.calendar");
+-	watcher->priv->desktop_settings = g_settings_new ("org.gnome.desktop.interface");
++	{
++		g_autoptr(GSettingsSchemaSource) schema_source;
++		g_autoptr(GSettingsSchema) schema;
++		schema_source = g_settings_schema_source_new_from_directory("@EDS@",
++									    g_settings_schema_source_get_default(),
++									    TRUE,
++									    NULL);
++		schema = g_settings_schema_source_lookup(schema_source,
++							 "org.gnome.evolution-data-server.calendar",
++							 FALSE);
++		watcher->priv->settings = g_settings_new_full(schema, NULL,
++							      NULL);
++	}
++	{
++		g_autoptr(GSettingsSchemaSource) schema_source;
++		g_autoptr(GSettingsSchema) schema;
++		schema_source = g_settings_schema_source_new_from_directory("@GDS@",
++									    g_settings_schema_source_get_default(),
++									    TRUE,
++									    NULL);
++		schema = g_settings_schema_source_lookup(schema_source,
++							 "org.gnome.desktop.interface",
++							 FALSE);
++		watcher->priv->desktop_settings = g_settings_new_full(schema,
++								      NULL,
++								      NULL);
++	}
+ 	if (watcher->priv->desktop_settings) {
+ 		g_signal_connect_object (
+ 			watcher->priv->desktop_settings,
+diff --git a/src/calendar/libedata-cal/e-cal-meta-backend.c b/src/calendar/libedata-cal/e-cal-meta-backend.c
+index e0e9169..a44f52c 100644
+--- a/src/calendar/libedata-cal/e-cal-meta-backend.c
++++ b/src/calendar/libedata-cal/e-cal-meta-backend.c
+@@ -156,7 +156,18 @@ ecmb_is_power_saver_enabled (void)
+ 	GSettings *settings;
+ 	gboolean enabled = FALSE;
+ 
+-	settings = g_settings_new ("org.gnome.evolution-data-server");
++	{
++		g_autoptr(GSettingsSchemaSource) schema_source;
++		g_autoptr(GSettingsSchema) schema;
++		schema_source = g_settings_schema_source_new_from_directory("@EDS@",
++									    g_settings_schema_source_get_default(),
++									    TRUE,
++									    NULL);
++		schema = g_settings_schema_source_lookup(schema_source,
++							 "org.gnome.evolution-data-server",
++							 FALSE);
++		settings = g_settings_new_full(schema, NULL, NULL);
++	}
+ 
+ 	if (g_settings_get_boolean (settings, "limit-operations-in-power-saver-mode")) {
+ 		GPowerProfileMonitor *power_monitor;
+@@ -2627,7 +2638,20 @@ ecmb_receive_object_sync (ECalMetaBackend *meta_backend,
+ 			if (is_declined) {
+ 				GSettings *settings;
+ 
+-				settings = g_settings_new ("org.gnome.evolution-data-server.calendar");
++				{
++					g_autoptr(GSettingsSchemaSource) schema_source;
++					g_autoptr(GSettingsSchema) schema;
++					schema_source = g_settings_schema_source_new_from_directory("@EDS@",
++												    g_settings_schema_source_get_default(),
++												    TRUE,
++												    NULL);
++					schema = g_settings_schema_source_lookup(schema_source,
++										 "org.gnome.evolution-data-server.calendar",
++										 FALSE);
++					settings = g_settings_new_full(schema,
++								       NULL,
++								       NULL);
++				}
+ 				is_declined = g_settings_get_boolean (settings, "delete-meeting-on-decline");
+ 				g_clear_object (&settings);
+ 			}
+diff --git a/src/camel/camel-cipher-context.c b/src/camel/camel-cipher-context.c
+index d5a0823..2ae03f8 100644
+--- a/src/camel/camel-cipher-context.c
++++ b/src/camel/camel-cipher-context.c
+@@ -1631,7 +1631,18 @@ camel_cipher_can_load_photos (void)
+ 	GSettings *settings;
+ 	gboolean load_photos;
+ 
+-	settings = g_settings_new ("org.gnome.evolution-data-server");
++	{
++		g_autoptr(GSettingsSchemaSource) schema_source;
++		g_autoptr(GSettingsSchema) schema;
++		schema_source = g_settings_schema_source_new_from_directory("@EDS@",
++									    g_settings_schema_source_get_default(),
++									    TRUE,
++									    NULL);
++		schema = g_settings_schema_source_lookup(schema_source,
++							 "org.gnome.evolution-data-server",
++							 FALSE);
++		settings = g_settings_new_full(schema, NULL, NULL);
++	}
+ 	load_photos = g_settings_get_boolean (settings, "camel-cipher-load-photos");
+ 	g_clear_object (&settings);
+ 
+diff --git a/src/camel/camel-gpg-context.c b/src/camel/camel-gpg-context.c
+index cceba4a..d3c4da6 100644
+--- a/src/camel/camel-gpg-context.c
++++ b/src/camel/camel-gpg-context.c
+@@ -747,7 +747,18 @@ gpg_ctx_get_executable_name (void)
+ 		GSettings *settings;
+ 		gchar *path;
+ 
+-		settings = g_settings_new ("org.gnome.evolution-data-server");
++		{
++			g_autoptr(GSettingsSchemaSource) schema_source;
++			g_autoptr(GSettingsSchema) schema;
++			schema_source = g_settings_schema_source_new_from_directory("@EDS@",
++										    g_settings_schema_source_get_default(),
++										    TRUE,
++										    NULL);
++			schema = g_settings_schema_source_lookup(schema_source,
++								 "org.gnome.evolution-data-server",
++								 FALSE);
++			settings = g_settings_new_full(schema, NULL, NULL);
++		}
+ 		path = g_settings_get_string (settings, "camel-gpg-binary");
+ 		g_clear_object (&settings);
+ 
+diff --git a/src/camel/camel-utils.c b/src/camel/camel-utils.c
+index e61160c..b6553a4 100644
+--- a/src/camel/camel-utils.c
++++ b/src/camel/camel-utils.c
+@@ -362,7 +362,19 @@ void
+ _camel_utils_initialize (void)
+ {
+ 	G_LOCK (mi_user_headers);
+-	mi_user_headers_settings = g_settings_new ("org.gnome.evolution-data-server");
++	{
++		g_autoptr(GSettingsSchemaSource) schema_source;
++		g_autoptr(GSettingsSchema) schema;
++		schema_source = g_settings_schema_source_new_from_directory("@EDS@",
++									    g_settings_schema_source_get_default(),
++									    TRUE,
++									    NULL);
++		schema = g_settings_schema_source_lookup(schema_source,
++							 "org.gnome.evolution-data-server",
++							 FALSE);
++		mi_user_headers_settings = g_settings_new_full(schema, NULL,
++							       NULL);
++	}
+ 	g_signal_connect (mi_user_headers_settings, "changed::camel-message-info-user-headers",
+ 		G_CALLBACK (mi_user_headers_settings_changed_cb), NULL);
+ 	G_UNLOCK (mi_user_headers);
+diff --git a/src/camel/providers/imapx/camel-imapx-server.c b/src/camel/providers/imapx/camel-imapx-server.c
+index 56429a9..a9cc62c 100644
+--- a/src/camel/providers/imapx/camel-imapx-server.c
++++ b/src/camel/providers/imapx/camel-imapx-server.c
+@@ -5682,7 +5682,18 @@ camel_imapx_server_do_old_flags_update (CamelFolder *folder)
+ 	if (do_old_flags_update) {
+ 		GSettings *eds_settings;
+ 
+-		eds_settings = g_settings_new ("org.gnome.evolution-data-server");
++		{
++			g_autoptr(GSettingsSchemaSource) schema_source;
++			g_autoptr(GSettingsSchema) schema;
++			schema_source = g_settings_schema_source_new_from_directory("@EDS@",
++										    g_settings_schema_source_get_default(),
++										    TRUE,
++										    NULL);
++			schema = g_settings_schema_source_lookup(schema_source,
++								 "org.gnome.evolution-data-server",
++								 FALSE);
++			eds_settings = g_settings_new_full(schema, NULL, NULL);
++		}
+ 
+ 		if (g_settings_get_boolean (eds_settings, "limit-operations-in-power-saver-mode")) {
+ 			GPowerProfileMonitor *power_monitor;
+diff --git a/src/camel/providers/smtp/camel-smtp-transport.c b/src/camel/providers/smtp/camel-smtp-transport.c
+index 6556f1e..90f0a5e 100644
+--- a/src/camel/providers/smtp/camel-smtp-transport.c
++++ b/src/camel/providers/smtp/camel-smtp-transport.c
+@@ -1471,7 +1471,18 @@ smtp_helo (CamelSmtpTransport *transport,
+ 		transport->authtypes = NULL;
+ 	}
+ 
+-	settings = g_settings_new ("org.gnome.evolution-data-server");
++	{
++		g_autoptr(GSettingsSchemaSource) schema_source;
++		g_autoptr(GSettingsSchema) schema;
++		schema_source = g_settings_schema_source_new_from_directory("@EDS@",
++									    g_settings_schema_source_get_default(),
++									    TRUE,
++									    NULL);
++		schema = g_settings_schema_source_lookup(schema_source,
++							 "org.gnome.evolution-data-server",
++							 FALSE);
++		settings = g_settings_new_full(schema, NULL, NULL);
++	}
+ 	name = g_settings_get_string (settings, "camel-smtp-helo-argument");
+ 	g_clear_object (&settings);
+ 
+diff --git a/src/libedataserver/e-network-monitor.c b/src/libedataserver/e-network-monitor.c
+index 188f276..939f89b 100644
+--- a/src/libedataserver/e-network-monitor.c
++++ b/src/libedataserver/e-network-monitor.c
+@@ -256,7 +256,18 @@ e_network_monitor_constructed (GObject *object)
+ 	/* Chain up to parent's method. */
+ 	G_OBJECT_CLASS (e_network_monitor_parent_class)->constructed (object);
+ 
+-	settings = g_settings_new ("org.gnome.evolution-data-server");
++	{
++		g_autoptr(GSettingsSchemaSource) schema_source;
++		g_autoptr(GSettingsSchema) schema;
++		schema_source = g_settings_schema_source_new_from_directory("@EDS@",
++									    g_settings_schema_source_get_default(),
++									    TRUE,
++									    NULL);
++		schema = g_settings_schema_source_lookup(schema_source,
++							 "org.gnome.evolution-data-server",
++							 FALSE);
++		settings = g_settings_new_full(schema, NULL, NULL);
++	}
+ 	g_settings_bind (
+ 		settings, "network-monitor-gio-name",
+ 		object, "gio-name",
+diff --git a/src/libedataserver/e-oauth2-service-google.c b/src/libedataserver/e-oauth2-service-google.c
+index 1453410..a3f06b0 100644
+--- a/src/libedataserver/e-oauth2-service-google.c
++++ b/src/libedataserver/e-oauth2-service-google.c
+@@ -72,7 +72,18 @@ eos_google_read_settings (EOAuth2Service *service,
+ 	if (!value) {
+ 		GSettings *settings;
+ 
+-		settings = g_settings_new ("org.gnome.evolution-data-server");
++		{
++			g_autoptr(GSettingsSchemaSource) schema_source;
++			g_autoptr(GSettingsSchema) schema;
++			schema_source = g_settings_schema_source_new_from_directory("@EDS@",
++										    g_settings_schema_source_get_default(),
++										    TRUE,
++										    NULL);
++			schema = g_settings_schema_source_lookup(schema_source,
++								 "org.gnome.evolution-data-server",
++								 FALSE);
++			settings = g_settings_new_full(schema, NULL, NULL);
++		}
+ 		value = g_settings_get_string (settings, key_name);
+ 		g_object_unref (settings);
+ 
+diff --git a/src/libedataserver/e-oauth2-service-outlook.c b/src/libedataserver/e-oauth2-service-outlook.c
+index 734f194..5b05077 100644
+--- a/src/libedataserver/e-oauth2-service-outlook.c
++++ b/src/libedataserver/e-oauth2-service-outlook.c
+@@ -75,7 +75,18 @@ eos_outlook_read_settings (EOAuth2Service *service,
+ 	if (!value) {
+ 		GSettings *settings;
+ 
+-		settings = g_settings_new ("org.gnome.evolution-data-server");
++		{
++			g_autoptr(GSettingsSchemaSource) schema_source;
++			g_autoptr(GSettingsSchema) schema;
++			schema_source = g_settings_schema_source_new_from_directory("@EDS@",
++										    g_settings_schema_source_get_default(),
++										    TRUE,
++										    NULL);
++			schema = g_settings_schema_source_lookup(schema_source,
++								 "org.gnome.evolution-data-server",
++								 FALSE);
++			settings = g_settings_new_full(schema, NULL, NULL);
++		}
+ 		value = g_settings_get_string (settings, key_name);
+ 		g_object_unref (settings);
+ 
+diff --git a/src/libedataserver/e-oauth2-service-yahoo.c b/src/libedataserver/e-oauth2-service-yahoo.c
+index c8bbd3a..e71e36a 100644
+--- a/src/libedataserver/e-oauth2-service-yahoo.c
++++ b/src/libedataserver/e-oauth2-service-yahoo.c
+@@ -67,7 +67,18 @@ eos_yahoo_read_settings (EOAuth2Service *service,
+ 	if (!value) {
+ 		GSettings *settings;
+ 
+-		settings = g_settings_new ("org.gnome.evolution-data-server");
++		{
++			g_autoptr(GSettingsSchemaSource) schema_source;
++			g_autoptr(GSettingsSchema) schema;
++			schema_source = g_settings_schema_source_new_from_directory("@EDS@",
++										    g_settings_schema_source_get_default(),
++										    TRUE,
++										    NULL);
++			schema = g_settings_schema_source_lookup(schema_source,
++								 "org.gnome.evolution-data-server",
++								 FALSE);
++			settings = g_settings_new_full(schema, NULL, NULL);
++		}
+ 		value = g_settings_get_string (settings, key_name);
+ 		g_object_unref (settings);
+ 
+diff --git a/src/libedataserver/e-oauth2-service.c b/src/libedataserver/e-oauth2-service.c
+index af59b0b..0c7e75e 100644
+--- a/src/libedataserver/e-oauth2-service.c
++++ b/src/libedataserver/e-oauth2-service.c
+@@ -94,7 +94,18 @@ eos_default_guess_can_process (EOAuth2Service *service,
+ 	name_len = strlen (name);
+ 	hostname_len = strlen (hostname);
+ 
+-	settings = g_settings_new ("org.gnome.evolution-data-server");
++	{
++		g_autoptr(GSettingsSchemaSource) schema_source;
++		g_autoptr(GSettingsSchema) schema;
++		schema_source = g_settings_schema_source_new_from_directory("@EDS@",
++									    g_settings_schema_source_get_default(),
++									    TRUE,
++									    NULL);
++		schema = g_settings_schema_source_lookup(schema_source,
++							 "org.gnome.evolution-data-server",
++							 FALSE);
++		settings = g_settings_new_full(schema, NULL, NULL);
++	}
+ 	values = g_settings_get_strv (settings, "oauth2-services-hint");
+ 	g_object_unref (settings);
+ 
+diff --git a/src/libedataserver/e-source-registry.c b/src/libedataserver/e-source-registry.c
+index 1539f8b..77cf123 100644
+--- a/src/libedataserver/e-source-registry.c
++++ b/src/libedataserver/e-source-registry.c
+@@ -1754,7 +1754,19 @@ e_source_registry_init (ESourceRegistry *registry)
+ 
+ 	g_mutex_init (&registry->priv->sources_lock);
+ 
+-	registry->priv->settings = g_settings_new (GSETTINGS_SCHEMA);
++	{
++		g_autoptr(GSettingsSchemaSource) schema_source;
++		g_autoptr(GSettingsSchema) schema;
++		schema_source = g_settings_schema_source_new_from_directory("@EDS@",
++									    g_settings_schema_source_get_default(),
++									    TRUE,
++									    NULL);
++		schema = g_settings_schema_source_lookup(schema_source,
++							 GSETTINGS_SCHEMA,
++							 FALSE);
++		registry->priv->settings = g_settings_new_full(schema, NULL,
++							       NULL);
++	}
+ 
+ 	g_signal_connect (
+ 		registry->priv->settings, "changed",
+diff --git a/src/libedataserverui/e-reminders-widget.c b/src/libedataserverui/e-reminders-widget.c
+index 14b6481..7149b74 100644
+--- a/src/libedataserverui/e-reminders-widget.c
++++ b/src/libedataserverui/e-reminders-widget.c
+@@ -1986,7 +1986,19 @@ static void
+ e_reminders_widget_init (ERemindersWidget *reminders)
+ {
+ 	reminders->priv = e_reminders_widget_get_instance_private (reminders);
+-	reminders->priv->settings = g_settings_new ("org.gnome.evolution-data-server.calendar");
++	{
++		g_autoptr(GSettingsSchemaSource) schema_source;
++		g_autoptr(GSettingsSchema) schema;
++		schema_source = g_settings_schema_source_new_from_directory("@EDS@",
++									    g_settings_schema_source_get_default(),
++									    TRUE,
++									    NULL);
++		schema = g_settings_schema_source_lookup(schema_source,
++							 "org.gnome.evolution-data-server.calendar",
++							 FALSE);
++		reminders->priv->settings = g_settings_new_full(schema, NULL,
++								NULL);
++	}
+ 	reminders->priv->cancellable = g_cancellable_new ();
+ 	reminders->priv->is_empty = TRUE;
+ 	reminders->priv->is_mapped = FALSE;
+diff --git a/src/services/evolution-source-registry/evolution-source-registry-autoconfig.c b/src/services/evolution-source-registry/evolution-source-registry-autoconfig.c
+index 6f03053..b5db6b2 100644
+--- a/src/services/evolution-source-registry/evolution-source-registry-autoconfig.c
++++ b/src/services/evolution-source-registry/evolution-source-registry-autoconfig.c
+@@ -706,7 +706,18 @@ evolution_source_registry_merge_autoconfig_sources (ESourceRegistryServer *serve
+ 	gchar *autoconfig_directory;
+ 	gint ii;
+ 
+-	settings = g_settings_new ("org.gnome.evolution-data-server");
++	{
++		g_autoptr(GSettingsSchemaSource) schema_source;
++		g_autoptr(GSettingsSchema) schema;
++		schema_source = g_settings_schema_source_new_from_directory("@EDS@",
++									    g_settings_schema_source_get_default(),
++									    TRUE,
++									    NULL);
++		schema = g_settings_schema_source_lookup(schema_source,
++							 "org.gnome.evolution-data-server",
++							 FALSE);
++		settings = g_settings_new_full(schema, NULL, NULL);
++	}
+ 
+ 	autoconfig_sources = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, e_autoconfig_free_merge_source_data);
+ 
+diff --git a/src/services/evolution-source-registry/evolution-source-registry-migrate-proxies.c b/src/services/evolution-source-registry/evolution-source-registry-migrate-proxies.c
+index d531cb9..c96f1d5 100644
+--- a/src/services/evolution-source-registry/evolution-source-registry-migrate-proxies.c
++++ b/src/services/evolution-source-registry/evolution-source-registry-migrate-proxies.c
+@@ -61,7 +61,18 @@ evolution_source_registry_migrate_proxies (ESourceRegistryServer *server)
+ 	extension_name = E_SOURCE_EXTENSION_PROXY;
+ 	extension = e_source_get_extension (source, extension_name);
+ 
+-	settings = g_settings_new (NETWORK_CONFIG_SCHEMA_ID);
++	{
++		g_autoptr(GSettingsSchemaSource) schema_source;
++		g_autoptr(GSettingsSchema) schema;
++		schema_source = g_settings_schema_source_new_from_directory("@EDS@",
++									    g_settings_schema_source_get_default(),
++									    TRUE,
++									    NULL);
++			schema = g_settings_schema_source_lookup(schema_source,
++								 NETWORK_CONFIG_SCHEMA_ID,
++								 FALSE);
++			settings = g_settings_new_full(schema, NULL, NULL);
++	}
+ 
+ 	switch (g_settings_get_int (settings, "proxy-type")) {
+ 		case 1:
+diff --git a/src/services/evolution-source-registry/evolution-source-registry.c b/src/services/evolution-source-registry/evolution-source-registry.c
+index 1c0a113..6b41423 100644
+--- a/src/services/evolution-source-registry/evolution-source-registry.c
++++ b/src/services/evolution-source-registry/evolution-source-registry.c
+@@ -181,7 +181,18 @@ main (gint argc,
+ 
+ reload:
+ 
+-	settings = g_settings_new ("org.gnome.evolution-data-server");
++	{
++		g_autoptr(GSettingsSchemaSource) schema_source;
++		g_autoptr(GSettingsSchema) schema;
++		schema_source = g_settings_schema_source_new_from_directory("@EDS@",
++									    g_settings_schema_source_get_default(),
++									    TRUE,
++									    NULL);
++		schema = g_settings_schema_source_lookup(schema_source,
++							 "org.gnome.evolution-data-server",
++							 FALSE);
++		settings = g_settings_new_full(schema, NULL, NULL);
++	}
+ 
+ 	if (!opt_disable_migration && !g_settings_get_boolean (settings, "migrated")) {
+ 		g_settings_set_boolean (settings, "migrated", TRUE);
diff --git a/pkgs/by-name/ev/evolution-data-server/package.nix b/pkgs/by-name/ev/evolution-data-server/package.nix
new file mode 100644
index 0000000000000..d774ea2f26853
--- /dev/null
+++ b/pkgs/by-name/ev/evolution-data-server/package.nix
@@ -0,0 +1,189 @@
+{ stdenv
+, lib
+, fetchurl
+, substituteAll
+, pkg-config
+, gnome
+, _experimental-update-script-combinators
+, python3
+, gobject-introspection
+, gettext
+, libsoup_3
+, libxml2
+, libsecret
+, icu
+, sqlite
+, tzdata
+, libcanberra-gtk3
+, p11-kit
+, db
+, nspr
+, nss
+, libical
+, gperf
+, wrapGAppsHook3
+, glib-networking
+, gsettings-desktop-schemas
+, pcre
+, vala
+, cmake
+, ninja
+, libkrb5
+, openldap
+, enableOAuth2 ? stdenv.isLinux
+, webkitgtk_4_1
+, webkitgtk_6_0
+, json-glib
+, glib
+, gtk3
+, gtk4
+, withGtk3 ? true
+, withGtk4 ? false
+, libphonenumber
+, gnome-online-accounts
+, libgweather
+, boost
+, protobuf
+, libiconv
+, makeHardcodeGsettingsPatch
+}:
+
+stdenv.mkDerivation rec {
+  pname = "evolution-data-server";
+  version = "3.52.2";
+
+  outputs = [ "out" "dev" ];
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/evolution-data-server/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
+    hash = "sha256-oAakTtyzjSb/scYuHV0KMdHy5ZB1Vl4mx5ou4BxFp+U=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./fix-paths.patch;
+      inherit tzdata;
+    })
+
+    # Avoid using wrapper function, which the hardcode gsettings
+    # patch generator cannot handle.
+    ./drop-tentative-settings-constructor.patch
+  ];
+
+  prePatch = ''
+    substitute ${./hardcode-gsettings.patch} hardcode-gsettings.patch \
+      --subst-var-by EDS ${glib.makeSchemaPath "$out" "${pname}-${version}"} \
+      --subst-var-by GDS ${glib.getSchemaPath gsettings-desktop-schemas}
+    patches="$patches $PWD/hardcode-gsettings.patch"
+  '';
+
+  nativeBuildInputs = [
+    cmake
+    ninja
+    pkg-config
+    gettext
+    python3
+    gperf
+    wrapGAppsHook3
+    gobject-introspection
+    vala
+  ];
+
+  buildInputs = [
+    glib
+    libsecret
+    libsoup_3
+    gnome-online-accounts
+    p11-kit
+    libgweather
+    icu
+    sqlite
+    libkrb5
+    openldap
+    glib-networking
+    libcanberra-gtk3
+    pcre
+    libphonenumber
+    boost
+    protobuf
+  ] ++ lib.optionals stdenv.isDarwin [
+    libiconv
+  ] ++ lib.optionals withGtk3 [
+    gtk3
+  ] ++ lib.optionals (withGtk3 && enableOAuth2) [
+    webkitgtk_4_1
+  ] ++ lib.optionals withGtk4 [
+    gtk4
+  ] ++ lib.optionals (withGtk4 && enableOAuth2) [
+    webkitgtk_6_0
+  ];
+
+  propagatedBuildInputs = [
+    db
+    nss
+    nspr
+    libical
+    libsoup_3
+    libxml2
+    json-glib
+  ];
+
+  cmakeFlags = [
+    "-DENABLE_UOA=OFF"
+    "-DENABLE_VALA_BINDINGS=ON"
+    "-DENABLE_INTROSPECTION=ON"
+    "-DINCLUDE_INSTALL_DIR=${placeholder "dev"}/include"
+    "-DWITH_PHONENUMBER=ON"
+    "-DENABLE_GTK=${lib.boolToString withGtk3}"
+    "-DENABLE_EXAMPLES=${lib.boolToString withGtk3}"
+    "-DENABLE_CANBERRA=${lib.boolToString withGtk3}"
+    "-DENABLE_GTK4=${lib.boolToString withGtk4}"
+    "-DENABLE_OAUTH2_WEBKITGTK=${lib.boolToString (withGtk3 && enableOAuth2)}"
+    "-DENABLE_OAUTH2_WEBKITGTK4=${lib.boolToString (withGtk4 && enableOAuth2)}"
+  ];
+
+  postPatch = lib.optionalString stdenv.isDarwin ''
+    substituteInPlace cmake/modules/SetupBuildFlags.cmake \
+      --replace "-Wl,--no-undefined" ""
+    substituteInPlace src/services/evolution-alarm-notify/e-alarm-notify.c \
+      --replace "G_OS_WIN32" "__APPLE__"
+  '';
+
+  postInstall = lib.optionalString stdenv.isDarwin ''
+    ln -s $out/lib/${pname}/*.dylib $out/lib/
+  '';
+
+  passthru = {
+    hardcodeGsettingsPatch = makeHardcodeGsettingsPatch {
+      schemaIdToVariableMapping = {
+        "org.gnome.Evolution.DefaultSources" = "EDS";
+        "org.gnome.evolution.shell.network-config" = "EDS";
+        "org.gnome.evolution-data-server.addressbook" = "EDS";
+        "org.gnome.evolution-data-server.calendar" = "EDS";
+        "org.gnome.evolution-data-server" = "EDS";
+        "org.gnome.desktop.interface" = "GDS";
+      };
+      inherit src patches;
+    };
+    updateScript =
+      let
+        updateSource = gnome.updateScript {
+          packageName = "evolution-data-server";
+          versionPolicy = "odd-unstable";
+        };
+        updatePatch = _experimental-update-script-combinators.copyAttrOutputToFile "evolution-data-server.hardcodeGsettingsPatch" ./hardcode-gsettings.patch;
+      in
+      _experimental-update-script-combinators.sequence [
+        updateSource
+        updatePatch
+      ];
+  };
+
+  meta = with lib; {
+    description = "Unified backend for programs that work with contacts, tasks, and calendar information";
+    homepage = "https://gitlab.gnome.org/GNOME/evolution-data-server";
+    license = licenses.lgpl2Plus;
+    maintainers = teams.gnome.members;
+    platforms = platforms.unix;
+  };
+}
diff --git a/pkgs/by-name/fi/file-roller/package.nix b/pkgs/by-name/fi/file-roller/package.nix
new file mode 100644
index 0000000000000..497bfe4920c91
--- /dev/null
+++ b/pkgs/by-name/fi/file-roller/package.nix
@@ -0,0 +1,78 @@
+{ lib
+, stdenv
+, fetchurl
+, desktop-file-utils
+, gettext
+, glibcLocales
+, itstool
+, libxml2
+, meson
+, ninja
+, pkg-config
+, python3
+, wrapGAppsHook4
+, cpio
+, glib
+, gnome
+, gtk4
+, libadwaita
+, libhandy
+, json-glib
+, libarchive
+, libportal-gtk4
+, nautilus
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "file-roller";
+  version = "44.3";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/file-roller/${lib.versions.major finalAttrs.version}/file-roller-${finalAttrs.version}.tar.xz";
+    hash = "sha256-BMinRiX+yEJn/exAMGr7QQS9My2FBh4NNtSrBTOt+ko=";
+  };
+
+  nativeBuildInputs = [
+    desktop-file-utils
+    gettext
+    glibcLocales
+    itstool
+    libxml2
+    meson
+    ninja
+    pkg-config
+    python3
+    wrapGAppsHook4
+  ];
+
+  buildInputs = [
+    cpio
+    glib
+    gtk4
+    libadwaita
+    libhandy
+    json-glib
+    libarchive
+    libportal-gtk4
+    nautilus
+  ];
+
+  postPatch = ''
+    patchShebangs data/set-mime-type-entry.py
+  '';
+
+  passthru = {
+    updateScript = gnome.updateScript {
+      packageName = "file-roller";
+    };
+  };
+
+  meta = with lib; {
+    homepage = "https://gitlab.gnome.org/GNOME/file-roller";
+    description = "Archive manager for the GNOME desktop environment";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = teams.gnome.members ++ teams.pantheon.members;
+    mainProgram = "file-roller";
+  };
+})
diff --git a/pkgs/by-name/fo/font-manager/package.nix b/pkgs/by-name/fo/font-manager/package.nix
index 0cfc68aa4fd2b..83fba770c113e 100644
--- a/pkgs/by-name/fo/font-manager/package.nix
+++ b/pkgs/by-name/fo/font-manager/package.nix
@@ -14,7 +14,7 @@
 , vala
 , gsettings-desktop-schemas
 , gtk3
-, gnome
+, adwaita-icon-theme
 , desktop-file-utils
 , nix-update-script
 , wrapGAppsHook3
@@ -55,7 +55,7 @@ stdenv.mkDerivation rec {
     sqlite
     gsettings-desktop-schemas # for font settings
     gtk3
-    gnome.adwaita-icon-theme
+    adwaita-icon-theme
   ] ++ lib.optionals withWebkit [
     glib-networking # for SSL so that Google Fonts can load
     libsoup
diff --git a/pkgs/by-name/ge/geary/package.nix b/pkgs/by-name/ge/geary/package.nix
new file mode 100644
index 0000000000000..565ed9ae2d239
--- /dev/null
+++ b/pkgs/by-name/ge/geary/package.nix
@@ -0,0 +1,156 @@
+{ lib
+, stdenv
+, fetchurl
+, pkg-config
+, gtk3
+, vala
+, enchant2
+, wrapGAppsHook3
+, meson
+, ninja
+, desktop-file-utils
+, gnome-online-accounts
+, gsettings-desktop-schemas
+, adwaita-icon-theme
+, libpeas
+, libsecret
+, gmime3
+, isocodes
+, icu
+, libxml2
+, gettext
+, sqlite
+, gcr
+, json-glib
+, itstool
+, libgee
+, gnome
+, webkitgtk_4_1
+, python3
+, gnutls
+, cacert
+, xvfb-run
+, glibcLocales
+, dbus
+, shared-mime-info
+, libunwind
+, folks
+, glib-networking
+, gobject-introspection
+, gspell
+, appstream-glib
+, libstemmer
+, libytnef
+, libhandy
+, gsound
+}:
+
+stdenv.mkDerivation rec {
+  pname = "geary";
+  version = "46.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "r60VEwKBfd8Ji15BbnrH8tXupWejuAu5C9PGKv0TuaE=";
+  };
+
+  nativeBuildInputs = [
+    appstream-glib
+    desktop-file-utils
+    gettext
+    gobject-introspection
+    itstool
+    libxml2
+    meson
+    ninja
+    pkg-config
+    python3
+    vala
+    wrapGAppsHook3
+  ];
+
+  buildInputs = [
+    adwaita-icon-theme
+    enchant2
+    folks
+    gcr
+    glib-networking
+    gmime3
+    gnome-online-accounts
+    gsettings-desktop-schemas
+    gsound
+    gspell
+    gtk3
+    isocodes
+    icu
+    json-glib
+    libgee
+    libhandy
+    libpeas
+    libsecret
+    libunwind
+    libstemmer
+    libytnef
+    sqlite
+    webkitgtk_4_1
+  ];
+
+  nativeCheckInputs = [
+    dbus
+    gnutls # for certtool
+    cacert # trust store for glib-networking
+    xvfb-run
+    glibcLocales # required by Geary.ImapDb.DatabaseTest/utf8_case_insensitive_collation
+  ];
+
+  mesonFlags = [
+    "-Dprofile=release"
+    "-Dcontractor=enabled" # install the contractor file (Pantheon specific)
+  ];
+
+  # NOTE: Remove `build-auxyaml_to_json.py` when no longer needed, see:
+  # https://gitlab.gnome.org/GNOME/geary/commit/f7f72143e0f00ca5e0e6a798691805c53976ae31#0cc1139e3347f573ae1feee5b73dbc8a8a21fcfa
+  postPatch = ''
+    chmod +x build-aux/git_version.py
+
+    patchShebangs build-aux/git_version.py
+
+    chmod +x desktop/geary-attach
+  '';
+
+  # Some tests time out.
+  doCheck = false;
+
+  checkPhase = ''
+    runHook preCheck
+
+    NO_AT_BRIDGE=1 \
+    GIO_EXTRA_MODULES=$GIO_EXTRA_MODULES:${glib-networking}/lib/gio/modules \
+    HOME=$TMPDIR \
+    XDG_DATA_DIRS=$XDG_DATA_DIRS:${gsettings-desktop-schemas}/share/gsettings-schemas/${gsettings-desktop-schemas.name}:${shared-mime-info}/share:${folks}/share/gsettings-schemas/${folks.name} \
+    xvfb-run -s '-screen 0 800x600x24' dbus-run-session \
+      --config-file=${dbus}/share/dbus-1/session.conf \
+      meson test -v --no-stdsplit
+
+    runHook postCheck
+  '';
+
+  preFixup = ''
+    # Add geary to path for geary-attach
+    gappsWrapperArgs+=(--prefix PATH : "$out/bin")
+  '';
+
+  passthru = {
+    updateScript = gnome.updateScript {
+      packageName = pname;
+    };
+  };
+
+  meta = with lib; {
+    homepage = "https://gitlab.gnome.org/GNOME/geary";
+    description = "Mail client for GNOME 3";
+    maintainers = teams.gnome.members;
+    license = licenses.lgpl21Plus;
+    platforms = platforms.linux;
+  };
+}
diff --git a/pkgs/by-name/gh/ghex/package.nix b/pkgs/by-name/gh/ghex/package.nix
new file mode 100644
index 0000000000000..0f3aefaa56bed
--- /dev/null
+++ b/pkgs/by-name/gh/ghex/package.nix
@@ -0,0 +1,86 @@
+{ stdenv
+, lib
+, fetchurl
+, pkg-config
+, gi-docgen
+, meson
+, ninja
+, gnome
+, desktop-file-utils
+, appstream-glib
+, gettext
+, itstool
+, libxml2
+, gtk4
+, libadwaita
+, glib
+, atk
+, gobject-introspection
+, vala
+, wrapGAppsHook4
+}:
+
+stdenv.mkDerivation rec {
+  pname = "ghex";
+  version = "46.0";
+
+  outputs = [ "out" "dev" "devdoc" ];
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/ghex/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    hash = "sha256-ocRvMCDLNYuDIwJds6U5yX2ZSkxG9wH0jtxjV/f7y9E=";
+  };
+
+  nativeBuildInputs = [
+    desktop-file-utils
+    gettext
+    itstool
+    meson
+    ninja
+    pkg-config
+    gi-docgen
+    gobject-introspection
+    vala
+    wrapGAppsHook4
+  ];
+
+  buildInputs = [
+    gtk4
+    libadwaita
+    atk
+    glib
+  ];
+
+  nativeCheckInputs = [
+    appstream-glib
+    desktop-file-utils
+  ];
+
+  mesonFlags = [
+    "-Dgtk_doc=true"
+    "-Dvapi=true"
+  ] ++ lib.optionals stdenv.isDarwin [
+    # mremap does not exist on darwin
+    "-Dmmap-buffer-backend=false"
+  ];
+
+  postFixup = ''
+    # Cannot be in postInstall, otherwise _multioutDocs hook in preFixup will move right back.
+    moveToOutput "share/doc" "$devdoc"
+  '';
+
+  passthru = {
+    updateScript = gnome.updateScript {
+      packageName = "ghex";
+    };
+  };
+
+  meta = with lib; {
+    homepage = "https://gitlab.gnome.org/GNOME/ghex";
+    description = "Hex editor for GNOME desktop environment";
+    mainProgram = "ghex";
+    platforms = platforms.linux;
+    license = licenses.gpl2Plus;
+    maintainers = teams.gnome.members;
+  };
+}
diff --git a/pkgs/by-name/gi/gitg/package.nix b/pkgs/by-name/gi/gitg/package.nix
new file mode 100644
index 0000000000000..923f1ccc28bfd
--- /dev/null
+++ b/pkgs/by-name/gi/gitg/package.nix
@@ -0,0 +1,99 @@
+{ lib
+, stdenv
+, fetchurl
+, vala
+, pkg-config
+, gtk3
+, glib
+, gpgme
+, json-glib
+, wrapGAppsHook3
+, libpeas
+, bash
+, gobject-introspection
+, gtksourceview4
+, gsettings-desktop-schemas
+, gnome
+, gspell
+, gvfs
+, shared-mime-info
+, libgee
+, libgit2-glib
+, libhandy
+, libsecret
+, libxml2
+, meson
+, ninja
+, python3
+, libdazzle
+}:
+
+stdenv.mkDerivation rec {
+  pname = "gitg";
+  version = "44";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
+    hash = "sha256-NCoxaE2rlnHNNBvT485mWtzuBGDCoIHdxJPNvAMTJTA=";
+  };
+
+  nativeBuildInputs = [
+    gobject-introspection
+    meson
+    ninja
+    pkg-config
+    python3
+    vala
+    wrapGAppsHook3
+  ];
+
+  buildInputs = [
+    glib
+    gpgme
+    gsettings-desktop-schemas
+    gtk3
+    gtksourceview4
+    gspell
+    gvfs
+    json-glib
+    libdazzle
+    libgee
+    libgit2-glib
+    libhandy
+    libpeas
+    libsecret
+    libxml2
+  ];
+
+  doCheck = true;
+
+  postPatch = ''
+    patchShebangs meson_post_install.py
+
+    substituteInPlace tests/libgitg/test-commit.vala --replace-fail "/bin/bash" "${bash}/bin/bash"
+  '';
+
+  preFixup = ''
+    gappsWrapperArgs+=(
+      # Thumbnailers
+      --prefix XDG_DATA_DIRS : "${shared-mime-info}/share"
+    )
+  '';
+
+  passthru = {
+    updateScript = gnome.updateScript {
+      packageName = pname;
+    };
+  };
+
+  strictDeps = true;
+
+  meta = with lib; {
+    homepage = "https://gitlab.gnome.org/GNOME/gitg";
+    description = "GNOME GUI client to view git repositories";
+    mainProgram = "gitg";
+    maintainers = with maintainers; [ domenkozar Luflosi ];
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+  };
+}
diff --git a/pkgs/by-name/gi/github-desktop/package.nix b/pkgs/by-name/gi/github-desktop/package.nix
index ae882fdfddaff..606a7770dc2f3 100644
--- a/pkgs/by-name/gi/github-desktop/package.nix
+++ b/pkgs/by-name/gi/github-desktop/package.nix
@@ -4,7 +4,7 @@
 , autoPatchelfHook
 , wrapGAppsHook3
 , makeWrapper
-, gnome
+, gnome-keyring
 , libsecret
 , git
 , curl
@@ -48,7 +48,7 @@ stdenvNoCC.mkDerivation (finalAttrs: {
   ];
 
   buildInputs = [
-    gnome.gnome-keyring
+    gnome-keyring
     xorg.libXdamage
     xorg.libX11
     libsecret
diff --git a/pkgs/by-name/gn/gnome-autoar/package.nix b/pkgs/by-name/gn/gnome-autoar/package.nix
new file mode 100644
index 0000000000000..dfbcc24898b5a
--- /dev/null
+++ b/pkgs/by-name/gn/gnome-autoar/package.nix
@@ -0,0 +1,59 @@
+{ stdenv
+, lib
+, fetchurl
+, meson
+, ninja
+, pkg-config
+, gnome
+, gtk3
+, glib
+, gobject-introspection
+, libarchive
+, vala
+}:
+
+stdenv.mkDerivation rec {
+  pname = "gnome-autoar";
+  version = "0.4.4";
+
+  outputs = [ "out" "dev" ];
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-autoar/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
+    sha256 = "wK++MzvPPLFEGh9XTMjsexuBl3eRRdTt7uKJb9rPw8I=";
+  };
+
+  nativeBuildInputs = [
+    gobject-introspection
+    meson
+    ninja
+    pkg-config
+    vala
+  ];
+
+  buildInputs = [
+    gtk3
+  ];
+
+  propagatedBuildInputs = [
+    libarchive
+    glib
+  ];
+
+  mesonFlags = [
+    "-Dvapi=true"
+  ];
+
+  passthru = {
+    updateScript = gnome.updateScript {
+      packageName = "gnome-autoar";
+    };
+  };
+
+  meta = with lib; {
+    platforms = platforms.linux;
+    maintainers = teams.gnome.members;
+    license = licenses.lgpl21Plus;
+    description = "Library to integrate compressed files management with GNOME";
+  };
+}
diff --git a/pkgs/by-name/gn/gnome-calculator/package.nix b/pkgs/by-name/gn/gnome-calculator/package.nix
new file mode 100644
index 0000000000000..577a8245426a6
--- /dev/null
+++ b/pkgs/by-name/gn/gnome-calculator/package.nix
@@ -0,0 +1,80 @@
+{ stdenv
+, lib
+, appstream
+, meson
+, ninja
+, vala
+, gettext
+, itstool
+, fetchurl
+, pkg-config
+, libxml2
+, gtk4
+, glib
+, gtksourceview5
+, wrapGAppsHook4
+, gnome
+, mpfr
+, gmp
+, libsoup_3
+, libmpc
+, libadwaita
+, gsettings-desktop-schemas
+, libgee
+}:
+
+stdenv.mkDerivation rec {
+  pname = "gnome-calculator";
+  version = "46.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-calculator/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    hash = "sha256-LTZ1CnOJAIYSLPPwyD5oUXiRWFYVFlMG+hWWqRhmgkc=";
+  };
+
+  nativeBuildInputs = [
+    appstream
+    meson
+    ninja
+    pkg-config
+    vala
+    gettext
+    itstool
+    wrapGAppsHook4
+  ];
+
+  buildInputs = [
+    gtk4
+    glib
+    libxml2
+    gtksourceview5
+    mpfr
+    gmp
+    libgee
+    gsettings-desktop-schemas
+    libsoup_3
+    libmpc
+    libadwaita
+  ];
+
+  doCheck = true;
+
+  preCheck = ''
+    # Currency conversion test tries to store currency data in $HOME/.cache.
+    export HOME=$TMPDIR
+  '';
+
+  passthru = {
+    updateScript = gnome.updateScript {
+      packageName = "gnome-calculator";
+    };
+  };
+
+  meta = with lib; {
+    homepage = "https://apps.gnome.org/Calculator/";
+    description = "Application that solves mathematical equations and is suitable as a default application in a Desktop environment";
+    maintainers = teams.gnome.members;
+    license = licenses.gpl3Plus;
+    platforms = platforms.unix;
+  };
+}
diff --git a/pkgs/by-name/gn/gnome-calendar/package.nix b/pkgs/by-name/gn/gnome-calendar/package.nix
new file mode 100644
index 0000000000000..a751ee3822718
--- /dev/null
+++ b/pkgs/by-name/gn/gnome-calendar/package.nix
@@ -0,0 +1,66 @@
+{ stdenv
+, lib
+, fetchurl
+, meson
+, ninja
+, pkg-config
+, wrapGAppsHook4
+, libgweather
+, geoclue2
+, gettext
+, libxml2
+, gnome
+, gtk4
+, evolution-data-server-gtk4
+, libical
+, libsoup_3
+, glib
+, gsettings-desktop-schemas
+, libadwaita
+}:
+
+stdenv.mkDerivation rec {
+  pname = "gnome-calendar";
+  version = "46.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    hash = "sha256-mGH/e4q9W3sgaQulXrdULH7FNLVmJp4ptbHoWMFhCJc=";
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    gettext
+    libxml2
+    wrapGAppsHook4
+  ];
+
+  buildInputs = [
+    gtk4
+    evolution-data-server-gtk4
+    libical
+    libsoup_3
+    glib
+    libgweather
+    geoclue2
+    gsettings-desktop-schemas
+    libadwaita
+  ];
+
+  passthru = {
+    updateScript = gnome.updateScript {
+      packageName = pname;
+    };
+  };
+
+  meta = with lib; {
+    homepage = "https://apps.gnome.org/Calendar/";
+    description = "Simple and beautiful calendar application for GNOME";
+    mainProgram = "gnome-calendar";
+    maintainers = teams.gnome.members;
+    license = licenses.gpl3Plus;
+    platforms = platforms.unix;
+  };
+}
diff --git a/pkgs/by-name/gn/gnome-common/package.nix b/pkgs/by-name/gn/gnome-common/package.nix
new file mode 100644
index 0000000000000..0f9a1269b6ba9
--- /dev/null
+++ b/pkgs/by-name/gn/gnome-common/package.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, fetchurl, which, gnome, autoconf, automake }:
+
+stdenv.mkDerivation rec {
+  pname = "gnome-common";
+  version = "3.18.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-common/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
+    sha256 = "22569e370ae755e04527b76328befc4c73b62bfd4a572499fde116b8318af8cf";
+  };
+
+  passthru = {
+    updateScript = gnome.updateScript { packageName = "gnome-common"; };
+  };
+
+  propagatedBuildInputs = [ which autoconf automake ]; # autogen.sh which is using gnome-common tends to require which
+
+  meta = with lib; {
+    maintainers = teams.gnome.members;
+  };
+}
diff --git a/pkgs/by-name/gn/gnome-dictionary/package.nix b/pkgs/by-name/gn/gnome-dictionary/package.nix
new file mode 100644
index 0000000000000..9db61b591eb74
--- /dev/null
+++ b/pkgs/by-name/gn/gnome-dictionary/package.nix
@@ -0,0 +1,86 @@
+{ stdenv
+, lib
+, fetchurl
+, fetchpatch
+, meson
+, ninja
+, pkg-config
+, desktop-file-utils
+, appstream-glib
+, libxslt
+, libxml2
+, gettext
+, itstool
+, wrapGAppsHook3
+, docbook_xsl
+, docbook_xml_dtd_43
+, gnome
+, adwaita-icon-theme
+, gtk3
+, glib
+, gsettings-desktop-schemas
+}:
+
+stdenv.mkDerivation rec {
+  pname = "gnome-dictionary";
+  version = "40.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-dictionary/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "1d8dhcfys788vv27v34i3s3x3jdvdi2kqn2a5p8c937a9hm0qr9f";
+  };
+
+  patches = [
+    # Fix test dependencies with meson 0.57, can be removed on next bump
+    # We need to explicitly depend on the generated files.
+    (fetchpatch {
+      url = "https://gitlab.gnome.org/Archive/gnome-dictionary/-/commit/87c026cfe4acbcfc62d15950f88a71d8d9678c7e.patch";
+      sha256 = "tKesWeOK3OqOxrXm4dZvCZHHdTD7AQbYDjtYDCsLd3A=";
+    })
+    # Fix build with meson 0.61, can be removed on next bump
+    # data/appdata/meson.build:3:5: ERROR: Function does not take positional arguments.
+    (fetchpatch {
+      url = "https://gitlab.gnome.org/Archive/gnome-dictionary/-/commit/cf3f8a67cd6f3059c555ed9cf0f5fba10abb7f68.patch";
+      sha256 = "cIRM6ACqsnEo2JWYvr6EBye5o0BudugZMShCe1U5hz8=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    wrapGAppsHook3
+    libxml2
+    gettext
+    itstool
+    desktop-file-utils
+    appstream-glib
+    libxslt
+    docbook_xsl
+    docbook_xml_dtd_43
+  ];
+
+  buildInputs = [
+    gtk3
+    glib
+    gsettings-desktop-schemas
+    adwaita-icon-theme
+  ];
+
+  doCheck = true;
+
+  passthru = {
+    updateScript = gnome.updateScript {
+      packageName = "gnome-dictionary";
+    };
+  };
+
+  meta = with lib; {
+    homepage = "https://gitlab.gnome.org/Archive/gnome-dictionary";
+    description = "Dictionary is the GNOME application to look up definitions";
+    mainProgram = "gnome-dictionary";
+    maintainers = [ ];
+    license = licenses.gpl2;
+    platforms = platforms.unix;
+  };
+}
diff --git a/pkgs/by-name/gn/gnome-disk-utility/package.nix b/pkgs/by-name/gn/gnome-disk-utility/package.nix
new file mode 100644
index 0000000000000..4ca25e2cf822f
--- /dev/null
+++ b/pkgs/by-name/gn/gnome-disk-utility/package.nix
@@ -0,0 +1,81 @@
+{ lib
+, stdenv
+, gettext
+, fetchurl
+, pkg-config
+, udisks2
+, libhandy
+, libsecret
+, libdvdread
+, meson
+, ninja
+, gtk3
+, glib
+, wrapGAppsHook3
+, libnotify
+, itstool
+, gnome
+, adwaita-icon-theme
+, libxml2
+, gsettings-desktop-schemas
+, libcanberra-gtk3
+, libxslt
+, docbook-xsl-nons
+, desktop-file-utils
+, libpwquality
+, systemd
+}:
+
+stdenv.mkDerivation rec {
+  pname = "gnome-disk-utility";
+  version = "46.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-disk-utility/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    hash = "sha256-RkZJFIxtZ3HxrC6/5DpOUZIFsRwtkUoJ8qABgh0GlX0=";
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    gettext
+    itstool
+    libxslt
+    docbook-xsl-nons
+    desktop-file-utils
+    wrapGAppsHook3
+    libxml2
+  ];
+
+  buildInputs = [
+    gtk3
+    glib
+    libhandy
+    libsecret
+    libpwquality
+    libnotify
+    libdvdread
+    libcanberra-gtk3
+    udisks2
+    adwaita-icon-theme
+    systemd
+    gnome.gnome-settings-daemon
+    gsettings-desktop-schemas
+  ];
+
+  passthru = {
+    updateScript = gnome.updateScript {
+      packageName = "gnome-disk-utility";
+    };
+  };
+
+  meta = with lib; {
+    homepage = "https://apps.gnome.org/DiskUtility/";
+    description = "Udisks graphical front-end";
+    maintainers = teams.gnome.members;
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    mainProgram = "gnome-disks";
+  };
+}
diff --git a/pkgs/by-name/gn/gnome-font-viewer/package.nix b/pkgs/by-name/gn/gnome-font-viewer/package.nix
new file mode 100644
index 0000000000000..ddb98b787099c
--- /dev/null
+++ b/pkgs/by-name/gn/gnome-font-viewer/package.nix
@@ -0,0 +1,65 @@
+{ lib
+, stdenv
+, meson
+, ninja
+, gettext
+, fetchurl
+, pkg-config
+, gtk4
+, glib
+, libxml2
+, gnome-desktop
+, libadwaita
+, fribidi
+, wrapGAppsHook4
+, gnome
+, harfbuzz
+}:
+
+stdenv.mkDerivation rec {
+  pname = "gnome-font-viewer";
+  version = "46.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-font-viewer/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    hash = "sha256-WS9AHkhdAswETUh7tcjgTJYdpoViFnaKWfH/mL0tU3w=";
+  };
+
+  doCheck = true;
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    gettext
+    wrapGAppsHook4
+    libxml2
+    glib
+  ];
+
+  buildInputs = [
+    gtk4
+    glib
+    gnome-desktop
+    harfbuzz
+    libadwaita
+    fribidi
+  ];
+
+  # Do not run meson-postinstall.sh
+  preConfigure = "sed -i '2,$ d'  meson-postinstall.sh";
+
+  passthru = {
+    updateScript = gnome.updateScript {
+      packageName = "gnome-font-viewer";
+    };
+  };
+
+  meta = with lib; {
+    description = "Program that can preview fonts and create thumbnails for fonts";
+    homepage = "https://gitlab.gnome.org/GNOME/gnome-font-viewer";
+    maintainers = teams.gnome.members;
+    license = licenses.gpl2Plus;
+    platforms = platforms.unix;
+  };
+}
diff --git a/pkgs/by-name/gn/gnome-keyring/package.nix b/pkgs/by-name/gn/gnome-keyring/package.nix
new file mode 100644
index 0000000000000..01be1e7aa9000
--- /dev/null
+++ b/pkgs/by-name/gn/gnome-keyring/package.nix
@@ -0,0 +1,108 @@
+{ lib
+, stdenv
+, fetchurl
+, pkg-config
+, dbus
+, libgcrypt
+, pam
+, python3
+, glib
+, libxslt
+, gettext
+, gcr
+, libcap_ng
+, libselinux
+, p11-kit
+, openssh
+, wrapGAppsHook3
+, docbook-xsl-nons
+, docbook_xml_dtd_43
+, gnome
+, useWrappedDaemon ? true
+}:
+
+stdenv.mkDerivation rec {
+  pname = "gnome-keyring";
+  version = "46.1";
+
+  outputs = [ "out" "dev" ];
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-keyring/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    hash = "sha256-sdOukTL/L4s/JaGQeQiSlo49Cs+VKkh+QPZEqFUM4/Y=";
+  };
+
+  nativeBuildInputs = [
+    pkg-config
+    gettext
+    libxslt
+    docbook-xsl-nons
+    docbook_xml_dtd_43
+    wrapGAppsHook3
+  ];
+
+  buildInputs = [
+    glib
+    libgcrypt
+    pam
+    openssh
+    libcap_ng
+    libselinux
+    gcr
+    p11-kit
+  ];
+
+  nativeCheckInputs = [ dbus python3 ];
+
+  configureFlags = [
+    "--with-pkcs11-config=${placeholder "out"}/etc/pkcs11/" # installation directories
+    "--with-pkcs11-modules=${placeholder "out"}/lib/pkcs11/"
+    # gnome-keyring doesn't build with ssh-agent by default anymore, we need to
+    # switch to using gcr https://github.com/NixOS/nixpkgs/issues/140824
+    "--enable-ssh-agent"
+    # cross compilation requires these paths to be explicitly declared:
+    "LIBGCRYPT_CONFIG=${lib.getExe' (lib.getDev libgcrypt) "libgcrypt-config"}"
+    "SSH_ADD=${lib.getExe' openssh "ssh-add"}"
+    "SSH_AGENT=${lib.getExe' openssh "ssh-agent"}"
+  ];
+
+  # Tends to fail non-deterministically.
+  # - https://github.com/NixOS/nixpkgs/issues/55293
+  # - https://github.com/NixOS/nixpkgs/issues/51121
+  doCheck = false;
+
+  postPatch = ''
+    patchShebangs build
+  '';
+
+  checkPhase = ''
+    export HOME=$(mktemp -d)
+    dbus-run-session \
+      --config-file=${dbus}/share/dbus-1/session.conf \
+      make check
+  '';
+
+  # Use wrapped gnome-keyring-daemon with cap_ipc_lock=ep
+  postFixup = lib.optionalString useWrappedDaemon ''
+    files=($out/etc/xdg/autostart/* $out/share/dbus-1/services/*)
+
+    for file in ''${files[*]}; do
+      substituteInPlace $file \
+        --replace "$out/bin/gnome-keyring-daemon" "/run/wrappers/bin/gnome-keyring-daemon"
+    done
+  '';
+
+  passthru = {
+    updateScript = gnome.updateScript {
+      packageName = "gnome-keyring";
+    };
+  };
+
+  meta = with lib; {
+    description = "Collection of components in GNOME that store secrets, passwords, keys, certificates and make them available to applications";
+    homepage = "https://gitlab.gnome.org/GNOME/gnome-keyring";
+    license = licenses.gpl2;
+    maintainers = teams.gnome.members;
+    platforms = platforms.linux;
+  };
+}
diff --git a/pkgs/by-name/gn/gnome-packagekit/package.nix b/pkgs/by-name/gn/gnome-packagekit/package.nix
new file mode 100644
index 0000000000000..699e24fba18e3
--- /dev/null
+++ b/pkgs/by-name/gn/gnome-packagekit/package.nix
@@ -0,0 +1,59 @@
+{ lib
+, stdenv
+, fetchurl
+, pkg-config
+, meson
+, ninja
+, gettext
+, gnome
+, packagekit
+, polkit
+, gtk3
+, systemd
+, wrapGAppsHook3
+, desktop-file-utils
+}:
+
+stdenv.mkDerivation rec {
+  pname = "gnome-packagekit";
+  version = "43.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-packagekit/${lib.versions.major version}/gnome-packagekit-${version}.tar.xz";
+    sha256 = "zaRVplKpI7LqL3Axa9D92Clve2Lu8/r9nOUMjmbF8ZU=";
+  };
+
+  nativeBuildInputs = [
+    pkg-config
+    meson
+    ninja
+    gettext
+    wrapGAppsHook3
+    desktop-file-utils
+  ];
+
+  buildInputs = [
+    gtk3
+    packagekit
+    systemd
+    polkit
+  ];
+
+  postPatch = ''
+    patchShebangs meson_post_install.sh
+  '';
+
+  passthru = {
+    updateScript = gnome.updateScript {
+      packageName = "gnome-packagekit";
+    };
+  };
+
+  meta = with lib; {
+    homepage = "https://www.freedesktop.org/software/PackageKit/";
+    platforms = platforms.linux;
+    maintainers = teams.gnome.members;
+    license = licenses.gpl2;
+    description = "Tools for installing software on the GNOME desktop using PackageKit";
+  };
+}
diff --git a/pkgs/by-name/gn/gnome-pomodoro/fix-schema-path.patch b/pkgs/by-name/gn/gnome-pomodoro/fix-schema-path.patch
new file mode 100644
index 0000000000000..0750d01f86757
--- /dev/null
+++ b/pkgs/by-name/gn/gnome-pomodoro/fix-schema-path.patch
@@ -0,0 +1,40 @@
+diff --git a/data/meson.build b/data/meson.build
+index 5e4ce69..982b3c9 100644
+--- a/data/meson.build
++++ b/data/meson.build
+@@ -31,7 +31,7 @@ i18n.merge_file(
+ 
+ install_data(
+   'org.gnome.pomodoro.gschema.xml',
+-  install_dir: get_option('datadir') / 'glib-2.0' / 'schemas',
++  install_dir: gschema_dir,
+ )
+ 
+ subdir('icons')
+diff --git a/meson-post-install.sh b/meson-post-install.sh
+index bf4013a..c87fba4 100644
+--- a/meson-post-install.sh
++++ b/meson-post-install.sh
+@@ -7,7 +7,7 @@ datadir="${prefix}/$1"
+ # want/need us to do the below
+ if [ -z "${DESTDIR}" ]; then
+     echo "Compiling GSchema..."
+-    glib-compile-schemas "${datadir}/glib-2.0/schemas"
++    glib-compile-schemas "${datadir}/gsettings-schemas/@pname@-@version@/glib-2.0/schemas"
+ 
+     echo "Updating icon cache..."
+     gtk-update-icon-cache -f -t "${datadir}/icons/hicolor"
+diff --git a/meson.build b/meson.build
+index 09857a1..a07d27c 100644
+--- a/meson.build
++++ b/meson.build
+@@ -40,7 +40,8 @@ add_project_arguments(
+ )
+ 
+ # We are going to use these variables later on for the plugins
+-gschema_dir = get_option('prefix') / get_option('datadir') / 'glib-2.0' / 'schemas'
++nix_package_name = '@pname@' + '-' + '@version@'
++gschema_dir = get_option('prefix') / get_option('datadir') / 'gsettings-schemas' / nix_package_name / 'glib-2.0' / 'schemas'
+ plugin_libdir = get_option('prefix') / get_option('libdir') / meson.project_name() / 'plugins'
+ extension_dir = get_option('prefix') / get_option('datadir') / 'gnome-shell' / 'extensions' / 'pomodoro@arun.codito.in'
+ 
diff --git a/pkgs/by-name/gn/gnome-pomodoro/package.nix b/pkgs/by-name/gn/gnome-pomodoro/package.nix
new file mode 100644
index 0000000000000..4261ebaec1efd
--- /dev/null
+++ b/pkgs/by-name/gn/gnome-pomodoro/package.nix
@@ -0,0 +1,83 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, substituteAll
+, meson
+, ninja
+, pkg-config
+, wrapGAppsHook3
+, desktop-file-utils
+, libcanberra
+, gst_all_1
+, vala
+, gtk3
+, gom
+, sqlite
+, libxml2
+, glib
+, gobject-introspection
+, json-glib
+, libpeas
+, gsettings-desktop-schemas
+, gettext
+}:
+
+stdenv.mkDerivation rec {
+  pname = "gnome-pomodoro";
+  version = "0.24.1";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = version;
+    hash = "sha256-Ml3znMz1Q9593rMgfAST8k9QglxMG9ocFD7W8kaFWCw=";
+  };
+
+  patches = [
+    # Our glib setup hooks moves GSettings schemas to a subdirectory to prevent conflicts.
+    # We need to patch the build script so that the extension can find them.
+    (substituteAll {
+      src = ./fix-schema-path.patch;
+      inherit pname version;
+    })
+  ];
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    gettext
+    gobject-introspection
+    libxml2
+    pkg-config
+    vala
+    wrapGAppsHook3
+    desktop-file-utils
+  ];
+
+  buildInputs = [
+    glib
+    gom
+    gsettings-desktop-schemas
+    gst_all_1.gst-plugins-base
+    gst_all_1.gst-plugins-good
+    gst_all_1.gstreamer
+    gtk3
+    json-glib
+    libcanberra
+    libpeas
+    sqlite
+  ];
+
+  meta = with lib; {
+    homepage = "https://gnomepomodoro.org/";
+    description = "Time management utility for GNOME based on the pomodoro technique";
+    mainProgram = "gnome-pomodoro";
+    longDescription = ''
+      This GNOME utility helps to manage time according to Pomodoro Technique.
+      It intends to improve productivity and focus by taking short breaks.
+    '';
+    maintainers = with maintainers; [ ];
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+  };
+}
diff --git a/pkgs/by-name/gn/gnome-screenshot/package.nix b/pkgs/by-name/gn/gnome-screenshot/package.nix
new file mode 100644
index 0000000000000..e282277469f02
--- /dev/null
+++ b/pkgs/by-name/gn/gnome-screenshot/package.nix
@@ -0,0 +1,83 @@
+{ stdenv
+, lib
+, gettext
+, libxml2
+, libhandy
+, fetchurl
+, fetchpatch
+, pkg-config
+, libcanberra-gtk3
+, gtk3
+, glib
+, meson
+, ninja
+, python3
+, wrapGAppsHook3
+, appstream-glib
+, desktop-file-utils
+, gnome
+, adwaita-icon-theme
+, gsettings-desktop-schemas
+}:
+
+stdenv.mkDerivation rec {
+  pname = "gnome-screenshot";
+  version = "41.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "Stt97JJkKPdCY9V5ZnPPFC5HILbnaPVGio0JM/mMlZc=";
+  };
+
+  patches = [
+    # Fix build with meson 0.61
+    # https://gitlab.gnome.org/GNOME/gnome-screenshot/-/issues/186
+    (fetchpatch {
+      url = "https://gitlab.gnome.org/GNOME/gnome-screenshot/-/commit/b60dad3c2536c17bd201f74ad8e40eb74385ed9f.patch";
+      sha256 = "Js83h/3xxcw2hsgjzGa5lAYFXVrt6MPhXOTh5dZTx/w=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    gettext
+    appstream-glib
+    libxml2
+    desktop-file-utils
+    python3
+    wrapGAppsHook3
+  ];
+
+  buildInputs = [
+    gtk3
+    glib
+    libcanberra-gtk3
+    libhandy
+    adwaita-icon-theme
+    gsettings-desktop-schemas
+  ];
+
+  doCheck = true;
+
+  postPatch = ''
+    chmod +x build-aux/postinstall.py # patchShebangs requires executable file
+    patchShebangs build-aux/postinstall.py
+  '';
+
+  passthru = {
+    updateScript = gnome.updateScript {
+      packageName = pname;
+    };
+  };
+
+  meta = with lib; {
+    homepage = "https://gitlab.gnome.org/GNOME/gnome-screenshot";
+    description = "Utility used in the GNOME desktop environment for taking screenshots";
+    mainProgram = "gnome-screenshot";
+    maintainers = teams.gnome.members;
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+  };
+}
diff --git a/pkgs/by-name/gn/gnome-system-monitor/fix-paths.patch b/pkgs/by-name/gn/gnome-system-monitor/fix-paths.patch
new file mode 100644
index 0000000000000..967ef5e155421
--- /dev/null
+++ b/pkgs/by-name/gn/gnome-system-monitor/fix-paths.patch
@@ -0,0 +1,12 @@
+diff --git a/src/gsm_pkexec.cpp b/src/gsm_pkexec.cpp
+index 5e1edf2f..717d7bf1 100644
+--- a/src/gsm_pkexec.cpp
++++ b/src/gsm_pkexec.cpp
+@@ -36,5 +36,6 @@ gsm_pkexec_create_root_password_dialog (const char *command)
+ gboolean
+ procman_has_pkexec (void)
+ {
+-  return g_file_test ("/usr/bin/pkexec", G_FILE_TEST_EXISTS);
++  return g_file_test ("/run/wrappers/bin/pkexec", G_FILE_TEST_EXISTS)
++      || g_file_test ("/usr/bin/pkexec", G_FILE_TEST_EXISTS);
+ }
diff --git a/pkgs/by-name/gn/gnome-system-monitor/package.nix b/pkgs/by-name/gn/gnome-system-monitor/package.nix
new file mode 100644
index 0000000000000..27c4576e01709
--- /dev/null
+++ b/pkgs/by-name/gn/gnome-system-monitor/package.nix
@@ -0,0 +1,80 @@
+{ lib
+, stdenv
+, gettext
+, fetchurl
+, pkg-config
+, gtkmm4
+, libxml2
+, bash
+, gtk4
+, libadwaita
+, glib
+, wrapGAppsHook4
+, meson
+, ninja
+, gsettings-desktop-schemas
+, itstool
+, gnome
+, adwaita-icon-theme
+, librsvg
+, gdk-pixbuf
+, libgtop
+, systemd
+}:
+
+stdenv.mkDerivation rec {
+  pname = "gnome-system-monitor";
+  version = "46.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-system-monitor/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    hash = "sha256-U3YkgVjGhsMIJVRy6MKp5MFyVWQsFJ/HGYxtA05UdZk=";
+  };
+
+  patches = [
+    # Fix pkexec detection on NixOS.
+    ./fix-paths.patch
+  ];
+
+  nativeBuildInputs = [
+    pkg-config
+    gettext
+    itstool
+    wrapGAppsHook4
+    meson
+    ninja
+    glib
+  ];
+
+  buildInputs = [
+    bash
+    gtk4
+    libadwaita
+    glib
+    libxml2
+    gtkmm4
+    libgtop
+    gdk-pixbuf
+    adwaita-icon-theme
+    librsvg
+    gsettings-desktop-schemas
+    systemd
+  ];
+
+  doCheck = true;
+
+  passthru = {
+    updateScript = gnome.updateScript {
+      packageName = "gnome-system-monitor";
+    };
+  };
+
+  meta = with lib; {
+    homepage = "https://apps.gnome.org/SystemMonitor/";
+    description = "System Monitor shows you what programs are running and how much processor time, memory, and disk space are being used";
+    mainProgram = "gnome-system-monitor";
+    maintainers = teams.gnome.members;
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/pkgs/by-name/gn/gnome-terminal/package.nix b/pkgs/by-name/gn/gnome-terminal/package.nix
new file mode 100644
index 0000000000000..7cfde6e911ae2
--- /dev/null
+++ b/pkgs/by-name/gn/gnome-terminal/package.nix
@@ -0,0 +1,97 @@
+{ stdenv
+, lib
+, fetchFromGitLab
+, meson
+, ninja
+, pkg-config
+, python3
+, libxml2
+, gitUpdater
+, nautilus
+, glib
+, gtk4
+, gtk3
+, libhandy
+, gsettings-desktop-schemas
+, vte
+, gettext
+, which
+, libuuid
+, vala
+, desktop-file-utils
+, itstool
+, wrapGAppsHook3
+, pcre2
+, libxslt
+, docbook-xsl-nons
+, nixosTests
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "gnome-terminal";
+  version = "3.52.2";
+
+  src = fetchFromGitLab {
+    domain = "gitlab.gnome.org";
+    owner = "GNOME";
+    repo = "gnome-terminal";
+    rev = finalAttrs.version;
+    hash = "sha256-c6xMUyhQnJiIrFnnUEx6vGVvFghGvLjTxiAFq+nSj2A=";
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    gettext
+    itstool
+    which
+    libxml2
+    libxslt
+    glib # for glib-compile-schemas
+    docbook-xsl-nons
+    vala
+    desktop-file-utils
+    wrapGAppsHook3
+    pcre2
+    python3
+  ];
+
+  buildInputs = [
+    glib
+    gtk4
+    gtk3
+    libhandy
+    gsettings-desktop-schemas
+    vte
+    libuuid
+    nautilus # For extension
+  ];
+
+  postPatch = ''
+    patchShebangs \
+      data/icons/meson_updateiconcache.py \
+      data/meson_desktopfile.py \
+      data/meson_metainfofile.py \
+      src/meson_compileschemas.py
+  '';
+
+  passthru = {
+    updateScript = gitUpdater {
+      odd-unstable = true;
+    };
+
+    tests = {
+      test = nixosTests.terminal-emulators.gnome-terminal;
+    };
+  };
+
+  meta = with lib; {
+    description = "GNOME Terminal Emulator";
+    mainProgram = "gnome-terminal";
+    homepage = "https://gitlab.gnome.org/GNOME/gnome-terminal";
+    platforms = platforms.linux;
+    license = licenses.gpl3Plus;
+    maintainers = teams.gnome.members;
+  };
+})
diff --git a/pkgs/by-name/gn/gnome-themes-extra/package.nix b/pkgs/by-name/gn/gnome-themes-extra/package.nix
new file mode 100644
index 0000000000000..c40c81b8245f7
--- /dev/null
+++ b/pkgs/by-name/gn/gnome-themes-extra/package.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv, fetchurl, intltool, gtk3, gnome, adwaita-icon-theme, librsvg, pkg-config, pango, atk, gtk2
+, gdk-pixbuf, hicolor-icon-theme }:
+
+stdenv.mkDerivation rec {
+  pname = "gnome-themes-extra";
+  version = "3.28";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-themes-extra/${lib.versions.majorMinor version}/gnome-themes-extra-${version}.tar.xz";
+    sha256 = "06aqg9asq2vqi9wr29bs4v8z2bf4manhbhfghf4nvw01y2zs0jvw";
+  };
+
+  passthru = {
+    updateScript = gnome.updateScript {
+      packageName = pname;
+    };
+  };
+
+  nativeBuildInputs = [ pkg-config intltool gtk3 ];
+  buildInputs = [ gtk3 librsvg pango atk gtk2 gdk-pixbuf ];
+  propagatedBuildInputs = [ adwaita-icon-theme hicolor-icon-theme ];
+
+  dontDropIconThemeCache = true;
+
+  postInstall = ''
+    gtk-update-icon-cache "$out"/share/icons/HighContrast
+  '';
+
+  meta = with lib; {
+    platforms = platforms.unix;
+    maintainers = teams.gnome.members;
+  };
+}
diff --git a/pkgs/by-name/gn/gnome-tweaks/package.nix b/pkgs/by-name/gn/gnome-tweaks/package.nix
new file mode 100644
index 0000000000000..3bbe91007b6d8
--- /dev/null
+++ b/pkgs/by-name/gn/gnome-tweaks/package.nix
@@ -0,0 +1,94 @@
+{ lib
+, meson
+, ninja
+, fetchurl
+, desktop-file-utils
+, gdk-pixbuf
+, gettext
+, glib
+, gnome
+, gnome-desktop
+, gobject-introspection
+, gsettings-desktop-schemas
+, gtk4
+, itstool
+, libadwaita
+, libgudev
+, libnotify
+, libxml2
+, pkg-config
+, python3Packages
+, wrapGAppsHook4
+}:
+
+python3Packages.buildPythonApplication rec {
+  pname = "gnome-tweaks";
+  version = "46.1";
+  format = "other";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    hash = "sha256-LxkqcIX71oQ+z4JXFtnaIeyScgKRSeo18+FZ4Kwwm4A=";
+  };
+
+  nativeBuildInputs = [
+    desktop-file-utils
+    gettext
+    gobject-introspection
+    itstool
+    libxml2
+    meson
+    ninja
+    pkg-config
+    wrapGAppsHook4
+  ];
+
+  buildInputs = [
+    gdk-pixbuf
+    glib
+    gnome-desktop
+    gnome.gnome-settings-daemon
+    gnome.gnome-shell
+    # Makes it possible to select user themes through the `user-theme` extension
+    gnome.gnome-shell-extensions
+    gnome.mutter
+    gsettings-desktop-schemas
+    gtk4
+    libadwaita
+    libgudev
+    libnotify
+  ];
+
+  pythonPath = with python3Packages; [
+    pygobject3
+  ];
+
+  postPatch = ''
+    patchShebangs meson-postinstall.py
+  '';
+
+  dontWrapGApps = true;
+
+  preFixup = ''
+    makeWrapperArgs+=("''${gappsWrapperArgs[@]}")
+  '';
+
+  postFixup = ''
+    wrapPythonProgramsIn "$out/libexec" "$out $pythonPath"
+  '';
+
+  passthru = {
+    updateScript = gnome.updateScript {
+      packageName = pname;
+    };
+  };
+
+  meta = with lib; {
+    homepage = "https://gitlab.gnome.org/GNOME/gnome-tweaks";
+    description = "Tool to customize advanced GNOME 3 options";
+    mainProgram = "gnome-tweaks";
+    maintainers = teams.gnome.members;
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+  };
+}
diff --git a/pkgs/by-name/gn/gnome-user-share/package.nix b/pkgs/by-name/gn/gnome-user-share/package.nix
new file mode 100644
index 0000000000000..1d2368478bb1c
--- /dev/null
+++ b/pkgs/by-name/gn/gnome-user-share/package.nix
@@ -0,0 +1,72 @@
+{ stdenv
+, lib
+, gettext
+, meson
+, ninja
+, fetchurl
+, apacheHttpdPackages
+, pkg-config
+, glib
+, libxml2
+, systemd
+, wrapGAppsNoGuiHook
+, itstool
+, gnome
+}:
+
+let
+  inherit (apacheHttpdPackages) apacheHttpd mod_dnssd;
+in
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "gnome-user-share";
+  version = "43.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-user-share/${lib.versions.major finalAttrs.version}/gnome-user-share-${finalAttrs.version}.tar.xz";
+    sha256 = "DfMGqgVYMT81Pvf1G/onwDYoGtxFZ34c+/p8n4YVOM4=";
+  };
+
+  preConfigure = ''
+    sed -e 's,^LoadModule dnssd_module.\+,LoadModule dnssd_module ${mod_dnssd}/modules/mod_dnssd.so,' \
+      -e 's,''${HTTP_MODULES_PATH},${apacheHttpd}/modules,' \
+      -i data/dav_user_2.4.conf
+  '';
+
+  mesonFlags = [
+    "-Dhttpd=${apacheHttpd.out}/bin/httpd"
+    "-Dmodules_path=${apacheHttpd}/modules"
+    "-Dsystemduserunitdir=${placeholder "out"}/etc/systemd/user"
+  ];
+
+  nativeBuildInputs = [
+    pkg-config
+    meson
+    ninja
+    gettext
+    itstool
+    libxml2
+    wrapGAppsNoGuiHook
+  ];
+
+  buildInputs = [
+    glib
+    systemd
+  ];
+
+  doCheck = true;
+
+  passthru = {
+    updateScript = gnome.updateScript {
+      packageName = "gnome-user-share";
+    };
+  };
+
+  meta = with lib; {
+    homepage = "https://gitlab.gnome.org/GNOME/gnome-user-share";
+    description = "Service that exports the contents of the Public folder in your home directory on the local network";
+    maintainers = teams.gnome.members;
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+  };
+})
diff --git a/pkgs/by-name/go/google-chrome/package.nix b/pkgs/by-name/go/google-chrome/package.nix
index 519b640512242..9f7a1d8281a81 100644
--- a/pkgs/by-name/go/google-chrome/package.nix
+++ b/pkgs/by-name/go/google-chrome/package.nix
@@ -32,7 +32,7 @@
 , pulseSupport ? true, libpulseaudio
 
 , gsettings-desktop-schemas
-, gnome
+, adwaita-icon-theme
 
 # For video acceleration via VA-API (--enable-features=VaapiVideoDecoder)
 , libvaSupport ? true, libva
@@ -77,7 +77,7 @@ in stdenv.mkDerivation (finalAttrs: {
     gsettings-desktop-schemas glib gtk3
 
     # needed for XDG_ICON_DIRS
-    gnome.adwaita-icon-theme
+    adwaita-icon-theme
   ];
 
   unpackPhase = ''
diff --git a/pkgs/by-name/gp/gpaste/fix-paths.patch b/pkgs/by-name/gp/gpaste/fix-paths.patch
new file mode 100644
index 0000000000000..ebebc8a20bd66
--- /dev/null
+++ b/pkgs/by-name/gp/gpaste/fix-paths.patch
@@ -0,0 +1,16 @@
+diff --git a/src/libgpaste/gpaste/gpaste-settings.c b/src/libgpaste/gpaste/gpaste-settings.c
+index 830f5e0b..c8df0e11 100644
+--- a/src/libgpaste/gpaste/gpaste-settings.c
++++ b/src/libgpaste/gpaste/gpaste-settings.c
+@@ -1039,7 +1039,10 @@ create_g_settings (void)
+     }
+     else
+     {
+-        return g_settings_new (G_PASTE_SETTINGS_NAME);
++        // library used by introspection requires schemas but we cannot set XDG_DATA_DIRS for the library
++        g_autoptr (GSettingsSchemaSource) schema_source = g_settings_schema_source_new_from_directory ("@gschemasCompiled@", NULL, FALSE, NULL);
++        g_autoptr (GSettingsSchema) schema = g_settings_schema_source_lookup (schema_source, G_PASTE_SETTINGS_NAME, FALSE);
++        return g_settings_new_full (schema, NULL, NULL);
+     }
+ }
+ 
diff --git a/pkgs/by-name/gp/gpaste/package.nix b/pkgs/by-name/gp/gpaste/package.nix
new file mode 100644
index 0000000000000..16da276b64b55
--- /dev/null
+++ b/pkgs/by-name/gp/gpaste/package.nix
@@ -0,0 +1,88 @@
+{ stdenv
+, lib
+, fetchurl
+, gjs
+, glib
+, gobject-introspection
+, gtk3
+, gtk4
+, gcr_4
+, libadwaita
+, meson
+, ninja
+, pango
+, pkg-config
+, vala
+, desktop-file-utils
+, wrapGAppsHook3
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  version = "45.1";
+  pname = "gpaste";
+
+  src = fetchurl {
+    url = "https://www.imagination-land.org/files/gpaste/GPaste-${finalAttrs.version}.tar.xz";
+    hash = "sha256-yYLoHn3/2xlefBeErnydNfkvtJva8/9f9JHhfschBpQ=";
+  };
+
+  patches = [
+    ./fix-paths.patch
+  ];
+
+  # TODO: switch to substituteAll with placeholder
+  # https://github.com/NixOS/nix/issues/1846
+  postPatch = ''
+    substituteInPlace src/libgpaste/gpaste/gpaste-settings.c \
+      --subst-var-by gschemasCompiled ${glib.makeSchemaPath (placeholder "out") "${finalAttrs.pname}-${finalAttrs.version}"}
+  '';
+
+  nativeBuildInputs = [
+    gobject-introspection
+    meson
+    ninja
+    pkg-config
+    vala
+    desktop-file-utils
+    wrapGAppsHook3
+  ];
+
+  buildInputs = [
+    gjs
+    glib
+    gtk3
+    gtk4
+    gcr_4
+    libadwaita
+    pango
+  ];
+
+  mesonFlags = [
+    "-Dcontrol-center-keybindings-dir=${placeholder "out"}/share/gnome-control-center/keybindings"
+    "-Ddbus-services-dir=${placeholder "out"}/share/dbus-1/services"
+    "-Dsystemd-user-unit-dir=${placeholder "out"}/etc/systemd/user"
+  ];
+
+  postInstall = ''
+    # We do not have central location to install typelibs to,
+    # let’s ensure GNOME Shell can still find them.
+    extensionDir="$out/share/gnome-shell/extensions/GPaste@gnome-shell-extensions.gnome.org"
+    mv "$extensionDir/"{extension,.extension-wrapped}.js
+    mv "$extensionDir/"{prefs,.prefs-wrapped}.js
+    substitute "${./wrapper.js}" "$extensionDir/extension.js" \
+      --subst-var-by originalName "extension" \
+      --subst-var-by typelibPath "${placeholder "out"}/lib/girepository-1.0"
+    substitute "${./wrapper.js}" "$extensionDir/prefs.js" \
+      --subst-var-by originalName "prefs" \
+      --subst-var-by typelibPath "${placeholder "out"}/lib/girepository-1.0"
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/Keruspe/GPaste";
+    description = "Clipboard management system with GNOME integration";
+    mainProgram = "gpaste-client";
+    license = licenses.bsd2;
+    platforms = platforms.linux;
+    maintainers = teams.gnome.members;
+  };
+})
diff --git a/pkgs/by-name/gp/gpaste/wrapper.js b/pkgs/by-name/gp/gpaste/wrapper.js
new file mode 100644
index 0000000000000..ea6a9cba6f6fb
--- /dev/null
+++ b/pkgs/by-name/gp/gpaste/wrapper.js
@@ -0,0 +1,5 @@
+import GIRepository from 'gi://GIRepository';
+
+GIRepository.Repository.prepend_search_path('@typelibDir@');
+
+export default (await import('./.@originalName@-wrapped.js')).default;
diff --git a/pkgs/by-name/gu/gucharmap/package.nix b/pkgs/by-name/gu/gucharmap/package.nix
new file mode 100644
index 0000000000000..17f8465f380bf
--- /dev/null
+++ b/pkgs/by-name/gu/gucharmap/package.nix
@@ -0,0 +1,114 @@
+{ stdenv
+, lib
+, intltool
+, fetchFromGitLab
+, meson
+, mesonEmulatorHook
+, ninja
+, pkg-config
+, python3
+, gtk3
+, pcre2
+, glib
+, desktop-file-utils
+, gtk-doc
+, wrapGAppsHook3
+, itstool
+, libxml2
+, yelp-tools
+, docbook_xsl
+, docbook_xml_dtd_412
+, gsettings-desktop-schemas
+, unzip
+, unicode-character-database
+, unihan-database
+, runCommand
+, symlinkJoin
+, gobject-introspection
+, gitUpdater
+}:
+
+let
+  # TODO: make upstream patch allowing to use the uncompressed file,
+  # preferably from XDG_DATA_DIRS.
+  # https://gitlab.gnome.org/GNOME/gucharmap/issues/13
+  unihanZip = runCommand "unihan" {} ''
+    mkdir -p $out/share/unicode
+    ln -s ${unihan-database.src} $out/share/unicode/Unihan.zip
+  '';
+  ucd = symlinkJoin {
+    name = "ucd+unihan";
+    paths = [
+      unihanZip
+      unicode-character-database
+    ];
+  };
+in stdenv.mkDerivation (finalAttrs: {
+  pname = "gucharmap";
+  version = "15.1.5";
+
+  outputs = [ "out" "lib" "dev" "devdoc" ];
+
+  src = fetchFromGitLab {
+    domain = "gitlab.gnome.org";
+    owner = "GNOME";
+    repo = "gucharmap";
+    rev = finalAttrs.version;
+    sha256 = "sha256-PG86D8QvqHdmo3aJseCerngmuWUqtSMdWzbixWE2HOQ=";
+  };
+
+  strictDeps = true;
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    python3
+    wrapGAppsHook3
+    unzip
+    intltool
+    itstool
+    gtk-doc
+    docbook_xsl
+    docbook_xml_dtd_412
+    yelp-tools
+    libxml2
+    desktop-file-utils
+    gobject-introspection
+  ] ++ lib.optionals (!stdenv.buildPlatform.canExecute stdenv.hostPlatform) [
+    mesonEmulatorHook
+  ];
+
+  buildInputs = [
+    gtk3
+    glib
+    gsettings-desktop-schemas
+    pcre2
+  ];
+
+  mesonFlags = [
+    "-Ducd_path=${ucd}/share/unicode"
+    "-Dvapi=false"
+  ];
+
+  doCheck = true;
+
+  postPatch = ''
+    patchShebangs \
+      data/meson_desktopfile.py \
+      gucharmap/gen-guch-unicode-tables.pl
+  '';
+
+  passthru = {
+    updateScript = gitUpdater {
+    };
+  };
+
+  meta = with lib; {
+    description = "GNOME Character Map, based on the Unicode Character Database";
+    mainProgram = "gucharmap";
+    homepage = "https://gitlab.gnome.org/GNOME/gucharmap";
+    license = licenses.gpl3Plus;
+    maintainers = teams.gnome.members;
+    platforms = platforms.linux;
+  };
+})
diff --git a/pkgs/by-name/ht/htb-toolkit/package.nix b/pkgs/by-name/ht/htb-toolkit/package.nix
index cedbe645f9416..9cffed873290d 100644
--- a/pkgs/by-name/ht/htb-toolkit/package.nix
+++ b/pkgs/by-name/ht/htb-toolkit/package.nix
@@ -6,7 +6,7 @@
 , stdenv
 , darwin
 , coreutils
-, gnome
+, gnome-keyring
 , libsecret
 , bash
 , openvpn
@@ -41,7 +41,7 @@ rustPlatform.buildRustPackage {
   buildInputs = [
     openssl
   ] ++ lib.optionals stdenv.isLinux [
-    gnome.gnome-keyring
+    gnome-keyring
   ] ++ lib.optionals stdenv.isDarwin [
     darwin.apple_sdk.frameworks.Security
     darwin.apple_sdk.frameworks.SystemConfiguration
diff --git a/pkgs/by-name/in/insync-nautilus/package.nix b/pkgs/by-name/in/insync-nautilus/package.nix
index 8cf010c893264..d0e3b3d934e48 100644
--- a/pkgs/by-name/in/insync-nautilus/package.nix
+++ b/pkgs/by-name/in/insync-nautilus/package.nix
@@ -3,7 +3,7 @@
   fetchurl,
   lib,
   dpkg,
-  gnome,
+  nautilus-python,
   insync-emblem-icons,
 }:
 
@@ -25,7 +25,7 @@ stdenv.mkDerivation (finalAttrs: {
   nativeBuildInputs = [ dpkg ];
 
   buildInputs = [
-    gnome.nautilus-python
+    nautilus-python
     insync-emblem-icons
   ];
 
diff --git a/pkgs/by-name/ir/ironbar/package.nix b/pkgs/by-name/ir/ironbar/package.nix
index 006eb004611d2..bc1f877af11bf 100644
--- a/pkgs/by-name/ir/ironbar/package.nix
+++ b/pkgs/by-name/ir/ironbar/package.nix
@@ -10,7 +10,7 @@
   gsettings-desktop-schemas,
   wrapGAppsHook3,
   gtk-layer-shell,
-  gnome,
+  adwaita-icon-theme,
   libxkbcommon,
   openssl,
   pkg-config,
@@ -48,7 +48,7 @@ rustPlatform.buildRustPackage rec {
       gtk-layer-shell
       glib-networking
       shared-mime-info
-      gnome.adwaita-icon-theme
+      adwaita-icon-theme
       hicolor-icon-theme
       gsettings-desktop-schemas
       libxkbcommon
diff --git a/pkgs/by-name/na/nautilus-open-in-blackbox/package.nix b/pkgs/by-name/na/nautilus-open-in-blackbox/package.nix
index 638d6ac671e15..cb8c6434e24cb 100644
--- a/pkgs/by-name/na/nautilus-open-in-blackbox/package.nix
+++ b/pkgs/by-name/na/nautilus-open-in-blackbox/package.nix
@@ -1,4 +1,4 @@
-{ python3, fetchFromGitHub, gnome, stdenv, lib }:
+{ python3, fetchFromGitHub, nautilus-python, stdenv, lib }:
 stdenv.mkDerivation rec {
   pname = "nautilus-open-in-blackbox";
   version = "0.1.1";
@@ -15,7 +15,7 @@ stdenv.mkDerivation rec {
   patches = [ ./paths.patch ];
 
   buildInputs = [
-    gnome.nautilus-python
+    nautilus-python
     python3.pkgs.pygobject3
   ];
 
diff --git a/pkgs/by-name/na/nautilus-python/fix-paths.patch b/pkgs/by-name/na/nautilus-python/fix-paths.patch
new file mode 100644
index 0000000000000..ba82937d6c9c5
--- /dev/null
+++ b/pkgs/by-name/na/nautilus-python/fix-paths.patch
@@ -0,0 +1,14 @@
+diff --git a/src/nautilus-python.c b/src/nautilus-python.c
+index 843e3c6..466a513 100644
+--- a/src/nautilus-python.c
++++ b/src/nautilus-python.c
+@@ -184,6 +184,9 @@ nautilus_python_init_python (void) {
+         return FALSE;
+     }
+ 
++    debug("Add PyGObject to path");
++    PyRun_SimpleString("import site;import functools; functools.reduce(lambda k, p: site.addsitedir(p, k), [@pythonPaths@], site._init_pathinfo())");
++
+     /* import gobject */
+     debug("init_pygobject");
+     if (!np_init_pygobject()) {
diff --git a/pkgs/by-name/na/nautilus-python/package.nix b/pkgs/by-name/na/nautilus-python/package.nix
new file mode 100644
index 0000000000000..993d3e2933aff
--- /dev/null
+++ b/pkgs/by-name/na/nautilus-python/package.nix
@@ -0,0 +1,71 @@
+{
+  stdenv,
+  lib,
+  substituteAll,
+  fetchurl,
+  meson,
+  ninja,
+  pkg-config,
+  gtk-doc,
+  docbook-xsl-nons,
+  docbook_xml_dtd_412,
+  python3,
+  nautilus,
+  gnome,
+}:
+
+stdenv.mkDerivation (finalAttrs:{
+  pname = "nautilus-python";
+  version = "4.0.1";
+
+  outputs = [
+    "out"
+    "dev"
+    "doc"
+    "devdoc"
+  ];
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/nautilus-python/${lib.versions.majorMinor finalAttrs.version}/nautilus-python-${finalAttrs.version}.tar.xz";
+    hash = "sha256-/EnBBPsyoK0ZWmawE2eEzRnRDYs+jVnV7n9z6PlOko8=";
+  };
+
+  patches = [
+    # Make PyGObject’s gi library available.
+    (substituteAll {
+      src = ./fix-paths.patch;
+      pythonPaths = lib.concatMapStringsSep ", " (pkg: "'${pkg}/${python3.sitePackages}'") [
+        python3.pkgs.pygobject3
+      ];
+    })
+  ];
+
+  nativeBuildInputs = [
+    pkg-config
+    meson
+    ninja
+    gtk-doc
+    docbook-xsl-nons
+    docbook_xml_dtd_412
+  ];
+
+  buildInputs = [
+    python3
+    python3.pkgs.pygobject3
+    nautilus
+  ];
+
+  passthru = {
+    updateScript = gnome.updateScript {
+      packageName = "nautilus-python";
+    };
+  };
+
+  meta = with lib; {
+    description = "Python bindings for the Nautilus Extension API";
+    homepage = "https://gitlab.gnome.org/GNOME/nautilus-python";
+    license = licenses.gpl2Plus;
+    maintainers = teams.gnome.members;
+    platforms = platforms.unix;
+  };
+})
diff --git a/pkgs/by-name/na/nautilus/extension_dir.patch b/pkgs/by-name/na/nautilus/extension_dir.patch
new file mode 100644
index 0000000000000..d7cd161a8dfc5
--- /dev/null
+++ b/pkgs/by-name/na/nautilus/extension_dir.patch
@@ -0,0 +1,24 @@
+diff --git a/src/nautilus-module.c b/src/nautilus-module.c
+index cd889ff18..e2cd6468e 100644
+--- a/src/nautilus-module.c
++++ b/src/nautilus-module.c
+@@ -267,6 +267,7 @@ void
+ nautilus_module_setup (void)
+ {
+     static gboolean initialized = FALSE;
++    const gchar* extensiondir = NULL;
+     const gchar *disable_plugins;
+ 
+     disable_plugins = g_getenv ("NAUTILUS_DISABLE_PLUGINS");
+@@ -280,7 +281,12 @@ nautilus_module_setup (void)
+     {
+         initialized = TRUE;
+ 
+-        load_module_dir (NAUTILUS_EXTENSIONDIR);
++        extensiondir = g_getenv ("NAUTILUS_4_EXTENSION_DIR");
++        if (extensiondir == NULL) {
++            extensiondir = NAUTILUS_EXTENSIONDIR;
++        }
++
++        load_module_dir (extensiondir);
+     }
diff --git a/pkgs/by-name/na/nautilus/fix-paths.patch b/pkgs/by-name/na/nautilus/fix-paths.patch
new file mode 100644
index 0000000000000..dc9874359b233
--- /dev/null
+++ b/pkgs/by-name/na/nautilus/fix-paths.patch
@@ -0,0 +1,13 @@
+diff --git a/src/nautilus-tag-manager.c b/src/nautilus-tag-manager.c
+index 28b96c996..0b1fad9ab 100644
+--- a/src/nautilus-tag-manager.c
++++ b/src/nautilus-tag-manager.c
+@@ -962,7 +962,7 @@ child_watch_cb (GPid     pid,
+ static void
+ export_tracker2_data (NautilusTagManager *self)
+ {
+-    gchar *argv[] = {"tracker3", "export", "--2to3", "files-starred", "--keyfile", NULL};
++    gchar *argv[] = {"@tracker@/bin/tracker3", "export", "--2to3", "files-starred", "--keyfile", NULL};
+     gint stdout_fd;
+     GPid child_pid;
+     g_autoptr (GError) error = NULL;
diff --git a/pkgs/by-name/na/nautilus/package.nix b/pkgs/by-name/na/nautilus/package.nix
new file mode 100644
index 0000000000000..660867e81ebd8
--- /dev/null
+++ b/pkgs/by-name/na/nautilus/package.nix
@@ -0,0 +1,140 @@
+{
+  lib,
+  stdenv,
+  fetchurl,
+  meson,
+  ninja,
+  pkg-config,
+  gi-docgen,
+  docbook-xsl-nons,
+  gettext,
+  desktop-file-utils,
+  wrapGAppsHook4,
+  gtk4,
+  libadwaita,
+  libportal-gtk4,
+  gnome,
+  adwaita-icon-theme,
+  gnome-autoar,
+  glib-networking,
+  shared-mime-info,
+  libnotify,
+  libexif,
+  libjxl,
+  libseccomp,
+  librsvg,
+  webp-pixbuf-loader,
+  tracker,
+  tracker-miners,
+  gexiv2,
+  libselinux,
+  libcloudproviders,
+  gdk-pixbuf,
+  substituteAll,
+  gnome-desktop,
+  gst_all_1,
+  gsettings-desktop-schemas,
+  gnome-user-share,
+  gobject-introspection,
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "nautilus";
+  version = "46.2";
+
+  outputs = [
+    "out"
+    "dev"
+    "devdoc"
+  ];
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/nautilus/${lib.versions.major finalAttrs.version}/nautilus-${finalAttrs.version}.tar.xz";
+    hash = "sha256-bujJkBm540R/aRjWgjKiDeyonlUlwFgFQyt9iEDKcfo=";
+  };
+
+  patches = [
+    # Allow changing extension directory using environment variable.
+    ./extension_dir.patch
+
+    # Hardcode required paths.
+    (substituteAll {
+      src = ./fix-paths.patch;
+      inherit tracker;
+    })
+  ];
+
+  nativeBuildInputs = [
+    desktop-file-utils
+    gettext
+    gobject-introspection
+    meson
+    ninja
+    pkg-config
+    gi-docgen
+    docbook-xsl-nons
+    wrapGAppsHook4
+  ];
+
+  buildInputs = [
+    gexiv2
+    glib-networking
+    gnome-desktop
+    adwaita-icon-theme
+    gsettings-desktop-schemas
+    gnome-user-share
+    gst_all_1.gst-plugins-base
+    gtk4
+    libadwaita
+    libportal-gtk4
+    libexif
+    libnotify
+    libseccomp
+    libselinux
+    gdk-pixbuf
+    libcloudproviders
+    shared-mime-info
+    tracker
+    tracker-miners
+    gnome-autoar
+  ];
+
+  propagatedBuildInputs = [
+    gtk4
+  ];
+
+  mesonFlags = [
+    "-Ddocs=true"
+  ];
+
+  preFixup = ''
+    gappsWrapperArgs+=(
+      # Thumbnailers
+      --prefix XDG_DATA_DIRS : "${gdk-pixbuf}/share"
+      --prefix XDG_DATA_DIRS : "${libjxl}/share"
+      --prefix XDG_DATA_DIRS : "${librsvg}/share"
+      --prefix XDG_DATA_DIRS : "${webp-pixbuf-loader}/share"
+      --prefix XDG_DATA_DIRS : "${shared-mime-info}/share"
+    )
+  '';
+
+  postFixup = ''
+    # Cannot be in postInstall, otherwise _multioutDocs hook in preFixup will move right back.
+    moveToOutput "share/doc" "$devdoc"
+  '';
+
+  passthru = {
+    updateScript = gnome.updateScript {
+      packageName = "nautilus";
+    };
+  };
+
+  meta = with lib; {
+    description = "File manager for GNOME";
+    homepage = "https://apps.gnome.org/Nautilus/";
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = teams.gnome.members;
+    mainProgram = "nautilus";
+  };
+})
diff --git a/pkgs/by-name/pa/papers/package.nix b/pkgs/by-name/pa/papers/package.nix
index dcdb5e6b19f7e..c0de8348e8382 100644
--- a/pkgs/by-name/pa/papers/package.nix
+++ b/pkgs/by-name/pa/papers/package.nix
@@ -13,7 +13,7 @@
 , shared-mime-info
 , itstool
 , poppler
-, gnome
+, nautilus
 , darwin
 , djvulibre
 , libspectre
@@ -96,7 +96,7 @@ stdenv.mkDerivation (finalAttrs: {
   ] ++ lib.optionals supportXPS [
     libgxps
   ] ++ lib.optionals supportNautilus [
-    gnome.nautilus
+    nautilus
   ] ++ lib.optionals stdenv.isDarwin [
     darwin.apple_sdk.frameworks.Foundation
   ];
diff --git a/pkgs/by-name/ry/rygel/add-option-for-installation-sysconfdir.patch b/pkgs/by-name/ry/rygel/add-option-for-installation-sysconfdir.patch
new file mode 100644
index 0000000000000..5204e3518aba7
--- /dev/null
+++ b/pkgs/by-name/ry/rygel/add-option-for-installation-sysconfdir.patch
@@ -0,0 +1,35 @@
+diff --git a/meson.build b/meson.build
+index 27bde61f..3d434de9 100644
+--- a/meson.build
++++ b/meson.build
+@@ -22,7 +22,11 @@ if not get_option('uninstalled')
+     rygel_datadir = join_paths(get_option('prefix'), get_option('datadir'), 'rygel')
+     rygel_libexecdir = join_paths(get_option('prefix'), get_option('libexecdir'),
+     'rygel')
+-    rygel_sysconfdir = join_paths(get_option('prefix'), get_option('sysconfdir'))
++    if get_option('sysconfdir_install') != ''
++        rygel_sysconfdir = join_paths(get_option('prefix'), get_option('sysconfdir_install'))
++    else
++        rygel_sysconfdir = join_paths(get_option('prefix'), get_option('sysconfdir'))
++    endif
+     rygel_plugindir = join_paths(rygel_libdir, 'rygel-2.8', 'plugins')
+     rygel_enginedir = join_paths(rygel_libdir, 'rygel-2.8', 'engines')
+     rygel_presetdir = join_paths(rygel_datadir, 'presets')
+@@ -57,7 +61,7 @@ conf.set_quoted('DATA_DIR', rygel_datadir)
+ conf.set_quoted('PLUGIN_DIR', rygel_plugindir)
+ conf.set_quoted('BIG_ICON_DIR', rygel_bigicondir)
+ conf.set_quoted('SMALL_ICON_DIR', rygel_smallicondir)
+-conf.set_quoted('SYS_CONFIG_DIR', rygel_sysconfdir)
++conf.set_quoted('SYS_CONFIG_DIR', get_option('sysconfdir'))
+ conf.set_quoted('LOCALEDIR', join_paths(get_option('prefix'), get_option('localedir')))
+ conf.set_quoted('MX_EXTRACT_PATH', join_paths(rygel_libexecdir, 'mx-extract'))
+ conf.set_quoted('DESKTOP_DIR', join_paths(get_option('prefix'), get_option('datadir'), 'applications'))
+diff --git a/meson_options.txt b/meson_options.txt
+index fd04776a..3dee43ba 100644
+--- a/meson_options.txt
++++ b/meson_options.txt
+@@ -1,3 +1,4 @@
++option('sysconfdir_install', type: 'string', value: '', description: 'sysconfdir to use during installation')
+ option('uninstalled', type: 'boolean', value: 'false', description: 'Run Rygel from build directory only')
+ option('api-docs', type: 'boolean', value: 'false', description: 'Build the API documentation')
+ option('man_pages', type: 'boolean', value: 'true', description: 'Build the man pages')
diff --git a/pkgs/by-name/ry/rygel/package.nix b/pkgs/by-name/ry/rygel/package.nix
new file mode 100644
index 0000000000000..66d2a5ffae8c4
--- /dev/null
+++ b/pkgs/by-name/ry/rygel/package.nix
@@ -0,0 +1,107 @@
+{ lib, stdenv
+, fetchurl
+, meson
+, ninja
+, pkg-config
+, vala
+, gettext
+, libxml2
+, gobject-introspection
+, wrapGAppsHook3
+, python3
+, glib
+, gssdp_1_6
+, gupnp_1_6
+, gupnp-av
+, gupnp-dlna
+, gst_all_1
+, libgee
+, libsoup_3
+, gtk3
+, libmediaart
+, sqlite
+, systemd
+, tracker
+, shared-mime-info
+, gnome
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "rygel";
+  version = "0.42.6";
+
+  # TODO: split out lib
+  outputs = [ "out" "dev" ];
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/rygel/${lib.versions.majorMinor finalAttrs.version}/rygel-${finalAttrs.version}.tar.xz";
+    sha256 = "R9JXBLYQiDdeJqq6Vr5HwXGJRy5vgMdSq+hvAu9OMwQ=";
+  };
+
+  patches = [
+    ./add-option-for-installation-sysconfdir.patch
+  ];
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    vala
+    gettext
+    libxml2
+    gobject-introspection
+    wrapGAppsHook3
+    python3
+  ];
+
+  buildInputs = [
+    glib
+    gssdp_1_6
+    gupnp_1_6
+    gupnp-av
+    gupnp-dlna
+    libgee
+    libsoup_3
+    gtk3
+    libmediaart
+    sqlite
+    systemd
+    tracker
+    shared-mime-info
+  ] ++ (with gst_all_1; [
+    gstreamer
+    gst-editing-services
+    gst-plugins-base
+    gst-plugins-good
+    gst-plugins-bad
+    gst-plugins-ugly
+  ]);
+
+  mesonFlags = [
+    "-Dsystemd-user-units-dir=${placeholder "out"}/lib/systemd/user"
+    "-Dapi-docs=false"
+    "--sysconfdir=/etc"
+    "-Dsysconfdir_install=${placeholder "out"}/etc"
+  ];
+
+  doCheck = true;
+
+  postPatch = ''
+    patchShebangs data/xml/process-xml.py
+  '';
+
+  passthru = {
+    updateScript = gnome.updateScript {
+      packageName = "rygel";
+      versionPolicy = "odd-unstable";
+    };
+  };
+
+  meta = with lib; {
+    description = "Home media solution (UPnP AV MediaServer) that allows you to easily share audio, video and pictures to other devices";
+    homepage = "https://gitlab.gnome.org/GNOME/rygel";
+    license = licenses.lgpl21Plus;
+    maintainers = teams.gnome.members;
+    platforms = platforms.linux;
+  };
+})
diff --git a/pkgs/by-name/se/seahorse/package.nix b/pkgs/by-name/se/seahorse/package.nix
new file mode 100644
index 0000000000000..2ebc5bae4d0b2
--- /dev/null
+++ b/pkgs/by-name/se/seahorse/package.nix
@@ -0,0 +1,114 @@
+{ stdenv
+, lib
+, fetchpatch
+, fetchurl
+, vala
+, meson
+, ninja
+, libpwquality
+, pkg-config
+, gtk3
+, glib
+, glib-networking
+, wrapGAppsHook3
+, itstool
+, gnupg
+, desktop-file-utils
+, libsoup_3
+, gnome
+, gpgme
+, python3
+, openldap
+, gcr
+, libsecret
+, avahi
+, p11-kit
+, openssh
+, gsettings-desktop-schemas
+, libhandy
+}:
+
+stdenv.mkDerivation rec {
+  pname = "seahorse";
+  version = "43.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    hash = "sha256-Wx0b+6dPNlgifzyC4pbzMN0PzR70Y2tqIYIo/uXqgy0=";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "gpg-2.4.patch";
+      url = "https://gitlab.gnome.org/GNOME/seahorse/-/commit/9260c74779be3d7a378db0671af862ffa3573d42.patch";
+      hash = "sha256-4QiFgH4jC1ucmA9fFozUQZ3Mat76SgpYkMpRz80RH64=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    vala
+    itstool
+    wrapGAppsHook3
+    python3
+    openssh
+    gnupg
+    desktop-file-utils
+    gcr
+  ];
+
+  buildInputs = [
+    gtk3
+    glib
+    glib-networking
+    gcr
+    gsettings-desktop-schemas
+    gpgme
+    libsecret
+    avahi
+    libsoup_3
+    p11-kit
+    openldap
+    libpwquality
+    libhandy
+  ];
+
+  doCheck = true;
+
+  postPatch = ''
+    patchShebangs build-aux/gpg_check_version.py
+  '';
+
+  preCheck = ''
+    # Add “org.gnome.crypto.pgp” GSettings schema to path
+    # to make it available for “gpgme-backend” test.
+    # It is used by Seahorse’s internal “common” library.
+    addToSearchPath XDG_DATA_DIRS "${glib.getSchemaDataDirPath gcr}"
+    # The same test also requires home directory so that it can store settings.
+    export HOME=$TMPDIR
+  '';
+
+  preFixup = ''
+    gappsWrapperArgs+=(
+      # Pick up icons from Gcr
+      --prefix XDG_DATA_DIRS : "${gcr}/share"
+    )
+  '';
+
+  passthru = {
+    updateScript = gnome.updateScript {
+      packageName = pname;
+    };
+  };
+
+  meta = with lib; {
+    homepage = "https://gitlab.gnome.org/GNOME/seahorse";
+    description = "Application for managing encryption keys and passwords in the GnomeKeyring";
+    mainProgram = "seahorse";
+    maintainers = teams.gnome.members;
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+  };
+}
diff --git a/pkgs/by-name/si/simple-scan/package.nix b/pkgs/by-name/si/simple-scan/package.nix
new file mode 100644
index 0000000000000..e7f2954ca39f4
--- /dev/null
+++ b/pkgs/by-name/si/simple-scan/package.nix
@@ -0,0 +1,89 @@
+{ lib, stdenv
+, fetchurl
+, meson
+, ninja
+, pkg-config
+, gettext
+, itstool
+, python3
+, wrapGAppsHook4
+, cairo
+, gdk-pixbuf
+, colord
+, glib
+, libadwaita
+, gtk4
+, gusb
+, packagekit
+, libwebp
+, libxml2
+, sane-backends
+, vala
+, gnome
+, gobject-introspection
+}:
+
+stdenv.mkDerivation rec {
+  pname = "simple-scan";
+  version = "46.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    hash = "sha256-wW5lkBQv5WO+UUMSKzu7U/awCn2p2VL2HEf6Jve08Kk=";
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    gettext
+    itstool
+    pkg-config
+    python3
+    wrapGAppsHook4
+    libxml2
+    gobject-introspection # For setup hook
+    vala
+  ];
+
+  buildInputs = [
+    cairo
+    gdk-pixbuf
+    colord
+    glib
+    gusb
+    libadwaita
+    gtk4
+    libwebp
+    packagekit
+    sane-backends
+  ];
+
+  postPatch = ''
+    patchShebangs data/meson_compile_gschema.py
+  '';
+
+  doCheck = true;
+
+  passthru = {
+    updateScript = gnome.updateScript {
+      packageName = "simple-scan";
+    };
+  };
+
+  meta = with lib; {
+    description = "Simple scanning utility";
+    mainProgram = "simple-scan";
+    longDescription = ''
+      A really easy way to scan both documents and photos. You can crop out the
+      bad parts of a photo and rotate it if it is the wrong way round. You can
+      print your scans, export them to pdf, or save them in a range of image
+      formats. Basically a frontend for SANE - which is the same backend as
+      XSANE uses. This means that all existing scanners will work and the
+      interface is well tested.
+    '';
+    homepage = "https://gitlab.gnome.org/GNOME/simple-scan";
+    license = licenses.gpl3Plus;
+    maintainers = teams.gnome.members;
+    platforms = platforms.linux;
+  };
+}
diff --git a/pkgs/by-name/sm/smartgithg/package.nix b/pkgs/by-name/sm/smartgithg/package.nix
index 65c5a78ad299e..d3bb1ed1b67d7 100644
--- a/pkgs/by-name/sm/smartgithg/package.nix
+++ b/pkgs/by-name/sm/smartgithg/package.nix
@@ -5,7 +5,7 @@
 , openjdk21
 , gtk3
 , glib
-, gnome
+, adwaita-icon-theme
 , wrapGAppsHook3
 , libXtst
 , which
@@ -24,7 +24,7 @@ stdenv.mkDerivation rec {
 
   nativeBuildInputs = [ wrapGAppsHook3 ];
 
-  buildInputs = [ jre gnome.adwaita-icon-theme gtk3 ];
+  buildInputs = [ jre adwaita-icon-theme gtk3 ];
 
   preFixup = with lib; ''
     gappsWrapperArgs+=( \
diff --git a/pkgs/by-name/su/sushi/package.nix b/pkgs/by-name/su/sushi/package.nix
new file mode 100644
index 0000000000000..aad4727da20b1
--- /dev/null
+++ b/pkgs/by-name/su/sushi/package.nix
@@ -0,0 +1,86 @@
+{ lib, stdenv
+, fetchurl
+, pkg-config
+, meson
+, gettext
+, gobject-introspection
+, evince
+, glib
+, gnome
+, gtksourceview4
+, gjs
+, libsoup_3
+, webkitgtk_4_1
+, icu
+, wrapGAppsHook3
+, gst_all_1
+, gdk-pixbuf
+, librsvg
+, gtk3
+, harfbuzz
+, ninja
+, libepoxy
+}:
+
+stdenv.mkDerivation rec {
+  pname = "sushi";
+  version = "46.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/sushi/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    hash = "sha256-lghbqqQwqyFCxgaqtcR+L7sv0+two1ITfmXFmlig8sY=";
+  };
+
+  nativeBuildInputs = [
+    pkg-config
+    meson
+    ninja
+    gettext
+    gobject-introspection
+    wrapGAppsHook3
+  ];
+
+  buildInputs = [
+    glib
+    gtk3
+    evince
+    icu
+    harfbuzz
+    gjs
+    gtksourceview4
+    gdk-pixbuf
+    librsvg
+    libsoup_3
+    webkitgtk_4_1
+    libepoxy
+    gst_all_1.gstreamer
+    gst_all_1.gst-plugins-base
+    (gst_all_1.gst-plugins-good.override { gtkSupport = true; })
+    gst_all_1.gst-plugins-bad
+    gst_all_1.gst-plugins-ugly
+  ];
+
+  # See https://github.com/NixOS/nixpkgs/issues/31168
+  postInstall = ''
+    for file in $out/libexec/org.gnome.NautilusPreviewer
+    do
+      sed -e $"2iimports.package._findEffectiveEntryPointName = () => \'$(basename $file)\' " \
+        -i $file
+    done
+  '';
+
+  passthru = {
+    updateScript = gnome.updateScript {
+      packageName = "sushi";
+    };
+  };
+
+  meta = with lib; {
+    homepage = "https://en.wikipedia.org/wiki/Sushi_(software)";
+    description = "Quick previewer for Nautilus";
+    mainProgram = "sushi";
+    maintainers = teams.gnome.members;
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+  };
+}
diff --git a/pkgs/by-name/sv/svp/package.nix b/pkgs/by-name/sv/svp/package.nix
index c34507c91e448..30e540ba74165 100644
--- a/pkgs/by-name/sv/svp/package.nix
+++ b/pkgs/by-name/sv/svp/package.nix
@@ -7,7 +7,6 @@
 , copyDesktopItems
 , ffmpeg
 , glibc
-, gnome
 , jq
 , lib
 , libmediainfo
@@ -20,6 +19,7 @@
 , vapoursynth
 , xdg-utils
 , xorg
+, zenity
 }:
 let
   mpvForSVP = callPackage ./mpv.nix { };
@@ -42,7 +42,7 @@ let
     fakeLsof
     ffmpeg.bin
     glibc
-    gnome.zenity
+    zenity
     libmediainfo
     libsForQt5.qtbase
     libsForQt5.qtwayland
diff --git a/pkgs/by-name/th/thcrap-steam-proton-wrapper/package.nix b/pkgs/by-name/th/thcrap-steam-proton-wrapper/package.nix
index 00a5458c08821..8b43215c52dc0 100644
--- a/pkgs/by-name/th/thcrap-steam-proton-wrapper/package.nix
+++ b/pkgs/by-name/th/thcrap-steam-proton-wrapper/package.nix
@@ -5,7 +5,7 @@
   , makeWrapper
   , bash
   , subversion
-  , gnome
+  , zenity
 }:
 stdenv.mkDerivation {
   pname = "thcrap-proton";
@@ -37,7 +37,7 @@ stdenv.mkDerivation {
         lib.makeBinPath [
           bash
           subversion
-          gnome.zenity
+          zenity
         ]
       }
   '';
diff --git a/pkgs/by-name/to/totem/package.nix b/pkgs/by-name/to/totem/package.nix
new file mode 100644
index 0000000000000..c2cf2ff9a7d46
--- /dev/null
+++ b/pkgs/by-name/to/totem/package.nix
@@ -0,0 +1,138 @@
+{ stdenv
+, lib
+, fetchurl
+, fetchpatch
+, meson
+, ninja
+, gettext
+, gst_all_1
+, python3Packages
+, shared-mime-info
+, pkg-config
+, gtk3
+, glib
+, gobject-introspection
+, totem-pl-parser
+, wrapGAppsHook3
+, itstool
+, libxml2
+, vala
+, gnome
+, grilo
+, grilo-plugins
+, libpeas
+, libportal-gtk3
+, libhandy
+, adwaita-icon-theme
+, gnome-desktop
+, gsettings-desktop-schemas
+, gdk-pixbuf
+, xvfb-run
+}:
+
+stdenv.mkDerivation rec {
+  pname = "totem";
+  version = "43.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/totem/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "s202VZKLWJZGKk05+Dtq1m0328nJnc6wLqii43OUpB4=";
+  };
+
+  patches = [
+    # Lower X11 dependency version since we do not have it.
+    (fetchpatch {
+      url = "https://gitlab.gnome.org/GNOME/totem/-/commit/140d9eea70c3101ef3234abb4de5974cb84b13db.patch";
+      sha256 = "ohppxqMiH8Ksc9B2e3AXighfM6KVN+RNXYL+fLELSN8=";
+      revert = true;
+    })
+    (fetchpatch {
+      url = "https://gitlab.gnome.org/GNOME/totem/-/commit/2610b4536f73493587e4a5a38e01c9961fcabb96.patch";
+      sha256 = "nPfzS+LQuAlyQOz67hCdtx93w2frhgWlg1KGX5bEU38=";
+      revert = true;
+    })
+    (fetchpatch {
+      url = "https://gitlab.gnome.org/GNOME/totem/-/commit/5b871aee5292f25bbf39dca18045732e979e7a68.patch";
+      sha256 = "LqQLdgyZkIVc+/hQ5sdBLqhtjCVIMDSs9tjVXwMFodg=";
+      revert = true;
+    })
+  ];
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    vala
+    pkg-config
+    gettext
+    python3Packages.python
+    itstool
+    gobject-introspection
+    wrapGAppsHook3
+  ];
+
+  buildInputs = [
+    gtk3
+    glib
+    grilo
+    totem-pl-parser
+    grilo-plugins
+    gst_all_1.gstreamer
+    gst_all_1.gst-plugins-base
+    (gst_all_1.gst-plugins-good.override { gtkSupport = true; })
+    gst_all_1.gst-plugins-bad
+    gst_all_1.gst-plugins-ugly
+    gst_all_1.gst-libav
+    libpeas
+    libportal-gtk3
+    libhandy
+    shared-mime-info
+    gdk-pixbuf
+    libxml2
+    adwaita-icon-theme
+    gnome-desktop
+    gsettings-desktop-schemas
+    python3Packages.pygobject3
+  ];
+
+  nativeCheckInputs = [
+    xvfb-run
+  ];
+
+  mesonFlags = [
+    # TODO: https://github.com/NixOS/nixpkgs/issues/36468
+    "-Dc_args=-I${glib.dev}/include/gio-unix-2.0"
+  ];
+
+  # Tests do not work with GStreamer 1.18.
+  # https://gitlab.gnome.org/GNOME/totem/-/issues/450
+  doCheck = false;
+
+  postPatch = ''
+    chmod +x meson_compile_python.py # patchShebangs requires executable file
+    patchShebangs \
+      ./meson_compile_python.py
+  '';
+
+  checkPhase = ''
+    runHook preCheck
+
+    xvfb-run -s '-screen 0 800x600x24' \
+      ninja test
+
+    runHook postCheck
+  '';
+
+  passthru = {
+    updateScript = gnome.updateScript {
+      packageName = "totem";
+    };
+  };
+
+  meta = with lib; {
+    homepage = "https://apps.gnome.org/Totem/";
+    description = "Movie player for the GNOME desktop based on GStreamer";
+    maintainers = teams.gnome.members;
+    license = licenses.gpl2Plus; # with exception to allow use of non-GPL compatible plug-ins
+    platforms = platforms.linux;
+  };
+}
diff --git a/pkgs/by-name/tr/trigger-control/package.nix b/pkgs/by-name/tr/trigger-control/package.nix
index b0a389e29ec4e..3398a3fe0aabb 100644
--- a/pkgs/by-name/tr/trigger-control/package.nix
+++ b/pkgs/by-name/tr/trigger-control/package.nix
@@ -10,13 +10,9 @@
 , libdecor
 , libnotify
 , dejavu_fonts
-, gnome
+, zenity
 }:
 
-let
-  inherit (gnome) zenity;
-in
-
 stdenv.mkDerivation (finalAttrs: {
   pname = "trigger-control";
   version = "1.5.1";
diff --git a/pkgs/by-name/tu/tuifimanager/package.nix b/pkgs/by-name/tu/tuifimanager/package.nix
index c2b214ce55b15..7ccb8e4b237f0 100644
--- a/pkgs/by-name/tu/tuifimanager/package.nix
+++ b/pkgs/by-name/tu/tuifimanager/package.nix
@@ -3,7 +3,7 @@
 , python3
 , fetchFromGitHub
 , kdePackages
-, gnome
+, gnome-themes-extra
 , qt6
 , makeWrapper
 , x11Support ? stdenv.isLinux
@@ -52,7 +52,7 @@ python3.pkgs.buildPythonApplication rec {
   postFixup = let
     # fix missing 'adwaita' warning missing with ncurses tui
     # see: https://github.com/NixOS/nixpkgs/issues/60918
-    theme = gnome.gnome-themes-extra;
+    theme = gnome-themes-extra;
   in
     lib.optionalString enableDragAndDrop ''
       wrapProgram $out/bin/tuifi \
diff --git a/pkgs/by-name/wi/wifi-qr/package.nix b/pkgs/by-name/wi/wifi-qr/package.nix
index 341077edaefa9..3c5a37b071b88 100644
--- a/pkgs/by-name/wi/wifi-qr/package.nix
+++ b/pkgs/by-name/wi/wifi-qr/package.nix
@@ -2,7 +2,7 @@
 , fetchFromGitHub
 , installShellFiles
 , makeWrapper
-, gnome
+, zenity
 , ncurses
 , networkmanager
 , patsh
@@ -26,7 +26,7 @@ stdenvNoCC.mkDerivation {
   };
 
   buildInputs = [
-    gnome.zenity
+    zenity
     ncurses
     networkmanager
     procps
diff --git a/pkgs/by-name/ye/yelp-xsl/package.nix b/pkgs/by-name/ye/yelp-xsl/package.nix
new file mode 100644
index 0000000000000..572f68a923a84
--- /dev/null
+++ b/pkgs/by-name/ye/yelp-xsl/package.nix
@@ -0,0 +1,51 @@
+{ lib, stdenv
+, gettext
+, fetchurl
+, pkg-config
+, itstool
+, libxml2
+, libxslt
+, gnome
+}:
+
+stdenv.mkDerivation rec {
+  pname = "yelp-xsl";
+  version = "42.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/yelp-xsl/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "sha256-I4vhULFlMIDOE5lxMw/TbTomWV4NagQKLAML89IAW80=";
+  };
+
+  nativeBuildInputs = [
+    pkg-config
+    gettext
+    itstool
+    libxml2
+    libxslt
+  ];
+
+  doCheck = true;
+
+  passthru = {
+    updateScript = gnome.updateScript {
+      packageName = pname;
+    };
+  };
+
+  meta = with lib; {
+    homepage = "https://gitlab.gnome.org/GNOME/yelp-xsl";
+    description = "Yelp's universal stylesheets for Mallard and DocBook";
+    maintainers = teams.gnome.members;
+    license = with licenses; [
+      # See https://gitlab.gnome.org/GNOME/yelp-xsl/blob/master/COPYING
+      # Stylesheets
+      lgpl2Plus
+      # Icons, unclear: https://gitlab.gnome.org/GNOME/yelp-xsl/issues/25
+      gpl2
+      # highlight.js
+      bsd3
+    ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/pkgs/by-name/ye/yelp/package.nix b/pkgs/by-name/ye/yelp/package.nix
new file mode 100644
index 0000000000000..7d9549d970930
--- /dev/null
+++ b/pkgs/by-name/ye/yelp/package.nix
@@ -0,0 +1,64 @@
+{ lib
+, stdenv
+, gettext
+, fetchurl
+, webkitgtk_4_1
+, pkg-config
+, gtk3
+, libhandy
+, glib
+, gnome
+, adwaita-icon-theme
+, sqlite
+, itstool
+, libxml2
+, libxslt
+, gst_all_1
+, wrapGAppsHook3
+, yelp-xsl
+}:
+
+stdenv.mkDerivation rec {
+  pname = "yelp";
+  version = "42.2";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/yelp/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "sha256-osX9B4epCJxyLMZr0Phc33CI2HDntsyFeZ+OW/+erEs=";
+  };
+
+  nativeBuildInputs = [
+    pkg-config
+    gettext
+    itstool
+    wrapGAppsHook3
+  ];
+
+  buildInputs = [
+    gtk3
+    libhandy
+    glib
+    webkitgtk_4_1
+    sqlite
+    libxml2
+    libxslt
+    yelp-xsl
+    adwaita-icon-theme
+    gst_all_1.gst-plugins-base
+    gst_all_1.gst-plugins-good
+  ];
+
+  passthru = {
+    updateScript = gnome.updateScript {
+      packageName = "yelp";
+    };
+  };
+
+  meta = with lib; {
+    homepage = "https://apps.gnome.org/Yelp/";
+    description = "Help viewer in Gnome";
+    maintainers = teams.gnome.members;
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/pkgs/by-name/ze/zenity/package.nix b/pkgs/by-name/ze/zenity/package.nix
new file mode 100644
index 0000000000000..b9e43a42b27b1
--- /dev/null
+++ b/pkgs/by-name/ze/zenity/package.nix
@@ -0,0 +1,56 @@
+{ stdenv
+, lib
+, fetchurl
+, help2man
+, meson
+, ninja
+, pkg-config
+, libxml2
+, gnome
+, gtk4
+, gettext
+, libadwaita
+, itstool
+, wrapGAppsHook4
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "zenity";
+  version = "4.0.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/zenity/${lib.versions.majorMinor finalAttrs.version}/zenity-${finalAttrs.version}.tar.xz";
+    sha256 = "DC9TeBOxD3KEcNnQXWyVcT2yUS+clQluHoWxpnOWBeY=";
+  };
+
+  nativeBuildInputs = [
+    help2man
+    meson
+    ninja
+    pkg-config
+    gettext
+    itstool
+    libxml2
+    wrapGAppsHook4
+  ];
+
+  buildInputs = [
+    gtk4
+    libadwaita
+  ];
+
+  passthru = {
+    updateScript = gnome.updateScript {
+      packageName = "zenity";
+    };
+  };
+
+  meta = with lib; {
+    mainProgram = "zenity";
+    description = "Tool to display dialogs from the commandline and shell scripts";
+    homepage = "https://gitlab.gnome.org/GNOME/zenity";
+    license = licenses.lgpl21Plus;
+    platforms = platforms.unix;
+    maintainers = teams.gnome.members;
+  };
+})