diff --git a/includes/before-script-yarn.yml b/includes/before-script-yarn.yml
new file mode 100644
index 0000000000000000000000000000000000000000..fb444094d17b54f1167226ba728d24985709d6a1
--- /dev/null
+++ b/includes/before-script-yarn.yml
@@ -0,0 +1,6 @@
+.before-script-yarn:
+  extends: .cache-node-modules
+  before_script:
+    - cd $APP_PATH
+    - if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi
+    - yarn install --frozen-lockfile
diff --git a/includes/cache.yml b/includes/cache.yml
index d3ad9f00f9be44ea78ab71d89028a964db5a6cf9..8763e314e4f2bb18b699ff138de8c9bd7da6fad7 100644
--- a/includes/cache.yml
+++ b/includes/cache.yml
@@ -1,10 +1,23 @@
 .cache-node-modules:
   cache:
     key: node-modules
-    # unfortunatly CACHE_FALLBACK_KEY is broken https://gitlab.com/gitlab-org/gitlab-runner/-/issues/27293
-    #key: "$CI_COMMIT_REF_SLUG" # we have a fallback configured using CACHE_FALLBACK_KEY
     policy: pull-push
     paths:
       - "$APP_DIR/node_modules/"
-      - "$APP_DIR/.next/cache/"
-      - "$CACHE_FOLDER"
+
+.cache-app-build-node-next:
+  cache:
+    - !reference [.cache-node-modules, cache]
+    - key: next-cache
+      policy: pull-push
+      paths:
+        - "$APP_DIR/.next/cache/"
+
+# can be used for cypress verify steps
+.cache-verify-cypress:
+  cache:
+    - !reference [.cache-node-modules, cache]
+    - key: cypress
+      policy: pull-push
+      paths:
+        - "$CYPRESS_CACHE_FOLDER"
diff --git a/includes/docker-build.yml b/includes/docker-build.yml
index 9c37c4768114deff0c7c7d2dde3615a11c64b965..e21d7f1cdc2fc7a0645aa79fa9f3fd5ab7abf15b 100644
--- a/includes/docker-build.yml
+++ b/includes/docker-build.yml
@@ -62,17 +62,13 @@
 .storybook-build:
   extends:
     - .rules-stoybook
-    - .cache-node-modules
-  cache:
-    policy: pull
+    - .before-script-yarn
   stage: build
 
   needs: ["setup-build-info"]
   # don't do it after the semantic release commit, but do it after tag
   script:
     - cd $APP_PATH
-    - if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi
-    - yarn install --frozen-lockfile
     - yarn build-storybook -c .storybook -s public -o .storybook-out --quiet
   artifacts:
     paths:
diff --git a/node-kubernetes.yml b/node-kubernetes.yml
index 4f733f505078f424136403175b7826e724940774..27bfcb72bde91ead4f2ee4843e09b070c526eac7 100644
--- a/node-kubernetes.yml
+++ b/node-kubernetes.yml
@@ -45,13 +45,6 @@ docker-build:
     - *ensureDocker
     - ensureDockerfile
 
-.before-script-yarn:
-  extends: .cache-node-modules
-  before_script:
-    - cd $APP_PATH
-    - if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi
-    - yarn install --frozen-lockfile
-
 .test-node:
   stage: test
 
@@ -95,6 +88,7 @@ lint:
   extends:
     - .before-script-yarn
     - .app-build-base
+    - .cache-app-build-node-next
   script:
     - yarn build
 
@@ -106,3 +100,19 @@ lint:
 
 app-build:
   extends: .app-build-node
+
+# can be used optionaly
+.verify-cypress-base:
+  image: cypress/browsers:node14.16.0-chrome89-ff86
+  extends:
+    - .before-script-yarn
+    - .cache-verify-cypress
+  script:
+    - yarn cypress install
+    - CYPRESS_BASE_URL=$CI_ENVIRONMENT_URL yarn cypress:run --browser chrome --headless --record --key $CYPRESS_KEY
+  artifacts:
+    when: always
+    paths:
+      - cypress/videos/**/*.mp4
+      - cypress/screenshots/**/*.png
+    expire_in: 5 day
diff --git a/panter-kubernetes-base.yml b/panter-kubernetes-base.yml
index 115c6144f552738b2564cac00e705b7776fe0476..7e957914a25a9e1ab2ee76cb99a562cdb9009799 100644
--- a/panter-kubernetes-base.yml
+++ b/panter-kubernetes-base.yml
@@ -1,4 +1,5 @@
 include:
+  - /includes/before-script-yarn.yml
   - /includes/env.yml
   - /includes/retry.yml
   - /includes/cache.yml
@@ -41,7 +42,6 @@ variables:
   # APP NAME LOCAL TO THE APP NAMESPACEGIT S
   KUBE_APP_NAME: ${COMPONENT_NAME}
 
-  CACHE_FOLDER: "$CI_PROJECT_DIR/.cache"
   # see https://on.cypress.io/caching
   CYPRESS_CACHE_FOLDER: "$CI_PROJECT_DIR/.cache/Cypress"