Fedora 45 gives you three places to reshape GNOME: the Tweaks app, the Settings app, and Shell extensions. All three have moved on since most GNOME Tweaks guides for Fedora were written, and extensions moved the furthest. GNOME 51 is new enough that the popular third-party extensions Fedora packages as RPMs (Dash to Dock, AppIndicator, Just Perfection, Caffeine, Blur my Shell) still declare GNOME 50 at most and get stamped OUT OF DATE, while most of them already have GNOME 51 builds on extensions.gnome.org.
This guide covers how to install GNOME Tweaks on Fedora along with the Extension Manager Flatpak, what each Tweaks panel still controls (and which settings moved to Settings), how to install GNOME 51 extensions that actually load, a compatibility table for the popular ones, the gsettings keys worth scripting, and a dconf backup that restores cleanly. It pairs with the Fedora 45 post-install checklist, which links here for the desktop part. Every command, error and screenshot below came from a Fedora 45 Workstation on GNOME 51.0, with a Fedora 44 machine on GNOME 50.5 for the comparison.
Install GNOME Tweaks and Extension Manager on Fedora
Tweaks and the small Extensions app are in the Fedora repository. Neither is on the Workstation ISO by default:
sudo dnf install -y gnome-tweaks gnome-extensions-app
Look at the version numbers dnf prints. Tweaks is still the 49 release on both Fedora 45 and Fedora 44, and the Extensions app on Fedora 45 is a 51 alpha build sitting next to a 51.0 Shell:
Package Arch Version Repository Size
Installing:
gnome-extensions-app x86_64 0:51~alpha-3.fc45 fedora 576.0 KiB
gnome-tweaks noarch 0:49.0-4.fc45 fedora 1.5 MiB
Warning: A pending offline transaction initiated by the following command will be invalidated: dnf5daemon-server
...
Warning: Pending offline transaction has been invalidated.
To reschedule, run: dnf5daemon-server
Complete!
That warning catches people on a fresh install. GNOME Software downloads updates in the background and stages them as an offline transaction for the next reboot. Any dnf install from a terminal throws that staged transaction away, so the “Restart and Update” prompt disappears. Nothing breaks. Run sudo dnf upgrade --refresh afterwards if you want the pending updates applied now.
Extension Manager, the app that browses and installs from extensions.gnome.org, comes from Flathub. Fedora 45 configures the Flathub remote when third-party repositories are enabled (initial setup asks, and fedora-third-party query tells you the current state; sudo fedora-third-party enable turns it on), and on this release it is no longer filtered. Check which installation it belongs to before you copy an install command from somewhere else:
flatpak remotes --show-details
cat /usr/share/flatpak/fedora-flathub.filter
Both remotes are system remotes, and the filter file contains a single comment line, so every Flathub app is visible:
fedora Fedora Flatpaks oci+https://registry.fedoraproject.org - - - 1 system,oci - - - -
flathub Flathub https://dl.flathub.org/repo/ - - /usr/share/flatpak/fedora-flathub.filter 1 system,filtered Central repository of Flatpak applications ...
# Unfiltered
Install Extension Manager system-wide against that remote:
sudo flatpak install -y flathub com.mattjakeman.ExtensionManager
It pulls the GNOME 50 Flatpak runtime alongside the app. Confirm it landed:
flatpak list --app --columns=application,version,origin,installation
One row, from Flathub, in the system installation:
com.mattjakeman.ExtensionManager 0.6.5 flathub system
Error: “No remote refs found for ‘flathub'”
Plenty of guides, including an older version of this one, install Extension Manager with flatpak install --user flathub .... On Fedora that fails immediately:
Looking for matchesβ¦
error: No remote refs found for βflathubβ
The --user flag makes Flatpak look in your per-user installation, which has no remotes at all (flatpak remotes --user prints nothing). Fedora adds Flathub only to the system installation. Drop --user and use sudo as shown above, or add a user remote first with flatpak remote-add --user --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo if you really want a per-user install. The Flatpak and Flathub guide covers the system versus user split in more detail.
What each GNOME Tweaks panel still controls
Open Tweaks from the app grid or run gnome-tweaks. The first launch shows an “Extensions Has Moved” dialog pointing you to the Extensions app and to Flathub. Press Continue; there is no extensions tab in Tweaks anymore.

The sidebar has seven panels: Fonts, Appearance, Sound, Mouse & Touchpad, Keyboard, Windows and Startup Applications. Three of them earn their place. The rest either hold one switch or duplicate Settings.
Fonts
The standout panel, because Settings has no font family, hinting or antialiasing controls anywhere (its only text option sits under Accessibility). Fedora ships Adwaita Sans for interface and document text and Adwaita Mono for monospace, with Slight hinting and Standard (grayscale) antialiasing. Grayscale is the right default on high-DPI and OLED panels. On an older 1080p LCD, switch Antialiasing to Subpixel and text gets visibly sharper. The Titlebar font row that older Tweaks releases had is gone.

Appearance
Cursor, icon theme, the theme for legacy GTK 3 applications, and separate light and dark wallpapers. Fedora 45’s default backgrounds are JPEG XL files (f45-01-day.jxl and f45-01-night.jxl), which is why the file picker shows .jxl names. There is no Shell theme row unless the User Themes extension is installed and enabled.

To make old GTK 3 apps match the libadwaita look, install the adw-gtk3-theme package from the Fedora repository and pick adw-gtk3 (or adw-gtk3-dark) in the Legacy Applications row. Dark style and the accent color live in Settings under Appearance, not in Tweaks.
Mouse & Touchpad (and where acceleration went)
This panel now holds exactly one switch, Middle Click Paste, and Fedora ships it off. Turn it on if you rely on selecting text and middle-clicking to paste it, the old X11 habit.

The acceleration profile setting that gamers and designers used Tweaks for is no longer here. It lives in Settings under Mouse & Touchpad as a Mouse Acceleration switch. Turning that switch off writes accel-profile 'flat', the one-to-one pointer mapping.

Windows
The reason most people install Tweaks at all. Maximize and Minimize are off by default, so windows show only a close button. Flip both on, and optionally move the buttons to the left. The same panel sets what double, middle and secondary clicks on a titlebar do, and whether modal dialogs stay attached to their parent window. Center New Windows is already on.

Keyboard is worth one visit for the Overview Shortcut (Left or Right Super) and Additional Layout Options, which is where Caps Lock remapping hides. Startup Applications does what it says. Sound holds a single System Sound Theme picker.
Why Fedora’s packaged extensions break on GNOME 51
Fedora packages about fifty Shell extensions as RPMs, so sudo dnf install gnome-shell-extension-dash-to-dock looks like the obvious route. On Fedora 45 it is a dead end for now. We installed Dash to Dock, AppIndicator, Just Perfection, Caffeine and Blur my Shell from the fedora repository and read the Shell versions each one declares:
for d in [email protected] [email protected] [email protected]; do
printf "%s: " "$d"
python3 -c "import json; print(json.load(open('/usr/share/gnome-shell/extensions/$d/metadata.json'))['shell-version'])"
done
Every one of them stops at 50:
[email protected]: ['45', '46', '47', '48', '49', '50']
[email protected]: ['45', '46', '47', '48', '49', '50']
[email protected]: ['45', '46', '47', '48', '49', '50']
GNOME Shell refuses to load an extension whose metadata does not list the running major version. After a logout and login, enabling them changes nothing:
gnome-extensions enable [email protected]
gnome-extensions info [email protected]
Enabled, but not running:
[email protected]
Version: 105
Enabled: Yes
State: OUT OF DATE
The Extensions app shows the same thing as a greyed-out switch with a minus badge next to each packaged extension.

On Fedora 44 the same upstream versions (built as fc44 packages) declare 50 and the Shell is 50.5, so the version check passes there. The packages simply have not caught up with the new GNOME yet, which is normal in the first weeks of a release. Rebuilt versions land in the updates repository as packagers catch up, so check again with the loop above before you switch back to the RPMs. Until then, remove them. They cannot run, they leave a dead OUT OF DATE row in the Extensions app, and they get confusing fast if you ever flip the version-validation switch covered below:
sudo dnf remove gnome-shell-extension-dash-to-dock gnome-shell-extension-appindicator gnome-shell-extension-just-perfection gnome-shell-extension-caffeine gnome-shell-extension-blur-my-shell
Error: Extension β[email protected]β does not exist
You see this if you run gnome-extensions enable right after dnf install. On Wayland the Shell scans the system extension directory only at login, so a freshly installed RPM is invisible to the running session. Log out and back in, then enable it. The same applies to extensions installed from a zip.
Install GNOME 51 extensions from extensions.gnome.org
Extension authors publish to extensions.gnome.org (EGO) first, and most popular extensions already had GNOME 51 builds there while the Fedora RPMs were still on 50. You have two ways to install them per user, into ~/.local/share/gnome-shell/extensions.
With Extension Manager
Open Extension Manager, switch to Browse, search, and press Install. The Installed tab then lists your user extensions above the system ones, each with a settings gear and its own switch.

Search results are not filtered by your Shell version. Clipboard Indicator, which has no GNOME 51 build yet, still shows an Install button. Only when you press it does Extension Manager stop you with an Unsupported Extension dialog. Pick Go Back unless you are prepared to debug it, for reasons the next section makes clear.

From the command line
For a setup script or a fleet of desktops, query the EGO API for the build that matches your running Shell, download that exact zip, and install it with gnome-extensions. This loop skips anything with no build for your major version instead of installing a broken one:
SHELL_MAJOR=$(gnome-shell --version | grep -oE '[0-9]+' | head -1)
for UUID in [email protected] [email protected] [email protected] blur-my-shell@aunetx; do
TAG=$(curl -s "https://extensions.gnome.org/extension-info/?uuid=${UUID}" \
| python3 -c "import sys, json; m = json.load(sys.stdin)['shell_version_map']; print(m.get('${SHELL_MAJOR}', {}).get('pk', ''))")
if [ -z "${TAG}" ]; then echo "${UUID}: no build for GNOME ${SHELL_MAJOR}, skipped"; continue; fi
curl -sL -o "/tmp/${UUID}.zip" "https://extensions.gnome.org/download-extension/${UUID}.shell-extension.zip?version_tag=${TAG}"
gnome-extensions install --force "/tmp/${UUID}.zip" && echo "${UUID}: installed build ${TAG}"
done
Three installed, and Blur my Shell was skipped because its newest upload still targets GNOME 50:
[email protected]: installed build 75334
[email protected]: installed build 75340
[email protected]: installed build 74743
blur-my-shell@aunetx: no build for GNOME 51, skipped
Don’t lean on the API’s own &shell_version=51 filter for this. In our tests it returned a 404 for Dash to Panel, Just Perfection, GSConnect and ArcMenu, which all have 51 builds, and a normal result for Caffeine, which does not. Reading shell_version_map directly, as the loop does, gave the right answer every time.
Log out and back in so the Shell picks the new directories up, then enable them:
for UUID in [email protected] [email protected] [email protected]; do gnome-extensions enable "${UUID}"; done
gnome-extensions list --enabled
A per-user copy wins over a system RPM with the same UUID, so this works even if you left the packaged version installed. The Shell says so in the user journal (journalctl --user -b | grep "will not be loaded"):
Extension [email protected] already installed in /home/sysadmin/.local/share/gnome-shell/extensions/[email protected]. /usr/share/gnome-shell/extensions/[email protected] will not be loaded
And the state flips from OUT OF DATE to ACTIVE, now loaded from your home directory:
Path: /home/sysadmin/.local/share/gnome-shell/extensions/[email protected]
Version: 109
Enabled: Yes
State: ACTIVE
Dash to Dock turns the dash into a permanent dock and Vitals puts CPU, memory and network readings in the top bar. Both run cleanly on GNOME 51.

GNOME 51 compatibility of popular extensions
We pulled the shell_version_map for fourteen of the most installed extensions on 28 September 2026 and compared the result with the RPM Fedora ships. “EGO build” is the extension version to install for that Shell release:
| Extension | EGO build for GNOME 51 | EGO build for GNOME 50 | Fedora 45 RPM |
|---|---|---|---|
| Dash to Dock | v109 | v109 | 105, out of date |
| Dash to Panel | v74 | v74 | 73, out of date |
| AppIndicator and KStatusNotifierItem Support | v66 | v66 | 64, out of date |
| Just Perfection | v37 | v37 | 36, out of date |
| Vitals | v85 | v85 | not packaged |
| User Themes | v78 | v79 | 51.0 (GNOME’s own, works) |
| GSConnect | v73 | v73 | 72, out of date |
| ArcMenu | v74 | v74 | not packaged |
| Blur my Shell | none | v72 | 72, out of date |
| Caffeine | none | v60 | 60, out of date |
| Tiling Shell | none | v76 | not packaged |
| Clipboard Indicator | none | v71 | not packaged |
| PaperWM | none | v148 | not packaged |
| Forge | none | none | 89, out of date |
Eight of the fourteen were ready for GNOME 51. For a taskbar while you wait, GNOME’s own Window List and Apps Menu extensions ship on the Workstation install at version 51.0, disabled, and need no third-party code. Re-run the loop in a week or two, because authors push 51 builds steadily after a GNOME release.
Forcing an old extension with disable-extension-version-validation
GNOME has a switch that skips the version check entirely:
gsettings set org.gnome.shell disable-extension-version-validation true
After a relogin, Caffeine and Blur my Shell both reported State: ACTIVE. That looks like a fix, and it isn’t one. The user journal showed Blur my Shell crashing the moment it tried to style the dock:
JS ERROR: TypeError: this.set_shader_source is not a function
CornerEffect@file:///usr/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/corner.js:85:22
@file:///usr/share/gnome-shell/extensions/blur-my-shell@aunetx/conveniences/effects_manager.js:23:30
build_effect@file:///usr/share/gnome-shell/extensions/blur-my-shell@aunetx/conveniences/pipeline.js:167:82
The metadata check exists because GNOME 51 changed APIs underneath extensions (the GNOME Shell 51 porting guide lists the removals). With validation off, the Shell happily reports an extension as active while it throws errors in the background, so you lose the one signal that told you something was wrong. Put the default back:
gsettings reset org.gnome.shell disable-extension-version-validation
gsettings keys worth putting in a setup script
Tweaks and Settings are front ends to gsettings, so once you know the keys you can apply a whole desktop setup in one go after every fresh install. These are the keys we set and verified on GNOME 51:
# Minimize and maximize buttons (Tweaks > Windows)
gsettings set org.gnome.desktop.wm.preferences button-layout "appmenu:minimize,maximize,close"
# Weekday and seconds in the top bar clock
gsettings set org.gnome.desktop.interface clock-show-weekday true
gsettings set org.gnome.desktop.interface clock-show-seconds true
# Battery percentage next to the battery icon (laptops)
gsettings set org.gnome.desktop.interface show-battery-percentage true
# Dark style for libadwaita and GTK 4 apps
gsettings set org.gnome.desktop.interface color-scheme prefer-dark
# Flat pointer, same as turning Mouse Acceleration off in Settings
gsettings set org.gnome.desktop.peripherals.mouse accel-profile flat
# Do not auto-suspend after 15 minutes idle on AC power
gsettings set org.gnome.settings-daemon.plugins.power sleep-inactive-ac-type nothing
# Middle click paste (Tweaks > Mouse & Touchpad)
gsettings set org.gnome.desktop.interface gtk-enable-primary-paste true
The idle suspend key is the one people misread. It controls what happens after the machine sits idle on AC power (the default is suspend after 900 seconds), not what happens when you close a laptop lid. Workstations that run long jobs or accept SSH sessions want nothing here. Dump the interface keys afterwards to confirm what changed:
dconf dump /org/gnome/desktop/interface/
Only keys stored in your user database appear, which includes a couple that GNOME wrote itself (enable-animations, toolkit-accessibility):
[/]
clock-show-seconds=true
clock-show-weekday=true
color-scheme='prefer-dark'
enable-animations=true
gtk-enable-primary-paste=true
show-battery-percentage=true
toolkit-accessibility=false
Applied together, the desktop switches to the dark style (Fedora swaps in the night wallpaper automatically), every window gets minimize and maximize buttons, and the clock shows the weekday and seconds.

Error: No such key “experimental-features”
A line that sits in countless setup scripts fails on Fedora 45:
gsettings set org.gnome.mutter experimental-features "['scale-monitor-framebuffer']"
GNOME 51 removed that key from the main mutter schema, so gsettings exits with status 1:
No such key βexperimental-featuresβ
Mutter’s experimental switches now live in a separate org.gnome.mutter.experimental schema, which on GNOME 51 holds just two boolean keys, autoclose-xwayland and kms-modifiers. Fedora 44 still has the old key, so a script shared between both releases should guard that line with gsettings writable org.gnome.mutter experimental-features >/dev/null 2>&1 && in front of it (the check fails when the key does not exist), or drop it on Fedora 45 and set display scaling in Settings under Displays.
Back up and restore GNOME settings with dconf
Take a backup before you start installing extensions. The usual advice is to dump the whole database:
dconf dump / > ~/dconf-backup-$(date +%Y%m%d).ini
The dump works. Restoring it from the root does not:
dconf load / < ~/dconf-backup-20260928.ini
The load is all or nothing, and it aborts with nothing restored:
error: The operation attempted to modify one or more non-writable keys
The culprit is the [org/gnome/login-screen] section of the dump. Fedora’s authselect locks three of those keys (enable-smartcard-authentication, enable-fingerprint-authentication and enable-switchable-authentication) through /etc/dconf/db/distro.d/locks/20-authselect, and a locked key in the file fails the entire load. Deleting that section from the dump makes the same load succeed. Simpler still, back up the subtrees you actually customize instead:
mkdir -p ~/gnome-backup
for p in desktop shell mutter settings-daemon; do dconf dump /org/gnome/$p/ > ~/gnome-backup/$p.ini; done
The shell file carries your enabled extensions list and every extension’s own settings under extensions/, so it is the one that saves you from re-clicking Dash to Dock preferences. Restore each subtree to the same path it came from:
for p in desktop shell mutter settings-daemon; do dconf load /org/gnome/$p/ < ~/gnome-backup/$p.ini && echo "restored $p"; done
We reset the titlebar buttons and the dark style, ran the restore, and both came back:
after reset: 'appmenu:close' 'default'
restored desktop
restored shell
restored mutter
restored settings-daemon
after load: 'appmenu:minimize,maximize,close' 'prefer-dark'
Copy that folder to your next machine, or keep it next to your Btrfs snapshots so a system rollback and a desktop restore travel together. It also survives an upgrade from Fedora 44 to 45, which keeps your dconf database anyway. What the upgrade will not do is make your Fedora 44 extension RPMs compatible, so plan to swap them for EGO builds on first login.
Fedora 45 vs Fedora 44: what changes for GNOME customization
If you manage both releases, or you are about to upgrade, these are the differences that matter, all measured on the two lab machines:
| Item | Fedora 45 (GNOME 51.0) | Fedora 44 (GNOME 50.5) |
|---|---|---|
| GNOME Tweaks package | 49.0 | 49.0 |
| gnome-extensions-app | 51 alpha build | 50.2 |
| Fedora extension RPMs (Dash to Dock, AppIndicator, Caffeine, Blur my Shell) | Declare up to 50, blocked as OUT OF DATE | Declare up to 50, pass the version check |
| Recommended extension source | extensions.gnome.org, per user | Fedora RPMs or extensions.gnome.org |
org.gnome.mutter experimental-features | Key removed, “No such key” | Present |
org.gnome.mutter.experimental schema | Present (2 keys) | Absent |
| Mouse acceleration profile | Settings, Mouse & Touchpad | Settings, Mouse & Touchpad |
The short version: Tweaks itself barely changed between the two releases, and nearly all the friction on Fedora 45 comes from extensions and one removed mutter key. If you want a bigger change than extensions can give you, the KDE Plasma walkthrough installs Plasma alongside GNOME. For everything else on a new install, head back to the Fedora 45 release notes breakdown for the system-level changes that sit under the desktop.