diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index e8524909bf8a135e2bed01c413ca1b1f5ec91d46..e537adfebf04d843173e96724df29edbe32904de 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -4,10 +4,12 @@ stages:
 
 variables:
   BUILD_ENV_DOCKER_IMAGE: docker-registry.ebrains.eu/ebrains-spack-build-env/base:devel
+  RUN_ENV_DOCKER_IMAGE: docker-registry.ebrains.eu/clb-jupyter-image/ebrains:dev-a7ab31be
   SPACK_PATH_GITLAB: /mnt/spack_v0.23.1
   SYSTEMNAME: ebrainslab
   GIT_SUBMODULE_STRATEGY: recursive
   GIT_CLEAN_FLAGS: -ffdxq
+  RUNNER_AFTER_SCRIPT_TIMEOUT: 20m
 
 # ===================================================================
 # LAB DEPLOYMENTS
@@ -47,6 +49,15 @@ variables:
     - if [ $(kubectl get pods -l job-name=simplejob${CI_PIPELINE_ID} -o jsonpath='{.items[0].status.containerStatuses[0].state.terminated.exitCode}') -ne 0 ]; then exit 1; fi;
     # delete the job, as we have the logs here
     - kubectl delete job simplejob${CI_PIPELINE_ID} || true
+  after_script:
+    - kubectl config use-context $KUBE_CONTEXT
+    - sh create_job_widget_script.sh $CI_PIPELINE_ID $RUN_ENV_DOCKER_IMAGE $INSTALLATION_ROOT $SPACK_ENV $RELEASE_NAME $LAB_KERNEL_ROOT
+    - cat widget-script.yml
+    - kubectl create -f widget-script.yml
+    - while true; do sleep 300; x=$(kubectl get pods -l job-name=widget-script${CI_PIPELINE_ID} -o jsonpath='{.items[0].status.phase}'); if [ $x != "Running" ]; then break; fi; done
+    - kubectl logs jobs/widget-script${CI_PIPELINE_ID} | tee log.txt
+    - if [ $(kubectl get pods -l job-name=widget-script${CI_PIPELINE_ID} -o jsonpath='{.items[0].status.containerStatuses[0].state.terminated.exitCode}') -ne 0 ]; then exit 1; fi;
+    - kubectl delete job widget-script${CI_PIPELINE_ID} || true
   # artifacts:
   #   paths:
   #     - spack_logs
diff --git a/create_job_widget_script.sh b/create_job_widget_script.sh
new file mode 100644
index 0000000000000000000000000000000000000000..e28df2f8bae2e62d682b722f6f3e2f5c42af98d2
--- /dev/null
+++ b/create_job_widget_script.sh
@@ -0,0 +1,68 @@
+#!/bin/bash
+
+# ===========================================================================================================
+# title         : create_job_widget_script.sh
+# usage         : ./create_job_widget_script.sh $OC_JOB_ID $RUN_ENV_DOCKER_IMAGE $INSTALLATION_ROOT
+#                 $SPACK_ENV $RELEASE_NAME $LAB_KERNEL_ROOT
+# description   : creates job file that generates a script to load the jupyter extensions for a given env
+# ===========================================================================================================
+
+OC_JOB_ID=$1
+RUN_ENV_DOCKER_IMAGE=$2
+INSTALLATION_ROOT=$3
+EBRAINS_SPACK_ENV=$4
+RELEASE_NAME=$5
+LAB_KERNEL_ROOT=$6
+
+cat <<EOT >> widget-script.yml
+apiVersion: batch/v1
+kind: Job
+metadata:
+  name: widget-script${OC_JOB_ID}
+spec:
+  parallelism: 1
+  completions: 1
+  backoffLimit: 0
+  template:
+    spec:
+      containers:
+      - name: widget-script
+        image: ${RUN_ENV_DOCKER_IMAGE}
+        imagePullPolicy: Always
+        resources:
+          limits:
+            cpu: '1'
+            memory: '1Gi'
+          requests:
+            cpu: '0.5'
+            memory: '500Mi'
+        volumeMounts:
+          - name: sharedbin
+            mountPath: /srv
+        command:
+        - /bin/bash
+        - -c
+        - |
+          . \$INSTALLATION_ROOT/spack/share/spack/setup-env.sh
+          spack env activate --without-view \$EBRAINS_SPACK_ENV
+          KERNEL_PATH=\$LAB_KERNEL_ROOT/\$(echo "\$RELEASE_NAME" | tr '[:upper:]' '[:lower:]')
+          spack load --sh clb-nb-utils py-tvb-ext-bucket py-tvb-ext-unicore py-tvb-ext-xircuits > \$KERNEL_PATH/bin/widget_activation.sh
+        env:
+          - name: SYSTEMNAME
+            value: ebrainslab
+          - name: SPACK_DISABLE_LOCAL_CONFIG
+            value: "true"
+          - name: INSTALLATION_ROOT
+            value: "$INSTALLATION_ROOT"
+          - name: EBRAINS_SPACK_ENV
+            value: "$EBRAINS_SPACK_ENV"
+          - name: RELEASE_NAME
+            value: "$RELEASE_NAME"
+          - name: LAB_KERNEL_ROOT
+            value: "$LAB_KERNEL_ROOT"
+      volumes:
+        - name: sharedbin
+          persistentVolumeClaim:
+            claimName: shared-binaries
+      restartPolicy: Never
+EOT