diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 3fd6e50e68..afe3fa4987 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -56,9 +56,11 @@ build_test:
     - if: $CI_PIPELINE_SOURCE == 'push' || $CI_PIPELINE_SOURCE == 'merge_request_event'
       changes:
         paths:
-          - packages/**/*
+          - packages/backend/*
+          - packages/backend-rs/*
+          - packages/macro-rs/*
+          - packages/megalodon/*
           - scripts/**/*
-          - locales/**/*
           - package.json
           - pnpm-lock.yaml
           - Cargo.toml
@@ -68,6 +70,33 @@ build_test:
     - pnpm run build:debug
     - pnpm run migrate
 
+client_build_test:
+  stage: test
+  rules:
+    - if: $CI_PIPELINE_SOURCE == 'push' || $CI_PIPELINE_SOURCE == 'merge_request_event'
+      changes:
+        paths:
+          - packages/client/*
+          - packages/firefish-js/*
+          - packages/sw/*
+          - scripts/**/*
+          - locales/**/*
+          - package.json
+          - pnpm-lock.yaml
+    - if: $CI_PIPELINE_SOURCE == 'push' || $CI_PIPELINE_SOURCE == 'merge_request_event'
+      changes:
+        paths:
+          - packages/backend/*
+          - packages/backend-rs/*
+          - packages/macro-rs/*
+          - packages/megalodon/*
+          - Cargo.toml
+          - Cargo.lock
+      when: never
+  script:
+    - pnpm install --frozen-lockfile
+    - pnpm --filter 'client' --filter 'sw' run build:debug
+
 container_image_build:
   stage: build
   image: docker.io/debian:bookworm-slim