GNOME Extensions Dead After Update? Here's the Real Fix
Extensions stop working after a GNOME Shell update. The fix is usually checking the API version or reinstalling from source.
You updated your system, rebooted, and now GNOME extensions are dead. The toggles in Extensions app are there, but nothing works. Or maybe they're not even showing up. This happened to me twice in the last year — once after jumping from GNOME 44 to 45, and again after a point release in GNOME 46. The trigger is always a GNOME Shell update that changes the JavaScript API, but the extensions are still pointing at the old version.
Root Cause
GNOME extensions are written against a specific GNOME Shell version. When you update GNOME Shell, the extension's metadata still says it's for the old version. GNOME's extension manager then does one of two things: either it silently disables the extension, or it shows it as enabled but the extension's code throws errors because functions it calls don't exist anymore. The Extensions app doesn't tell you this — it just shows a gray toggle or nothing at all.
The other common cause is that GNOME 45 changed how extensions are loaded. Before 45, extensions used a extension.js with a global init function. In 45 and later, they need an ESM-based extension.js with proper import/export. If you're running an extension that hasn't been updated since 2023, it's dead on 45+.
Step-by-Step Fix
Step 1: Check GNOME Shell Version
Open a terminal and run:
gnome-shell --version
Make note of the version. For example, 45.5 or 46.0. This is the target version your extensions need to match.
Step 2: Check Extension Status
Run:
gnome-extensions list
You'll see a list of installed extension UUIDs. Pick one that's broken and check its detailed status:
gnome-extensions info <uuid>
Look for the State line. If it says ERROR or OUT_OF_DATE, you've found the problem. The version-name line shows what GNOME Shell version it's built for.
Step 3: Match the Version
If the extension's version is lower than your GNOME Shell version, you need to either update the extension or tweak the metadata file.
To force a version override (works for minor version bumps, not major ones like 44 to 45):
- Find the extension's directory:
~/.local/share/gnome-shell/extensions/<uuid>/or/usr/share/gnome-shell/extensions/<uuid>/ - Open
metadata.jsonin a text editor. - Look for
".shell-version"— it's an array of version strings. - Add your GNOME Shell version to the array. For example, if it has
["45"]and you're on 46, change it to["45", "46"] - Save and restart GNOME Shell: press
Alt+F2, typer, and hit Enter.
Warning: This will break the extension if the API actually changed. It's a gamble. I've seen it work for extensions like Vitals on 45→46, but fail horribly for Dash to Dock on 44→45.
Step 4: Reinstall from Source (The Reliable Fix)
For major version jumps, you need to reinstall the extension from the GNOME Extensions website or GitHub. The key is to get a version built for your shell version.
- Go to extensions.gnome.org in Firefox or Chrome (with the GNOME Shell integration browser extension installed).
- Search for the extension.
- Check the version list — it shows which GNOME Shell versions are supported.
- Click the install toggle. The site will detect your shell version and serve the right build.
- If that fails, use the
gnome-extensionsCLI:gnome-extensions install https://extensions.gnome.org/extension-data/...someslug.vXX.shell-extension.zip
Step 5: For GNOME 45+ — Check the Extension Format
If you're on GNOME 45 or later and the extension still doesn't work, open the extension's extension.js. If it uses function init() at the top with no import statements, it's an old format. You'll need to find a version that uses import Extension from 'resource:///org/gnome/shell/extensions/extension.js' or similar ESM syntax. Otherwise, it's not going to work without rewriting the whole thing.
What to Check If It Still Fails
If the steps above don't work, you've got one of three problems:
- Conflicting extensions. Disable all extensions, then re-enable one at a time. I had a client last month whose
User Themesextension was conflicting with a custom shell theme, and disablingUser Themesfixed everything. - Wrong extension source. Some extensions exist in both the official GNOME Extensions repository and the distro's package manager. If you installed via
aptordnf, remove that package and install only from the website. Mixing sources causes version mismatches. - GNOME Shell crashed silently. Check journalctl:
journalctl -f -o cat /usr/bin/gnome-shell. If you see JS errors from an extension, you've found the culprit. Disable that extension and restart the shell.
At this point, if nothing works, you can downgrade GNOME Shell to the previous version using your distro's package manager. That's a nuclear option, but I've done it after a botched Fedora 39→40 upgrade. It's not ideal, but it works until extension authors catch up.
The real fix is to always check extension compatibility before updating GNOME Shell. Most extensions on extensions.gnome.org list the supported shell versions. If your favorite extension isn't listed for the new version, wait a week before upgrading. I learned that one the hard way.
Was this solution helpful?