How to Fix GNOME Extensions Not Working After Fedora Upgrade

Fix GNOME extensions after a Fedora upgrade by disabling and re-enabling them to clear cached data.

Story / scenario opener

You run a routine dnf upgrade to move from Fedora 40 to 42. The system reboots. You log in. The top bar looks bare. The extension settings panel throws a generic crash dialog. Your favorite workflow tools are gone. The desktop works, but it feels stripped down. This happens because Fedora upgrades frequently jump GNOME Shell versions, and extensions do not survive version bumps gracefully.

What is actually happening

GNOME extensions are JavaScript add-ons that hook into the GNOME Shell API. They live in two locations on a standard Fedora system. System-wide extensions ship with the distribution and sit in /usr/share/gnome-shell/extensions/. User-installed extensions live in ~/.local/share/gnome-shell/extensions/. Both locations contain a metadata.json file that declares the extension version and the minimum GNOME Shell version it supports.

When you upgrade Fedora, the package manager replaces gnome-shell with a newer release. The JavaScript API changes. Method signatures shift. Internal objects get renamed. The extension cache in ~/.cache/gnome-shell/ still holds compiled bytecode and state from the old shell version. GNOME Shell reads the stale cache, tries to load the old bytecode, and fails silently or crashes the extension process. The desktop falls back to a safe mode where extensions are disabled.

This is not a bug. It is a safety mechanism. GNOME Shell refuses to run unverified JavaScript against a changed API. The fix requires clearing the stale cache, forcing the shell to re-evaluate extension compatibility, and reloading the session. Fedora releases a new version every six months. GNOME Shell usually jumps a major version with each release. Plan your extension maintenance around that cycle.

The fix

Start by clearing the extension cache and toggling the extensions through the command line. The graphical toggle in Settings often fails when the shell is already in a degraded state. The CLI bypasses the broken UI and talks directly to the extension manager daemon.

Here is how to disable every extension, clear the cache, and re-enable them in one sequence.

# Disable all extensions to stop the shell from trying to load stale bytecode
gnome-extensions disable --all
# Remove the compiled cache directory so the shell regenerates it on next load
rm -rf ~/.cache/gnome-shell/
# Re-enable all extensions to trigger a fresh compatibility check
gnome-extensions enable --all

Run those commands in a terminal. They do not require sudo because they only touch your user cache and session state. After the commands finish, log out of your desktop session and log back in. Do not use the keyboard shortcut to restart the shell. A full session logout forces GNOME to reinitialize the extension manager from scratch.

If the CLI reports that an extension is already disabled, the state file in ~/.local/share/gnome-shell/extensions/ is corrupted. Delete the specific extension folder and reinstall it from the official website. The browser add-on handles the metadata generation automatically.

Reboot before you debug. Half the time the symptom is gone.

Verify it worked

Check the extension list and the shell logs to confirm everything loaded correctly. The journal provides the most reliable view of what GNOME Shell actually did during startup.

# List all extensions and their current state
gnome-extensions list
# Check the journal for extension load errors or shell crashes
journalctl -xeu gnome-shell --since "10 minutes ago"

The gnome-extensions list output should show enabled next to your add-ons. The journalctl command filters the system log for GNOME Shell activity. The -x flag adds explanatory hints to error lines. The -e flag jumps to the end of the log. If you see Extension loaded successfully or no red error lines, the upgrade survived.

Run journalctl -xeu gnome-shell first. Read the actual error before guessing.

Common pitfalls and what the error looks like

Extensions break for three reasons after an upgrade. The first is an API mismatch. The second is a missing dependency. The third is a corrupted local installation.

An API mismatch prints a clear error in the journal. You will see something like this:

JS ERROR: Extension dash-to-dock@micxgx.gmail.com: TypeError: Me._dockContainer is undefined

The error means the extension references a shell object that no longer exists in the new GNOME version. You cannot fix this with a cache clear. You must wait for the extension author to update the code, or disable the extension until a new release ships.

A missing dependency shows up as a package conflict or a missing library. Fedora upgrades sometimes remove transitional packages that third-party extensions rely on. The journal will show:

JS ERROR: Extension user-theme@gnome-shell-extensions.gnome.org: Error: Could not find module 'libgtop-2.0'

Install the missing library with dnf install libgtop2. The package name changes across Fedora releases. Check the extension page for the current dependency list.

A corrupted local installation happens when dnf upgrade interrupts a manual extension download. The metadata.json file gets truncated. GNOME Shell refuses to parse it. The fix is to delete the extension folder in ~/.local/share/gnome-shell/extensions/ and reinstall it from the official website or the GNOME Extensions browser add-on.

Trust the package manager. Manual file edits drift, snapshots stay.

Preventing future breakage

You can reduce extension breakage by managing your add-ons proactively. The GNOME Extensions website tracks compatibility. Check the compatibility badge before you install. Extensions that have not been updated in more than six months will likely break on the next Fedora release.

Use the command line to manage your extension state. The GUI stores preferences in dconf, but the CLI reads the actual filesystem state. When you prepare for a major upgrade, run gnome-extensions list and save the output. Disable third-party extensions before running dnf upgrade. Re-enable them after the reboot. This prevents the shell from trying to load incompatible code during the critical boot phase.

Keep your user extension directory clean. Old versions of extensions sometimes leave behind empty folders or broken symlinks. Run a quick cleanup before upgrades.

# List all extension directories and filter for empty or broken ones
find ~/.local/share/gnome-shell/extensions/ -maxdepth 1 -type d -empty
# Remove any empty directories that the installer left behind
find ~/.local/share/gnome-shell/extensions/ -maxdepth 1 -type d -empty -delete

Snapshot the system before the upgrade. Future-you will thank you.

When to use this vs alternatives

Use the cache clear and toggle method when extensions simply stop loading after a routine Fedora upgrade. Use a full session logout when the graphical settings panel freezes or throws a generic crash dialog. Use the journal log when you need to identify which specific extension is breaking the shell. Wait for an upstream update when the error references a missing shell API or a renamed internal object. Disable the extension entirely when you need a stable desktop and the author has not released a compatible version.

Where to go next