---
title: Chrome Settings / Extensions
description: This script configures Chrome, Brave, and Chromium system-wide managed / recommended policies settings. It also pre-loads a configurable list of Chrome extensions to Chrome, Brave, Chromium, and Edge (if they are installed).
sidebar_label: 40 Chrome Settings / Extensions
slug: /scripts/after/run_onchange_after_40-chrome.sh.tmpl
githubLocation: https://github.com/megabyte-labs/install.doctor/blob/master/home/.chezmoiscripts/universal/run_onchange_after_40-chrome.sh.tmpl
scriptLocation: https://github.com/megabyte-labs/install.doctor/raw/master/home/.chezmoiscripts/universal/run_onchange_after_40-chrome.sh.tmpl
repoLocation: home/.chezmoiscripts/universal/run_onchange_after_40-chrome.sh.tmpl
---
# Chrome Settings / Extensions

This script configures Chrome, Brave, and Chromium system-wide managed / recommended policies settings. It also pre-loads a configurable list of Chrome extensions to Chrome, Brave, Chromium, and Edge (if they are installed).

## Overview

This Chrome setup script applies system-wide settings and pre-loads Chrome extensions into the browser profiles. The
extensions still must be enabled but they appear in the Chrome extensions menu and can be enabled with the toggle. The
system settings are applied to Chrome, Chromium, and Brave. Extensions are installed to the same browsers plus Microsoft Edge.

## Features

* Adds `~/.config/chrome/managed.json` to the `managed/policies.json` system locations
* Adds `~/.config/chrome/recommended.json` to the `recommended/policies.json` system locations
* Pre-loads extension metadata for all the extensions defined under `chromeExtensions` in the [`home/.chezmoidata.yaml`](https://github.com/megabyte-labs/install.doctor/blob/master/home/.chezmoidata.yaml) file

## TODO

* Automatically enable the extensions that are pre-loaded
* Create several profiles with different characteristics (similar to the Firefox setup script)
* Ensure the directories that the script cycles through to install managed settings and extensions are complete for all installation types (i.e. there might need to be some additions for Flatpak installations since their folder structure is different)
* Document how [`chromium-flags.conf`](https://github.com/megabyte-labs/install.doctor/blob/master/home/dot_config/chromium-flags.conf) can be or is integrated

## Links

* [`managed.json`](https://github.com/megabyte-labs/install.doctor/blob/master/home/dot_config/chrome/managed.json)
* [`recommended.json`](https://github.com/megabyte-labs/install.doctor/blob/master/home/dot_config/chrome/recommended.json)



## Source Code

```
{{- if ne .host.distro.family "windows" -}}
#!/usr/bin/env bash
# @file Chrome Settings / Extensions
# @brief This script configures Chrome, Brave, and Chromium system-wide managed / recommended policies settings. It also pre-loads a configurable list of Chrome extensions to Chrome, Brave, Chromium, and Edge (if they are installed).
# @description
#     This Chrome setup script applies system-wide settings and pre-loads Chrome extensions into the browser profiles. The
#     extensions still must be enabled but they appear in the Chrome extensions menu and can be enabled with the toggle. The
#     system settings are applied to Chrome, Chromium, and Brave. Extensions are installed to the same browsers plus Microsoft Edge.
#
#     ## Features
#
#     * Adds `~/.config/chrome/managed.json` to the `managed/policies.json` system locations
#     * Adds `~/.config/chrome/recommended.json` to the `recommended/policies.json` system locations
#     * Pre-loads extension metadata for all the extensions defined under `chromeExtensions` in the [`home/.chezmoidata.yaml`](https://github.com/megabyte-labs/install.doctor/blob/master/home/.chezmoidata.yaml) file
#
#     ## TODO
#
#     * Automatically enable the extensions that are pre-loaded
#     * Create several profiles with different characteristics (similar to the Firefox setup script)
#     * Ensure the directories that the script cycles through to install managed settings and extensions are complete for all installation types (i.e. there might need to be some additions for Flatpak installations since their folder structure is different)
#     * Document how [`chromium-flags.conf`](https://github.com/megabyte-labs/install.doctor/blob/master/home/dot_config/chromium-flags.conf) can be or is integrated
#
#     ## Links
#
#     * [`managed.json`](https://github.com/megabyte-labs/install.doctor/blob/master/home/dot_config/chrome/managed.json)
#     * [`recommended.json`](https://github.com/megabyte-labs/install.doctor/blob/master/home/dot_config/chrome/recommended.json)

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

### Ensure Chrome policies directory is present
for POLICY_DIR in "/opt/google/chrome/policies" "/etc/chromium/policies" "/etc/brave/policies"; do
    ### Managed policies
    if [ ! -f "$POLICY_DIR/managed/policies.json" ]; then
        logg info "Ensuring directory $POLICY_DIR/managed exists"
        sudo mkdir -p "$POLICY_DIR/managed"
        logg info "Copying ${XDG_CONFIG_HOME:-$HOME/.config}/chrome/managed.json to $POLICY_DIR/managed/policies.json"
        sudo cp -f "${XDG_CONFIG_HOME:-$HOME/.config}/chrome/managed.json" "$POLICY_DIR/managed/policies.json"
    fi

    ### Recommended policies
    if [ ! -f "$POLICY_DIR/recommended/policies.json" ]; then
        logg info "Ensuring directory $POLICY_DIR/recommended exists"
        sudo mkdir -p "$POLICY_DIR/recommended"
        logg info "Copying ${XDG_CONFIG_HOME:-$HOME/.config}/chrome/recommended.json to $POLICY_DIR/recommended/policies.json"
        sudo cp -f "${XDG_CONFIG_HOME:-$HOME/.config}/chrome/recommended.json" "$POLICY_DIR/recommended/policies.json"
    fi
done

### Add Chrome extension JSON
for EXTENSION_DIR in "/opt/google/chrome/extensions" "/etc/chromium/extensions" "/etc/brave/extensions" "$HOME/Library/Application Support/Google/Chrome/External Extensions" "$HOME/Library/Application Support/Microsoft/Edge/External Extensions" "$HOME/Library/Application Support/BraveSoftware/Brave-Browser/External Extensions"; do
    ### Ensure program-type is installed
    if [ -d "$(dirname "$EXTENSION_DIR")" ]; then
        ### Ensure extension directory exists
        if [[ "$EXTENSION_DIR" == '/opt/'* ]] || [[ "$EXTENSION_DIR" == '/etc/'* ]]; then
            if [ ! -d "$EXTENSION_DIR" ]; then
                logg info "Creating directory $EXTENSION_DIR"
                sudo mkdir -p "$EXTENSION_DIR"
            fi
        else
            if [ ! -d "$EXTENSION_DIR" ]; then
                logg info "Creating directory $EXTENSION_DIR"
                mkdir -p "$EXTENSION_DIR"
            fi
        fi

        ### Add extension JSON
        logg info "Adding Chrome extensions to $EXTENSION_DIR"
        for EXTENSION in {{ list (.chromeExtensions | toString | replace "[" "" | replace "]" "") | uniq | join " " }}; do
            logg info "Adding Chrome extension manifest ($EXTENSION)"
            if ! echo "$EXTENSION" | grep 'https://chrome.google.com/webstore/detail/' > /dev/null; then
                EXTENSION="https://chrome.google.com/webstore/detail/$EXTENSION"
            fi
            EXTENSION_ID="$(echo "$EXTENSION" | sed 's/^.*\/\([^\/]*\)$/\1/')"
            if [[ "$EXTENSION_DIR" == '/opt/'* ]] || [[ "$EXTENSION_DIR" == '/etc/'* ]]; then
                sudo cp -f "${XDG_CONFIG_HOME:-$HOME/.config}/chrome/extension.json" "$EXTENSION_DIR/${EXTENSION_ID}.json"
            else
                cp -f "${XDG_CONFIG_HOME:-$HOME/.config}/chrome/extension.json" "$EXTENSION_DIR/${EXTENSION_ID}.json"
            fi
        done
    else
        logg info "$EXTENSION_DIR does not exist"
    fi
done

{{ end -}}
```
