diff --git a/.github/workflows/diff.yml b/.github/workflows/diff.yml
new file mode 100644
index 0000000000000000000000000000000000000000..be3e3fc23e398e8809e90e16797fa385e8daaff7
--- /dev/null
+++ b/.github/workflows/diff.yml
@@ -0,0 +1,45 @@
+name: Diff
+on:
+  workflow_call:
+    inputs:
+      config:
+        type: string
+        required: true
+        description: 'YAML file containing modules to track'
+    outputs:
+      diff:
+        description: "diff"
+        value: "${{ jobs.diff.outputs.diff }}"
+      tags:
+        description: "tags"
+        value: "${{ jobs.diff.outputs.tags }}"
+      modules:
+        description: "modules"
+        value: "${{ jobs.diff.outputs.modules }}"
+      changed:
+        description: "changed"
+        value: "${{ jobs.diff.outputs.changed }}"
+
+jobs:
+  diff:
+    name: Compare
+    runs-on: ubuntu-latest
+    outputs:
+      diff: ${{ steps.run.outputs.diff }}
+      tags: ${{ steps.run.outputs.tags }}
+      modules: ${{ steps.run.outputs.modules }}
+      changed: ${{ steps.run.outputs.changed }}
+    steps:
+
+    - name: Checkout
+      uses: actions/checkout@v4
+
+    - id: run
+      name: Diff action
+      uses: aurelio-labs/diff-action@0.2.0
+      with:
+        token: ${{ secrets.GITHUB_TOKEN }}
+        config: ${{ inputs.config }}
+
+    - name: Print output
+      run: echo '${{ toJSON(steps.run.outputs) }}' | jq .
diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
index 88646ba144e4d62dfe130048285c0c213def80b2..b5d00c64365b6e8e74b47c840e7f9e4d6cb111d6 100644
--- a/.github/workflows/docs.yml
+++ b/.github/workflows/docs.yml
@@ -1,9 +1,8 @@
 name: Release Docs
 
 on:
-  push:
-    branches:
-    - main
+  workflow_call:
+
 
 jobs:
   build-docs:
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
index 3b2e2013d811466090fde14111f9632b96d0120d..8d40b060a356dba5979855c08abc206c0f779da8 100644
--- a/.github/workflows/lint.yml
+++ b/.github/workflows/lint.yml
@@ -1,7 +1,7 @@
 name: lint
 
 on:
-  pull_request:
+  workflow_call:
 
 
 jobs:
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 17e6a6e74c0127df68375c815cb39994efe10114..ef872e12a47f502dac54e064ccb089d4bb7ee318 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -1,7 +1,7 @@
 name: Test
 
 on:
-  pull_request:
+  workflow_call:
 
 
 jobs:
diff --git a/.github/workflows/triggers_merge.yml b/.github/workflows/triggers_merge.yml
new file mode 100644
index 0000000000000000000000000000000000000000..7f4322287d087770c61abc2f9470596fd0def092
--- /dev/null
+++ b/.github/workflows/triggers_merge.yml
@@ -0,0 +1,24 @@
+name: Merge Workflow
+
+permissions:
+  id-token: write
+  contents: read
+
+on:
+  merge:
+    branches:
+    - main
+
+jobs:
+
+  diff:
+    name: "Diff"
+    uses: ./.github/workflows/diff.yaml
+    with:
+      config: diff-config.yaml
+
+  docs:
+    needs: [ diff ]
+    name: "Docs"
+    if: ${{ fromJson(needs.diff.outputs.tags).docs.changed }}
+    uses: ./.github/workflows/docs.yml
diff --git a/.github/workflows/triggers_pr.yml b/.github/workflows/triggers_pr.yml
new file mode 100644
index 0000000000000000000000000000000000000000..aadd8b0225aa41823e39b2013c26a021a426a1ec
--- /dev/null
+++ b/.github/workflows/triggers_pr.yml
@@ -0,0 +1,30 @@
+name: PR Workflow
+
+permissions:
+  id-token: write
+  contents: read
+
+on:
+  pull_request:
+    types: [ opened, synchronize, ready_for_review ]
+    branches: [ 'main' ]
+
+jobs:
+
+  diff:
+    name: "Diff"
+    uses: ./.github/workflows/diff.yaml
+    with:
+      config: diff-config.yaml
+
+  lint:
+    needs: [ diff ]
+    name: "Lint"
+    if: ${{ fromJson(needs.diff.outputs.tags).code.changed }}
+    uses: ./.github/workflows/lint.yml
+
+  tests:
+    needs: [ diff ]
+    name: "Tests"
+    if: ${{ fromJson(needs.diff.outputs.tags).code.changed }}
+    uses: ./.github/workflows/test.yml