π

GNOME Setup

Show Sidebar

These are my personal notes on how to set up a new GNOME desktop environment (preferably Debian stable). This documentation started with GNOME 48 of Debian 13 (Trixie).

For the record: I was using the XFCE desktop environment for more than 15 years until 2025-08 when I wanted to try out something new with some additional armenities and better styling.

As of 2025-11-09, I switched from GNOME 48 to KDE Plasma 6. You can find my KDE Plasma settings in this article.

General GNOME Notes for Setup and Initial Steps

My current hardware setup is:

In case you want to extract all the `gsettings` commands from this page in one go:

wget "https://www.karl-voit.at/Gnome-Setup/source.org.txt"
grep "gsettings set" source.org.txt | sed 's/^ *//' | sed 's/^: //' | grep -v grep	  

Settings

Extensions

GNOME follows the concept of being rather minimal or puristic. For people with particular requirements, GNOME can be tweaked by multiple methods. Besides GNOME Tweaks (see below), GNOME Extensions are a whole ecosystem of extentions where functionality can be added to the desktop environment. This can be very easily done via web browser within the user context.

While this is really easy to accomplish by people, this comes with the downside for multi-user systems: each and every update needs to be applied by every separate user. This also results in "Extension X needs to be updated, please log out and in again"-messages, which can be regarded as tedious.

Furthermore, the particular combination of GNOME version and extensions is parts of the standard tests. Therefore, with more and more extensions installed by you, you get into a situation where you have a unique setup which can result in issues that are hard to impossible to debug when issues arise. For example, with my multi-monitor setup in combination with various extensions, I can not tell why certain bugs appear and how they can be analyzed.

With desktop environments that come with much more functionality out-of-the-box (like KDE) without relying on external dependencies, you can expect more thorough testing for more functionality.

Dash to Panel: app icons in the top (main) panel

Clipboard indicator: multiple clipboards

Astra: CPU Meter, ...

Hibernate status button

Somehow, you need an extension to expose relevant sleep/suspend/hibernate/... entries:

Battery Health Charging: set/control batt limits

WSP (Windows Search Provider): Search for window titles

In the default search, you can only search for applications. This activates search for window titles as well in order to jump to a specific browser window, not just the browser itself.

Mouse Follows Focus: fix wrong mouse placement when using "WSP"

Eye on Cursor: Replacement for xeyes to spot the mouse pointer

I like this method to spot the mouse pointer when using multiple screens.

Move To Next Screen: move windows to left/right screen

Wallpaper Slideshow: Image folder slideshow for desktop images

I'm using a Synchthing share that holds all photographs of mine that are marked as "suitable as desktop background" for the current month.

All Windows + Save/Restore Window Positions

Just in case the built-in method doesn't turn out to be stable. This extension might be removed later.

Window Gestures: More options for touch gestures

On multi-touch devices:

Screen Rotate: Adds quick settings for screen rotation

Important for 2-in-1 devices, tablets, ...

"User Themes"

So far, I'm satisfied with the current default styling. This is just in case I want to try out some themes:

Tweaks

Go through all all options! -> many interesting switches here!

Themes

So far, I'm satisfied with the current default styling. This is just in case I want to try out some themes:

Text Snippets

I was using AutoKey for many years with xfce. With Wayland, this doesn't work any more.

I need to find a new method.

Auto-Login

I prefer not to enter username/password of the default user after a fresh system boot because I already have authenticated myself by using the correct disk encryption password.

See also "Settings → Users → ... → Auto-Login option in UI" but I have no idea how the two config options are related.

Modify `sudo /etc/gdm/custom.conf`

[daemon]
AutomaticLoginEnable=True
AutomaticLogin=username	  

Nautilus ("Files")

gsettings set org.gnome.nautilus.preferences default-folder-viewer 'list-view'	  

I've got some self-written Python tools I want to integrate into Nautilus. Unfortunately, it's not possible to overwrite default keyboard shortcuts. So I had to get creative.

You'll find the scripts within your context menu under "Scripts >".

You can use following environment variables according to this comment (I haven't checked):

echo Selected File Paths: ${NAUTILUS_SCRIPT_SELECTED_FILE_PATHS}
echo Selected File URIs: ${NAUTILUS_SCRIPT_SELECTED_URIS}
echo Current location URI: ${NAUTILUS_SCRIPT_CURRENT_URI}	  

Notice that assigning a keyboard shortcut (accels) somehow doesn't work for "foo" if you also have "foo bar" as a scriptname.

If your paths differ, you need to get creative as well. ;-)

Ctrl-j for tagging files via filetags

Read more about my file tagging concept in this article.

SCRIPTNAME="filetags"  ## may contain spaces or "(" ")" but must not contain: "-"
SCRIPTSHORTCUT="<Primary>j"
INVOCATIONLINE="uv --project ${HOME}/src/filetags run ${HOME}/src/filetags/filetags/__init__.py --interactive --gui"

cat <<EOT >> ~/.local/share/nautilus/scripts/"${SCRIPTNAME}"
#!/usr/bin/env bash
${INVOCATIONLINE} "\$@"
#end
EOT
chmod +x ~/.local/share/nautilus/scripts/"${SCRIPTNAME}"

mkdir -p ~/.config/nautilus
echo "${SCRIPTSHORTCUT} ${SCRIPTNAME}" >> ~/.config/nautilus/scripts-accels	  

Adding date/time to file names as prefix

See my project date2name.

So far, I could not find any free keyboard shortcut that I was happy with. So this is only in the context menu:

SCRIPTNAME="date2name"  ## may contain spaces or "(" ")" but must not contain: "-"
#SCRIPTSHORTCUT="<Primary>j"
INVOCATIONLINE="uv --project ${HOME}/src/date2name run ${HOME}/src/date2name/date2name/__init__.py"

cat <<EOT >> ~/.local/share/nautilus/scripts/"${SCRIPTNAME}"
#!/usr/bin/env bash
${INVOCATIONLINE} "\$@"
#end
EOT
chmod +x ~/.local/share/nautilus/scripts/"${SCRIPTNAME}"	  
SCRIPTNAME="time2name"  ## may contain spaces or "(" ")" but must not contain: "-"
#SCRIPTSHORTCUT="<Primary>j"
INVOCATIONLINE="uv --project ${HOME}/src/date2name run ${HOME}/src/date2name/date2name/__init__.py --withtime"

cat <<EOT >> ~/.local/share/nautilus/scripts/"${SCRIPTNAME}"
#!/usr/bin/env bash
${INVOCATIONLINE} "\$@"
#end
EOT
chmod +x ~/.local/share/nautilus/scripts/"${SCRIPTNAME}"	  

Comparing files

This is using Meld which you need to install.

So far, I could not find any free keyboard shortcut that I was happy with. So this is only in the context menu:

SCRIPTNAME="compare files"  ## may contain spaces or "(" ")" but must not contain: "-"
#SCRIPTSHORTCUT="<Primary>j"
INVOCATIONLINE="meld"

cat <<EOT >> ~/.local/share/nautilus/scripts/"${SCRIPTNAME}"
#!/usr/bin/env bash
${INVOCATIONLINE} "\$@" &
#end
EOT
chmod +x ~/.local/share/nautilus/scripts/"${SCRIPTNAME}"	  

Copy File Path

This is using "wl-clip" and "notify-send".

So far, I could not find any free keyboard shortcut that I was happy with. So this is only in the context menu:

SCRIPTNAME="Copy file path"  ## may contain spaces or "(" ")" but must not contain: "-"
#SCRIPTSHORTCUT="<Primary>j"

cat <<EOT >> ~/.local/share/nautilus/scripts/"${SCRIPTNAME}"
#!/usr/bin/env bash
mypath=$(pwd)/"$1"
echo -n $mypath | wl-clip

notify-send "Path copied to clipboard:" "$mypath"
#end
EOT
chmod +x ~/.local/share/nautilus/scripts/"${SCRIPTNAME}"	  

Analyzing Disk Space

This is using qdirstat.

So far, I could not find any free keyboard shortcut that I was happy with. So this is only in the context menu:

SCRIPTNAME="date2name"  ## may contain spaces or "(" ")" but must not contain: "-"
#SCRIPTSHORTCUT="<Primary>j"

cat <<EOT >> ~/.local/share/nautilus/scripts/"${SCRIPTNAME}"
#!/usr/bin/env bash
qdirstat ./"$1" &
#end
EOT
chmod +x ~/.local/share/nautilus/scripts/"${SCRIPTNAME}"	  

GNOME Evolution

MISC settings, mostly set interactively. Here are just a few:

gsettings set org.gnome.evolution.calendar use-24hour-format true
gsettings set org.gnome.evolution-data-server camel-message-info-user-headers "['Message-ID']"
gsettings set org.gnome.evolution.mail global-view-setting false
gsettings set org.gnome.evolution.shell menubar-visible true
gsettings set org.gnome.evolution.shell use-header-bar false	  

Impove GNOME Shell performance (disable animation)

gsettings set org.gnome.desktop.interface enable-animations false	  

Adapt Default Directories

I dislike the default folders.

Defaults: ~/.config/user-dirs.dirs

# This file is written by xdg-user-dirs-update
# If you want to change or add directories, just edit the line you're
# interested in. All local changes will be retained on the next run.
# Format is XDG_xxx_DIR="$HOME/yyy", where yyy is a shell-escaped
# homedir-relative path, or XDG_xxx_DIR="/yyy", where /yyy is an
# absolute path. No other format is supported.
#
XDG_DESKTOP_DIR="$HOME/Desktop"
XDG_DOWNLOAD_DIR="$HOME/Downloads"
XDG_TEMPLATES_DIR="$HOME/Templates"
XDG_PUBLICSHARE_DIR="$HOME/Public"
XDG_DOCUMENTS_DIR="$HOME/Documents"
XDG_MUSIC_DIR="$HOME/Music"
XDG_PICTURES_DIR="$HOME/Pictures"
XDG_VIDEOS_DIR="$HOME/Videos"	  

On jackson/x13: (outdated example)

# This file is written by xdg-user-dirs-update
# If you want to change or add directories, just edit the line you're
# interested in. All local changes will be retained on the next run.
# Format is XDG_xxx_DIR="$HOME/yyy", where yyy is a shell-escaped
# homedir-relative path, or XDG_xxx_DIR="/yyy", where /yyy is an
# absolute path. No other format is supported.
#
XDG_DESKTOP_DIR="$HOME/tmp/2del/Desktop"
XDG_DOWNLOAD_DIR="$HOME/Downloads"
XDG_TEMPLATES_DIR="$HOME/templates_labels"
XDG_PUBLICSHARE_DIR="$HOME/tmp/2del/Publicshare"
XDG_DOCUMENTS_DIR="$HOME/rise"
XDG_MUSIC_DIR="$HOME/art/music/mp3/library"
XDG_PICTURES_DIR="$HOME/tmp/2del"
XDG_VIDEOS_DIR="$HOME/share/netvideos"	  

Bugs That Are Known to Me and Relevant for Me

So far, I haven't checked the Debian Bug Tracker because working with it is very tedious. Furthermore, it's most probably an issue that my situation does not reflect a general use-case (multi-monitor, multi-user) and therefore, issues - in particular the ones that are not 100% reproducible - are hard to debug.

If you happen to know a viable workaround or fix to any of those issues, please drop me a line:

In rare cases, switching users or resuming the system resulted in display errors like the following:

alterantive-text for the image
LibreWolf display issue with oversized app elements and normal sized content.

I don't have a workaround that is fixing those issues in any case yet.

All in all, the number of annoying bugs is substantial in my personal setup. My wife's setup is less complex (only laptop and one external screen) and she's got no general issue after her display resolution worked as expected (see above).


Related articles that link to this one:

Comment via email (persistent) or via Disqus (ephemeral) comments below: