---
title: GNOME Extension Settings
description: Applies GNOME extension settings from various data sources.
sidebar_label: 19 GNOME Extension Settings
slug: /scripts/after/run_onchange_after_19-gnome-extension-settings.sh.tmpl
githubLocation: https://github.com/megabyte-labs/install.doctor/blob/master/home/.chezmoiscripts/universal/run_onchange_after_19-gnome-extension-settings.sh.tmpl
scriptLocation: https://github.com/megabyte-labs/install.doctor/raw/master/home/.chezmoiscripts/universal/run_onchange_after_19-gnome-extension-settings.sh.tmpl
repoLocation: home/.chezmoiscripts/universal/run_onchange_after_19-gnome-extension-settings.sh.tmpl
---
# GNOME Extension Settings

Applies GNOME extension settings from various data sources.

## Overview

This script ensures your GNOME extensions come pre-configured to your liking. It provides the ability
to automatically install a configurable list of GNOME extensions as well as apply your preferred settings.



## Source Code

```
{{- if (eq .host.distro.family "linux") -}}
#!/usr/bin/env bash
# @file GNOME Extension Settings
# @brief Applies GNOME extension settings from various data sources.
# @description
#     This script ensures your GNOME extensions come pre-configured to your liking. It provides the ability
#     to automatically install a configurable list of GNOME extensions as well as apply your preferred settings.

{{ includeTemplate "universal/profile" }}
{{ includeTemplate "universal/logg" }}

# extension config hash: {{ include (joinPath .host.home ".config" "desktop" "gnome.yml") | sha256sum }}

### Ensure /tmp/install-gnome-extensions.txt is not present on the system
if [ -f /tmp/install-gnome-extensions.txt ]; then
    rm -f /tmp/install-gnome-extensions.txt
fi

### Register temporary file for gnome.yml JSON
if [ -f "$HOME/.config/desktop/gnome.yml" ]; then
    TMP_YQ="$(mktemp)"
    cat "$HOME/.config/desktop/gnome.yml" | yq e -o=j '.' > "$TMP_YQ"
fi

### Populate /tmp/install-gnome-extensions.txt with GNOME extensions that need to be installed
if [ -f "$HOME/.config/desktop/gnome.yml" ]; then
    cat "$TMP_YQ" | jq -c '.default_gnome_extensions[] | tojson' | while read EXT; do
        TMP="$(mktemp)"
        echo "$EXT" | sed 's/^.\(.*\).$/\1/' > "$TMP"
        EXT_URL="$(cat "$TMP" | jq -r '.url')"
        EXT_ID="$(cat "$TMP" | jq -r '.regex')"
        echo "$EXT_URL" >> /tmp/install-gnome-extensions.txt
        if [ ! -d "${XDG_DATA_HOME:-$HOME/.local/share}/gnome-shell/extensions" ]; then
            mkdir -p "${XDG_DATA_HOME:-$HOME/.local/share}/gnome-shell/extensions"
        fi
        find "${XDG_DATA_HOME:-$HOME/.local/share}/gnome-shell/extensions" -mindepth 1 -maxdepth 1 -type d | while read EXT_FOLDER; do
            if [[ "$EXT_FOLDER" == *"$EXT_ID"* ]] && [ -f /tmp/install-gnome-extensions.txt ]; then
                TMP_EXT="$(mktemp)"
                head -n -1 /tmp/install-gnome-extensions.txt > "$TMP_EXT"
                mv -f "$TMP_EXT" /tmp/install-gnome-extensions.txt > /dev/null
            fi
        done
    done
else
    logg warn 'The ~/.config/desktop/gnome.yml file is missing so GNOME extension install orders cannot be calculated'
fi

### Remove /tmp/install-gnome-extensions.txt if it is empty
if [ "$(cat /tmp/install-gnome-extensions.txt)" == "" ]; then
    rm -f /tmp/install-gnome-extensions.txt > /dev/null
fi

### Install the GNOME extensions using the `install-gnome-extensions` script
if command -v install-gnome-extensions > /dev/null; then
    if [ -f /tmp/install-gnome-extensions.txt ]; then
        logg info 'Running the install-gnome-extensions script'
        cd /tmp
        install-gnome-extensions --enable --overwrite --file /tmp/install-gnome-extensions.txt
        rm -f /tmp/install-gnome-extensions.txt
        logg success 'Finished installing the GNOME extensions'
    else
        logg info 'No new GNOME extensions to install'
    fi
else
    logg warn 'Cannot install GNOME extensions because the install-gnome-extensions script is missing from ~/.local/bin'
fi

### Apply plugin gsettings
if [ -f "$HOME/.config/desktop/gnome.yml" ]; then
    cat "$TMP_YQ" | jq -c '.default_gnome_extensions[] | tojson' | while read EXT; do
        if [ "$DEBUG_MODE" == 'true' ]; then
            logg info 'Extension data:'
            echo "$EXT"
        fi
        TMP="$(mktemp)"
        echo "$EXT" | sed 's/^.\(.*\).$/\1/' > "$TMP"
        EXT_URL="$(cat "$TMP" | jq -r '.url')"
        EXT_ID="$(cat "$TMP" | jq -r '.regex')"
        if [ "$DEBUG_MODE" == 'true' ]; then
            logg info 'Extension ID:'
            echo "$EXT_ID"
        fi
        EXT_SETTINGS_TYPE="$(cat "$TMP" | jq -r '.settings | type')"
        EXT_SETTINGS="$(cat "$TMP" | jq -r '.settings')"
        if [ "$EXT_SETTINGS" != 'null' ]; then
            logg info 'Evaluating extension settings for '"$EXT_ID"''
            if [ "$EXT_SETTINGS_TYPE" == 'array' ]; then
                cat "$TMP" | jq -r '.settings[]' | while read EXT_SETTING; do
                    logg info 'Applying following extension setting:'
                    echo "$EXT_SETTING"
                    eval "$EXT_SETTING"
                done
            else
                logg info 'Applying following extension setting:'
                echo "$EXT_SETTINGS"
                eval "$EXT_SETTINGS"
            fi
            logg success 'Applied gsettings configuration for the '"$EXT_ID"' GNOME extension'
        fi
    done
fi

{{- end }}
```
