π

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.)

General GNOME Notes for Setup and Initial Steps

If you want to extract all the `gsettings` commands from this page:

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

Settings

Extensions

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

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


Related articles that link to this one:

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