diff --git a/.github/workflows/clang-format.yml b/.github/workflows/clang-format.yml
new file mode 100644
index 000000000..d3847d8bd
--- /dev/null
+++ b/.github/workflows/clang-format.yml
@@ -0,0 +1,49 @@
+name: clang-format Check
+
+on:
+  push:
+    branches:
+      - 'main'
+    paths:
+      - 'src/**/*.cpp'
+      - 'src/**/*.h'
+      - 'include/**/*.h'
+  workflow_dispatch:
+  pull_request:
+    paths:
+      - 'src/**/*.cpp'
+      - 'src/**/*.h'
+      - 'include/**/*.h'
+
+jobs:
+  check_formatting:
+    name: Check Code Formatting
+    runs-on: ubuntu-24.04
+
+    steps:
+      - name: Checkout repository
+        uses: actions/checkout@v4
+
+      - name: Cache clang-format dependencies
+        uses: actions/cache@v3
+        with:
+          path: /tmp/apt-cache
+          key: clang-format-${{ runner.os }}-${{ hashFiles('**/apt-packages.txt') }}
+          restore-keys: |
+            clang-format-${{ runner.os }}-
+
+      - name: Install clang-format
+        run: |
+          if [ ! -f /tmp/apt-cache/clang-format-18 ]; then
+            sudo apt-get update
+            sudo apt-get install -y clang-format-18
+            touch /tmp/apt-cache/clang-format-18
+          fi
+
+      - name: Run clang-format
+        run: |
+          clang-format src/**/*.cpp src/**/*.h include/**/*.h -i -style=file
+
+      - name: Check for unformatted files
+        run: |
+          git diff --exit-code || (echo "Code is not formatted correctly" && exit 1)