diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index 390b9874b383f1e4d26a316a49083dc6e5d6a6f1..e39351bd9391e756b0ee6d67fbab78a349cc866d 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -308,6 +308,9 @@ jobs:
         run: |
           echo "Failed to restore Python virtual environment from cache"
           exit 1
+      - name: Register flake8 problem matcher
+        run: |
+          echo "::add-matcher::.github/workflows/matchers/flake8.json"
       - name: Run flake8
         run: |
           . venv/bin/activate
diff --git a/.github/workflows/matchers/flake8.json b/.github/workflows/matchers/flake8.json
new file mode 100644
index 0000000000000000000000000000000000000000..83163e72815ad40b449e420ad83729ea1defd148
--- /dev/null
+++ b/.github/workflows/matchers/flake8.json
@@ -0,0 +1,30 @@
+{
+  "problemMatcher": [
+    {
+      "owner": "flake8-error",
+      "severity": "error",
+      "pattern": [
+        {
+          "regexp": "^(.*):(\\d+):(\\d+):\\s(E\\d{3}\\s.*)$",
+          "file": 1,
+          "line": 2,
+          "column": 3,
+          "message": 4
+        }
+      ]
+    },
+    {
+      "owner": "flake8-warning",
+      "severity": "warning",
+      "pattern": [
+        {
+          "regexp": "^(.*):(\\d+):(\\d+):\\s([CDFNW]\\d{3}\\s.*)$",
+          "file": 1,
+          "line": 2,
+          "column": 3,
+          "message": 4
+        }
+      ]
+    }
+  ]
+}