NixOS Wiki
GNOME
GNOME (/(ɡ)noʊm/) is a desktop environment known for its focus on being simple, intuitive, and easy to use.
It is made by The GNOME Project and is composed entirely of free and open-source software. Its Mutter
compositor supports both Wayland and X server, and the GNOME Shell user interface is customizable by
extensions.
This article is an extension of the documentation in the NixOS manual (https://nixos.org/manual/nixos/stable/#c
hap-gnome).
GNOME (https://gnome.org/) is available as a module and can be enabled with
services.xserver.desktopManager.
Installation
To use GNOME, add this to your configuration.nix:
/etc/nixos/configuration.nix
{
services.xserver.enable = true;
services.xserver.displayManager.gdm.enable = true;
services.xserver.desktopManager.gnome.enable = true;
}
Excluding GNOME Applications
To exclude certain applications that are installed by default with GNOME edit configuration.nix as
follows:
/etc/nixos/configuration.nix
{
environment.gnome.excludePackages = with pkgs; [
orca
evince
# file-roller
geary
gnome-disk-utility
# seahorse
# sushi
# sysprof
#
# gnome-shell-extensions
#
# adwaita-icon-theme
# nixos-background-info
gnome-backgrounds
# gnome-bluetooth
# gnome-color-manager
# gnome-control-center
# gnome-shell-extensions
gnome-tour # GNOME Shell detects the .desktop file on first log-in.
gnome-user-docs
# glib # for gsettings program
# gnome-menus
# gtk3.out # for gtk-launch program
# xdg-user-dirs # Update user dirs as described in https://freedesktop.org/wiki/Software/xdg-user-dirs/
# xdg-user-dirs-gtk # Used to create the default bookmarks
#
baobab
epiphany
gnome-text-editor
gnome-calculator
gnome-calendar
gnome-characters
# gnome-clocks
gnome-console
gnome-contacts
gnome-font-viewer
gnome-logs
gnome-maps
gnome-music
# gnome-system-monitor
gnome-weather
# loupe
# nautilus
gnome-connections
simple-scan
snapshot
totem
yelp
gnome-software
];
}
Configuration
Managing extensions
GNOME extensions are managed and configured by the program "Extensions" that comes with GNOME. Some
of them can be installed with Nix, however they aren't enabled by default. To enable them the "Extensions"
program can be used.
/etc/nixos/configuration.nix
{
environment.systemPackages = with pkgs.gnomeExtensions; [
blur-my-shell
pop-shell
# ...
];
}
Installed extensions can be enabled and configured in Extension app that comes preinstalled with GNOME. If
you want to do that declaratively in your configuration, you can use Home Manager dconf module by adding
following lines.
~/.config/home-manager/home.nix
{
dconf = {
enable = true;
settings = {
"org/gnome/shell" = {
disable-user-extensions = false; # enables user extensions
enabled-extensions = [
# Put UUIDs of extensions that you want to enable here.
# If the extension you want to enable is packaged in nixpkgs,
# you can easily get its UUID by accessing its extensionUuid
# field (look at the following example).
pkgs.gnomeExtensions.gsconnect.extensionUuid
# Alternatively, you can manually pass UUID as a string.
"blur-my-shell@aunetx"
# ...
];
};
# Configure individual extensions
"org/gnome/shell/extensions/blur-my-shell" = {
brightness = 0.75;
noise-amount = 0;
};
};
};
}
dconf settings
Most of the GNOME settings are stored in dconf (https://en.wikipedia.org/wiki/Dconf) database. Settings are
stored as keys placed in folders.
To learn about settings that can be configured with dconf either look into dconf-editor program (provided
by gnome.dconf-editor package) or type dconf watch / in the terminal and change settings from the
GUI and see which options are responsible for that component/element.
These settings can be changed by NixOS via programs.dconf module or by Home Manager via dconf
module. To so in Home Manager, you need to change dconf.settings attribute set. This attribute set
contains absolute folder paths (without leading slash) as attributes' names which value is another attribute set
with keys (settings).
For example, to change the value of clock-show-weekday key that is located in
/org/gnome/desktop/interface, you need to the following:
~/.config/home-manager/home.nix
{
dconf = {
enable = true;
settings = {
# You need quotes to escape '/'
"org/gnome/desktop/interface" = {
clock-show-weekday = true;
};
};
};
}
Same can be achieved by using system configuration.
/etc/nixos/configuration.nix
{
programs.dconf = {
enable = true;
profiles.user.databases = [
{
lockAll = true; # prevents overriding
settings = {
"org/gnome/desktop/interface" = {
clock-show-weekday = true;
};
};
}
];
};
}
Note: Since dconf have more data types than Nix language (for example, tuples), in some cases you'll need to
convert Nix value to a GVariant value. You can achieve that by using function defined in lib.gvariant,
they're documented here (https://nixos.org/manual/nixpkgs/stable/#sec-functions-library-gvariant).
Dark mode
Change default color theme for all GTK4 applications to dark using Home Manager.
~/.config/home-manager/home.nix
{
dconf = {
enable = true;
settings."org/gnome/desktop/interface".color-scheme = "prefer-dark";
};
}
Tips and tricks
To run GNOME programs outside of GNOME
GNOME platform-based applications are largely self-contained (https://nixos.org/nixpkgs/manual/#sec-languag
e-gnome), but they still depend, for one reason or another, on some global configuration. The gnome.nix
module sets all the necessary options for you but if you are running customized set-up, you might need to
replicate that yourself.
For instance, if you see the following error:
dconf-WARNING **: failed to commit changes to dconf: GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown:
The name ca.desrt.dconf was not provided by any .service files
you should enable dconf module:
{
programs.dconf.enable = true;
}
Many applications rely heavily on having an icon theme available, GNOME’s Adwaita is a good choice but
most recent icon themes should work as well.
{
environment.systemPackages = [ pkgs.adwaita-icon-theme ];
}
If you're using the default theme, GTK-3 applications may not respect the dark theme if they can't find the
Adwaita. To fix it, make sure you have the gnome-themes-extra package installed:
{
environment.systemPackages = [ pkgs.gnome-themes-extra ];
}
Systray Icons
To get systray icons, install the related GNOME shell extension
{
environment.systemPackages = [ pkgs.gnomeExtensions.appindicator ];
}
And ensure gnome-settings-daemon udev rules are enabled:
{
services.udev.packages = [ pkgs.gnome-settings-daemon ];
}
To run old applications
Some old applications use GConf service to store configuration. This has been deprecated for many years but
some applications were abandoned before they managed to upgrade to a newer dconf system. If you are running
such application and getting an error like:
GLib.GException: Failed to contact configuration server; the most common cause is a missing or misconfigured
D-Bus session bus daemon. See http://projects.gnome.org/gconf/ for information
you need to add gnome2.GConf to the list of dbus packages in your configuration.nix:
{
services.dbus.packages = with pkgs; [ gnome2.GConf ];
}
After applying the update restart your desktop session to refresh the user-specific dbus session.
Dynamic triple buffering
Warning: Dynamic triple buffering is a still developing feature that is not merged into GNOME's mutter.
Some bugs and unexpected behavior can occur. Use at your own risk!
Big merge request (https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1441) against Mutter improves
the performance of the window manager by a lot (and is already used by Ubuntu). Not merged into nixpkgs due
to philosophy of nixpkgs (https://github.com/NixOS/nixpkgs/issues/197181), but users are free to add this
overlay to get it too.
If you wish to try this patch for yourself, add the following to your NixOS configuration:
/etc/nixos/configuration.nix
{
nixpkgs.overlays = [
# GNOME 46: triple-buffering-v4-46
(final: prev: {
mutter = prev.mutter.overrideAttrs (old: {
src = pkgs.fetchFromGitLab {
domain = "gitlab.gnome.org";
owner = "vanvugt";
repo = "mutter";
rev = "triple-buffering-v4-46";
hash = "sha256-C2VfW3ThPEZ37YkX7ejlyumLnWa9oij333d5c4yfZxc=";
};
});
})
];
}
For GNOME 47, use the following configuration instead:
/etc/nixos/configuration.nix
{
nixpkgs.overlays = [
# GNOME 47: triple-buffering-v4-47
(final: prev: {
mutter = prev.mutter.overrideAttrs (oldAttrs: {
# GNOME dynamic triple buffering (huge performance improvement)
# See https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1441
# Also https://gitlab.gnome.org/vanvugt/mutter/-/tree/triple-buffering-v4-47
src = final.fetchFromGitLab {
domain = "gitlab.gnome.org";
owner = "vanvugt";
repo = "mutter";
rev = "triple-buffering-v4-47";
hash = "sha256-Jlhzt2Cc44epkBcz3PA6I5aTnVEqMsHBOE8aEmvANWw=";
};
# GNOME 47 requires the gvdb subproject which is not included in the triple-buffering branch
# This copies the necessary gvdb files from the official GNOME repository
preConfigure = let
gvdb = final.fetchFromGitLab {
domain = "gitlab.gnome.org";
owner = "GNOME";
repo = "gvdb";
rev = "2b42fc75f09dbe1cd1057580b5782b08f2dcb400";
hash = "sha256-CIdEwRbtxWCwgTb5HYHrixXi+G+qeE1APRaUeka3NWk=";
};
in ''
cp -a "${gvdb}" ./subprojects/gvdb
'';
});
})
];
}
Flakes approach
If you're using flakes, you can add the repositories as inputs.
It will save you the burden of updating the dependencies manually, but at a cost of laziness: they will always be
fetched regardless of whether they're actually needed to build the current artifact/configuration. This may not be
always desirable.
flake.nix (inputs section)
{
# In inputs:
mutter-triple-buffering-src = {
url = "gitlab:vanvugt/mutter?ref=triple-buffering-v4-47&host=gitlab.gnome.org";
flake = false;
};
gvdb-src = {
url = "gitlab:GNOME/gvdb?ref=main&host=gitlab.gnome.org";
flake = false;
};
}
Then, in your overlay section:
flake.nix (overlay section)
{
# In your overlay:
mutter = super.mutter.overrideAttrs (old: {
src = inputs.mutter-triple-buffering-src;
preConfigure = ''
cp -a "${inputs.gvdb-src}" ./subprojects/gvdb
'';
});
}
Note: For GNOME 47, the gvdb dependency must be manually added to the subprojects directory during
build. The preConfigure hook handles this by fetching the required repository and placing it in the correct
location.
Prior to commit 7f387d6b (https://github.com/NixOS/nixpkgs/commit/7f387d6bf915b8fd7d7131edd3e5107f4a
98cc9d) (~01.09.2024 for master) mutter was located in gnome scope, so overrideScope was required to
achieve the same result:
/etc/nixos/configuration.nix
{
nixpkgs.overlays = [
# GNOME 46: triple-buffering-v4-46
(final: prev: {
gnome = prev.gnome.overrideScope (gnomeFinal: gnomePrev: {
mutter = gnomePrev.mutter.overrideAttrs (old: {
src = pkgs.fetchFromGitLab {
domain = "gitlab.gnome.org";
owner = "vanvugt";
repo = "mutter";
rev = "triple-buffering-v4-46";
hash = "sha256-fkPjB/5DPBX06t7yj0Rb3UEuu5b9mu3aS+jhH18+lpI=";
};
});
});
})
];
}
You might need to disable aliases to make it work:
nixpkgs.config.allowAliases = false;
NOTE - the "allowAliases" set to false has been known to break stylix (if you use it).
Profiling (with sysprof)
Install sysprof as a system package (it won't work properly if installed against users). Then enable the
associated service with
services.sysprof.enable = true;
Automatic screen rotation
hardware.sensor.iio.enable = true;
Troubleshoots
Change user's profile picture
Currently there is no way to change the user's profile picture using Gnome Control Center (see this issue) (http
s://github.com/NixOS/nixpkgs/issues/10025) and currently there is no plan to support it officially in NixOS.
However, you can modify it by copying the profile picture that you want to the path /home/$USER/.face as a
workaround, i.e.
$ mv /path/to/image.jpg ~/.face
Change Profile Photo for Login and Lockscreen - Declarative
This is admittedly a hack way of doing it, however does work.
Considerations:
image must be a PNG
permissions matter
this is absolutely a workaround
assumes you are already using a .face file
you will need to update the paths and username as applicable to your system (CAPITALIZED in
the code)
you cannot change the photo using Gnome Control Center
You can place this in your configuration.nix:
system.activationScripts.script.text = ''
mkdir -p /var/lib/AccountsService/{icons,users}
cp /home/YOUR-USER-NAME/PATH-TO/.face /var/lib/AccountsService/icons/YOUR-USER-NAME
echo -e "[User]\nIcon=/var/lib/AccountsService/icons/YOUR-USER-NAME\n" >
/var/lib/AccountsService/users/YOUR-USER-NAME
chown root:root /var/lib/AccountsService/users/YOUR-USER-NAME
chmod 0600 /var/lib/AccountsService/users/YOUR-USER-NAME
chown root:root /var/lib/AccountsService/icons/YOUR-USER-NAME
chmod 0444 /var/lib/AccountsService/icons/YOUR-USER-NAME
'';
Automatic login
If you have enabled auto login (https://help.gnome.org/admin/system-admin-guide/stable/login-automatic.html.e
n) (with GNOME) with something like
$ grep autoLogin /etc/nixos/configuration.nix
services.xserver.displayManager.autoLogin.enable = true;
services.xserver.displayManager.autoLogin.user = "account";
than add the following (as a workaround for a current (2023)[1] problem)
# nano /etc/nixos/configuration.nix
{
systemd.services."getty@tty1".enable = false;
systemd.services."autovt@tty1".enable = false;
}
See also
GNOME/Calendar
1. https://github.com/NixOS/nixpkgs/issues/103746#issuecomment-945091229
Retrieved from "https://wiki.nixos.org/w/index.php?title=GNOME&oldid=20891"
Categories: Desktop environment Applications NixOS Manual GNOME