Story
You installed Fedora Workstation and logged in. The desktop looks clean, but it feels alien. The dock is on the side when you want it on the bottom. The system tray is missing your Docker icon. The text is too small for your 4K monitor. You open Settings and realize the options you need simply aren't there. GNOME ships with a curated experience, not a toolbox. You need to reach under the hood to make it work for you.
What is actually happening
GNOME separates the core shell from user preferences. The Settings app exposes a safe subset of options designed for the broadest audience. Everything else lives in the dconf database, accessible via the gsettings command. Extensions modify the running shell at runtime by injecting JavaScript code. GNOME Tweaks is a graphical wrapper around gsettings that exposes hidden keys and schema options.
When you customize GNOME, you are writing values into a key-value store and loading plugins into the shell process. This architecture keeps the base system stable while allowing deep modification. It also means a bad extension can break your session, and a typo in gsettings can leave you with a non-functional UI. The gsettings command reads schema files installed by packages. These schemas define the valid types and ranges for every key. If you try to set a string value to an integer, gsettings will reject the command with a type error. This validation protects you from corrupting the configuration.
Install the customization tools
Fedora does not ship with the full suite of customization tools enabled by default. You need to install GNOME Tweaks and the Extensions app to access the hidden settings and manage plugins safely.
sudo dnf install gnome-tweaks gnome-extensions-app
# WHY: Installs the GUI tools needed to modify hidden settings and manage extensions.
# WHY: gnome-tweaks exposes keys not visible in the standard Settings app.
# WHY: gnome-extensions-app provides a safer interface than command-line toggling for managing plugins.
GNOME Tweaks gives you access to font configuration, window button placement, and legacy theme support. The Extensions app lets you enable, disable, and configure extensions without guessing command-line flags. Install these tools before you start changing settings. They save you from memorizing schema paths.
Manage extensions
Extensions add features that GNOME does not include out of the box. The safest way to install extensions is through the browser integration package. This connects your browser to the GNOME Shell backend.
sudo dnf install gnome-browser-connector
# WHY: Installs the backend service that allows the browser to communicate with GNOME Shell.
# WHY: Without this, clicking Install on extensions.gnome.org will fail silently or ask for manual download.
Every extension has a unique identifier, often called a UUID. This string looks like an email address but points to the extension's metadata. You need the UUID to enable or disable extensions from the command line. The Extensions app shows the UUID in the details view. Never guess the UUID. A typo will result in an extension not found error.
Dash to Panel moves the dash into a Windows-style taskbar. AppIndicator restores system tray icons for legacy applications. Blur my Shell adds visual depth to the interface. Extensions load JavaScript code into the GNOME Shell process. This gives them access to the internal APIs of the desktop. It also means they run with the same privileges as the shell itself. A malicious extension can read your clipboard, capture screenshots, or exfiltrate data. Only install extensions from trusted sources. The extensions.gnome.org website vets submissions, but third-party repositories carry risk. Check the extension's code on GitHub before enabling it if you are handling sensitive data.
Test extensions one at a time. A broken extension can lock you out of the graphical session.
Change themes and fonts
Themes control the visual appearance of GTK applications. Fedora includes the Adwaita theme by default. You can install alternative themes from the repository and apply them via gsettings.
sudo dnf install numix-gtk-theme numix-icon-theme
# WHY: Installs the theme and icon packages from the Fedora repository.
# WHY: Packages are preferred over manual downloads because dnf handles dependencies and updates.
When you install a new theme package, the package manager updates the schema database so gsettings recognizes the new theme name. Always run sudo dnf upgrade --refresh after installing new themes to ensure the schema cache is current.
gsettings set org.gnome.desktop.interface gtk-theme 'Numix'
# WHY: Applies the GTK theme to all applications using the standard toolkit.
# WHY: This change takes effect immediately for new windows, but existing windows may need a restart.
gsettings set org.gnome.desktop.interface icon-theme 'Numix'
# WHY: Swaps the icon set used by the file manager and application menus.
gsettings set org.gnome.desktop.interface color-scheme 'prefer-dark'
# WHY: Enables dark mode for GTK applications that support the color scheme API.
# WHY: This is the modern approach. Older themes may require a separate dark variant name.
Font configuration affects readability and layout. The text-scaling-factor key is the best way to handle HiDPI displays. It scales all text proportionally without breaking UI constraints.
gsettings set org.gnome.desktop.interface font-name 'Inter 11'
# WHY: Sets the default sans-serif font for the user interface.
# WHY: The size value is in points, not pixels.
gsettings set org.gnome.desktop.interface text-scaling-factor 1.25
# WHY: Scales all text by 25 percent for HiDPI displays without breaking layout constraints.
# WHY: Use this instead of changing font size globally to keep UI elements proportional.
Reboot the shell with Alt+F2, type r, and press Enter to apply theme changes instantly. If the session crashes, you will know the theme is incompatible.
Configure keyboard shortcuts
Custom keyboard shortcuts live in the media-keys schema. You can define them via the Settings app or set them directly with gsettings. The command-line approach requires creating a path for the shortcut and registering it in the active list.
gsettings set org.gnome.settings-daemon.plugins.media-keys custom-keybindings "['/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/']"
# WHY: Registers the path to the custom keybinding definition in the active list.
# WHY: GNOME requires the path to exist before it will recognize the shortcut.
gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/ name 'Terminal'
# WHY: Sets the human-readable label for the shortcut in the settings UI.
gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/ command 'gnome-terminal'
# WHY: Defines the executable command that runs when the shortcut is triggered.
gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/ binding '<Super>t'
# WHY: Binds the Super+T key combination to the command.
# WHY: Use angle brackets for modifier keys like Super, Control, and Shift.
Check the active bindings with gsettings get org.gnome.settings-daemon.plugins.media-keys custom-keybindings. If the path is missing, the shortcut will never fire.
User versus system configuration
GNOME distinguishes between user preferences and system policies. User settings live in ~/.config/dconf/user. System administrators can lock settings using dconf profiles in /etc/dconf/profile/. If you are managing a fleet of machines, do not rely on user scripts. Use dconf database files to enforce a baseline configuration. User settings always override system defaults unless the key is locked.
The dconf database is a binary file. GNOME writes to this file asynchronously. If the system crashes, you might lose the most recent change. For critical configurations, verify the write immediately after running the command. The dconf tool provides a lower-level interface than gsettings. You can use dconf write to set values, but you lose the type checking and schema validation. Use dconf only when you need to inspect the raw database or perform bulk operations that gsettings cannot handle efficiently.
dconf list /org/gnome/
# WHY: Lists all keys currently set in the user database.
# WHY: Compare this output against the schema to identify which settings have been modified from defaults.
Verify your changes
Verify your configuration by querying the current values. Run gsettings get org.gnome.desktop.interface gtk-theme to confirm the theme is applied. Check extension status with gnome-extensions list. If the output matches your intent, the configuration is persistent. GNOME saves these values to the user's dconf database automatically. You do not need to save manually.
Common pitfalls
A misconfigured extension can prevent GNOME Shell from starting. If you see the login screen return immediately after entering your password, your session is crashing. Boot to a TTY with Ctrl+Alt+F3. Log in and disable the problematic extension.
gnome-extensions disable dash-to-panel@jderose9.github.com
# WHY: Disables the extension so it does not load during the next shell startup.
# WHY: This prevents the crash loop without removing the extension data.
Look for errors in the journal. Run journalctl -xeu gnome-shell to see the crash log. You will often see JS ERROR: ... indicating a script failure in an extension. Read the error message before guessing. The stack trace usually points to the specific extension causing the issue.
If your customizations go wrong and you cannot isolate the cause, you can reset all GNOME settings to the schema defaults. This is a destructive operation. It removes themes, shortcuts, and window positions.
dconf reset -f /org/gnome/
# WHY: Wipes all user overrides for GNOME settings back to the schema defaults.
# WHY: This is a nuclear option. It removes themes, shortcuts, and window positions.
# WHY: Use this only when the configuration is irrecoverable or you want a clean slate.
Snapshot your dconf database before a major reset. Run dconf dump /org/gnome/ > backup.txt so you can restore your preferences later.
When to use each tool
Use GNOME Tweaks when you need a graphical interface to adjust fonts, themes, and window controls. Use the Extensions app when you want to browse, install, and toggle plugins safely. Use gsettings when you are scripting configuration or need to apply settings across multiple machines. Use dconf directly only when you are debugging a schema issue or writing a backup script. Stay on the default configuration when you value stability over personalization.