diff --git a/.gitlab/ci/doc.yml b/.gitlab/ci/doc.yml
index 64a91b98041982546434a9e943d82c068415931c..2f879b55fbe21e6ca5b4cbe6282e19d2aacd8aa5 100644
--- a/.gitlab/ci/doc.yml
+++ b/.gitlab/ci/doc.yml
@@ -1,5 +1,6 @@
 doc/build-image:
-  stage: build
+  # On le met au début car c'est utilisé dans les tests de storybook
+  stage: prepare
   needs: []
   extends:
     - .rule-build-and-push
@@ -7,4 +8,4 @@ doc/build-image:
   image:
     name: gcr.io/kaniko-project/executor:debug
     entrypoint: [""]
-  script: /kaniko/executor --context "$CI_PROJECT_DIR" --build-arg GIT_SHA=${CI_COMMIT_SHA} --dockerfile "$CI_PROJECT_DIR/Dockerfile.docs" --destination "caminofr/camino-docs:${CI_COMMIT_SHA}" ${KANIKO_POST_PARAM}
+  script: /kaniko/executor --context "$CI_PROJECT_DIR" --build-arg GIT_SHA=${CI_COMMIT_SHA} --dockerfile "$CI_PROJECT_DIR/Dockerfile.docs" --destination "caminofr/camino-docs:${CI_COMMIT_SHA}"
diff --git a/.gitlab/ci/ui.yml b/.gitlab/ci/ui.yml
index b5d0314f6a2ed13291e53f91e62b16d169e51eaf..08e9d84e10b68a247bf3765cbbfec26cb049d9cc 100644
--- a/.gitlab/ci/ui.yml
+++ b/.gitlab/ci/ui.yml
@@ -10,8 +10,11 @@ ui/test-storybook:
   extends: .prepare-node-run
   stage: test
   retry: 2
+  services:
+    - name: caminofr/camino-docs:${CI_COMMIT_SHA}
+      alias: storybook
   script:
-    - make storybook/build
+    - ./.gitlab/wait-for-it.sh -h localhost -p 80 -t 60 -- echo 'done'
     - make storybook/test
 ui/build-and-push-image:
   stage: build
diff --git a/Makefile b/Makefile
index 367486864b034ce138d0a67abff464583469319c..0a679a87ed133a01f03449b04955164f2cdb1cb2 100644
--- a/Makefile
+++ b/Makefile
@@ -57,8 +57,7 @@ storybook/test:
 ifndef CI
 	npm run storybook:test -w packages/ui
 else
-# TODO 2024-07-04 on peut surement mieux faire, avec un sidecar
-	npx concurrently -k -s first -n "SB,TEST" -c "magenta,blue" "npx http-server packages/ui/storybook-static --port 6006 --silent"  "npx wait-on tcp:6006 && npm run storybook:test -w packages/ui"
+	npm run storybook:test -w packages/ui -- --url http://localhost/storybook/
 endif
 
 test/common:
diff --git a/knip.ts b/knip.ts
index c6cba42ae492ed30eb331d9e0cd2767111fc586f..08fd43dd21520cd74d67a534ab9dfc36f5bcef97 100644
--- a/knip.ts
+++ b/knip.ts
@@ -42,6 +42,7 @@ const config = {
         "@vitest/coverage-v8",
         "eslint-config-prettier",
         "eslint-plugin-promise",
+        "vite",
       ],
     },
     "packages/common": {
diff --git a/packages/api/package.json b/packages/api/package.json
index 5ddae96cfecb30a44bc548c46a88f057fede40f2..380213a257a9083461900d1530f3b6c27a9f5a3f 100644
--- a/packages/api/package.json
+++ b/packages/api/package.json
@@ -29,8 +29,8 @@
     "lint": "prettier --write . && eslint --fix .",
     "start": "node --enable-source-maps --loader ts-node/esm/transpile-only ./src/index.ts",
     "test": "vitest",
-    "test:unit": "vitest --project unit",
-    "test:integration": "vitest --project integration",
+    "test:unit": "vitest --config ./vitest.unit.config.ts",
+    "test:integration": "vitest --config ./vitest.integration.config.ts",
     "test:generate-data": "node --enable-source-maps --loader ts-node/esm/transpile-only src/tools/demarches/tests-creation.ts",
     "test:generate-phase-data": "node --enable-source-maps --loader ts-node/esm/transpile-only src/tools/phases/tests-creation.ts",
     "test:generate-matrices-data": "node --enable-source-maps --loader ts-node/esm/transpile-only src/tools/matrices/tests-creation.ts",
diff --git a/packages/api/vitest.integration.config.ts b/packages/api/vitest.integration.config.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8ddfe9ba1f14e4658d4d325ce7d948e323881d65
--- /dev/null
+++ b/packages/api/vitest.integration.config.ts
@@ -0,0 +1,29 @@
+/// <reference types="vitest" />
+import { defineConfig } from 'vite'
+import { testEnv } from './test-env'
+import path from 'path'
+const poolOptions =
+  process.env.CI === 'true'
+    ? {
+        poolOptions: {
+          threads: {
+            minThreads: 1,
+            maxThreads: 5,
+          },
+        },
+      }
+    : {}
+export default defineConfig({
+  test: {
+    environment: 'node',
+    root: 'src/',
+    name: 'integration',
+    include: ['**/*.test.integration.ts'],
+    setupFiles: path.resolve(__dirname, './tests/vitestSetup.ts'),
+    testTimeout: 10000,
+    hookTimeout: 45000,
+    env: testEnv,
+    pool: 'threads',
+    ...poolOptions,
+  },
+})
diff --git a/packages/api/vitest.unit.config.ts b/packages/api/vitest.unit.config.ts
new file mode 100644
index 0000000000000000000000000000000000000000..705b5cee261c0a80f00effb1a0578f769db26d40
--- /dev/null
+++ b/packages/api/vitest.unit.config.ts
@@ -0,0 +1,12 @@
+import { defineConfig } from 'vitest/config'
+import path from 'path'
+import { testEnv } from './test-env'
+
+export default defineConfig({
+  test: {
+    environment: 'node',
+    root: 'src/',
+    setupFiles: path.resolve(__dirname, './tests/vitestSetup.ts'),
+    env: testEnv,
+  },
+})
diff --git a/packages/api/vitest.workspace.ts b/packages/api/vitest.workspace.ts
deleted file mode 100644
index 89d2e7d25eecf83f086a4f6ac17dc46745f8889f..0000000000000000000000000000000000000000
--- a/packages/api/vitest.workspace.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-import { defineWorkspace } from 'vitest/config'
-import path from 'path'
-import { testEnv } from './test-env'
-
-export default defineWorkspace([
-  {
-    test: {
-      setupFiles: path.resolve(__dirname, './tests/vitestSetup.ts'),
-      env: testEnv,
-      environment: 'node',
-      pool: 'threads',
-      root: 'src',
-      name: 'unit',
-    },
-  },
-  {
-    test: {
-      name: 'integration',
-      include: ['**/*.test.integration.ts'],
-      setupFiles: path.resolve(__dirname, './tests/vitestSetup.ts'),
-      testTimeout: 10000,
-      hookTimeout: 45000,
-      env: testEnv,
-    },
-  },
-])