diff --git a/make-ring.py b/make-ring.py
index 3d6629f821153ec67d332eeaae8648af4b089c6f..4c09b0da432cb034452b205cf2f98f3497691aee 100755
--- a/make-ring.py
+++ b/make-ring.py
@@ -282,6 +282,13 @@ def run_init():
     for name in module_names:
         copy_file("./scripts/commit-msg", ".git/modules/"+name+"/hooks")
 
+    module_names_to_format = ['daemon', 'lrc', 'client-qt']
+    for name in module_names_to_format:
+        execute_script(
+            ['./scripts/format.sh --install  %(path)s'],
+            {"path": ".git/modules/" + name + "/hooks"}
+        )
+
 
 def copy_file(src, dest):
     print("Copying:" + src + " to " + dest)
diff --git a/scripts/format.sh b/scripts/format.sh
new file mode 100755
index 0000000000000000000000000000000000000000..ebd3774a11a19ed13c0c5fd37cb4fd196f226f9b
--- /dev/null
+++ b/scripts/format.sh
@@ -0,0 +1,86 @@
+#!/usr/bin/env bash
+
+set -e
+
+command_exists ()
+{
+    type "$1" &> /dev/null ;
+}
+
+CFVERSION="9"
+CLANGFORMAT=""
+if command_exists clang-format-${CFVERSION}; then
+    CLANGFORMAT=clang-format-${CFVERSION}
+else
+    if command_exists clang-format; then
+        CLANGFORMAT=clang-format
+    fi
+fi
+
+if ! command -v $CLANGFORMAT &> /dev/null; then
+    echo "Required version of clang-format not found"
+    exit 1
+fi
+
+format_file()
+{
+    if [ -f "${1}" ]; then
+        $CLANGFORMAT -i -style=file "${1}" || true
+    fi
+}
+
+format_files()
+{
+    for file in $1; do
+        echo -ne "Formatting: ${file}\\033[0K\\r"
+        format_file "${file}"
+    done
+}
+
+exit_if_no_files()
+{
+    echo No files to format
+    exit 0
+}
+
+install_hook()
+{
+    hooks_path=$1
+    if [ ! -d "$hooks_path" ]; then
+        echo "$hooks_path" path does not exist
+        exit 1
+    fi
+    echo Installing pre-commit hook in "$hooks_path"
+    echo "/bin/bash $(realpath $0)" > "$hooks_path"/pre-commit
+    chmod +x "$hooks_path"/pre-commit
+}
+
+display_help()
+{
+    echo "Usage: $0 [OPTION...] -- Clang format source files with a .clang-format file" >&2
+    echo
+    echo "   --all             format all files instead of only committed ones"
+    echo "   --install <path>  install a pre-commit hook to run this script"
+    echo
+}
+
+if [ "$1" == "--help" ]; then
+    display_help
+    exit 0
+fi
+
+case "${1}" in
+  --all )
+    files=$(find src -regex '.*\.\(cpp\|hpp\|cc\|cxx\|h\)') || true
+    echo Formatting all source files...
+    format_files "$files"
+    ;;
+  --install )
+    install_hook "${2}"
+    ;;
+  * )
+    files=$(git diff-index --cached --name-only HEAD | grep -iE '\.(cpp|cxx|cc|h|hpp)') || exit_if_no_files
+    echo Formatting committed source files...
+    format_files "$files"
+    ;;
+esac