diff --git a/containers/debian/base.Dockerfile b/containers/debian/base.Dockerfile
index 1b6547c4ea060551bda6640830308e157f647cca..0d17bde251c3f55a49bbbcec2610102e7148ef21 100644
--- a/containers/debian/base.Dockerfile
+++ b/containers/debian/base.Dockerfile
@@ -103,6 +103,7 @@ apt-get -yqq install gcc${GCC} g++${GCC} gfortran${GCC}
 apt-get -yqq install clang${CLANG} clang-tidy${CLANG} clang-format${CLANG} libclang${CLANG}-dev
 apt-get -yqq autoremove
 # Ensure alternatives without version tags
+update-alternatives --install /usr/bin/cpp cpp /usr/bin/cpp${GCC} 100
 update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc${GCC} 100
 update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++${GCC} 100
 update-alternatives --install /usr/bin/gfortran gfortran /usr/bin/gfortran${GCC} 100
diff --git a/containers/jug/dev.Dockerfile b/containers/jug/dev.Dockerfile
index c8019b18a275492ce6f5d8b896a58e1f1d4ad383..3993994b19ba3db40329b1d8ec4f962eb1724d4a 100644
--- a/containers/jug/dev.Dockerfile
+++ b/containers/jug/dev.Dockerfile
@@ -57,7 +57,7 @@ declare -A target=(["linux/amd64"]="x86_64_v2" ["linux/arm64"]="aarch64")
 target=${target[${TARGETPLATFORM}]}
 spack config --scope site add "packages:all:require:[target=${target}]"
 spack config --scope site add "packages:all:target:[${target}]"
-spack external find --scope site llvm
+spack external find --not-buildable --scope site llvm
 spack config blame packages
 spack config --scope user add "config:suppress_gpg_warnings:true"
 spack config --scope user add "config:build_jobs:${jobs}"
diff --git a/eic-spack.sh b/eic-spack.sh
index 318a65c947bcfbd2f7533734c24d3f661930079d..30c8288c5363e3c8f912aa4c1d03f5e0cedbe9c5 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="fd2dfe268c913cee75ba14725369cddf7555e00a"
+EICSPACK_VERSION="4c9c1250d054e587455e5f00df242e376018130a"
 
 ## Space-separated list of eic-spack cherry-picks
 read -r -d '' EICSPACK_CHERRYPICKS <<- \
diff --git a/spack-environment/Makefile b/spack-environment/Makefile
index 7312a3318672e800e1061f7e425e9f43e9713f35..42f6fb6952ab835b887ff1ac3277679df8e14927 100644
--- a/spack-environment/Makefile
+++ b/spack-environment/Makefile
@@ -22,7 +22,7 @@ $(SPACK_ENV)/push: $(addprefix $(SPACK_ENV)/push/,$($(SPACK_ENV)/SPACK_PACKAGE_I
 
 $(SPACK_ENV)/push/%: $(SPACK_ENV)/install/%
 	@mkdir -p $(dir $@)
-	$(foreach buildcache, $(BUILDCACHE_MIRROR), $(SPACK) buildcache create --allow-root --only=package --unsigned $(buildcache) /$(HASH) ;) # push $(SPEC)
+	$(foreach buildcache, $(BUILDCACHE_MIRROR), $(SPACK) buildcache push --only=package --unsigned $(buildcache) /$(HASH) ;) # push $(SPEC)
 	@touch $@
 
 $(SPACK_ENV)/spack.lock: $(SPACK_ENV)/spack.yaml Makefile
diff --git a/spack-environment/dev/spack.yaml b/spack-environment/dev/spack.yaml
index 6821d66ec964cba87cac76152e7502949ebc5534..230fa067a16841aedc5b043e43804ebd4ae1537e 100644
--- a/spack-environment/dev/spack.yaml
+++ b/spack-environment/dev/spack.yaml
@@ -5,83 +5,83 @@ spack:
   config:
     install_missing_compilers: false
   specs:
-    - acts
-    - actsvg
-    - afterburner
-    - algorithms
-    - cairo
-    - catch2
-    - cernlib
-    - cli11
-    - cmake
-    - cnpy
-    - cppcoro
-    - dawn
-    - dawncut
-    - dd4hep +ddeve
-    - dpmjet
-    - east
-    - edm4eic
-    - edm4hep
-    - eic-smear
-    - eigen
-    - emacs
-    - fastjet
-    - fjcontrib
-    - fmt
-    - gaudi
-    - gdb
-    - geant4
-    - graphviz
-    - hepmc3
-    - heppdt
-    - imagemagick
-    - irt
-    - iwyu
-    - jana2
-    - lcov
-    - lhapdf
-    - madx
-    - npsim
-    - onnx
-    - opencascade
-    - osg-ca-certs
-    - phonebook-cli
-    - prmon
-    - pythia8
-    - py-awkward
-    - py-bokeh
-    - py-boto3
-    - py-dask
-    - py-deepdiff
-    - py-epic-capybara
-    - py-ipython
-    - py-jinja2
-    - py-jinja2-cli
-    - py-jupyter-console
-    - py-jupyterlab
-    - py-lmfit
-    - py-lxml
-    - py-matplotlib
-    - py-mplhep
-    - py-htgettoken
-    - py-numpy
-    - py-pandas
-    - py-pip
-    - py-pre-commit
-    - py-pycairo
-    - py-pyyaml
-    - py-scipy
-    - py-seaborn
-    - py-toml
-    - py-uproot
-    - py-wurlitzer
-    - py-yapf
-    - root
-    - snakemake
-    - spdlog
-    - stow
-    - tensorflow-lite
-    - valgrind
-    - xrootd
+  - acts
+  - actsvg
+  - afterburner
+  - algorithms
+  - cairo
+  - catch2
+  - cernlib
+  - cli11
+  - cmake
+  - cnpy
+  - cppcoro
+  - dawn
+  - dawncut
+  - dd4hep +ddeve
+  - dpmjet
+  - east
+  - edm4eic
+  - edm4hep
+  - eic-smear
+  - eigen
+  - emacs
+  - fastjet
+  - fjcontrib
+  - fmt
+  - gaudi
+  - gdb
+  - geant4
+  - graphviz
+  - hepmc3
+  - heppdt
+  - imagemagick
+  - irt
+  - iwyu
+  - jana2
+  - lcov
+  - lhapdf
+  - madx
+  - npsim
+  - onnx
+  - opencascade
+  - osg-ca-certs
+  - phonebook-cli
+  - prmon
+  - pythia8
+  - py-awkward
+  - py-bokeh
+  - py-boto3
+  - py-dask
+  - py-deepdiff
+  - py-epic-capybara
+  - py-ipython
+  - py-jinja2
+  - py-jinja2-cli
+  - py-jupyter-console
+  - py-jupyterlab
+  - py-lmfit
+  - py-lxml
+  - py-matplotlib
+  - py-mplhep
+  - py-htgettoken
+  - py-numpy
+  - py-pandas
+  - py-pip
+  - py-pre-commit
+  - py-pycairo
+  - py-pyyaml
+  - py-scipy
+  - py-seaborn
+  - py-toml
+  - py-uproot
+  - py-wurlitzer
+  - py-yapf
+  - root
+  - snakemake
+  - spdlog
+  - stow
+  - tensorflow-lite
+  - valgrind
+  - xrootd
   view: false
diff --git a/spack-environment/packages.yaml b/spack-environment/packages.yaml
index 5cd62a81139968afe1b8ee8be2d3c528c21d9012..7626bd60936d3a5be6eefeafe743ead34d0d62ff 100644
--- a/spack-environment/packages.yaml
+++ b/spack-environment/packages.yaml
@@ -33,6 +33,9 @@ packages:
   algorithms:
     require:
     - '@git.a1e6f0def343c2ddea5df7158c52a30376099a13'
+  blas:
+    require:
+    - openblas
   cairo:
     require:
     - '@1.16.0'
@@ -54,7 +57,7 @@ packages:
     - '@2.3.2'
   cmake:
     require:
-    - '@3.26.3'
+    - '@3.27.7'
   cnpy:
     require:
     - '@master'
@@ -101,6 +104,9 @@ packages:
   fjcontrib:
     require:
     - '@1.051'
+  flame:
+    require:
+    - libflame
   fmt:
     require:
     - '@9.1.0'
@@ -135,7 +141,7 @@ packages:
     - '@2.06.01'
   imagemagick:
     require:
-    - '@7.0.8-7'
+    - '@7.1.1-11'
   intel-tbb:
     require:
     - '@2020.3'
@@ -152,6 +158,9 @@ packages:
   juggler:
     require:
     - cxxstd=20
+  lapack:
+    require:
+    - openblas
   lcov:
     require:
     - '@1.16'
@@ -191,6 +200,10 @@ packages:
   osg-ca-certs:
     require:
     - '@1.109.igtf.1.117'
+  pcre:
+    require:
+    - build_system=cmake
+    - cflags=-fPIC cxxflags=-fPIC 
   phonebook-cli:
     require:
     - '@1.0.0'
@@ -208,7 +221,7 @@ packages:
     - +fastjet +root
   python:
     require:
-    - '@3.10.10'
+    - '@3.11.6'
   py-awkward:
     require:
     - '@2.1.1'
@@ -265,7 +278,7 @@ packages:
     - '@1.5.3'
   py-pip:
     require:
-    - '@23.0'
+    - '@23.1.2'
   py-pre-commit:
     require:
     - '@2.20.0'
@@ -300,7 +313,7 @@ packages:
   root:
     require:
     - '@6.28.06'
-    - cxxstd=20 +fftw +fortran +gdml +http -ipo +mlp +root7 +tmva +vc +xrootd +ssl
+    - cxxstd=20 +fftw +fortran +gdml +http -ipo +mlp +python +root7 +tmva +vc +xrootd +ssl
     - any_of: [+opengl +webgui +x, -opengl -webgui -x]
   snakemake:
     require:
@@ -324,3 +337,9 @@ packages:
     require:
     - '@5.5.5'
     - cxxstd=20 -davix +python +scitokens-cpp
+  zlib-api:
+    require:
+    - zlib-ng
+  zlib-ng:
+    require:
+    - '@2.1.4'
diff --git a/spack-environment/prod/spack.yaml b/spack-environment/prod/spack.yaml
index 7d605e13b4366974cdda024940373ee4084f2b10..3f05ab1b4fc24dc4faf8c85edd1997749d87c85b 100644
--- a/spack-environment/prod/spack.yaml
+++ b/spack-environment/prod/spack.yaml
@@ -5,23 +5,23 @@ spack:
   config:
     install_missing_compilers: false
   specs:
-    - acts
-    - cmake
-    - dd4hep -ddeve
-    - edm4eic
-    - fastjet
-    - fjcontrib
-    - gaudi
-    - geant4 -opengl
-    - hepmc3
-    - intel-tbb
-    - irt
-    - jana2
-    - npsim -geocad
-    - py-boto3
-    - py-jinja2
-    - py-jinja2-cli
-    - py-pip
-    - root -opengl
-    - xrootd
+  - acts
+  - cmake
+  - dd4hep -ddeve
+  - edm4eic
+  - fastjet
+  - fjcontrib
+  - gaudi
+  - geant4 -opengl
+  - hepmc3
+  - intel-tbb
+  - irt
+  - jana2
+  - npsim -geocad
+  - py-boto3
+  - py-jinja2
+  - py-jinja2-cli
+  - py-pip
+  - root -opengl
+  - xrootd
   view: false
diff --git a/spack.sh b/spack.sh
index 9e46b3cf396414c7626bc682604169a23b74bf5f..411c680550d9bf858fce116d029d242afebbcaf6 100644
--- a/spack.sh
+++ b/spack.sh
@@ -3,125 +3,31 @@ SPACK_ORGREPO="spack/spack"
 
 ## Spack github version, e.g. v0.18.1 or commit hash
 ## note: nightly builds will use e.g. releases/v0.19
-SPACK_VERSION="v0.20.1"
+SPACK_VERSION="v0.21.0"
 
 ## Space-separated list of spack cherry-picks
 read -r -d '' SPACK_CHERRYPICKS <<- \
 --- || true
-ef5d110d4abd2411d6bde82d738b205eb6672fe8
-9ee2d79de172de14477a78e5d407548a63eea33a
-776ab132760d63eab0703b7c0ebebc72a8443f5b
-188168c476eabe99764634db8d78eb3f9ea2a927
-b3268c2703b84f4e4961c1e2cdf43e8998f283e6
-4ae1a73d54b33bc4876535422d3f3bf3d9641c51
-9e4c4be3f523a0d144870dbf5645ad7bf0ff04be
-d8a9b42da6cdef3a08ec48931bf282e5e4811d38
-ce0b9ea8cf184c9048cac1ae88f2d69f0e4520c7
-ea1439dfa11a3996c9927ed792dc9fe4b7efc1b8
-5996aaa4e3b8b37f847da356489bb27958b968f1
-31431f967a59c07585021cba40683c2ca6ff2c47
-316bfd8b7d0d1bc63a7bccf030845775a442a317
-6e47f1645f31ce598d7f1f9770e24b483fb117d9
-63bb2c9bad8acb018f220630e5ce58e4a039d8a2
-ed76eab6943221f17776fd8d128ade6ba69e492c
-6c5d125cb06a86ce05bec27ae9fb9b07103bc1c5
-e3e7609af4903be7df42b6ae5ccf9a20293503d2
-df4a2457a41e7ab634e86d3148d8b22a9f433a6a
-53a45c820c983867e8b05cab3df34e98b468f932
-dca3d071d778cb7ca85166028acb5b866124157c
-c17fc3c0c1ecbebcfbf57214bf2724e26e6e1883
-ef4b35ea6361e83b243b375fc4e2a28cfc25bc8f
-36dd3251876895167270e26b14d16181895d6ace
-518da168331fd0e58c6c3a611b52507d1750b13a
-5ba4a2b83a0fabbfd221328a3c96955e9395b6ca
-eea743de461feca88fabf8c87e8fe617a368250c
-29835ac3437a7f975f7fdd22fac864b3273ff7d5
-581f45b63908dda8429b63c32047fd5295a95507
-cf031e83f0149cd2c43d04f877dc26cc9d9e7894
-dd747c5c4892fd0c8f6831786c2140198394cc4b
-aa9eb331080a3edeb876dd80552bb59243c69783
-f0658243c06119f6d0bf9bf72b162bb7be129344
-b25f8643ff6f28d9ca0c23d4eb46aadb840683cf
-c9e1e7d90c9880b158e29bf6e721065416d21b90
-537ab481670bad654225f488fb4ec92d25f148a8
-2a797f90b431d33f609dc1d92b2908f5734f4d50
-a9e78dc7d897c146b11a93fd8c0176d0e886f2b4
-6b51bfb713b7f9d6203b69ef79a198758c99de94
-b99288dcae9fd240a6d483d8b13940e52bfd8575
-3e2d1bd4133b437b10584a5e725d6fee8b5ca294
-f709518916ffe11588cffa3a5821c1e49e94b8d2
-6cd2241e49a393d7ac32b46064a2d2f4e53f7d86
-6f248836eafbee3b2c0612d250e201d3b3a57472
-5400b49ed6dc7001b1645b5d31bbcc7d830c15c2
-73ad3f729e8a5206d717d9d66468a19bb11d2940
-bd58801415dc0acebfd7368f66c43e50563a9891
-e1373d5408170047626583916db02911585c133a
-a65f13f79f617b6aa0b235aa5db612473b6d8c0e
 ed8ecc469e7b87842a876323878831e301f136a2
+53a45c820c983867e8b05cab3df34e98b468f932
 4991a60eacb5df289383f755e40702b720ed0513
-c485709f625429a88a184a099373d76c9438f8e3
-e91db7793038b4e7235c8ec7c82244afbb9dfc9e
 81e73b4dd4ea0bf6c6947359d3cee9d4270df13d
+c485709f625429a88a184a099373d76c9438f8e3
 6f08daf67020289e6a5ed1df9783ac5b2919e477
+50051b56199992eb4395b8ff22913c1995311a8c
+f01774f1d41781bc4b9e5abb5469e234168da663
+cfa2f19f48699a762af77ece8a9c5bc4db3a75d5
+2433f503b73bb515b2e1a7615ae01fea59d2290e
 ---
 ## Ref: https://github.com/spack/spack/commit/[hash]
 ## [hash]: [description]
-## ef5d110d4abd2411d6bde82d738b205eb6672fe8: Fix multiple quadratic complexity issues in environments
-## 9ee2d79de172de14477a78e5d407548a63eea33a: libxpm package: fix RHEL8 build with libintl
-## 776ab132760d63eab0703b7c0ebebc72a8443f5b: [xrootd] New variants, new version, improve build config
-## 188168c476eabe99764634db8d78eb3f9ea2a927: podio: Add 0.16.5 tag
-## b3268c2703b84f4e4961c1e2cdf43e8998f283e6: freetype: add pic and shared variants
-## 4ae1a73d54b33bc4876535422d3f3bf3d9641c51: (r-rcpp)ensmallen: new package
-## 9e4c4be3f523a0d144870dbf5645ad7bf0ff04be: mlpack: new package
-## d8a9b42da6cdef3a08ec48931bf282e5e4811d38: actsvg: add v0.4.33
-## ce0b9ea8cf184c9048cac1ae88f2d69f0e4520c7: acts: ensure Python_EXECUTABLE uses ^python when +python
-## ea1439dfa11a3996c9927ed792dc9fe4b7efc1b8: acts: new variant cxxstd
-## 5996aaa4e3b8b37f847da356489bb27958b968f1: acts: new versions 23.[3-5].0, 24.0.0, 25.0.[0-1], 26.0.0, 27.[0-1].0, 28.0.0
-## 31431f967a59c07585021cba40683c2ca6ff2c47: Environment/depfile: fix bug with Git hash versions
-## 316bfd8b7d0d1bc63a7bccf030845775a442a317: opencascade: new variants
-## 6e47f1645f31ce598d7f1f9770e24b483fb117d9: opencascade: typo in True
-## 63bb2c9bad8acb018f220630e5ce58e4a039d8a2: py-cryptography: does not run-depend on py-setuptools-rust
-## ed76eab6943221f17776fd8d128ade6ba69e492c: geant4: new version 11.1.2
-## 6c5d125cb06a86ce05bec27ae9fb9b07103bc1c5: cernlib: new variant shared
-## e3e7609af4903be7df42b6ae5ccf9a20293503d2: edm4hep: Add version 0.9
-## df4a2457a41e7ab634e86d3148d8b22a9f433a6a: Fix broken semver regex
-## 53a45c820c983867e8b05cab3df34e98b468f932: docker entrypoint.sh: fail multi-line RUN on first error with set -e
-## dca3d071d778cb7ca85166028acb5b866124157c: gaudi: fix issue with fmt::format
-## c17fc3c0c1ecbebcfbf57214bf2724e26e6e1883: gaudi: add gaudi to LD_LIBRARY_PATH
-## ef4b35ea6361e83b243b375fc4e2a28cfc25bc8f: gaudi: remove the py-qmtest dependency
-## 36dd3251876895167270e26b14d16181895d6ace: gaudi: new versions 36.[11-14]
-## // e51748ee8f89e0d3db4e426e3d04157129a45622: zlib-api: new virtual with zlib/zlib-ng as providers
-## 518da168331fd0e58c6c3a611b52507d1750b13a: Gaudi: Add a few versions and a dependency on tbb after 37.1
-## 5ba4a2b83a0fabbfd221328a3c96955e9395b6ca: podio: bump minimal version of catch2
-## eea743de461feca88fabf8c87e8fe617a368250c: podio: Add py-tabulate as new run and test dependency
-## 29835ac3437a7f975f7fdd22fac864b3273ff7d5: podio: add 0.16.6 tag and mark older releases as deprecated
-## 581f45b63908dda8429b63c32047fd5295a95507: podio: Add latest tags and variants and update dependencies accordingly
-## cf031e83f0149cd2c43d04f877dc26cc9d9e7894: compilers/gcc.py: support cxx{20,23}_flag
-## dd747c5c4892fd0c8f6831786c2140198394cc4b: xerces-c: support variant cxxstd=20
-## aa9eb331080a3edeb876dd80552bb59243c69783: boost: support variant cxxstd=20
-## f0658243c06119f6d0bf9bf72b162bb7be129344: clhep: support variant cxxstd=20
-## b25f8643ff6f28d9ca0c23d4eb46aadb840683cf: geant4, vecgeom: support variant cxxstd=20
-## c9e1e7d90c9880b158e29bf6e721065416d21b90: acts: impose cxxstd variant on geant4 dependency
-## 537ab481670bad654225f488fb4ec92d25f148a8: acts: use f-strings
-## 2a797f90b431d33f609dc1d92b2908f5734f4d50: acts: add v28.1.0:30.3.2
-## a9e78dc7d897c146b11a93fd8c0176d0e886f2b4: acts: new variant +binaries when +examples
-## 6b51bfb713b7f9d6203b69ef79a198758c99de94: edm4hep: Add tag for version 0.10 and deprecate older versions
-## b99288dcae9fd240a6d483d8b13940e52bfd8575: edm4hep: add edm4hep to PYTHONPATH
-## 3e2d1bd4133b437b10584a5e725d6fee8b5ca294: lcio: Add latest version 2.20
-## f709518916ffe11588cffa3a5821c1e49e94b8d2: podio, edm4hep and lcio: add lib and lib64 to LD_LIBRARY_PATH
-## 6cd2241e49a393d7ac32b46064a2d2f4e53f7d86: edm4hep: Add 0.10.1 tag and update maintainers
-## 6f248836eafbee3b2c0612d250e201d3b3a57472: dd4hep: restrict podio versions
-## 5400b49ed6dc7001b1645b5d31bbcc7d830c15c2: dd4hep: add LD_LIBRARY_PATH for plugins for Gaudi
-## 73ad3f729e8a5206d717d9d66468a19bb11d2940: dd4hep: add patch to fix missing hits when using LCIO
-## bd58801415dc0acebfd7368f66c43e50563a9891: dd4hep: fix setting LD_LIBRARY_PATH
-## // Following disabled due to https://github.com/spack/spack/pull/37372
-## // c7cca3aa8d11789eaee9bfc80b8417ffea511532: dd4hep: new version 1.26
-## e1373d5408170047626583916db02911585c133a: dd4hep: make sure to find libraries correctly
-## // a095c8113d5065bcb3d529269bc1de268df6791f: dd4hep: Add tag for version 1.27
-## a65f13f79f617b6aa0b235aa5db612473b6d8c0e: root: add latest available tag
 ## ed8ecc469e7b87842a876323878831e301f136a2: podio: Add the latest tag (0.17.2)
+## 53a45c820c983867e8b05cab3df34e98b468f932: docker entrypoint.sh: fail multi-line RUN on first error with set -e
 ## 4991a60eacb5df289383f755e40702b720ed0513: podio: Add latest tag 0.17.3
-## c485709f625429a88a184a099373d76c9438f8e3: iwyu: new versions up 0.21 (depends_on llvm-17)
-## e91db7793038b4e7235c8ec7c82244afbb9dfc9e: root: Add package name to all conflict messages
 ## 81e73b4dd4ea0bf6c6947359d3cee9d4270df13d: root: new version 6.30.00
+## c485709f625429a88a184a099373d76c9438f8e3: iwyu: new versions up 0.21 (depends_on llvm-17)
 ## 6f08daf67020289e6a5ed1df9783ac5b2919e477: root: add a webgui patch
+## 50051b56199992eb4395b8ff22913c1995311a8c: geant4: new version 11.1.3
+## f01774f1d41781bc4b9e5abb5469e234168da663: hepmc3: fix from_variant -> self.define
+## cfa2f19f48699a762af77ece8a9c5bc4db3a75d5: py-htgettoken: use os.environ, avoid AttributeError
+## 2433f503b73bb515b2e1a7615ae01fea59d2290e: py-htgettoken: allow for undefined variables