diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 724e9db99a2c1377b487cf8bcf7ac2e9b5b927cd..effc0a8d8e92f738644c7d713d9d359abc6ab455 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -5,10 +5,10 @@ variables:
   DOCKER_IMAGE: docker.io/docker:24.0.7
   SINGULARITY_IMAGE: quay.io/singularity/singularity:v3.11.5
 
-  ## Application versions used for the main release 
+  ## Default versions are specified in packages.yaml but can be overridden
   ## note: nightly builds will always use the master/main branch
-  JUGGLER_VERSION: "v13.0.0"
-  EICRECON_VERSION: "v1.9.1"
+  JUGGLER_VERSION: ""
+  EICRECON_VERSION: ""
 
   ## Local registry
   CI_PUSH: 1
@@ -337,8 +337,12 @@ jug_dev:
                    --build-arg S3_SECRET_KEY=${S3_SECRET_KEY}
                    --build-arg JUG_VERSION=${EXPORT_TAG}-${BUILD_TYPE}-$(git rev-parse HEAD)
                    ${IF_BUILD_DEFAULT:+
-                     --build-arg JUGGLER_VERSION=${JUGGLER_VERSION}
-                     --build-arg EICRECON_VERSION=${EICRECON_VERSION}
+                     ${JUGGLER_VERSION:+--build-arg JUGGLER_VERSION=${JUGGLER_VERSION}}
+                     ${EICRECON_VERSION:+--build-arg EICRECON_VERSION=${EICRECON_VERSION}}
+                   }
+                   ${IF_BUILD_NIGHTLY:+
+                     --build-arg JUGGLER_VERSION=main
+                     --build-arg EICRECON_VERSION=main
                    }
                    --build-arg ENV=${ENV}
                    --build-arg jobs=${JOBS}
diff --git a/containers/jug/dev.Dockerfile b/containers/jug/dev.Dockerfile
index ab0e5c9addca2cbe6dbf619a37840988c6851d66..b68cb505442c81d773f30fd420d7d31591ac6172 100644
--- a/containers/jug/dev.Dockerfile
+++ b/containers/jug/dev.Dockerfile
@@ -123,13 +123,9 @@ EOF
 ## ========================================================================================
 FROM spack as builder
 
-## Setup our custom environment (secret mount for write-enabled mirror)
+## 1. Setup our default environment (secret mount for write-enabled mirror)
 COPY --from=spack-environment . /opt/spack-environment/
 ARG ENV=dev
-ARG JUGGLER_VERSION="main"
-ADD https://api.github.com/repos/eic/juggler/commits/${JUGGLER_VERSION} /tmp/juggler.json
-ARG EICRECON_VERSION="main"
-ADD https://api.github.com/repos/eic/eicrecon/commits/${EICRECON_VERSION} /tmp/eicrecon.json
 ENV SPACK_ENV=/opt/spack-environment/${ENV}
 RUN --mount=type=cache,target=/ccache,id=${TARGETPLATFORM}              \
     --mount=type=cache,target=/var/cache/spack                          \
@@ -137,14 +133,47 @@ RUN --mount=type=cache,target=/ccache,id=${TARGETPLATFORM}              \
     <<EOF
 set -e
 export CCACHE_DIR=/ccache
+source ${SPACK_ROOT}/share/spack/setup-env.sh
 mkdir -p /var/cache/spack/blobs/sha256/
 find /var/cache/spack/blobs/sha256/ -atime +7 -delete
-JUGGLER_VERSION=$(jq -r .sha /tmp/juggler.json)
-EICRECON_VERSION=$(jq -r .sha /tmp/eicrecon.json)
 spack buildcache update-index eics3rw
 spack env activate --dir ${SPACK_ENV}
-spack add juggler@git.${JUGGLER_VERSION}
-spack add eicrecon@git.${EICRECON_VERSION}
+spack concretize --fresh --force --quiet
+make --jobs ${jobs} --keep-going --directory /opt/spack-environment \
+  SPACK_ENV=${SPACK_ENV} \
+  BUILDCACHE_OCI_PROMPT="eicweb" \
+  BUILDCACHE_OCI_FINAL="ghcr" \
+  BUILDCACHE_S3_FINAL="eics3rw"
+ccache --show-stats
+ccache --zero-stats
+EOF
+
+## 2. Setup our environment with custom versions (on top of cached layer)
+## Note: these default versions are just the very first commit.
+ARG JUGGLER_VERSION="df87bf1f8643afa8e80bece9d36d6dc26dfe8132"
+ARG EICRECON_VERSION="28108da4a1e8919a05dfdb5f11e114800a2cbe96"
+ADD https://api.github.com/repos/eic/juggler/commits/${JUGGLER_VERSION} /tmp/juggler.json
+ADD https://api.github.com/repos/eic/eicrecon/commits/${EICRECON_VERSION} /tmp/eicrecon.json
+RUN --mount=type=cache,target=/ccache,id=${TARGETPLATFORM}              \
+    --mount=type=cache,target=/var/cache/spack                          \
+    --mount=type=secret,id=mirrors,target=/opt/spack/etc/spack/mirrors.yaml \
+    <<EOF
+source ${SPACK_ROOT}/share/spack/setup-env.sh
+export CCACHE_DIR=/ccache
+spack buildcache update-index eics3rw
+spack env activate --dir ${SPACK_ENV}
+if [ "${JUGGLER_VERSION}" != "df87bf1f8643afa8e80bece9d36d6dc26dfe8132" ] ; then
+  export JUGGLER_VERSION=$(jq -r .sha /tmp/juggler.json)
+  spack config add "packages:juggler::require:['@git.${JUGGLER_VERSION}=main']"
+  spack deconcretize -y juggler
+fi
+if [ "${EICRECON_VERSION}" != "28108da4a1e8919a05dfdb5f11e114800a2cbe96" ] ; then
+  export EICRECON_VERSION=$(jq -r .sha /tmp/eicrecon.json)
+  spack config add "packages:eicrecon::require:['@git.${EICRECON_VERSION}=main']"
+  spack deconcretize -y eicrecon
+fi
+cat ${SPACK_ENV}/spack.yaml
+cat ${SPACK_ENV}/../packages.yaml
 spack concretize --fresh --force --quiet
 make --jobs ${jobs} --keep-going --directory /opt/spack-environment \
   SPACK_ENV=${SPACK_ENV} \
diff --git a/eic-spack.sh b/eic-spack.sh
index 055ad44f6254c9076368d2236fc5c7bf47ec0b47..d77d563dcbeb7454d9931b6ef8b3a3b8dfb82d35 100644
--- a/eic-spack.sh
+++ b/eic-spack.sh
@@ -3,7 +3,7 @@ EICSPACK_ORGREPO="eic/eic-spack"
 
 ## EIC spack commit hash or github version, e.g. v0.19.7
 ## note: nightly builds could use a branch e.g. releases/v0.19
-EICSPACK_VERSION="5d8ba97ea6b021a50aa11e924a55a4726c689d65"
+EICSPACK_VERSION="bc6a4382636dd8c8bcd8c665163840815d48a25e"
 
 ## Space-separated list of eic-spack cherry-picks
 read -r -d '' EICSPACK_CHERRYPICKS <<- \
diff --git a/spack-environment/dev/spack.yaml b/spack-environment/dev/spack.yaml
index 7ec9666618a095df0ca0d0899e28b36b966e3940..73cba0f6b1c16ea101b625ce869c96b6225d4234 100644
--- a/spack-environment/dev/spack.yaml
+++ b/spack-environment/dev/spack.yaml
@@ -24,6 +24,7 @@ spack:
   - edm4eic
   - edm4hep
   - eic-smear
+  - eicrecon
   - eigen
   - emacs
   - fastjet
@@ -40,6 +41,7 @@ spack:
   - iwyu
   - jana2
   - k4actstracking
+  - juggler
   - k4fwcore
   - lcov
   - lhapdf
diff --git a/spack-environment/packages.yaml b/spack-environment/packages.yaml
index c700a560ea427459dbf93f7cafaac0ae27aac82d..d2afb467cb9be624e45c50dc4584a40b952e9283 100644
--- a/spack-environment/packages.yaml
+++ b/spack-environment/packages.yaml
@@ -92,6 +92,9 @@ packages:
   eic-smear:
     require:
     - '@1.1.12'
+  eicrecon:
+    require:
+    - '@1.9.1'
   eigen:
     require:
     - '@3.4.0'
@@ -160,6 +163,7 @@ packages:
     - -ipo +podio +root +zmq
   juggler:
     require:
+    - '@13.0.0'
     - cxxstd=20
   k4actstracking:
     require:
diff --git a/spack-environment/prod/spack.yaml b/spack-environment/prod/spack.yaml
index 3f05ab1b4fc24dc4faf8c85edd1997749d87c85b..c56f72a99dc2fe110c2bc875f56d0e256fda8860 100644
--- a/spack-environment/prod/spack.yaml
+++ b/spack-environment/prod/spack.yaml
@@ -1,5 +1,5 @@
 spack:
-  include: 
+  include:
   - ../concretizer.yaml
   - ../packages.yaml
   config:
@@ -9,6 +9,7 @@ spack:
   - cmake
   - dd4hep -ddeve
   - edm4eic
+  - eicrecon
   - fastjet
   - fjcontrib
   - gaudi
@@ -17,6 +18,7 @@ spack:
   - intel-tbb
   - irt
   - jana2
+  - juggler
   - npsim -geocad
   - py-boto3
   - py-jinja2