diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index a794d5b6fde771d34c406f1b91284aa8728a7435..18d7b30dd572e8e954e264496c9e730fd797c744 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -4,6 +4,7 @@ image: docker:24
 
 variables:
   LATEST_UBUNTU_VERSION: "jammy"
+  LATEST_DEBIAN_VERSION: "bookworm"
 
 
 
@@ -16,7 +17,11 @@ variables:
     - docker --version
     - |
       if [ "${LANGUAGE}" == "python" ]; then
-        LANGUAGE_VERSION="${PYTHON_VERSION}"
+        if [ "${LATEST_DEBIAN_VERSION}" == "${DEBIAN_VERSION}" ]; then
+          LANGUAGE_VERSION="${PYTHON_VERSION}${PYTHON_VERSION_SUFFIX}"
+        else
+          LANGUAGE_VERSION="${PYTHON_VERSION}${PYTHON_VERSION_SUFFIX}-${DEBIAN_VERSION}"
+        fi
       else
         if [ "${LATEST_UBUNTU_VERSION}" == "${UBUNTU_VERSION}" ]; then
           LANGUAGE_VERSION="${R_VERSION}"
@@ -38,35 +43,47 @@ variables:
     - apk add gettext
     - envsubst < ./Dockerfile.$LANGUAGE > Dockerfile
     # pull the latest build of the targeted version of the current branch
-    - docker pull "$CI_REGISTRY_IMAGE/${LANGUAGE}/$CI_COMMIT_REF_SLUG:$VERSIONS_TAG" || true
+    - docker pull "$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG/${LANGUAGE}:$VERSIONS_TAG" || true
     # pull the latest build of the target version of the main branch
     - docker pull "$CI_REGISTRY_IMAGE/${LANGUAGE}:$VERSIONS_TAG" || true
     # pull the latest build of this branch
-    - docker pull "$CI_REGISTRY_IMAGE/${LANGUAGE}/$CI_COMMIT_REF_SLUG:latest" || true
+    - docker pull "$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG/${LANGUAGE}:latest" || true
     # build the image while passing commit SHA and versions, and tagging the image with them
     - docker build
       --build-arg BUILDKIT_INLINE_CACHE=1
       --build-arg R_VERSION
       --build-arg SHINY_SERVER_VERSION
-      --cache-from "$CI_REGISTRY_IMAGE/${LANGUAGE}/$CI_COMMIT_REF_SLUG:$VERSIONS_TAG"
+      --cache-from "$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG/${LANGUAGE}:$VERSIONS_TAG"
       --cache-from "$CI_REGISTRY_IMAGE/${LANGUAGE}:$VERSIONS_TAG"
-      --tag "$CI_REGISTRY_IMAGE/${LANGUAGE}/$CI_COMMIT_REF_SLUG:latest"
+      --tag "$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG/${LANGUAGE}:latest"
       --tag "$CI_REGISTRY_IMAGE/${LANGUAGE}:$VERSIONS_TAG"
-      --tag "$CI_REGISTRY_IMAGE/${LANGUAGE}/$CI_COMMIT_REF_SLUG:$VERSIONS_TAG"
-      --tag "$CI_REGISTRY_IMAGE/${LANGUAGE}/$CI_COMMIT_REF_SLUG:$VERSIONS_TAG--$CI_COMMIT_SHORT_SHA"
+      --tag "$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG/${LANGUAGE}:$VERSIONS_TAG"
+      --tag "$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG/${LANGUAGE}:$VERSIONS_TAG--$CI_COMMIT_SHORT_SHA"
       -f Dockerfile
       ./
     # push image as latest for the current branch
-    - docker push "$CI_REGISTRY_IMAGE/${LANGUAGE}/$CI_COMMIT_REF_SLUG:latest"
+    - docker push "$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG/${LANGUAGE}:latest"
     # push image tagged with its versions
-    - docker push "$CI_REGISTRY_IMAGE/${LANGUAGE}/$CI_COMMIT_REF_SLUG:$VERSIONS_TAG"
+    - IMAGE_PATH="$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG/${LANGUAGE}:$VERSIONS_TAG"
+    - docker push "${IMAGE_PATH}"
     # push image tagged with its versions and the commit sha (debug purpose)
-    - docker push "$CI_REGISTRY_IMAGE/${LANGUAGE}/$CI_COMMIT_REF_SLUG:$VERSIONS_TAG--$CI_COMMIT_SHORT_SHA"
+    - docker push "$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG/${LANGUAGE}:$VERSIONS_TAG--$CI_COMMIT_SHORT_SHA"
     - |
       if [ "docker-images" == "${CI_COMMIT_REF_SLUG}" ]; then
         # push image tagged with its versions
-        docker push "$CI_REGISTRY_IMAGE/${LANGUAGE}:$VERSIONS_TAG"
+        IMAGE_PATH="$CI_REGISTRY_IMAGE/${LANGUAGE}:$VERSIONS_TAG"
+        docker push "${IMAGE_PATH}"
       fi
+    - IMAGE_PATH="$CI_REGISTRY_IMAGE/${LANGUAGE}:$VERSIONS_TAG"
+    - CSV_LINE="${IMAGE_PATH},${UBUNTU_VERSION}${DEBIAN_VERSION},${PYTHON_VERSION}${R_VERSION},${SHINY_SERVER_VERSION}"
+    - MD5SUM=$(echo $CSV_LINE | md5sum | head -c 32)
+    - mkdir -p image-list-fragments/
+    - echo $CSV_LINE > image-list-fragments/${MD5SUM}.csv
+  artifacts:
+    when: always
+    paths:
+    - image-list-fragments
+    expire_in: 1 week
 
 
 
@@ -76,12 +93,16 @@ build_python:
     matrix:        
       - LANGUAGE: ["python"]
         PYTHON_VERSION: [
-          "3.9-slim-bullseye",
-          "3.9-slim",
-          "3.10-slim-bullseye",
-          "3.10-slim",
-          "3.11-slim-bullseye",
-          "3.11-slim",
+          "3.9",
+          "3.10",
+          "3.11",
+        ]
+        PYTHON_VERSION_SUFFIX: [
+          "-slim"
+        ]
+        DEBIAN_VERSION: [
+           "bookworm",
+           "bullseye",
         ]
         SHINY_SERVER_VERSION: [
           "1.5.21.1006",
@@ -113,6 +134,39 @@ build_r:
 
 
 
+publish_listing:
+  needs: 
+    - build_r
+    - build_python
+  image: docker:24-git
+  before_script:
+    - git fetch origin docs
+    - git checkout docs
+  script: 
+    - echo "Built image,Base os,R/Python,shiny-server" > image_list.csv
+    - cat image-list-fragments/*.csv >> image_list.csv
+    - WHEN=$(LC_TIME="en_US.utf8" date +"%b %G")
+    - sed "s/%%date%%/${WHEN}/g" source/user_guide/image_list.rst > image_list.rst
+  artifacts:
+    when: always
+    paths:
+    - image_list.csv
+    - image_list.rst
+    expire_in: 1 year
+  
+
+
+# update_docs:
+#   only:
+#     - docker-images
+#     - rework-image-matrix-and-export
+#   needs: []
+#   trigger:
+#     - project: hub/shiny-k8s
+#       branch: docs
+  
+
+
 trigger_r_example:
   needs: ["build_r"]
   trigger: