diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
new file mode 100644
index 0000000000000000000000000000000000000000..9534d1852311d26c9745dd780f4a1ea50869744b
--- /dev/null
+++ b/.github/workflows/publish.yml
@@ -0,0 +1,32 @@
+# This will run every time a tag is created and pushed to the repository.
+# It calls our tests workflow via a `workflow_call`, and if tests pass
+# then it triggers our upload to PyPI for a new release.
+name: Publish to PyPI
+on:
+  release:
+    types: ["published"]
+
+jobs:
+  tests:
+    uses: ./.github/workflows/tests.yml
+  publish:
+    name: publish
+    needs: [tests] # require tests to pass before deploy runs
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout source
+        uses: actions/checkout@v3
+      - name: Set up Python 3.9
+        uses: actions/setup-python@v4
+        with:
+          python-version: 3.9
+      - name: Install flit
+        run: |
+          pip install flit~=3.6
+
+      - name: Build and publish
+        run: |
+          flit publish
+        env:
+          FLIT_USERNAME: __token__
+          FLIT_PASSWORD: ${{ secrets.PYPI_KEY }}
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index aa7e74a2bf699325c364982b2e4ceabc7e2080ac..f64c6ef149992ac3739c880fe8b67c4ef7d6ea6f 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -6,6 +6,7 @@ on:
     tags:
       - 'v*'
   pull_request:
+  workflow_call:
 
 env:
   # Force colors for logs
@@ -109,27 +110,3 @@ jobs:
 
     - name: Run pytest
       run: pytest --durations=10 -m 'not requires_tex'
-
-  publish:
-
-    name: Publish to PyPi
-    needs: [pre-commit, test-with-cov, tests]
-    if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags')
-    runs-on: ubuntu-latest
-    steps:
-      - name: Checkout source
-        uses: actions/checkout@v3
-      - name: Set up Python 3.9
-        uses: actions/setup-python@v4
-        with:
-          python-version: 3.9
-      - name: Install flit
-        run: |
-          pip install flit~=3.6
-
-      - name: Build and publish
-        run: |
-          flit publish
-        env:
-          FLIT_USERNAME: __token__
-          FLIT_PASSWORD: ${{ secrets.PYPI_KEY }}