diff --git a/.github/workflows/projects.yml b/.github/workflows/projects.yml
new file mode 100644
index 0000000000..5d5ae55636
--- /dev/null
+++ b/.github/workflows/projects.yml
@@ -0,0 +1,72 @@
+name: Update Projects
+
+on:
+  issues:
+    types:
+      - labeled
+      - unlabeled
+      - closed
+      - reopened
+
+jobs:
+  bugs:
+    if: "github.event_name == 'issues' && contains(github.event.*.labels.*.name, 'type: bug')"
+    concurrency:
+      group: update-bugs-project-${{ github.event.issue.number }}
+      cancel-in-progress: true
+    runs-on: ubuntu-latest
+    steps:
+      - name: "authenticate"
+        id: "authenticate"
+        uses: "tibdex/github-app-token@b62528385c34dbc9f38e5f4225ac829252d1ea92" # v1
+        with:
+          app_id: "${{ secrets.PROJECTS_APP_ID }}"
+          installation_id: "36153445"
+          private_key: "${{ secrets.PROJECTS_PRIVATE_KEY }}"
+
+      - uses: PaperMC/update-projects-action@v0.2.0
+        name: Update open issue
+        if: github.event.issue.state == 'open'
+        with:
+          github-token: "${{ steps.authenticate.outputs.token }}"
+          project-url: https://github.com/orgs/PaperMC/projects/5/views/2
+          column-field: Status
+          label-to-column-map: |
+            {
+              "status: needs triage": "🕑 Needs Triage",
+              "status: accepted": "✅ Accepted",
+              "status: in progress": "Needs Work",
+              "status: rebase required": "Needs Work",
+              "status: blocked": "Needs Work",
+              "status: defer upstream": "Needs Work",
+              "status: input wanted": "Needs Work",
+              "status: waiting on reporter": "⌛ Waiting for Reporter",
+              "resolution: works-as-intended": "Invalid",
+              "resolution: invalid": "Invalid",
+              "resolution: wontfix": "Invalid",
+              "resolution: duplicate": "Invalid",
+              "resolution: cannot reproduce": "Invalid",
+              "resolution: unsupported": "Invalid",
+              "resolution: incomplete": "Invalid",
+              "resolution: superseded": "Invalid"
+            }
+
+      - uses: PaperMC/update-projects-action@v0.2.0
+        name: Update closed issue
+        if: github.event.issue.state == 'closed'
+        with:
+          github-token: "${{ steps.authenticate.outputs.token }}"
+          project-url: https://github.com/orgs/PaperMC/projects/5/views/2
+          column-field: Status
+          clear-on-no-match: false
+          label-to-column-map: |
+            {
+              "resolution: works-as-intended": "Invalid",
+              "resolution: invalid": "Invalid",
+              "resolution: wontfix": "Invalid",
+              "resolution: duplicate": "Invalid",
+              "resolution: cannot reproduce": "Invalid",
+              "resolution: unsupported": "Invalid",
+              "resolution: incomplete": "Invalid",
+              "resolution: superseded": "Invalid"
+            }