diff --git a/.forgejo/workflows/CI.yml b/.forgejo/workflows/CI.yml
deleted file mode 100644
index 6b4a105..0000000
--- a/.forgejo/workflows/CI.yml
+++ /dev/null
@@ -1,31 +0,0 @@
-name: 'CI'
-
-on:
-  push:
-    branches:
-      - 'main'
-  pull_request:
-
-jobs:
-  test:
-    runs-on: docker
-
-    strategy:
-      matrix:
-        lisp:
-          - sbcl-bin
-
-    steps:
-      - uses: actions/checkout@v4
-
-      - name: Install dependencies
-        env:
-          LISP: ${{ matrix.lisp }}
-        run: |
-          curl -L https://raw.githubusercontent.com/roswell/roswell/master/scripts/install-for-ci.sh | sh
-          ros install fukamachi/qlot
-          PATH="~/.roswell/bin:$PATH"
-          qlot install
-
-      - name: Run tests
-        run: .qlot/bin/rove lack-mw.asd
diff --git a/.forgejo/workflows/ci.yml b/.forgejo/workflows/ci.yml
new file mode 100644
index 0000000..dd31d55
--- /dev/null
+++ b/.forgejo/workflows/ci.yml
@@ -0,0 +1,72 @@
+name: 'CI'
+
+on:
+  push:
+    branches:
+      - 'main'
+  pull_request:
+
+jobs:
+  test:
+    runs-on: docker
+
+    strategy:
+      matrix:
+        lisp:
+          - sbcl-bin
+
+    steps:
+      - uses: actions/checkout@v4
+
+      - name: Restore cache
+        id: restore-cache
+        uses: actions/cache/restore@v4
+        with:
+          path: |
+            ~/.quicklisp-client-fix
+            ~/.roswell
+            /usr/local/bin/ros
+            /usr/local/etc/roswell/
+            qlfile
+            qlfile.lock
+            .qlot
+            ~/.cache/common-lisp/
+          key: roswell-${{ runner.os }}-${{ matrix.lisp }}-${{ hashFiles('qlfile', 'qlfile.lock', '*.asd', '.forgejo/workflows/ci.yml') }}
+
+      - name: Install Roswell
+        if: steps.restore-cache.outputs.cache-hit != 'true'
+        env:
+          LISP: ${{ matrix.lisp }}
+        run: |
+          curl -L https://raw.githubusercontent.com/roswell/roswell/master/scripts/install-for-ci.sh | sh
+
+      - name: Install Qlot
+        if: steps.restore-cache.outputs.cache-hit != 'true'
+        run: |
+          ros install fukamachi/qlot
+
+      - name: Install dependencies
+        if: steps.restore-cache.outputs.cache-hit != 'true'
+        run: |
+          PATH="~/.roswell/bin:$PATH"
+          qlot install
+          qlot exec ros install lack-mw
+
+      - name: Save cache
+        id: save-cache
+        uses: actions/cache/save@v4
+        if: steps.restore-cache.outputs.cache-hit != 'true'
+        with:
+          path: |
+            ~/.quicklisp-client-fix
+            ~/.roswell
+            /usr/local/bin/ros
+            /usr/local/etc/roswell/
+            qlfile
+            qlfile.lock
+            .qlot
+            ~/.cache/common-lisp/
+          key: ${{ steps.restore-cache.outputs.cache-primary-key }}
+
+      - name: Run tests
+        run: .qlot/bin/rove lack-mw.asd
diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml
deleted file mode 100644
index 293cd8a..0000000
--- a/.github/workflows/CI.yml
+++ /dev/null
@@ -1,31 +0,0 @@
-name: 'CI'
-
-on:
-  push:
-    branches:
-      - 'main'
-  pull_request:
-
-jobs:
-  test:
-    runs-on: ubuntu-latest
-
-    strategy:
-      matrix:
-        lisp:
-          - sbcl-bin
-
-    steps:
-      - uses: actions/checkout@v4
-
-      - name: Install dependencies
-        env:
-          LISP: ${{ matrix.lisp }}
-        run: |
-          curl -L https://raw.githubusercontent.com/roswell/roswell/master/scripts/install-for-ci.sh | sh
-          ros install fukamachi/qlot
-          PATH="~/.roswell/bin:$PATH"
-          qlot install
-
-      - name: Run tests
-        run: .qlot/bin/rove lack-mw.asd
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..115a9f4
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,29 @@
+name: 'CI'
+
+on:
+  push:
+    branches:
+      - 'main'
+  pull_request:
+
+jobs:
+  test:
+    runs-on: ubuntu-latest
+
+    strategy:
+      matrix:
+        lisp:
+          - sbcl-bin
+          - ccl-bin
+
+    env:
+      LISP: ${{ matrix.lisp }}
+
+    steps:
+      - uses: actions/checkout@v4
+      - uses: 40ants/setup-lisp@v4
+        with:
+          asdf-system: lack-mw
+      - uses: 40ants/run-tests@v2
+        with:
+          asdf-system: lack-mw
\ No newline at end of file