diff --git a/library/gsettings.py b/library/gsettings.py
new file mode 100644
index 0000000..0df376e
--- /dev/null
+++ b/library/gsettings.py
@@ -0,0 +1,146 @@
+# -*- coding: utf-8 -*-
+
+from typing import Tuple
+from ansible.module_utils.basic import AnsibleModule
+
+DOCUMENTATION = """
+module: gsettings
+author:
+    - Kenneth Benzie (Benie)
+short_description: Ansible module for the gsettings configuration tool
+options:
+    schema:
+        description:
+            - Schema ID of the settings to configure.
+        type: str
+    key:
+        description:
+            - Key of an individaul setting to configure.
+        type: str
+    value:
+        description:
+            - Value to configure the setting with.
+            - Mutually exclusive with reset.
+        type: str
+    reset:
+        description:
+            - Flag to reset the setting to the default value.
+            - Mutually exclusive with value.
+        type:
+        default: false
+"""
+
+EXAMPLES = """
+- name: get gnome color-scheme current value
+  gsettings:
+    schema: org.gnome.desktop.interface
+    key: color-scheme
+  register: color_scheme
+- debug: msg={{color_scheme.value}}
+
+- name: set gnome color-scheme to 'prefer-dark'
+  gsettings:
+    schema: org.gnome.desktop.interface
+    key: color-scheme
+    value: "'prefer-dark'"
+
+- name: reset gnome color-scheme to default value
+  gsettings:
+    schema: org.gnome.desktop.interface
+    key: color-scheme
+    reset: true
+"""
+
+RETURN = """
+value:
+    description: Value of the setting.
+    returned: Returned when there is a value.
+    type: str
+    sample: "'default'"
+stderr:
+    description: Error output from gsettings.
+    returned: Returned when there is an error.
+    type: str
+    sample: No such key “doesnt-exist”
+"""
+
+
+class GSettingsError(Exception):
+    def __init__(self, command, rc, stderr):
+        self.command = command
+        self.rc = (rc,)
+        self.stderr = stderr
+
+
+def gsettings_get(module: AnsibleModule) -> Tuple[bool, str]:
+    command = [
+        "gsettings",
+        "get",
+        module.params["schema"],
+        module.params["key"],
+    ]
+    rc, stdout, stderr = module.run_command(command)
+    if rc != 0:
+        raise GSettingsError(command, rc, stderr)
+    return False, stdout.rstrip()
+
+
+def gsettings_set(module: AnsibleModule) -> Tuple[bool, str]:
+    command = [
+        "gsettings",
+        "set",
+        module.params["schema"],
+        module.params["key"],
+        module.params["value"],
+    ]
+    _, before = gsettings_get(module)
+    rc, _, stderr = module.run_command(command)
+    if rc != 0:
+        raise GSettingsError(command, rc, stderr)
+    _, after = gsettings_get(module)
+    return before != after, after
+
+
+def gsettings_reset(module: AnsibleModule) -> Tuple[bool, str]:
+    command = [
+        "gsettings",
+        "reset",
+        module.params["schema"],
+        module.params["key"],
+    ]
+    _, before = gsettings_get(module)
+    rc, stdout, stderr = module.run_command(command)
+    if rc != 0:
+        raise GSettingsError(command, rc, stderr)
+    _, after = gsettings_get(module)
+    return before != after, after
+
+
+def main() -> None:
+    module = AnsibleModule(
+        argument_spec=dict(
+            schema=dict(type="str"),
+            key=dict(type="str"),
+            value=dict(type="str"),
+            reset=dict(type="bool", default=False),
+        ),
+        mutually_exclusive=[["value", "reset"]],
+        required_together=[["schema", "key"]],
+    )
+
+    try:
+        if module.params["value"]:
+            changed, value = gsettings_set(module)
+        elif module.params["reset"]:
+            changed, value = gsettings_reset(module)
+        else:
+            changed, value = gsettings_get(module)
+        module.exit_json(changed=changed, value=value)
+    except GSettingsError as error:
+        module.fail_json(
+            f"{error.command} failed ({error.rc}): {error.stderr}", stderr=error.stderr
+        )
+
+
+if __name__ == "__main__":
+    main()
diff --git a/roles/gnome-shell/tasks/main.yaml b/roles/gnome-shell/tasks/main.yaml
index d84a9e0..0194b61 100644
--- a/roles/gnome-shell/tasks/main.yaml
+++ b/roles/gnome-shell/tasks/main.yaml
@@ -2,7 +2,7 @@
 - assert:
     that: "'GNOME' in ansible_env.XDG_CURRENT_DESKTOP"
 
-- name: install gnome extra packages
+- name: install packages
   become: true
   package:
     name:
@@ -10,6 +10,23 @@
       - gnome-themes-extra
     state: latest
 
+- name: prefer dark mode
+  gsettings:
+    schema: org.gnome.desktop.interface
+    key: color-scheme
+    value: "'prefer-dark'"
+
+- name: disable switch-input-source keybinding
+  gsettings:
+    schema: org.gnome.desktop.wm.keybindings
+    key: switch-input-source
+    value: '@as []'
+- name: disable switch-input-source-backward keybinding
+  gsettings:
+    schema: org.gnome.desktop.wm.keybindings
+    key: switch-input-source-backward
+    value: '@as []'
+
 # NOTE: Use this command to see default keybindings
 # gsettings list-recursively | grep -i -E 'media-keys|keybindings'
 # NOTE: Use this command to inspect the current state of the custom keybindings