diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
new file mode 100644
index 0000000..27b1c62
--- /dev/null
+++ b/.github/workflows/deploy.yml
@@ -0,0 +1,35 @@
+name: Deploy to Shuttle
+
+on:
+  pull_request:
+    branches: [master]
+    types: [closed]
+
+jobs:
+  deploy:
+    if: github.event.pull_request.merged == true
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v3
+      
+      # Build frontend
+      - name: Install trunk
+        run: cargo install --locked trunk
+      - name: Build frontend
+        run: trunk build --release --public-url /${{ github.event.repository.name }}
+        working-directory: ./frontend
+        
+      # Deploy backend
+      - name: Install Rust
+        uses: actions-rs/toolchain@v1
+        with:
+          toolchain: stable
+          override: true
+      - name: Install cargo-shuttle
+        run: cargo install --locked cargo-shuttle
+      - name: Deploy to Shuttle
+        env:
+          SHUTTLE_TOKEN: ${{ secrets.SHUTTLE_TOKEN }}
+        run: |
+          cargo shuttle login --api-key $SHUTTLE_TOKEN
+          cargo shuttle deploy