====== Gnome - Extensions - metadata.json ======
**metadata.json** is a mandatory file of every extension.
* It contains basic information about the extension such as its UUID, name and description.
* Some fields are mandatory, but there are a number of other optional fields too that metadata.json may contain.
----
===== A minimal example, with only mandatory fields =====
{
"uuid": "example@blah",
"name": "Example",
"description": "This is an example extension.",
"shell-version": [ "3.38", "40" ],
"url": "https://sharewiz.net/gnome/extensions/example",
"version": 1
}
----
===== A comprehensive example, including optional fields =====
{
"uuid": "example@blah",
"name": "Example",
"description": "This is an example extension.",
"shell-version": [ "3.38", "40" ],
"url": "https://sharewiz.net/gnome/extensions/example",
"version": 1
"session-modes": ["user", "unlock-dialog"],
"settings-schema": "org.gnome.shell.extensions.example",
"gettext-domain": "example@blah",
}
----
===== Mandatory Fields =====
==== uuid ====
A globally-unique identifier for your extension, made of two parts separated by **@**.
* Each part must only container letters, numbers, period (.), underscore (_) and hyphen (-).
* The first part should be a short string like "click-to-focus".
* The second part must be some namespace under your control, such as username.github.io.
* Common examples are click-to-focus@username.github.io and adblock@account.gmail.com.
**NOTE:** An extension must be installed to a directory with the same name as **uuid+** to be recognized by GNOME Shell.
~/.local/share/gnome-shell/extensions/example@blah/
----
==== name ====
A short, descriptive name for the extension.
----
==== description ====
A relatively short description of the extension.
**NOTE:** Line breaks and tabs can be inserted by using **\n** and **\t** escape sequences.
----
==== shell-version ====
An array of strings describing the GNOME Shell versions that an extension supports.
**NOTE:** It must include at least one entry or the extension will be uninstallable.
* For versions up to and including GNOME 3.38, this should have a major and minor component such as "3.38".
* Starting with GNOME 40, it should simply be the major version, such as "40" or "41".
* GNOME Shell has a configuration setting, **disable-extension-version-validation**, which controls whether unsupported extensions can be loaded.
* Before GNOME 40 this was __true__ by default (users could install extensions regardless of the shell-version), but because of the major changes it is now __false__ by default.
----
==== url ====
A URL for an extension, where the code can be found and issues can be reported.
**NOTE:** It is required for extensions submitted to https://extensions.gnome.org/ to have a valid URL.
----
==== version ====
The version of the extension.
**NOTE:** As known to the GNOME Extensions website, and MUST be a whole number like 1.
* It is not a semantic version like 1.1 or a string like "1".
* This version is automatically incremented by the GNOME Extensions website with each submission.
----
===== Optional Fields =====
==== gettext-domain ====
A Gettext translation domain, used by the **ExtensionUtils.initTranslations()** convenience method to create a object with methods for marking and retrieving string translations in an extension.
**NOTE:** The domain should be unique to your extension and the easiest choice is to use the UUID from your extension, such as example@blah.
* See the Translations page.
----
==== settings-schema ====
A **Gio.SettingsSchema** ID, used by the **ExtensionUtils.getSettings()** convenience method to create a Gio.Settings object for an extension.
**NOTE:** By convention, the schema ID for extensions all start with the string **org.gnome.shell.extensions** with the extension ID as a unique identifier, such as **org.gnome.shell.extensions.example**.
* See the Preferences page.
----
==== session-modes ====
An array of strings describing the GNOME Shell session modes that the extension supports.
**NOTE:** Almost all extensions will only use the user session mode, which is the default if this field is not present.
**WARNING:** This field was added in GNOME 42.
The current possible session modes are:
* **user**: Extensions that specify this key run during active user sessions.
* If no other session modes are specified, the extension will be enabled when the session is unlocked and disabled when it locks.
* **unlock-dialog**: Extensions that specify this key are allowed to run, or keep running, on the lock screen.
* **gdm**: Extensions that specify this key are allowed to run, or keep running, on the login screen.
* This session mode is only available for system extensions that are enabled for the **gdm** user.
**NOTE:** Extensions that want to support other session modes must provide a justification to be approved during review for distribution from the GNOME Extensions website.