Cpp-Extension manager: An extension manager for browsing and installing GNOME Shell Extensions.

Extension Manager

A native tool for browsing, installing, and managing GNOME Shell Extensions.

Written with GTK 4 and libadwaita.

Screenshot of the main GUI


The tool supports:

  • Browsing and searching extensions from extensions.gnome.org
  • Installation
  • Enabling and Disabling
  • Uninstall

Things that are not yet supported:

  • Updating extensions in-app
  • Translations (help wanted)

If there's something you'd like to see, contributions are welcome!


The easiest way to build is by cloning this repo with GNOME Builder. It will automatically resolve all relevant flatpak SDKs automatically.

If you run into issues, make sure you have the gnome-nightly flatpak repository installed.


  • Search Page Improvements
    Search Page Improvements

    Jan 14, 2022

    A catch-all issue for some improvements to the search page:

    • [X] Do not search on start up: Currently the application queries extensions.gnome.org for a search on startup regardless of whether the user is on the Browse page or not. Change this to run only when the browse page is loaded. This will require a rework of the main GUI. (#35)
    • [X] Add search progress indicator: When search is happening in the background, display a progress indicator (spinner) so the user is aware the application is still responsive. (#36)
    • [ ] Show screenshots and extension icons (#3): Make searching more useful by displaying screenshots. These should be loaded "on-demand", either when the entry is expanded, or by moving search results to a separate page (i.e. like GNOME Software).
    • [ ] Support filtering search results: Allow switching between "Top" and "New" (other categories are probably not relevant)
    • [ ] Display shell version map: Show all supported versions of GNOME Shell
    • [ ] Show reviews (#4): Show the review score of the extension and somehow display text reviews
  • Improve Appstream data
    Improve Appstream data

    Jan 14, 2022

    The appstream data (which determines what is displayed on GNOME Software and Flathub) is very barebones at the moment.

    For the next update, fill out more fields:

    • Description - Add more detail
    • Developer
    • Release description and changelog
    • Update Contact

    See: https://www.freedesktop.org/software/appstream/docs/chap-Quickstart.html

  • po: Update Spanish translation
    po: Update Spanish translation

    Jan 17, 2022


  • po: Update Brazilian Portuguese translation
    po: Update Brazilian Portuguese translation

    Jan 17, 2022

    Here we go

  • Update Italian translation
    Update Italian translation

    Jan 17, 2022


  • po: Update Polish translation
    po: Update Polish translation

    Jan 17, 2022


  • Add Japanese Translation
    Add Japanese Translation

    Jan 12, 2022


  • Respect system GTK theme
    Respect system GTK theme

    Jan 12, 2022

    Hi! Thanks for the app!

    Any way for the application to support the system GTK theme?

    It looks bad to me compared to the rest of the native apps =(

  • Global toggle to enable/disable all extensions
    Global toggle to enable/disable all extensions

    Jan 11, 2022

    The normal extension app can do this. It's super helpful to debug extension issues.

    enhancement good first issue 
  • Added German Translation
    Added German Translation

    Jan 13, 2022


  • AUR: Doesn't install app
    AUR: Doesn't install app

    Jan 10, 2022

    Cloning extension-manager build files...
    Generating extension-manager information...
    Checking extension-manager dependencies...
    Resolving dependencies...
    Checking inter-conflicts...
    Building extension-manager...
    ==> Making package: extension-manager 0.1.0-1 (Пн 10 янв 2022 17:22:56)
    ==> Checking runtime dependencies...
    ==> Checking buildtime dependencies...
    ==> Retrieving sources...
      -> Found v0.1.0.tar.gz
    ==> Validating source files with b2sums...
        v0.1.0.tar.gz ... Passed
    ==> Removing existing $srcdir/ directory...
    ==> Extracting sources...
      -> Extracting v0.1.0.tar.gz with bsdtar
    ==> Removing existing $pkgdir/ directory...
    ==> Starting build()...
    + exec meson setup --prefix /usr --libexecdir lib --sbindir bin --buildtype plain --auto-features enabled --wrap-mode nodownload -D b_lto=true -D b_pie=true extension-manager-0.1.0 build
    The Meson build system
    Version: 0.60.3
    Source dir: /var/tmp/pamac-build-alphas/extension-manager/src/extension-manager-0.1.0
    Build dir: /var/tmp/pamac-build-alphas/extension-manager/src/build
    Build type: native build
    Project name: extension-manager
    Project version: 0.1.0
    C compiler for the host machine: cc (gcc 11.1.0 "cc (GCC) 11.1.0")
    C linker for the host machine: cc ld.bfd 2.36.1
    Host machine cpu family: x86_64
    Host machine cpu: x86_64
    Configuring exm-config.h using configuration
    Program desktop-file-validate found: YES (/usr/bin/desktop-file-validate)
    Program appstream-util found: YES (/usr/bin/appstream-util)
    Program glib-compile-schemas found: YES (/usr/bin/glib-compile-schemas)
    Found pkg-config: /usr/bin/pkg-config (1.8.0)
    Run-time dependency gtk4 found: YES 4.4.1
    Run-time dependency libadwaita-1 found: YES 1.0.0.alpha.4
    Run-time dependency json-glib-1.0 found: YES 1.6.6
    Run-time dependency libsoup-3.0 found: YES 3.0.3
    Program blueprint-compiler found: YES (/usr/bin/blueprint-compiler)
    Found pkg-config: /usr/bin/pkg-config (1.8.0)
    Program glib-compile-resources found: YES (/usr/bin/glib-compile-resources)
    Program build-aux/meson/postinstall.py found: YES (/var/tmp/pamac-build-alphas/extension-manager/src/extension-manager-0.1.0/build-aux/meson/postinstall.py)
    Build targets in project: 9
    extension-manager 0.1.0
      User defined options
        auto_features: enabled
        buildtype    : plain
        libexecdir   : lib
        prefix       : /usr
        sbindir      : bin
        wrap_mode    : nodownload
        b_lto        : true
        b_pie        : true
    Found ninja-1.10.2 at /usr/bin/ninja
    ninja: Entering directory `/var/tmp/pamac-build-alphas/extension-manager/src/build'
    [1/15] Generating data/com.mattjakeman.ExtensionManager.desktop_data_merge with a custom command
    [2/15] Generating data/com.mattjakeman.ExtensionManager.appdata.xml_data_merge with a custom command
    [3/15] Generating src/blueprints with a custom command
    [4/15] Generating src/exm-resources_h with a custom command
    [5/15] Generating src/exm-resources_c with a custom command
    [6/15] Compiling C object src/extension-manager.p/model_exm-extension.c.o
    ../extension-manager-0.1.0/src/model/exm-extension.c: In function ‘exm_extension_finalize’:
    ../extension-manager-0.1.0/src/model/exm-extension.c:54:19: warning: unused variable ‘self’ [-Wunused-variable]
       54 |     ExmExtension *self = (ExmExtension *)object;
          |                   ^~~~
    ../extension-manager-0.1.0/src/model/exm-extension.c: In function ‘exm_extension_init’:
    ../extension-manager-0.1.0/src/model/exm-extension.c:193:35: warning: unused parameter ‘self’ [-Wunused-parameter]
      193 | exm_extension_init (ExmExtension *self)
          |                     ~~~~~~~~~~~~~~^~~~
    [7/15] Compiling C object src/extension-manager.p/meson-generated_.._exm-resources.c.o
    [8/15] Compiling C object src/extension-manager.p/model_exm-manager.c.o
    ../extension-manager-0.1.0/src/model/exm-manager.c: In function ‘exm_manager_finalize’:
    ../extension-manager-0.1.0/src/model/exm-manager.c:32:17: warning: unused variable ‘self’ [-Wunused-variable]
       32 |     ExmManager *self = (ExmManager *)object;
          |                 ^~~~
    ../extension-manager-0.1.0/src/model/exm-manager.c: In function ‘exm_manager_set_property’:
    ../extension-manager-0.1.0/src/model/exm-manager.c:61:17: warning: unused variable ‘self’ [-Wunused-variable]
       61 |     ExmManager *self = EXM_MANAGER (object);
          |                 ^~~~
    ../extension-manager-0.1.0/src/model/exm-manager.c:58:41: warning: unused parameter ‘value’ [-Wunused-parameter]
       58 |                           const GValue *value,
          |                           ~~~~~~~~~~~~~~^~~~~
    ../extension-manager-0.1.0/src/model/exm-manager.c: In function ‘on_signal’:
    ../extension-manager-0.1.0/src/model/exm-manager.c:385:24: warning: unused parameter ‘proxy’ [-Wunused-parameter]
      385 | on_signal (GDBusProxy *proxy,
          |            ~~~~~~~~~~~~^~~~~
    ../extension-manager-0.1.0/src/model/exm-manager.c:386:24: warning: unused parameter ‘sender_name’ [-Wunused-parameter]
      386 |            gchar      *sender_name,
          |            ~~~~~~~~~~~~^~~~~~~~~~~
    ../extension-manager-0.1.0/src/model/exm-manager.c:388:24: warning: unused parameter ‘parameters’ [-Wunused-parameter]
      388 |            GVariant   *parameters,
          |            ~~~~~~~~~~~~^~~~~~~~~~
    [9/15] Compiling C object src/extension-manager.p/web_exm-search-result.c.o
    ../extension-manager-0.1.0/src/web/exm-search-result.c: In function ‘exm_search_result_finalize’:
    ../extension-manager-0.1.0/src/web/exm-search-result.c:47:22: warning: unused variable ‘self’ [-Wunused-variable]
       47 |     ExmSearchResult *self = (ExmSearchResult *)object;
          |                      ^~~~
    ../extension-manager-0.1.0/src/web/exm-search-result.c: In function ‘exm_search_result_init’:
    ../extension-manager-0.1.0/src/web/exm-search-result.c:186:42: warning: unused parameter ‘self’ [-Wunused-parameter]
      186 | exm_search_result_init (ExmSearchResult *self)
          |                         ~~~~~~~~~~~~~~~~~^~~~
    ../extension-manager-0.1.0/src/web/exm-search-result.c: In function ‘json_serializable_iface_init’:
    ../extension-manager-0.1.0/src/web/exm-search-result.c:191:54: warning: unused parameter ‘iface’ [-Wunused-parameter]
      191 | json_serializable_iface_init (JsonSerializableIface *iface)
          |                               ~~~~~~~~~~~~~~~~~~~~~~~^~~~~
    [10/15] Compiling C object src/extension-manager.p/web_exm-search-provider.c.o
    ../extension-manager-0.1.0/src/web/exm-search-provider.c:23:20: warning: ‘properties’ defined but not used [-Wunused-variable]
       23 | static GParamSpec *properties [N_PROPS];
          |                    ^~~~~~~~~~
    [11/15] Compiling C object src/extension-manager.p/web_exm-image-resolver.c.o
    ../extension-manager-0.1.0/src/web/exm-image-resolver.c: In function ‘image_loaded_callback’:
    ../extension-manager-0.1.0/src/web/exm-image-resolver.c:57:19: warning: implicit declaration of function ‘gdk_texture_new_from_bytes’; did you mean ‘gdk_texture_new_from_file’? [-Wimplicit-function-declaration]
       57 |         texture = gdk_texture_new_from_bytes (bytes, &error);
          |                   ^~~~~~~~~~~~~~~~~~~~~~~~~~
          |                   gdk_texture_new_from_file
    ../extension-manager-0.1.0/src/web/exm-image-resolver.c:57:17: warning: assignment to ‘GdkTexture *’ {aka ‘struct _GdkTexture *’} from ‘int’ makes pointer from integer without a cast [-Wint-conversion]
       57 |         texture = gdk_texture_new_from_bytes (bytes, &error);
          |                 ^
    At top level:
    ../extension-manager-0.1.0/src/web/exm-image-resolver.c:20:20: warning: ‘properties’ defined but not used [-Wunused-variable]
       20 | static GParamSpec *properties [N_PROPS];
          |                    ^~~~~~~~~~
    [12/15] Compiling C object src/extension-manager.p/main.c.o
    [13/15] Compiling C object src/extension-manager.p/exm-application.c.o
    ../extension-manager-0.1.0/src/exm-application.c: In function ‘exm_application_finalize’:
    ../extension-manager-0.1.0/src/exm-application.c:42:21: warning: unused variable ‘self’ [-Wunused-variable]
       42 |     ExmApplication *self = (ExmApplication *)object;
          |                     ^~~~
    ../extension-manager-0.1.0/src/exm-application.c: In function ‘exm_application_show_about’:
    ../extension-manager-0.1.0/src/exm-application.c:94:44: warning: unused parameter ‘action’ [-Wunused-parameter]
       94 | exm_application_show_about (GSimpleAction *action,
          |                             ~~~~~~~~~~~~~~~^~~~~~
    ../extension-manager-0.1.0/src/exm-application.c:95:44: warning: unused parameter ‘parameter’ [-Wunused-parameter]
       95 |                             GVariant      *parameter,
          |                             ~~~~~~~~~~~~~~~^~~~~~~~~
    [14/15] Compiling C object src/extension-manager.p/exm-window.c.o
    ../extension-manager-0.1.0/src/exm-window.c: In function ‘on_install_done’:
    ../extension-manager-0.1.0/src/exm-window.c:199:32: warning: unused parameter ‘self’ [-Wunused-parameter]
      199 |                  ExmWindow    *self)
          |                  ~~~~~~~~~~~~~~^~~~
    ../extension-manager-0.1.0/src/exm-window.c: In function ‘create_thumbnail’:
    ../extension-manager-0.1.0/src/exm-window.c:240:37: warning: unused parameter ‘resolver’ [-Wunused-parameter]
      240 | create_thumbnail (ExmImageResolver *resolver,
          |                   ~~~~~~~~~~~~~~~~~~^~~~~~~~
    ../extension-manager-0.1.0/src/exm-window.c:241:37: warning: unused parameter ‘icon_uri’ [-Wunused-parameter]
      241 |                   const gchar      *icon_uri)
          |                   ~~~~~~~~~~~~~~~~~~^~~~~~~~
    ../extension-manager-0.1.0/src/exm-window.c: In function ‘search_widget_factory’:
    ../extension-manager-0.1.0/src/exm-window.c:275:16: warning: unused variable ‘screenshot’ [-Wunused-variable]
      275 |     GtkWidget *screenshot;
          |                ^~~~~~~~~~
    ../extension-manager-0.1.0/src/exm-window.c: In function ‘update_extensions_list’:
    ../extension-manager-0.1.0/src/exm-window.c:380:30: warning: cast between incompatible function types from ‘GtkWidget * (*)(ExmExtension *)’ {aka ‘struct _GtkWidget * (*)(struct _ExmExtension *)’} to ‘GtkWidget * (*)(void *, void *)’ {aka ‘struct _GtkWidget * (*)(void *, void *)’} [-Wcast-function-type]
      380 |                              (GtkListBoxCreateWidgetFunc) widget_factory,
          |                              ^
    At top level:
    ../extension-manager-0.1.0/src/exm-window.c:222:1: warning: ‘on_image_loaded’ defined but not used [-Wunused-function]
      222 | on_image_loaded (GObject      *source,
          | ^~~~~~~~~~~~~~~
    [15/15] Linking target src/extension-manager
    FAILED: src/extension-manager 
    cc  -o src/extension-manager src/extension-manager.p/meson-generated_.._exm-resources.c.o src/extension-manager.p/main.c.o src/extension-manager.p/exm-window.c.o src/extension-manager.p/exm-application.c.o src/extension-manager.p/model_exm-manager.c.o src/extension-manager.p/model_exm-extension.c.o src/extension-manager.p/web_exm-search-provider.c.o src/extension-manager.p/web_exm-search-result.c.o src/extension-manager.p/web_exm-image-resolver.c.o -flto -Wl,--as-needed -Wl,--no-undefined -pie -Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now -march=x86-64 -mtune=generic -O2 -pipe -fno-plt -fexceptions -Wp,-D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fstack-clash-protection -fcf-protection -Wl,--start-group /usr/lib/libgtk-4.so /usr/lib/libpangocairo-1.0.so /usr/lib/libpango-1.0.so /usr/lib/libharfbuzz.so /usr/lib/libgdk_pixbuf-2.0.so /usr/lib/libcairo-gobject.so /usr/lib/libcairo.so /usr/lib/libgraphene-1.0.so /usr/lib/libgio-2.0.so /usr/lib/libgobject-2.0.so /usr/lib/libglib-2.0.so /usr/lib/libadwaita-1.so /usr/lib/libjson-glib-1.0.so /usr/lib/libsoup-3.0.so -Wl,--export-dynamic /usr/lib/libgmodule-2.0.so -Wl,--end-group -pthread
    /usr/bin/ld: /tmp/cc2Tzjok.ltrans0.ltrans.o: in function `image_loaded_callback':
    <artificial>:(.text+0x12ed): undefined reference to `gdk_texture_new_from_bytes'
    collect2: error: ld returned 1 exit status
    ninja: build stopped: subcommand failed.
    ==> ERROR: A failure occurred in build().
  • install guide?
    install guide?

    Jan 10, 2022


    would you mind giving a tutorial how to setup and install this please, learning linux so it would greatly help me?

    going to use fedora


    documentation question