diff --git a/.devcontainer/debian/bookworm/Dockerfile b/.devcontainer/debian/bookworm/Dockerfile
deleted file mode 100644
index 9ef0182..0000000
--- a/.devcontainer/debian/bookworm/Dockerfile
+++ /dev/null
@@ -1,656 +0,0 @@
-# SPDX-FileCopyrightText: 2023-2025 Jens A. Koch
-# SPDX-License-Identifier: MIT
-# This file is part of https://github.com/jakoch/cpp-devbox
-
-#
-#
-#   .d8888b.                        8888888b.                    888888b.
-#  d88P  Y88b                       888  "Y88b                   888  "88b
-#  888    888                       888    888                   888  .88P
-#  888          888     888         888    888  .d88b.  888  888 8888888K.   .d88b.  888  888
-#  888        8888888 8888888       888    888 d8P  Y8b 888  888 888  "Y88b d88""88b `Y8bd8P'
-#  888    888   888     888         888    888 88888888 Y88  88P 888    888 888  888   X88K
-#  Y88b  d88P                       888  .d88P Y8b.      Y8bd8P  888   d88P Y88..88P .d8""8b.
-#   "Y8888P"                        8888888P"   "Y8888    Y88P   8888888P"   "Y88P"  888  888
-#
-#
-
-# /===========================================================================\
-# | Debian Bookworm                                                           |
-# |===========================================================================|
-# |                                                                           |
-# | Package Versions                                            (os upstream) |
-# |                                                                           |
-# | LLVM:   https://packages.debian.org/bookworm/llvm                14.0     |
-# | GCC:    https://packages.debian.org/bookworm/gcc                 12.2.0   |
-# | Vulkan: https://packages.debian.org/bookworm/libvulkan-dev       1.3.239.0|
-# | MESA:   https://packages.debian.org/bookworm/mesa-vulkan-drivers 22.3.6   |
-# |                                                                           |
-# \===========================================================================/
-
-# +-----------------------------+
-# | GLOBAL ARGS                 |
-# +-----------------------------+
-# The following global args need to be redeclared without a value inside each FROM section.
-# For example, VULKAN_VERSION is used in the FROM sections of "downloader" and "cpp-devbox-with-vulkansdk".
-# The value is set in the build command, e.g. --build-arg VULKAN_VERSION=1.3.296.0
-
-ARG DEBIAN_VERSION=12
-ARG DEBIAN_VERSION_NAME=bookworm
-ARG GCC_VERSION=13.4.0
-ARG LLVM_VERSION=20
-ARG VULKAN_VERSION=1.4.321.1
-ARG MESA_VERSION=22.3.6
-
-# +-----------------------------+
-# | Downloader                  |
-# +-----------------------------+
-# Download Stage is for caching:
-# - /tmp/gcc.xz
-# - /tmp/vulkansdk.xz
-
-FROM debian:bookworm-slim AS downloader
-
-# Reuse global arguments
-ARG GCC_VERSION
-ARG VULKAN_VERSION
-
-ENV DEBIAN_FRONTEND=noninteractive \
-    DEBCONF_NOWARNINGS="yes" \
-    CURL_OPTIONS="--silent --show-error --retry 5 --location"
-
-WORKDIR /tmp
-RUN echo "Download Stage" && \
-    apt-get update && apt-get install --no-install-recommends --assume-yes \
-    ca-certificates curl jq && \
-    curl $CURL_OPTIONS -o gcc.xz "http://ftp.gnu.org/gnu/gcc/gcc-${GCC_VERSION}/gcc-${GCC_VERSION}.tar.xz" && \
-    curl $CURL_OPTIONS -o vulkansdk.xz "https://sdk.lunarg.com/sdk/download/${VULKAN_VERSION}/linux/vulkansdk-linux-x86_64-${VULKAN_VERSION}.tar.xz" && \
-	# Cleanup
-	apt-get autoremove -y && \
-    apt-get clean autoclean && \
-    rm -rf /var/lib/apt/lists/* && \
-    # List downloaded files
-    ls -la /tmp
-
-# +-----------------------------+
-# | BASE IMAGE                  |        See https://hub.docker.com/_/debian
-# +-----------------------------+
-
-FROM debian:bookworm-slim AS cpp-devbox-base
-
-# +-----------------------------+
-# | REUSE GLOBAL ARGS           |
-# +-----------------------------+
-
-ARG DEBIAN_VERSION
-ARG DEBIAN_VERSION_NAME
-ARG GCC_VERSION
-ARG LLVM_VERSION
-
-# +-----------------------------+
-# | METADATA                    |
-# +-----------------------------+
-# Standardized Docker Image Labels
-# https://github.com/opencontainers/image-spec/blob/main/annotations.md
-
-LABEL \
-    maintainer="Jens A. Koch <jakoch@web.de>" \
-    org.opencontainers.image.created="$(date --utc --iso-8601=seconds)" \
-    org.opencontainers.image.authors='Jens A. Koch <jakoch@web.de>' \
-    org.opencontainers.image.url='https://ghcr.io/jakoch/cpp-devbox' \
-    org.opencontainers.image.source='https://github.com/jakoch/cpp-devbox'\
-    org.opencontainers.image.title='ghcr.io/jakoch/cpp-devbox'\
-    org.opencontainers.image.description="C++ DevBox (Debian ${DEBIAN_VERSION}-${DEBIAN_VERSION_NAME} with LLVM ${LLVM_VERSION%%.*} & GCC ${GCC_VERSION%%.*}, CMake, VCPKG, zsh)" \
-    org.opencontainers.image.licenses=MIT
-
-
-#
-#  8888888b.                    888
-#  888   Y88b                   888
-#  888    888                   888
-#  888   d88P  8888b.   .d8888b 888  888  8888b.   .d88b.   .d88b.  .d8888b
-#  8888888P"      "88b d88P"    888 .88P     "88b d88P"88b d8P  Y8b 88K
-#  888        .d888888 888      888888K  .d888888 888  888 88888888 "Y8888b.
-#  888        888  888 Y88b.    888 "88b 888  888 Y88b 888 Y8b.          X88
-#  888        "Y888888  "Y8888P 888  888 "Y888888  "Y88888  "Y8888   88888P'
-#                                                      888
-#                                                 Y8b d88P
-#                                                  "Y88P"
-
-ENV DEBIAN_FRONTEND=noninteractive \
-    DEBCONF_NOWARNINGS="yes" \
-    CURL_OPTIONS="--silent --show-error --retry 5 --location"
-
-RUN echo "Packages" && \
-    apt-get update && apt-get install --no-install-recommends --assume-yes \
-    gnupg2 ca-certificates software-properties-common \
-    build-essential \
-    wget git nano jq \
-    # code analysis
-    cppcheck \
-    valgrind \
-    # profiling
-    # gprof (is part of binutils and already installed)
-    linux-perf \
-    # code coverage (gcov is part of GCC)
-    gcovr lcov \
-    # tracing
-    strace ltrace \
-    # asm
-    nasm fasm \
-    # build tools
-    meson \
-    # required by Visual Studio
-    g++ gdb make ninja-build rsync zip sudo \
-    # required by VCPKG + optional downloader
-    openssh-server tar curl unzip pkg-config bash-completion aria2 \
-    # required by LLVM
-    lsb-release zlib1g-dev \
-    # locale
-    locales \
-    # shell
-    zsh \
-    # optional tools for Doxygen: Sphinx + Graphviz
-    python3 python3-pip \
-    python3-sphinx python3-sphinx-rtd-theme python3-defusedxml sphinx-common \
-    graphviz && \
-	# Cleanup
-	apt-get autoremove -y && \
-    apt-get clean autoclean && \
-    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
-
-#
-#   .d8888b.  d8b 888    888               888             .d8888b.  888      8888888
-#  d88P  Y88b Y8P 888    888               888            d88P  Y88b 888        888
-#  888    888     888    888               888            888    888 888        888
-#  888        888 888888 88888b.  888  888 88888b.        888        888        888
-#  888  88888 888 888    888 "88b 888  888 888 "88b       888        888        888
-#  888    888 888 888    888  888 888  888 888  888       888    888 888        888
-#  Y88b  d88P 888 Y88b.  888  888 Y88b 888 888 d88P       Y88b  d88P 888        888
-#   "Y8888P88 888  "Y888 888  888  "Y88888 88888P"         "Y8888P"  88888888 8888888
-#
-
-# Website: https://cli.github.com/
-# Installation Instructions: https://github.com/cli/cli/blob/trunk/docs/install_linux.md#official-sources
-
-SHELL ["/bin/bash", "-o", "pipefail", "-c"]
-RUN echo "GITHUB CLI" && \
-    curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg && \
-    chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg && \
-    echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | tee /etc/apt/sources.list.d/github-cli.list > /dev/null && \
-    apt-get update && apt-get install --no-install-recommends --assume-yes \
-    gh && \
-    # Cleanup
-    apt-get autoremove -y && \
-    apt-get clean autoclean && \
-    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
-
-#
-#   .d8888b.  888b     d888          888
-#  d88P  Y88b 8888b   d8888          888
-#  888    888 88888b.d88888          888
-#  888        888Y88888P888  8888b.  888  888  .d88b.
-#  888        888 Y888P 888     "88b 888 .88P d8P  Y8b
-#  888    888 888  Y8P  888 .d888888 888888K  88888888
-#  Y88b  d88P 888   "   888 888  888 888 "88b Y8b.
-#   "Y8888P"  888       888 "Y888888 888  888  "Y8888
-#
-
-# Latest Release: https://github.com/Kitware/CMake/releases/latest
-
-SHELL ["/bin/bash", "-o", "pipefail", "-c"]
-RUN echo "CMake" && \
-    version="$(curl -s https://api.github.com/repos/Kitware/CMake/releases/latest | jq -r '.tag_name' | cut -c 2-)"; echo "Latest Version: \"$version\"" && \
-    url="https://github.com/Kitware/CMake/releases/download/v$version/cmake-$version-linux-x86_64.sh"; echo "Download URL: \"$url\"" && \
-    curl $CURL_OPTIONS -O $url && \
-    mkdir /opt/cmake && \
-    sh cmake-$version-linux-x86_64.sh --prefix=/opt/cmake --skip-license && \
-    ln -sF /opt/cmake/bin/cmake /usr/bin/cmake && \
-    ln -sF /opt/cmake/bin/ccmake /usr/bin/ccmake && \
-    ln -sF /opt/cmake/bin/cmake-gui /usr/bin/cmake-gui && \
-    ln -sF /opt/cmake/bin/cpack /usr/bin/cpack && \
-    ln -sF /opt/cmake/bin/ctest /usr/bin/ctest && \
-    rm -rf cmake-$version-linux-x86_64.sh
-
-#
-#  888     888  .d8888b.  8888888b.  888    d8P   .d8888b.
-#  888     888 d88P  Y88b 888   Y88b 888   d8P   d88P  Y88b
-#  888     888 888    888 888    888 888  d8P    888    888
-#  Y88b   d88P 888        888   d88P 888d88K     888
-#   Y88b d88P  888        8888888P"  8888888b    888  88888
-#    Y88o88P   888    888 888        888  Y88b   888    888
-#     Y888P    Y88b  d88P 888        888   Y88b  Y88b  d88P
-#      Y8P      "Y8888P"  888        888    Y88b  "Y8888P88
-#
-
-# vcpkg requires curl, unzip, tar, pkg-config (optional cmake).
-# We use the installed binaries from the system.
-# We do not download latest version of CMake and Ninja during vcpkg bootstrap.
-
-ENV VCPKG_ROOT=/opt/vcpkg \
-    VCPKG_TRIPLET=x64-linux \
-    VCPKG_FORCE_SYSTEM_BINARIES=1 \
-    VCPKG_USE_SYSTEM_BINARIES=1
-ENV PATH="${PATH}:${VCPKG_ROOT}"
-
-SHELL ["/bin/bash", "-o", "pipefail", "-c"]
-RUN echo "VCPKG" && \
-    git clone --depth=1 --no-tags \
-    -c core.eol=lf \
-    -c core.autocrlf=false \
-    -c fsck.zeroPaddedFilemode=ignore \
-    -c fetch.fsck.zeroPaddedFilemode=ignore \
-    -c receive.fsck.zeroPaddedFilemode=ignore \
-    https://github.com/microsoft/vcpkg "${VCPKG_ROOT}" && \
-    "${VCPKG_ROOT}"/bootstrap-vcpkg.sh -disableMetrics
-
-#
-#   .d8888b.   .d8888b.         d8888  .d8888b.  888    888 8888888888
-#  d88P  Y88b d88P  Y88b       d88888 d88P  Y88b 888    888 888
-#  888    888 888    888      d88P888 888    888 888    888 888
-#  888        888            d88P 888 888        8888888888 8888888
-#  888        888           d88P  888 888        888    888 888
-#  888    888 888    888   d88P   888 888    888 888    888 888
-#  Y88b  d88P Y88b  d88P  d8888888888 Y88b  d88P 888    888 888
-#   "Y8888P"   "Y8888P"  d88P     888  "Y8888P"  888    888 8888888888
-#
-
-SHELL ["/bin/bash", "-o", "pipefail", "-c"]
-RUN echo "CCACHE" && \
-    version="$(curl -s https://api.github.com/repos/ccache/ccache/releases/latest | jq -r '.tag_name' | cut -c 2-)"; echo "Latest Version: \"$version\"" && \
-    url="https://github.com/ccache/ccache/releases/download/v$version/ccache-$version-linux-x86_64.tar.xz"; echo "Download URL: \"$url\"" && \
-    curl $CURL_OPTIONS -sLO $url && \
-    mkdir -p /opt/ccache/bin &&\
-    tar xf ccache-$version-linux-x86_64.tar.xz --strip-components=1 -C /opt/ccache/bin && \
-	ln -s /opt/ccache/bin/ccache /usr/bin && \
-	rm ccache-$version-linux-x86_64.tar.xz
-
-#
-#  8888888b.   .d88888b.  Y88b   d88P Y88b   d88P  .d8888b.  8888888888 888b    888
-#  888  "Y88b d88P" "Y88b  Y88b d88P   Y88b d88P  d88P  Y88b 888        8888b   888
-#  888    888 888     888   Y88o88P     Y88o88P   888    888 888        88888b  888
-#  888    888 888     888    Y888P       Y888P    888        8888888    888Y88b 888
-#  888    888 888     888    d888b        888     888  88888 888        888 Y88b888
-#  888    888 888     888   d88888b       888     888    888 888        888  Y88888
-#  888  .d88P Y88b. .d88P  d88P Y88b      888     Y88b  d88P 888        888   Y8888
-#  8888888P"   "Y88888P"  d88P   Y88b     888      "Y8888P88 8888888888 888    Y888
-#
-
-# +-----------------------------+
-# | Doxygen - Latest Version    |
-# +-----------------------------+
-# We are using the prebuilt binaries for x64.
-
-SHELL ["/bin/bash", "-o", "pipefail", "-c"]
-RUN echo "DOXYGEN" && \
-    version_string="$(curl -s https://api.github.com/repos/doxygen/doxygen/releases/latest | jq -r '.tag_name')"; echo "Latest Version: \"$version_string\"" && \
-    version_number="$(echo $version_string | cut -c 9- | sed 's/_/./g')" && \
-    url="https://github.com/doxygen/doxygen/releases/download/$version_string/doxygen-$version_number.linux.bin.tar.gz"; echo "Download URL: \"$url\"" && \
-    curl $CURL_OPTIONS -O $url && \
-    mkdir /opt/doxygen && \
-    tar xf doxygen-$version_number.linux.bin.tar.gz --strip-components=1 -C /opt/doxygen && \
-	ln -s /opt/doxygen/bin/doxygen /usr/bin && \
-	rm doxygen-$version_number.linux.bin.tar.gz
-
-#
-#  888      888      888     888 888b     d888
-#  888      888      888     888 8888b   d8888
-#  888      888      888     888 88888b.d88888
-#  888      888      Y88b   d88P 888Y88888P888
-#  888      888       Y88b d88P  888 Y888P 888
-#  888      888        Y88o88P   888  Y8P  888
-#  888      888         Y888P    888   "   888
-#  88888888 88888888     Y8P     888       888
-#
-
-# +-----------------------------+
-# | LLVM                        |
-# +-----------------------------+
-# For an installation using the llvm.sh setup script:
-# RUN curl -sLO https://apt.llvm.org/llvm.sh && chmod +x llvm.sh && ./llvm.sh ${LLVM_VERSION} all && rm ./llvm.sh
-
-SHELL ["/bin/bash", "-o", "pipefail", "-c"]
-RUN echo "LLVM" && \
-    curl -s https://apt.llvm.org/llvm-snapshot.gpg.key | tee /etc/apt/trusted.gpg.d/apt.llvm.org.asc && \
-    add-apt-repository -y "deb http://apt.llvm.org/$DEBIAN_VERSION_NAME/ llvm-toolchain-$DEBIAN_VERSION_NAME-$LLVM_VERSION main" && \
-    apt-get update && apt-get install --no-install-recommends --assume-yes \
-    clang-$LLVM_VERSION \
-    clangd-$LLVM_VERSION \
-    clang-tidy-$LLVM_VERSION \
-    clang-format-$LLVM_VERSION \
-    clang-tools-$LLVM_VERSION \
-    llvm-$LLVM_VERSION-dev \
-    llvm-$LLVM_VERSION-runtime \
-    llvm-$LLVM_VERSION-tools \
-    lld-$LLVM_VERSION \
-    lldb-$LLVM_VERSION \
-    libomp-$LLVM_VERSION-dev \
-    libc++-$LLVM_VERSION-dev \
-    libc++abi-$LLVM_VERSION-dev \
-    libclang-rt-$LLVM_VERSION-dev \
-    libclang-common-$LLVM_VERSION-dev \
-    libclang-$LLVM_VERSION-dev \
-    libclang-cpp$LLVM_VERSION-dev \
-    libfuzzer-$LLVM_VERSION-dev \
-    libunwind-$LLVM_VERSION-dev \
-    libclang-rt-$LLVM_VERSION-dev \
-    libpolly-$LLVM_VERSION-dev && \
-	# Cleanup
-	apt-get autoremove -y && \
-    apt-get clean autoclean && \
-    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
-
-# add llvm to path
-ENV PATH="/usr/lib/llvm-${LLVM_VERSION}/bin:/usr/lib/llvm-${LLVM_VERSION}/include:${PATH}"
-
-# first set LD_LIBRARY_PATH (Debian doesn't set LD_LIBRARY_PATH by default.) and then add LLVM lib folder
-ENV LD_LIBRARY_PATH="/usr/lib:/usr/local/lib"
-ENV LD_LIBRARY_PATH="/usr/lib/llvm-${LLVM_VERSION}/lib:${LD_LIBRARY_PATH:-}"
-
-# remove version from binaries
-RUN echo "LLVM symlink binaries" && \
-    ln -s /usr/bin/clang-${LLVM_VERSION} /usr/bin/clang && \
-    ln -s /usr/bin/clang++-${LLVM_VERSION} /usr/bin/clang++ && \
-    ln -s /usr/bin/clang-format-${LLVM_VERSION} /usr/bin/clang-format
-
-# update compiler environment vars
-ENV CC=/usr/bin/clang \
-    CXX=/usr/bin/clang++
-
-# update alternatives
-RUN echo "LLVM udate-alternatives" && \
-    update-alternatives --install /usr/bin/cc cc /usr/bin/clang 100 && \
-    update-alternatives --install /usr/bin/c++ c++ /usr/bin/clang++ 100
-
-#
-#  888b     d888          888      888
-#  8888b   d8888          888      888
-#  88888b.d88888          888      888
-#  888Y88888P888  .d88b.  888  .d88888
-#  888 Y888P 888 d88""88b 888 d88" 888
-#  888  Y8P  888 888  888 888 888  888
-#  888   "   888 Y88..88P 888 Y88b 888
-#  888       888  "Y88P"  888  "Y88888
-#
-
-# We are using Clang++ for compilation, so this download + compile step must happen after installing LLVM+Clang.
-# We don't need to call mold's ./install-build-deps.sh, because all build dependencies are present.
-# Note to overwrite ld: sudo ln -sf /opt/mold/bin/mold $(realpath /usr/bin/ld)
-
-SHELL ["/bin/bash", "-o", "pipefail", "-c"]
-RUN echo "MOLD" && \
-    version="$(curl -s https://api.github.com/repos/rui314/mold/releases/latest | jq -r '.tag_name' | cut -c 2-)"; echo "Latest Version: \"$version\"" && \
-    git clone --branch "v$version" --single-branch --depth 1 --no-tags https://github.com/rui314/mold.git "/tmp/mold" && \
-    cmake -S /tmp/mold -B /tmp/mold/build -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=clang++ && \
-    cmake --build /tmp/mold/build -j "$(nproc)" && \
-    cmake --install /tmp/mold/build --prefix=/opt/mold && \
-    ln -s /opt/mold/bin/mold /usr/bin && \
-    rm -rf /tmp/mold
-
-#
-#   .d8888b.   .d8888b.   .d8888b.
-#  d88P  Y88b d88P  Y88b d88P  Y88b
-#  888    888 888    888 888    888
-#  888        888        888
-#  888  88888 888        888
-#  888    888 888    888 888    888
-#  Y88b  d88P Y88b  d88P Y88b  d88P
-#   "Y8888P88  "Y8888P"   "Y8888P"
-#
-
-# +-----------------------------+
-# | GCC                         |
-# +-----------------------------+
-
-COPY --from=downloader /tmp/gcc.xz /tmp/gcc.xz
-RUN echo "GCC - Extract" && \
-    tar xf /tmp/gcc.xz && rm /tmp/gcc.xz && \
-    apt-get update && apt-get install --no-install-recommends --assume-yes \
-    libmpfr-dev libgmp3-dev libmpc-dev
-
-# set default compiler to gcc
-ENV CC=/usr/bin/gcc \
-    CXX=/usr/bin/g++
-
-# installing into /usr instead of /usr/local to have consistent paths in CMakePresets:
-# /usr/bin/g++-12
-# /usr/bin/g++-13
-WORKDIR /gcc-${GCC_VERSION}
-
-SHELL ["/bin/bash", "-o", "pipefail", "-c"]
-
-# https://gcc.gnu.org/install/configure.html
-RUN echo "GCC - Compile" && \
-    ./configure \
-    --libdir=/usr/lib \
-    --libexecdir=/usr/lib \
-    --prefix=/usr \
-    --program-suffix=-13 \
-    --build=x86_64-linux-gnu \
-    --host=x86_64-linux-gnu \
-    --target=x86_64-linux-gnu \
-    --disable-multilib \
-    --disable-libquadmath \
-    --disable-vtable-verify \
-    --disable-werror \
-    --enable-cet \
-    --enable-lto \
-    --enable-checking=release \
-    --enable-clocale=gnu \
-    --enable-default-pie \
-    --enable-gnu-unique-object \
-    --enable-languages=c,c++ \
-    --enable-libstdcxx-debug \
-    --enable-libstdcxx-time=yes \
-    --enable-linker-build-id \
-    --enable-nls \
-    --enable-multiarch \
-    --enable-plugin \
-    --enable-shared \
-    --enable-shared-libgcc \
-    --enable-static \
-    --enable-threads=posix \
-    --enable-libsanitizer \
-    --without-included-gettext \
-    --without-cuda-driver \
-    --with-arch-32=i686 \
-    --with-abi=m64 \
-    --with-tune=generic \
-    --with-default-libstdcxx-abi=new \
-    --with-gcc-major-version-only \
-    --with-system-zlib && \
-    make -s -j"$(nproc)" all-gcc > /dev/null 2>&1 && \
-    make -s -j"$(nproc)" all-target-libgcc > /dev/null 2>&1 && \
-    make -s -j"$(nproc)" all-target-libsanitizer > /dev/null 2>&1 && \
-    make -s -j"$(nproc)" all-target-libatomic > /dev/null 2>&1 && \
-    make install-gcc && \
-    make install-target-libgcc && \
-    make install-target-libsanitizer && \
-    make install-target-libatomic
-
-# return from /gcc-x.y.z folder
-WORKDIR /
-
-# remove gcc source folder and dependencies
-RUN echo "GCC - Cleanup" && \
-    rm -rf gcc-${GCC_VERSION} && \
-    # Cleanup
-    apt-get autoremove -y libmpfr-dev libgmp3-dev libmpc-dev && \
-    apt-get clean autoclean && \
-    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
-
-# reset default compiler to clang
-ENV CC=/usr/bin/clang \
-    CXX=/usr/bin/clang++ \
-    # add gcc libs to library paths
-    # TODO why is this installed into /usr/lib64?
-    LD_LIBRARY_PATH="/usr/lib64${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
-
-#
-#  8888888888P  .d8888b.  888    888
-#        d88P  d88P  Y88b 888    888
-#       d88P   Y88b.      888    888
-#      d88P     "Y888b.   8888888888
-#     d88P         "Y88b. 888    888
-#    d88P            "888 888    888
-#   d88P       Y88b  d88P 888    888
-#  d8888888888  "Y8888P"  888    888
-#
-
-# +-----------------------------+
-# | ZSH                         |
-# +-----------------------------+
-# Setup zsh, ohmyzsh, powerline fonts.
-# Setup zsh plugins: autosuggestions, autocompletions, history search.
-
-ENV TERM=xterm-256color \
-    ZSH_THEME=agnoster
-
-SHELL ["/bin/bash", "-o", "pipefail", "-c"]
-RUN echo "ZSH" && \
-    apt-get update && apt-get install --no-install-recommends --assume-yes \
-    # Install fonts-powerline
-    fontconfig fonts-powerline && \
-    # Install Oh My Zsh
-    curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh | sh && \
-    # Add Zsh plugins
-    git clone --depth=1 --no-tags https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions && \
-    git clone --depth=1 --no-tags https://github.com/zsh-users/zsh-completions ${ZSH_CUSTOM:=~/.oh-my-zsh/custom}/plugins/zsh-completions && \
-    git clone --depth=1 --no-tags https://github.com/zsh-users/zsh-history-substring-search ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-history-substring-search && \
-    # Update .zshrc
-    sed -i "s/plugins=(git)/plugins=(git zsh-completions zsh-autosuggestions zsh-history-substring-search)/" /root/.zshrc && \
-    sed -i "s/ZSH_THEME=\"agnoster\"/ZSH_THEME=\"robbyrussell\"/" /root/.zshrc  && \
-	# Cleanup
-	apt-get autoremove -y && \
-    apt-get clean autoclean && \
-    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
-
-# Set the default shell to zsh after it is installed
-ENV SHELL=/bin/zsh
-
-# +-----------------------------+
-# | CLEANUP                     |
-# +-----------------------------+
-
-RUN echo "CLeanup" && \
-    apt-get autoremove -y && \
-    apt-get clean autoclean && \
-    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
-
-# +-----------------------------+
-# | Set Locale + Timezone       |
-# +-----------------------------+
-
-# +-----------------------------+
-# | Set Locale + Timezone       |
-# +-----------------------------+
-
-ENV TZ=America/Los_Angeles
-
-RUN echo "Locale & Timezone" && \
-    ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && \
-    echo $TZ > /etc/timezone && \
-    dpkg-reconfigure -f noninteractive tzdata && \
-    sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && \
-    echo 'LANG="en_US.UTF-8"' > /etc/default/locale && \
-    dpkg-reconfigure -f noninteractive locales && \
-    update-locale LANG=en_US.UTF-8 && \
-    echo "export PATH=$PATH" > /etc/environment && \
-    localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8
-
-ENV LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 \
-    # Switch back to dialog for any ad-hoc use of apt-get
-    DEBIAN_FRONTEND=dialog
-
-# +----------------------------------+
-# | Stage: cpp-devbox-with-vulkansdk |
-# +----------------------------------+
-
-FROM cpp-devbox-base AS cpp-devbox-with-vulkansdk
-
-# Reuse global arguments
-ARG DEBIAN_VERSION
-ARG DEBIAN_VERSION_NAME
-ARG LLVM_VERSION
-ARG GCC_VERSION
-ARG VULKAN_VERSION
-ARG MESA_VERSION
-
-# +-----------------------------+
-# | METADATA                    |
-# +-----------------------------+
-# Standardized Docker Image Labels
-# https://github.com/opencontainers/image-spec/blob/main/annotations.md
-
-LABEL \
-    maintainer="Jens A. Koch <jakoch@web.de>" \
-    org.opencontainers.image.created="$(date --utc --iso-8601=seconds)" \
-    org.opencontainers.image.authors='Jens A. Koch <jakoch@web.de>' \
-    org.opencontainers.image.url='https://ghcr.io/jakoch/cpp-devbox' \
-    org.opencontainers.image.source='https://github.com/jakoch/cpp-devbox'\
-    org.opencontainers.image.title='ghcr.io/jakoch/cpp-devbox'\
-    org.opencontainers.image.description="C++ DevBox (Debian ${DEBIAN_VERSION}-${DEBIAN_VERSION_NAME} with LLVM ${LLVM_VERSION%%.*} & GCC ${GCC_VERSION%%.*}, VulkanSDK ${VULKAN_VERSION%%.*}, Mesa ${MESA_VERSION%%.*}, CMake, VCPKG, zsh)" \
-    org.opencontainers.image.licenses=MIT
-
-#
-#  888     888          888 888                               .d8888b.  8888888b.  888    d8P
-#  888     888          888 888                              d88P  Y88b 888  "Y88b 888   d8P
-#  888     888          888 888                              Y88b.      888    888 888  d8P
-#  Y88b   d88P 888  888 888 888  888  8888b.  88888b.         "Y888b.   888    888 888d88K
-#   Y88b d88P  888  888 888 888 .88P     "88b 888 "88b           "Y88b. 888    888 8888888b
-#    Y88o88P   888  888 888 888888K  .d888888 888  888             "888 888    888 888  Y88b
-#     Y888P    Y88b 888 888 888 "88b 888  888 888  888       Y88b  d88P 888  .d88P 888   Y88b
-#      Y8P      "Y88888 888 888  888 "Y888888 888  888        "Y8888P"  8888888P"  888    Y88b
-#
-
-# +-----------------------------+
-# | Vulkan SDK                  |
-# +-----------------------------+
-
-COPY --from=downloader /tmp/vulkansdk.xz /tmp/vulkansdk.xz
-
-RUN mkdir -p /opt/vulkan && \
-    tar xf /tmp/vulkansdk.xz -C /opt/vulkan && \
-    rm /tmp/vulkansdk.xz
-
-# Note: do not combine the 2 ENV statements.
-# (do not refer to env var within the same statement where it is defined)
-# Note: We are not using VK_ADD_LAYER_PATH, which would search for SDK layers
-# first and then any layers installed on the system. Instead, we use
-# VK_LAYER_PATH to specify the path to the SDK layer manifest .json files.
-ENV VULKAN_SDK=/opt/vulkan/${VULKAN_VERSION}/x86_64
-ENV PATH="$VULKAN_SDK/bin:$PATH" \
-    LD_LIBRARY_PATH="$VULKAN_SDK/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" \
-    VK_LAYER_PATH="$VULKAN_SDK/share/vulkan/explicit_layer.d"
-
-# +-----------------------------+
-# | Mesa                        |
-# +-----------------------------+
-
-# Mesa's software Vulkan implementation is called lavapipe (libvulkan_lvp).
-#
-# To setup Vulkan to use the CPU for rendering, you need to set the env var
-# VK_ICD_FILENAMES to point to the software renderer.
-# That JSON file points to the location of the driver (libvulkan_lvp.so).
-#
-# To test CPU rendering using the Mesa Vulkan drivers, you can use "vkcube",
-# which is a simple spinning-cube app to demonstrate Vulkan functionality.
-#
-RUN echo "Mesa" && \
-    apt-get update && apt-get install --no-install-recommends --assume-yes \
-      libgl1-mesa-dri \
-      mesa-vulkan-drivers && \
-      # Cleanup
-      apt-get autoremove -y && \
-      apt-get clean autoclean && \
-      rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
-
-#
-# https://docs.mesa3d.org/envvars.html
-# LIBGL_ALWAYS_SOFTWARE 1 = use software rendering
-ENV VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/lvp_icd.x86_64.json \
-    LIBGL_ALWAYS_SOFTWARE=1
-
-# The AsciiArt for the VSCode minimap is generated using
-# shellcheck disable=SC2046
-# https://patorjk.com/software/taag/#p=display&h=0&v=0&c=bash&f=Colossal&t=C%2B%2B%20DevBox%0APackages%0AGithub%20CLI%0ACMake%0ADOXYGEN%0AVCPKG%0ACCACHE%0ALLVM%0AGCC%0AZSH%0AVulkan%20SDK
diff --git a/.devcontainer/debian/trixie/Dockerfile b/.devcontainer/debian/trixie/Dockerfile
deleted file mode 100644
index efa6710..0000000
--- a/.devcontainer/debian/trixie/Dockerfile
+++ /dev/null
@@ -1,802 +0,0 @@
-# SPDX-FileCopyrightText: 2023-2025 Jens A. Koch
-# SPDX-License-Identifier: MIT
-# This file is part of https://github.com/jakoch/cpp-devbox
-
-#
-#
-#   .d8888b.                        8888888b.                    888888b.
-#  d88P  Y88b                       888  "Y88b                   888  "88b
-#  888    888                       888    888                   888  .88P
-#  888          888     888         888    888  .d88b.  888  888 8888888K.   .d88b.  888  888
-#  888        8888888 8888888       888    888 d8P  Y8b 888  888 888  "Y88b d88""88b `Y8bd8P'
-#  888    888   888     888         888    888 88888888 Y88  88P 888    888 888  888   X88K
-#  Y88b  d88P                       888  .d88P Y8b.      Y8bd8P  888   d88P Y88..88P .d8""8b.
-#   "Y8888P"                        8888888P"   "Y8888    Y88P   8888888P"   "Y88P"  888  888
-#
-#
-
-# /===========================================================================\
-# | Debian Trixie                                                             |
-# |===========================================================================|
-# |                                                                           |
-# | Package Versions                                            (os upstream) |
-# |                                                                           |
-# | LLVM:   https://packages.debian.org/trixie/llvm                 19.0      |
-# | GCC:    https://packages.debian.org/trixie/gcc                  14.2.0    |
-# | Vulkan: https://packages.debian.org/trixie/libvulkan-dev        1.4.309.0 |
-# | MESA:   https://packages.debian.org/trixie/mesa-vulkan-drivers  25.0.7    |
-# |                                                                           |
-# |---------------------------------------------------------------------------|
-# |                                                                           |
-# | Latest Versions                                         (vendor upstream) |
-# |                                                                           |
-# | LLVM:   https://apt.llvm.org/                                             |                     |
-# | GCC:    https://ftp.gnu.org/gnu/gcc/                                      |
-# | Vulkan: https://vulkan.lunarg.com/sdk/latest.json                         |
-# | MESA:   https://archive.mesa3d.org/                                       |
-# |                                                                           |
-# \===========================================================================/
-
-# +-----------------------------+
-# | Versions Notes              |
-# +-----------------------------+
-# GCC: Because Debian Trixie ships GCC 14.2.0 by default, our GCC compilation is disabled.
-#      We install GCC 14 from the distribution provided packages.
-
-# +-----------------------------+
-# | GLOBAL ARGS                 |
-# +-----------------------------+
-# The following global args need to be redeclared without a value inside each FROM section.
-# For example, VULKAN_VERSION is used in the FROM sections of "downloader" and "cpp-devbox-with-vulkansdk".
-# The value is set in the build command, e.g. --build-arg VULKAN_VERSION=1.3.296.0
-
-ARG DEBIAN_VERSION=13
-ARG DEBIAN_VERSION_NAME=trixie
-ARG GCC_VERSION=14.2.0
-ARG LLVM_VERSION=20
-ARG VULKAN_VERSION=1.4.321.1
-ARG MESA_VERSION=25.0.7
-
-# +-----------------------------+
-# | Downloader                  |
-# +-----------------------------+
-# Download Stage is for caching:
-# - /tmp/gcc.xz
-# - /tmp/vulkansdk.xz
-# - /tmp/mesa.xz
-
-FROM debian:trixie-slim AS downloader
-
-# Reuse global arguments
-#ARG GCC_VERSION
-ARG VULKAN_VERSION
-#ARG MESA_VERSION
-
-ENV DEBIAN_FRONTEND=noninteractive \
-    DEBCONF_NOWARNINGS="yes" \
-    CURL_OPTIONS="--silent --show-error --retry 5 --location"
-
-WORKDIR /tmp
-RUN echo "Download Stage" && \
-    apt-get update && apt-get install --no-install-recommends --assume-yes \
-    ca-certificates curl jq && \
-#   curl $CURL_OPTIONS -o gcc.xz "http://ftp.gnu.org/gnu/gcc/gcc-14.2.0/gcc-14.2.0.tar.xz" && \
-    curl $CURL_OPTIONS -o vulkansdk.xz "https://sdk.lunarg.com/sdk/download/${VULKAN_VERSION}/linux/vulkansdk-linux-x86_64-${VULKAN_VERSION}.tar.xz" && \
-    #curl $CURL_OPTIONS -o mesa.xz "https://archive.mesa3d.org/mesa-${MESA_VERSION}.tar.xz" && \
-	# Cleanup
-	apt-get autoremove -y && \
-    apt-get clean autoclean && \
-    rm -rf /var/lib/apt/lists/* && \
-    # List files in /tmp
-    ls -la /tmp
-
-# +-----------------------------+
-# | BASE IMAGE                  |        See https://hub.docker.com/_/debian
-# +-----------------------------+
-
-FROM debian:trixie-slim AS cpp-devbox-base
-
-# +-----------------------------+
-# | REUSE GLOBAL ARGS           |
-# +-----------------------------+
-
-ARG DEBIAN_VERSION
-ARG DEBIAN_VERSION_NAME
-ARG GCC_VERSION
-ARG LLVM_VERSION
-
-# +-----------------------------+
-# | METADATA                    |
-# +-----------------------------+
-# Standardized Docker Image Labels
-# https://github.com/opencontainers/image-spec/blob/main/annotations.md
-
-LABEL \
-    maintainer="Jens A. Koch <jakoch@web.de>" \
-    org.opencontainers.image.created="$(date --utc --iso-8601=seconds)" \
-    org.opencontainers.image.authors='Jens A. Koch <jakoch@web.de>' \
-    org.opencontainers.image.url='https://ghcr.io/jakoch/cpp-devbox' \
-    org.opencontainers.image.source='https://github.com/jakoch/cpp-devbox'\
-    org.opencontainers.image.title='ghcr.io/jakoch/cpp-devbox'\
-    org.opencontainers.image.description="C++ DevBox (Debian ${DEBIAN_VERSION}-${DEBIAN_VERSION_NAME} with LLVM ${LLVM_VERSION%%.*} & GCC ${GCC_VERSION%%.*}, CMake, VCPKG, zsh)" \
-    org.opencontainers.image.licenses=MIT
-
-
-#
-#  8888888b.                    888
-#  888   Y88b                   888
-#  888    888                   888
-#  888   d88P  8888b.   .d8888b 888  888  8888b.   .d88b.   .d88b.  .d8888b
-#  8888888P"      "88b d88P"    888 .88P     "88b d88P"88b d8P  Y8b 88K
-#  888        .d888888 888      888888K  .d888888 888  888 88888888 "Y8888b.
-#  888        888  888 Y88b.    888 "88b 888  888 Y88b 888 Y8b.          X88
-#  888        "Y888888  "Y8888P 888  888 "Y888888  "Y88888  "Y8888   88888P'
-#                                                      888
-#                                                 Y8b d88P
-#                                                  "Y88P"
-
-ENV DEBIAN_FRONTEND=noninteractive \
-    DEBCONF_NOWARNINGS="yes" \
-    CURL_OPTIONS="--silent --show-error --retry 5 --location"
-
-RUN echo "Packages" && \
-    apt-get update && apt-get install --no-install-recommends --assume-yes \
-    gnupg2 ca-certificates \
-    # package seems gone, was used in LLVM section below: software-properties-common \
-    build-essential \
-    wget git nano jq \
-    # code analysis
-    cppcheck \
-    valgrind \
-    # profiling
-    # gprof
-    linux-perf \
-    # code coverage  (gcov is part of GCC)
-    gcovr lcov \
-    # tracing
-    strace ltrace \
-    # assembler
-    nasm fasm \
-    # build tools (cmake is build from source)
-    meson \
-    # required by Visual Studio
-    g++ gdb make ninja-build rsync zip sudo \
-    # required by VCPKG
-    openssh-server tar curl unzip pkg-config bash-completion \
-    # optional downloader for VCPKG
-    aria2 \
-    # required by LLVM
-    lsb-release zlib1g-dev \
-    # locale
-    locales \
-    # shell
-    zsh \
-    # optional tools for Doxygen
-    python3 python3-pip \
-    python3-sphinx python3-sphinx-rtd-theme python3-defusedxml sphinx-common \
-    python3-venv \
-    graphviz && \
-    # Cleanup
-    apt-get autoremove -y && \
-    apt-get clean autoclean && \
-    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
-
-#
-#   .d8888b.  d8b 888    888               888             .d8888b.  888      8888888
-#  d88P  Y88b Y8P 888    888               888            d88P  Y88b 888        888
-#  888    888     888    888               888            888    888 888        888
-#  888        888 888888 88888b.  888  888 88888b.        888        888        888
-#  888  88888 888 888    888 "88b 888  888 888 "88b       888        888        888
-#  888    888 888 888    888  888 888  888 888  888       888    888 888        888
-#  Y88b  d88P 888 Y88b.  888  888 Y88b 888 888 d88P       Y88b  d88P 888        888
-#   "Y8888P88 888  "Y888 888  888  "Y88888 88888P"         "Y8888P"  88888888 8888888
-#
-
-# Website: https://cli.github.com/
-# Installation Instructions: https://github.com/cli/cli/blob/trunk/docs/install_linux.md#official-sources
-
-SHELL ["/bin/bash", "-o", "pipefail", "-c"]
-RUN echo "GITHUB CLI" && \
-    curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg && \
-    chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg && \
-    echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | tee /etc/apt/sources.list.d/github-cli.list > /dev/null && \
-    apt-get update && apt-get install --no-install-recommends --assume-yes \
-    gh && \
-    # Cleanup
-    apt-get autoremove -y && \
-    apt-get clean autoclean && \
-    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
-
-#
-#   .d8888b.  888b     d888          888
-#  d88P  Y88b 8888b   d8888          888
-#  888    888 88888b.d88888          888
-#  888        888Y88888P888  8888b.  888  888  .d88b.
-#  888        888 Y888P 888     "88b 888 .88P d8P  Y8b
-#  888    888 888  Y8P  888 .d888888 888888K  88888888
-#  Y88b  d88P 888   "   888 888  888 888 "88b Y8b.
-#   "Y8888P"  888       888 "Y888888 888  888  "Y8888
-#
-
-# Latest Release: https://github.com/Kitware/CMake/releases/latest
-
-SHELL ["/bin/bash", "-o", "pipefail", "-c"]
-RUN echo "CMake" && \
-    version="$(curl -s https://api.github.com/repos/Kitware/CMake/releases/latest | jq -r '.tag_name' | cut -c 2-)"; echo "Latest Version: \"$version\"" && \
-    url="https://github.com/Kitware/CMake/releases/download/v$version/cmake-$version-linux-x86_64.sh"; echo "Download URL: \"$url\"" && \
-    curl $CURL_OPTIONS -O $url && \
-    mkdir /opt/cmake && \
-    sh cmake-$version-linux-x86_64.sh --prefix=/opt/cmake --skip-license && \
-    ln -sF /opt/cmake/bin/cmake /usr/bin/cmake && \
-    ln -sF /opt/cmake/bin/ccmake /usr/bin/ccmake && \
-    ln -sF /opt/cmake/bin/cmake-gui /usr/bin/cmake-gui && \
-    ln -sF /opt/cmake/bin/cpack /usr/bin/cpack && \
-    ln -sF /opt/cmake/bin/ctest /usr/bin/ctest && \
-    rm -rf cmake-$version-linux-x86_64.sh
-
-#
-#  888     888  .d8888b.  8888888b.  888    d8P   .d8888b.
-#  888     888 d88P  Y88b 888   Y88b 888   d8P   d88P  Y88b
-#  888     888 888    888 888    888 888  d8P    888    888
-#  Y88b   d88P 888        888   d88P 888d88K     888
-#   Y88b d88P  888        8888888P"  8888888b    888  88888
-#    Y88o88P   888    888 888        888  Y88b   888    888
-#     Y888P    Y88b  d88P 888        888   Y88b  Y88b  d88P
-#      Y8P      "Y8888P"  888        888    Y88b  "Y8888P88
-#
-
-# vcpkg requires curl, unzip, tar, pkg-config (optional cmake).
-# We use the installed binaries from the system.
-# We do not download latest version of CMake and Ninja during vcpkg bootstrap.
-
-ENV VCPKG_ROOT=/opt/vcpkg \
-    VCPKG_TRIPLET=x64-linux \
-    VCPKG_FORCE_SYSTEM_BINARIES=1 \
-    VCPKG_USE_SYSTEM_BINARIES=1
-ENV PATH="${PATH}:${VCPKG_ROOT}"
-
-SHELL ["/bin/bash", "-o", "pipefail", "-c"]
-RUN echo "VCPKG" && \
-    git clone --depth=1 --no-tags \
-    -c core.eol=lf \
-    -c core.autocrlf=false \
-    -c fsck.zeroPaddedFilemode=ignore \
-    -c fetch.fsck.zeroPaddedFilemode=ignore \
-    -c receive.fsck.zeroPaddedFilemode=ignore \
-    https://github.com/microsoft/vcpkg "${VCPKG_ROOT}" && \
-    "${VCPKG_ROOT}"/bootstrap-vcpkg.sh -disableMetrics
-
-#
-#   .d8888b.   .d8888b.         d8888  .d8888b.  888    888 8888888888
-#  d88P  Y88b d88P  Y88b       d88888 d88P  Y88b 888    888 888
-#  888    888 888    888      d88P888 888    888 888    888 888
-#  888        888            d88P 888 888        8888888888 8888888
-#  888        888           d88P  888 888        888    888 888
-#  888    888 888    888   d88P   888 888    888 888    888 888
-#  Y88b  d88P Y88b  d88P  d8888888888 Y88b  d88P 888    888 888
-#   "Y8888P"   "Y8888P"  d88P     888  "Y8888P"  888    888 8888888888
-#
-
-SHELL ["/bin/bash", "-o", "pipefail", "-c"]
-RUN echo "CCACHE" && \
-    version="$(curl -s https://api.github.com/repos/ccache/ccache/releases/latest | jq -r '.tag_name' | cut -c 2-)"; echo "Latest Version: \"$version\"" && \
-    url="https://github.com/ccache/ccache/releases/download/v$version/ccache-$version-linux-x86_64.tar.xz"; echo "Download URL: \"$url\"" && \
-    curl $CURL_OPTIONS -sLO $url && \
-    mkdir -p /opt/ccache/bin &&\
-    tar xf ccache-$version-linux-x86_64.tar.xz --strip-components=1 -C /opt/ccache/bin && \
-	ln -s /opt/ccache/bin/ccache /usr/bin && \
-	rm ccache-$version-linux-x86_64.tar.xz
-
-#
-#  888  .d8888b.  8888888b.  888    888 8888888888 888b    888
-#  888 d88P  Y88b 888   Y88b 888   d88P 888        8888b   888
-#  888 888    888 888    888 888  d8P   888        88888b  888
-#  888 888        888   d88P 888d88K    8888888    888Y88b 888
-#  888 888        8888888P"  8888888b   888        888 Y88b888
-#  888 888    888 888        888  Y88b  888        888  Y88888
-#  888 Y88b  d88P 888        888   Y88b 888        888   Y8888
-#  888  "Y8888P"  888        888    Y88b 8888888888 888    Y888
-#
-
-# We are using the prebuilt binaries for x64.
-
-SHELL ["/bin/bash", "-o", "pipefail", "-c"]
-RUN echo "DOXYGEN" && \
-    version_string="$(curl -s https://api.github.com/repos/doxygen/doxygen/releases/latest | jq -r '.tag_name')"; echo "Latest Version: \"$version_string\"" && \
-    version_number="$(echo $version_string | cut -c 9- | sed 's/_/./g')" && \
-    url="https://github.com/doxygen/doxygen/releases/download/$version_string/doxygen-$version_number.linux.bin.tar.gz"; echo "Download URL: \"$url\"" && \
-    curl $CURL_OPTIONS -sLO $url && \
-    mkdir /opt/doxygen && \
-    tar xf doxygen-$version_number.linux.bin.tar.gz --strip-components=1 -C /opt/doxygen && \
-    ln -s /opt/doxygen/bin/doxygen /usr/bin && \
-    rm doxygen-$version_number.linux.bin.tar.gz
-
-#
-#  888      888      888     888 888b     d888
-#  888      888      888     888 8888b   d8888
-#  888      888      888     888 88888b.d88888
-#  888      888      Y88b   d88P 888Y88888P888
-#  888      888       Y88b d88P  888 Y888P 888
-#  888      888        Y88o88P   888  Y8P  888
-#  888      888         Y888P    888   "   888
-#  88888888 88888888     Y8P     888       888
-#
-
-# For an installation using the llvm.sh setup script:
-# RUN curl -sLO https://apt.llvm.org/llvm.sh && chmod +x llvm.sh && ./llvm.sh ${LLVM_VERSION} all && rm ./llvm.sh
-
-# for installation using add-apt-repository from software-properties-common
-#add-apt-repository -y "deb http://apt.llvm.org/$DEBIAN_VERSION_NAME/ llvm-toolchain$LINKNAME-$LLVM_VERSION main" && \
-#add-apt-repository "deb http://httpredir.debian.org/debian sid main" && \
-
-SHELL ["/bin/bash", "-o", "pipefail", "-c"]
-RUN echo "LLVM" && \
-    if [ "$DEBIAN_VERSION_NAME" == "trixie" ]; then DEBIAN_VERSION_NAME="unstable"; fi && \
-    if [ "$DEBIAN_VERSION_NAME" == "unstable" ]; then LINKNAME=""; else LINKNAME="-$DEBIAN_VERSION_NAME"; fi && \
-    curl -s https://apt.llvm.org/llvm-snapshot.gpg.key | tee /etc/apt/trusted.gpg.d/apt.llvm.org.asc && \
-    echo "deb http://apt.llvm.org/$DEBIAN_VERSION_NAME/ llvm-toolchain$LINKNAME-$LLVM_VERSION main" >> /etc/apt/sources.list.d/llvm.list && \
-    echo "deb http://httpredir.debian.org/debian sid main" >> /etc/apt/sources.list.d/sid.list && \
-    apt-get update && apt-get install --no-install-recommends --assume-yes \
-    # Not all LLVM key packages are installed:
-    # ocaml-dev, doc, examples, libclc, mlir, bolt, flang (fortran), wasm, libllvmlibc
-    # libclc (not installed because, implementation detail and not for external use as OpenCL headers)
-    clang-$LLVM_VERSION \
-    clangd-$LLVM_VERSION \
-    clang-tidy-$LLVM_VERSION \
-    clang-format-$LLVM_VERSION \
-    clang-tools-$LLVM_VERSION \
-    llvm-$LLVM_VERSION-dev \
-    llvm-$LLVM_VERSION-runtime \
-    llvm-$LLVM_VERSION-tools \
-    lld-$LLVM_VERSION \
-    lldb-$LLVM_VERSION \
-    libomp-$LLVM_VERSION-dev \
-    libc++-$LLVM_VERSION-dev \
-    libc++abi-$LLVM_VERSION-dev \
-    libclang-rt-$LLVM_VERSION-dev \
-    libclang-common-$LLVM_VERSION-dev \
-    libclang-$LLVM_VERSION-dev \
-    libclang-cpp$LLVM_VERSION-dev \
-    libfuzzer-$LLVM_VERSION-dev \
-    libunwind-$LLVM_VERSION-dev \
-    libclang-rt-$LLVM_VERSION-dev \
-    libpolly-$LLVM_VERSION-dev && \
-    # Cleanup
-    apt-get autoremove -y && \
-    apt-get clean autoclean && \
-    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
-
-# add llvm to path
-ENV PATH="/usr/lib/llvm-${LLVM_VERSION}/bin:/usr/lib/llvm-${LLVM_VERSION}/include:${PATH}"
-
-# first set LD_LIBRARY_PATH (Debian doesn't set LD_LIBRARY_PATH by default.) and then add LLVM lib folder
-ENV LD_LIBRARY_PATH="/usr/lib:/usr/local/lib"
-ENV LD_LIBRARY_PATH="/usr/lib/llvm-${LLVM_VERSION}/lib:${LD_LIBRARY_PATH:-}"
-
-# remove version from binaries
-RUN ln -s /usr/bin/clang-${LLVM_VERSION} /usr/bin/clang && \
-    ln -s /usr/bin/clang++-${LLVM_VERSION} /usr/bin/clang++ && \
-    ln -s /usr/bin/clang-format-${LLVM_VERSION} /usr/bin/clang-format
-
-# update compiler environment vars
-ENV CC=/usr/bin/clang \
-    CXX=/usr/bin/clang++
-
-# update alternatives
-RUN update-alternatives --install /usr/bin/cc cc /usr/bin/clang 100 && \
-    update-alternatives --install /usr/bin/c++ c++ /usr/bin/clang++ 100
-
-#
-#  888b     d888          888      888
-#  8888b   d8888          888      888
-#  88888b.d88888          888      888
-#  888Y88888P888  .d88b.  888  .d88888
-#  888 Y888P 888 d88""88b 888 d88" 888
-#  888  Y8P  888 888  888 888 888  888
-#  888   "   888 Y88..88P 888 Y88b 888
-#  888       888  "Y88P"  888  "Y88888
-#
-
-# We are using Clang++ for compilation, so this download + compile step must happen after installing LLVM+Clang.
-# We don't need to call mold's ./install-build-deps.sh, because all build dependencies are present.
-# Note to overwrite ld: sudo ln -sf /opt/mold/bin/mold $(realpath /usr/bin/ld)
-
-SHELL ["/bin/bash", "-o", "pipefail", "-c"]
-RUN echo "MOLD" && \
-    version="$(curl -s https://api.github.com/repos/rui314/mold/releases/latest | jq -r '.tag_name' | cut -c 2-)"; echo "Latest Version: \"$version\"" && \
-    git clone --branch "v$version" --single-branch --depth 1 --no-tags https://github.com/rui314/mold.git "/tmp/mold" && \
-    cmake -S /tmp/mold -B /tmp/mold/build -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=clang++ && \
-    cmake --build /tmp/mold/build -j "$(nproc)" && \
-    cmake --install /tmp/mold/build --prefix=/opt/mold && \
-    ln -s /opt/mold/bin/mold /usr/bin && \
-    rm -rf /tmp/mold
-
-#
-#   .d8888b.   .d8888b.   .d8888b.
-#  d88P  Y88b d88P  Y88b d88P  Y88b
-#  888    888 888    888 888    888
-#  888        888        888
-#  888  88888 888        888
-#  888    888 888    888 888    888
-#  Y88b  d88P Y88b  d88P Y88b  d88P
-#   "Y8888P88  "Y8888P"   "Y8888P"
-#
-
-RUN echo "GCC - Extract" && \
-    apt-get update && apt-get install --no-install-recommends --assume-yes \
-    cpp-14 g++-14 && \
-    # Cleanup
-    apt-get autoremove -y && \
-    apt-get clean autoclean && \
-    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
-
-# COPY --from=downloader /tmp/gcc.xz /tmp/gcc.xz
-# RUN echo "GCC - Extract" && \
-#     tar xf /tmp/gcc.xz && rm /tmp/gcc.xz && \
-#     apt-get update && apt-get install --no-install-recommends --assume-yes \
-#     libmpfr-dev libgmp3-dev libmpc-dev
-
-# set default compiler to gcc
-# ENV CC=/usr/bin/gcc \
-#     CXX=/usr/bin/g++
-
-# installing into /usr instead of /usr/local to have consistent paths in CMakePresets:
-# /usr/bin/g++-12
-# /usr/bin/g++-13
-# WORKDIR /gcc-14.2.0
-
-SHELL ["/bin/bash", "-o", "pipefail", "-c"]
-
-# https://gcc.gnu.org/install/configure.html
-# RUN echo "GCC - Compile" && \
-#     ./configure \
-#     --libdir=/usr/lib \
-#     --libexecdir=/usr/lib \
-#     --prefix=/usr \
-#     --program-suffix=-14 \
-#     --build=x86_64-linux-gnu \
-#     --host=x86_64-linux-gnu \
-#     --target=x86_64-linux-gnu \
-#     --disable-multilib \
-#     --disable-libquadmath \
-#     --disable-vtable-verify \
-#     --disable-werror \
-#     --enable-cet \
-#     --enable-lto \
-#     --enable-checking=release \
-#     --enable-clocale=gnu \
-#     --enable-default-pie \
-#     --enable-gnu-unique-object \
-#     --enable-languages=c,c++ \
-#     --enable-libstdcxx-debug \
-#     --enable-libstdcxx-time=yes \
-#     --enable-linker-build-id \
-#     --enable-nls \
-#     --enable-multiarch \
-#     --enable-plugin \
-#     --enable-shared \
-#     --enable-shared-libgcc \
-#     --enable-static \
-#     --enable-threads=posix \
-#     --enable-libsanitizer \
-#     --without-included-gettext \
-#     --without-cuda-driver \
-#     --with-arch-32=i686 \
-#     --with-abi=m64 \
-#     --with-tune=generic \
-#     --with-default-libstdcxx-abi=new \
-#     --with-gcc-major-version-only \
-#     --with-system-zlib && \
-#     make -s -j"$(nproc)" all-gcc > /dev/null 2>&1 && \
-#     make -s -j"$(nproc)" all-target-libgcc > /dev/null 2>&1 && \
-#     make -s -j"$(nproc)" all-target-libsanitizer > /dev/null 2>&1 && \
-#     make -s -j"$(nproc)" all-target-libatomic > /dev/null 2>&1 && \
-#     make install-gcc && \
-#     make install-target-libgcc && \
-#     make install-target-libsanitizer && \
-#     make install-target-libatomic
-
-# return from /gcc-x.y.z folder
-#WORKDIR /
-
-# remove gcc source folder and dependencies
-#RUN echo "GCC - Cleanup" && \
-#    rm -rf gcc-14.2.0 && \
-#    apt-get autoremove -y libmpfr-dev libgmp3-dev libmpc-dev
-
-# reset default compiler to clang
-ENV CC=/usr/bin/clang \
-    CXX=/usr/bin/clang++
-
-#
-#  8888888888P  .d8888b.  888    888
-#        d88P  d88P  Y88b 888    888
-#       d88P   Y88b.      888    888
-#      d88P     "Y888b.   8888888888
-#     d88P         "Y88b. 888    888
-#    d88P            "888 888    888
-#   d88P       Y88b  d88P 888    888
-#  d8888888888  "Y8888P"  888    888
-#
-
-# Setup zsh, ohmyzsh, powerline fonts.
-# Setup zsh plugins: autosuggestions, autocompletions, history search.
-
-ENV TERM=xterm-256color \
-    ZSH_THEME=agnoster
-
-# Setup zsh for the root user
-SHELL ["/bin/bash", "-o", "pipefail", "-c"]
-RUN echo "ZSH" && \
-    apt-get update && apt-get install --no-install-recommends --assume-yes \
-    zsh fontconfig && \
-    # Download and install fonts-powerline
-    # An installation via apt-get is not possible for trixie,
-	# because the package is only available in unstable(sid).
-    # https://packages.debian.org/sid/fonts-powerline
-	# https://api.ftp-master.debian.org/madison?package=fonts-powerline&table=debian
-    FONTS_POWERLINE_VERSION=$(curl -s 'https://api.ftp-master.debian.org/madison?package=fonts-powerline&table=debian&s=unstable&f=json' | jq -r '.[0]["fonts-powerline"].unstable | keys[0]'); echo "Latest Version: \"$FONTS_POWERLINE_VERSION\"" && \
-    FONTS_POWERLINE_URL="http://ftp.de.debian.org/debian/pool/main/p/powerline/fonts-powerline_${FONTS_POWERLINE_VERSION}_all.deb" && \
-    curl -o fonts-powerline.deb -L ${FONTS_POWERLINE_URL} && \
-    dpkg -i fonts-powerline.deb && \
-    rm fonts-powerline.deb && \
-    # Install Oh My Zsh
-    curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh | sh && \
-    # Add Zsh plugins
-    git clone --depth=1 --no-tags https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions && \
-    git clone --depth=1 --no-tags https://github.com/zsh-users/zsh-completions ${ZSH_CUSTOM:=~/.oh-my-zsh/custom}/plugins/zsh-completions && \
-    git clone --depth=1 --no-tags https://github.com/zsh-users/zsh-history-substring-search ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-history-substring-search && \
-    # Update .zshrc
-    sed -i "s/plugins=(git)/plugins=(git zsh-completions zsh-autosuggestions zsh-history-substring-search)/" /root/.zshrc && \
-    sed -i "s/ZSH_THEME=\"agnoster\"/ZSH_THEME=\"robbyrussell\"/" /root/.zshrc && \
-	sed -i "s/# DISABLE_AUTO_UPDATE=\"true\"/DISABLE_AUTO_UPDATE=\"true\"/" /root/.zshrc && \
-	# Cleanup
-	apt-get autoremove -y && \
-    apt-get clean autoclean && \
-    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
-
-# Set the default shell to zsh after it is installed
-ENV SHELL=/bin/zsh
-
-# +-----------------------------+
-# | CLEANUP                     |
-# +-----------------------------+
-
-RUN echo "CLeanup" && \
-    apt-get autoremove -y && \
-    apt-get clean autoclean && \
-    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
-
-# +-----------------------------+
-# | Set Locale + Timezone       |
-# +-----------------------------+
-
-ENV TZ=America/Los_Angeles
-
-RUN echo "Locale & Timezone" && \
-    ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && \
-    echo $TZ > /etc/timezone && \
-    dpkg-reconfigure -f noninteractive tzdata && \
-    sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && \
-    echo 'LANG="en_US.UTF-8"' > /etc/default/locale && \
-    dpkg-reconfigure -f noninteractive locales && \
-    update-locale LANG=en_US.UTF-8 && \
-    echo "export PATH=$PATH" > /etc/environment && \
-    localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8
-
-ENV LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 \
-    # Switch back to dialog for any ad-hoc use of apt-get
-    DEBIAN_FRONTEND=dialog
-
-# +----------------------------------+
-# | Stage: mesa-builder              |
-# +----------------------------------+
-
-# FROM cpp-devbox-base AS mesa-builder
-
-# # Mesa Build Options: https://gitlab.freedesktop.org/mesa/mesa/-/blob/main/meson_options.txt
-# #
-# COPY --from=downloader /tmp/mesa.xz /tmp/mesa.xz
-
-# ENV MESA_PACKAGE_FOLDER=/mesa-package
-
-# # +------------------+
-# # | SPIRV-TOOLS      |
-# # +------------------+
-# # Notes:
-# # - SPIRV_VERSION_TAG has to match your LLVM version, see https://github.com/KhronosGroup/SPIRV-LLVM-Translator/releases/latest
-# # - spirv-tools dependency is needed for e.g. spirv-objdump, which is not in the vk sdk
-
-# SHELL ["/bin/bash", "-o", "pipefail", "-c"]
-# RUN SPIRV_VERSION_TAG=$(curl -s https://api.github.com/repos/KhronosGroup/SPIRV-LLVM-Translator/releases/latest | jq -r '.tag_name') && \
-#     LLVM_VERSION=$(llvm-config --version) && \
-#     apt-get update && apt-get install --no-install-recommends --assume-yes \
-#         libcurl4-openssl-dev \
-#         libedit-dev \
-#         libzstd-dev \
-#     # spirv-tools is needed (for e.g. spirv-objdump, because not part of vulkan sdk)
-#         spirv-tools  && \
-#         # Cleanup
-#         apt-get autoremove -y && \
-#         apt-get clean autoclean && \
-#         rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
-#     git clone --branch $SPIRV_VERSION_TAG --single-branch --depth=1 --no-tags https://github.com/KhronosGroup/SPIRV-LLVM-Translator.git && \
-#     mkdir SPIRV-LLVM-Translator/build && \
-#     cd SPIRV-LLVM-Translator/build && \
-#     cmake .. -D BASE_LLVM_VERSION=$LLVM_VERSION && \
-#     make llvm-spirv -j`nproc` && \
-#     cmake --install . --prefix=/usr/local
-
-# SHELL ["/bin/bash", "-o", "pipefail", "-c"]
-# RUN mkdir /tmp/mesa && \
-#     tar xvf /tmp/mesa.xz -C /tmp/mesa --strip-components 1 && \
-#     rm /tmp/mesa.xz && \
-#     #
-#     # Install Mesa dependencies..
-#     #
-#     # TODO not sure if we need all this
-#     #
-#     apt-get update && apt-get install --no-install-recommends --assume-yes \
-#       meson bison byacc flex libzstd-dev pkg-config \
-#       python3-mako python3-ply \
-#       libdrm2 libdrm-dev \
-#       libclc-18-dev \
-#       libexpat1-dev \
-#       libunwind-dev \
-#       libwayland-dev wayland-protocols \
-#       libx11-dev libxext-dev libxfixes-dev \
-#       libxrandr2 libxrandr-dev libxcb-randr0-dev \
-#       libx11-xcb-dev libxcb-dri2-0-dev libxcb-dri3-dev libxcb-present-dev \
-#       libxcb-shm0-dev libxshmfence-dev \
-#       rust-all bindgen cbindgen \
-#       # fix mesa error: libclc shader missing. Consider installing the libclc package
-#       libclc-18 \
-#       # only needed, if vulkan isn't already installed
-#       glslang-tools
-# # Dependencies possibly need when altering Mesa configuration:
-# #      libudev-dev \
-# #      libelf-dev \
-# #      libwayland-egl-backend-dev \
-# #      libxcb-glx0-dev \
-# #      libxxf86vm-dev  && \
-#        # Cleanup
-#        apt-get autoremove -y && \
-#        apt-get clean autoclean && \
-#        rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
-
-# ENV CXXFLAGS="-O2 -g -DDEFAULT_SOFTWARE_DEPTH_BITS=31"
-
-# #
-# # Configure Mesa
-# #
-# # Note: Vulkan drivers require dri3 for X11 support
-# #
-# WORKDIR /tmp/mesa
-# RUN meson build/ \
-#       -D buildtype=release \
-#       -D prefix=/usr \
-#       #-D prefix=/usr/local \
-#       #-D libdir=/usr/local/lib \
-#       -D dri3=enabled \
-#       -D egl=disabled \
-#       -D gallium-drivers=swrast,zink \
-#       -D gallium-nine=false \
-#       -D glx=xlib \
-#       -D gles1=disabled \
-#       -D gles2=disabled \
-#       -D glvnd=disabled \
-#       -D libunwind=enabled \
-#       -D llvm=enabled \
-#       -D microsoft-clc=disabled \
-#       -D osmesa=false \
-#       -D platforms=x11,wayland \
-#       -D valgrind=disabled \
-#       -D vulkan-beta=false \
-#       -D vulkan-drivers=auto && \
-#      #
-#      # Build and Install Mesa
-#      #
-#      ninja -C build/ && \
-#      DESTDIR=${MESA_PACKAGE_FOLDER} && \
-#      ninja -C build/ install && \
-#      rm -rf /tmp/mesa && \
-#      #
-#      # Package Mesa
-#      #
-#      tar cvf mesa-package.tar.gz ${MESA_PACKAGE_FOLDER}
-
-# +----------------------------------+
-# | Stage: cpp-devbox-with-vulkansdk |
-# +----------------------------------+
-
-FROM cpp-devbox-base AS cpp-devbox-with-vulkansdk
-
-# Reuse global arguments
-ARG DEBIAN_VERSION
-ARG DEBIAN_VERSION_NAME
-ARG LLVM_VERSION
-ARG GCC_VERSION
-ARG VULKAN_VERSION
-ARG MESA_VERSION
-
-# +-----------------------------+
-# | METADATA                    |
-# +-----------------------------+
-# Standardized Docker Image Labels
-# https://github.com/opencontainers/image-spec/blob/main/annotations.md
-
-LABEL \
-    maintainer="Jens A. Koch <jakoch@web.de>" \
-    org.opencontainers.image.created="$(date --utc --iso-8601=seconds)" \
-    org.opencontainers.image.authors='Jens A. Koch <jakoch@web.de>' \
-    org.opencontainers.image.url='https://ghcr.io/jakoch/cpp-devbox' \
-    org.opencontainers.image.source='https://github.com/jakoch/cpp-devbox'\
-    org.opencontainers.image.title='ghcr.io/jakoch/cpp-devbox'\
-    org.opencontainers.image.description="C++ DevBox (Debian ${DEBIAN_VERSION}-${DEBIAN_VERSION_NAME} with LLVM ${LLVM_VERSION%%.*} & GCC ${GCC_VERSION%%.*}, VulkanSDK ${VULKAN_VERSION%%.*}, Mesa ${MESA_VERSION%%.*}, CMake, VCPKG, zsh)" \
-    org.opencontainers.image.licenses=MIT
-
-#
-#  888     888          888 888                               .d8888b.  8888888b.  888    d8P
-#  888     888          888 888                              d88P  Y88b 888  "Y88b 888   d8P
-#  888     888          888 888                              Y88b.      888    888 888  d8P
-#  Y88b   d88P 888  888 888 888  888  8888b.  88888b.         "Y888b.   888    888 888d88K
-#   Y88b d88P  888  888 888 888 .88P     "88b 888 "88b           "Y88b. 888    888 8888888b
-#    Y88o88P   888  888 888 888888K  .d888888 888  888             "888 888    888 888  Y88b
-#     Y888P    Y88b 888 888 888 "88b 888  888 888  888       Y88b  d88P 888  .d88P 888   Y88b
-#      Y8P      "Y88888 888 888  888 "Y888888 888  888        "Y8888P"  8888888P"  888    Y88b
-#
-
-COPY --from=downloader /tmp/vulkansdk.xz /tmp/vulkansdk.xz
-
-RUN echo "Vulkan SDK" && \
-    mkdir -p /opt/vulkan && \
-    tar xf /tmp/vulkansdk.xz -C /opt/vulkan && \
-    rm /tmp/vulkansdk.xz
-
-# Note: do not combine the 2 ENV statements.
-# (do not refer to env var within the same statement where it is defined)
-# Note: We are not using VK_ADD_LAYER_PATH, which would search for SDK layers
-# first and then any layers installed on the system. Instead, we use
-# VK_LAYER_PATH to specify the path to the SDK layer manifest .json files.
-ENV VULKAN_SDK=/opt/vulkan/${VULKAN_VERSION}/x86_64
-ENV PATH="$VULKAN_SDK/bin:$PATH" \
-    LD_LIBRARY_PATH="$VULKAN_SDK/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" \
-    VK_LAYER_PATH="$VULKAN_SDK/share/vulkan/explicit_layer.d"
-
-# +-----------------------------+
-# | Mesa                        |
-# +-----------------------------+
-
-# Mesa's software Vulkan implementation is called lavapipe (libvulkan_lvp).
-#
-# To configure Vulkan to use the CPU for rendering, set the environment variable
-# VK_ICD_FILENAMES to the path of the software renderer's JSON file.
-# This JSON file specifies the location of the driver (libvulkan_lvp.so).
-#
-# To test CPU rendering using the Mesa Vulkan drivers, you can use "vkcube",
-# which is a simple spinning-cube app to demonstrate Vulkan functionality.
-#
-
-# Copy the packaged mesa drivers and extract into root.
-#COPY --from=mesa-builder /tmp/mesa-package.tar.gz /tmp
-#RUN tar xvf /tmp/mesa-package.tar.gz -C / --strip-components 1 && \
-#    rm /tmp/mesa-package.tar.gz
-
-RUN echo "Mesa" && \
-    apt-get update && apt-get install --no-install-recommends --assume-yes \
-      libgl1-mesa-dri \
-      mesa-vulkan-drivers && \
-      # Cleanup
-      apt-get autoremove -y && \
-      apt-get clean autoclean && \
-      rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
-
-#
-# https://docs.mesa3d.org/envvars.html
-# LIBGL_ALWAYS_SOFTWARE 1 = use software rendering
-ENV VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/lvp_icd.x86_64.json \
-    LIBGL_ALWAYS_SOFTWARE=1
-
-# The AsciiArt for the VSCode minimap is generated using
-# shellcheck disable=SC2046
-# https://patorjk.com/software/taag/#p=display&h=0&v=0&c=bash&f=Colossal&t=C%2B%2B%20DevBox%0APackages%0AGithub%20CLI%0ACMake%0ADOXYGEN%0AVCPKG%0ACCACHE%0ALLVM%0AGCC%0AZSH%0AVulkan%20SDK
diff --git a/.devcontainer/debian/trixie/Dockerfile.ikos.backup b/.devcontainer/debian/trixie/Dockerfile.ikos.backup
deleted file mode 100644
index a7790bd..0000000
--- a/.devcontainer/debian/trixie/Dockerfile.ikos.backup
+++ /dev/null
@@ -1,940 +0,0 @@
-# SPDX-FileCopyrightText: 2023-2025 Jens A. Koch
-# SPDX-License-Identifier: MIT
-# This file is part of https://github.com/jakoch/cpp-devbox
-
-#
-#
-#   .d8888b.                        8888888b.                    888888b.
-#  d88P  Y88b                       888  "Y88b                   888  "88b
-#  888    888                       888    888                   888  .88P
-#  888          888     888         888    888  .d88b.  888  888 8888888K.   .d88b.  888  888
-#  888        8888888 8888888       888    888 d8P  Y8b 888  888 888  "Y88b d88""88b `Y8bd8P'
-#  888    888   888     888         888    888 88888888 Y88  88P 888    888 888  888   X88K
-#  Y88b  d88P                       888  .d88P Y8b.      Y8bd8P  888   d88P Y88..88P .d8""8b.
-#   "Y8888P"                        8888888P"   "Y8888    Y88P   8888888P"   "Y88P"  888  888
-#
-#
-
-# /===========================================================================\
-# | Debian Trixie                                                             |
-# |===========================================================================|
-# |                                                                           |
-# | Package Versions                                            (os upstream) |
-# |                                                                           |
-# | LLVM:   https://packages.debian.org/trixie/llvm                 19.0      |
-# | GCC:    https://packages.debian.org/trixie/gcc                  14.2.0    |
-# | Vulkan: https://packages.debian.org/trixie/libvulkan-dev        1.4.304.0 |
-# | MESA:   https://packages.debian.org/trixie/mesa-vulkan-drivers  24.3.4    |
-# |                                                                           |
-# |---------------------------------------------------------------------------|
-# |                                                                           |
-# | Latest Versions                                         (vendor upstream) |
-# |                                                                           |
-# | LLVM:   https://apt.llvm.org/                                                                  |
-# | GCC:    https://ftp.gnu.org/gnu/gcc/                                      |
-# | Vulkan: https://vulkan.lunarg.com/sdk/latest.json                         |
-# | MESA:   https://archive.mesa3d.org/                                       |
-# |                                                                           |
-# \===========================================================================/
-
-# +-----------------------------+
-# | Versions Notes              |
-# +-----------------------------+
-# GCC: Because Debian Trixie ships GCC 14.2.0 by default, our GCC compilation is disabled.
-#      We install GCC 14 from the distribution provided packages.
-
-# +-----------------------------+
-# | GLOBAL ARGS                 |
-# +-----------------------------+
-# The following global args need to be redeclared without a value inside each FROM section.
-# For example, VULKAN_VERSION is used in the FROM sections of "downloader" and "cpp-devbox-with-vulkansdk".
-# The value is set in the build command, e.g. --build-arg VULKAN_VERSION=1.3.296.0
-
-ARG DEBIAN_VERSION=13
-ARG DEBIAN_VERSION_NAME=trixie
-ARG GCC_VERSION=14
-ARG LLVM_VERSION=20
-ARG VULKAN_VERSION=1.4.304.1
-ARG MESA_VERSION=24.3.1
-
-# +-----------------------------+
-# | Downloader                  |
-# +-----------------------------+
-# Download Stage is for caching:
-# - /tmp/ikos.xz
-# - /tmp/gcc.xz
-# - /tmp/vulkansdk.xz
-# - /tmp/mesa.xz
-
-FROM debian:trixie-slim AS downloader
-
-# Reuse global arguments
-#ARG GCC_VERSION
-ARG VULKAN_VERSION
-ARG MESA_VERSION
-ARG IKOS_VERSION=3.5
-
-ENV DEBIAN_FRONTEND=noninteractive \
-    DEBCONF_NOWARNINGS="yes" \
-    CURL_OPTIONS="--silent --show-error --retry 5 --location"
-
-WORKDIR /tmp
-RUN echo "Download Stage" && \
-    apt-get update && apt-get install --no-install-recommends --assume-yes \
-    ca-certificates curl jq && \
-    curl $CURL_OPTIONS -o ikos.xz https://github.com/NASA-SW-VnV/ikos/archive/refs/tags/v${IKOS_VERSION}.tar.gz && \
-#   curl $CURL_OPTIONS -o gcc.xz "http://ftp.gnu.org/gnu/gcc/gcc-14.2.0/gcc-14.2.0.tar.xz" && \
-    curl $CURL_OPTIONS -o vulkansdk.xz "https://sdk.lunarg.com/sdk/download/${VULKAN_VERSION}/linux/vulkansdk-linux-x86_64-${VULKAN_VERSION}.tar.xz" && \
-    curl $CURL_OPTIONS -o mesa.xz "https://archive.mesa3d.org/mesa-${MESA_VERSION}.tar.xz" && \
-	# Cleanup
-	apt-get autoremove -y && \
-    apt-get clean autoclean && \
-    rm -rf /var/lib/apt/lists/* && \
-    # List files in /tmp
-    ls -la /tmp
-
-# +-----------------------------+
-# | IKOS Build Stage            |
-# +-----------------------------+
-
-FROM debian:trixie-slim AS ikos-builder
-
-ARG DEBIAN_VERSION=13
-ARG DEBIAN_VERSION_NAME=trixie
-ARG LLVM_VERSION=14
-
-ENV DEBIAN_FRONTEND=noninteractive \
-    DEBCONF_NOWARNINGS="yes" \
-    CURL_OPTIONS="--silent --show-error --retry 5 --location"
-
-RUN echo "Packages" && \
-    # avoid debconf: delaying package configuration, since apt-utils is not installed
-    apt-get update && apt-get install --no-install-recommends --assume-yes \
-        curl jq tar xz-utils sed perl \
-        gcc g++ \
-        cmake \
-        make \
-        libgmp-dev \
-        libboost-dev libboost-filesystem-dev libboost-thread-dev libboost-test-dev \
-        libsqlite3-dev \
-        libtbb-dev \
-        libz-dev \
-        libzstd-dev \
-        libedit-dev \
-        libmpfr-dev \
-        libppl-dev \
-        libgmp-dev \
-        python3 python3-pip python3-venv python3-setuptools python3-build
-
-# https://github.com/NASA-SW-VnV/ikos?tab=readme-ov-file#dependencies
-SHELL ["/bin/bash", "-o", "pipefail", "-c"]
-RUN echo "LLVM 14" && \
-    if [ "$DEBIAN_VERSION_NAME" == "trixie" ]; then DEBIAN_VERSION_NAME="unstable"; fi && \
-    if [ "$DEBIAN_VERSION_NAME" == "unstable" ]; then LINKNAME=""; else LINKNAME="-$DEBIAN_VERSION_NAME"; fi && \
-    curl -s https://apt.llvm.org/llvm-snapshot.gpg.key | tee /etc/apt/trusted.gpg.d/apt.llvm.org.asc && \
-    echo "deb http://apt.llvm.org/$DEBIAN_VERSION_NAME/ llvm-toolchain$LINKNAME-$LLVM_VERSION main" >> /etc/apt/sources.list.d/llvm.list && \
-    echo "deb http://httpredir.debian.org/debian sid main" >> /etc/apt/sources.list.d/sid.list && \
-    apt-get update && apt-get install --no-install-recommends --assume-yes \
-        llvm-14 llvm-14-dev llvm-14-tools clang-14
-
-RUN echo "APRON" && \
-    cd tmp && \
-    # Download
-    url="https://github.com/antoinemine/apron/archive/refs/tags/v0.9.15.tar.gz"; echo "Download URL: \"$url\"" && \
-    curl $CURL_OPTIONS -o apron.xz -O $url && \
-    # Extract
-    tar xzf apron.xz && \
-    mv apron-* apron && \
-    # Build
-    cd apron && \
-    ./configure && \
-    make -j4 && \
-    make install && \
-    # Cleanup
-    rm -rf /tmp/*
-
-COPY --from=downloader /tmp/ikos.xz /tmp/ikos.xz
-
-RUN echo "IKOS" && \
-    echo "Extract IKOS" && \
-    cd /tmp && \
-    tar zxf ikos.xz && \
-    # remove version from folder name
-    mv ikos-* ikos && \
-    cd /tmp/ikos && \
-    # Patch IKOS to allow LLVM14+
-    #sed -i 's/(LLVM_VERSION VERSION_LESS "14") OR (NOT (LLVM_VERSION VERSION_LESS "15"))/(LLVM_VERSION VERSION_LESS "14")/g' analyzer/CMakeLists.txt frontend/llvm/CMakeLists.txt && \
-    # Build IKOS
-    echo "Build IKOS" && \
-    mkdir build && cd build && \
-    cmake \
-    -DCMAKE_INSTALL_PREFIX="/opt/ikos" \
-    -DCMAKE_BUILD_TYPE="Debug" \
-    -DLLVM_CONFIG_EXECUTABLE="/usr/lib/llvm-$LLVM_VERSION/bin/llvm-config" \
-    -DMPFR_ROOT=/usr \
-    -DPPL_ROOT=/usr \
-    -DAPRON_ROOT=/usr/local \
-    .. && \
-    make -j4 && \
-    echo "Install IKOS" && \
-    make install && \
-    echo "Test Run 1" && \
-    /opt/ikos/bin/ikos --version && \
-    echo "Build Python Module" && \
-    cd /tmp/ikos/build && \
-    python3 -m build --no-isolation --outdir "/opt/ikos/dist/" --wheel "analyzer/python" && \
-    find /opt/ikos/dist -name "*.whl" -exec ls -la {} + && \
-    echo "Install Python Module" && \
-    python3 -m pip install --no-cache-dir "$(find /opt/ikos/dist -name "ikos-*.whl")" --target "/opt/ikos/python-module" && \
-    export PYTHONPATH="/opt/ikos/python-module" && \
-    echo "Test Run 2" && \
-    /opt/ikos/bin/ikos --version && \
-    echo "Cleanup" && \
-    apt-get autoremove -y && \
-    apt-get clean autoclean && \
-    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
-
-# +-----------------------------+
-# | BASE IMAGE                  |        See https://hub.docker.com/_/debian
-# +-----------------------------+
-
-FROM debian:trixie-slim AS cpp-devbox-base
-
-# +-----------------------------+
-# | REUSE GLOBAL ARGS           |
-# +-----------------------------+
-
-ARG DEBIAN_VERSION
-ARG DEBIAN_VERSION_NAME
-ARG GCC_VERSION
-ARG LLVM_VERSION
-
-# +-----------------------------+
-# | METADATA                    |
-# +-----------------------------+
-# Standardized Docker Image Labels
-# https://github.com/opencontainers/image-spec/blob/main/annotations.md
-
-LABEL \
-    maintainer="Jens A. Koch <jakoch@web.de>" \
-    org.opencontainers.image.created="$(date --utc --iso-8601=seconds)" \
-    org.opencontainers.image.authors='Jens A. Koch <jakoch@web.de>' \
-    org.opencontainers.image.url='https://ghcr.io/jakoch/cpp-devbox' \
-    org.opencontainers.image.source='https://github.com/jakoch/cpp-devbox'\
-    org.opencontainers.image.title='ghcr.io/jakoch/cpp-devbox'\
-    org.opencontainers.image.description="C++ DevBox (Debian ${DEBIAN_VERSION}-${DEBIAN_VERSION_NAME} with LLVM ${LLVM_VERSION%%.*} & GCC ${GCC_VERSION%%.*}, CMake, VCPKG, zsh)" \
-    org.opencontainers.image.licenses=MIT
-
-
-#
-#  8888888b.                    888
-#  888   Y88b                   888
-#  888    888                   888
-#  888   d88P  8888b.   .d8888b 888  888  8888b.   .d88b.   .d88b.  .d8888b
-#  8888888P"      "88b d88P"    888 .88P     "88b d88P"88b d8P  Y8b 88K
-#  888        .d888888 888      888888K  .d888888 888  888 88888888 "Y8888b.
-#  888        888  888 Y88b.    888 "88b 888  888 Y88b 888 Y8b.          X88
-#  888        "Y888888  "Y8888P 888  888 "Y888888  "Y88888  "Y8888   88888P'
-#                                                      888
-#                                                 Y8b d88P
-#                                                  "Y88P"
-
-ENV DEBIAN_FRONTEND=noninteractive \
-    DEBCONF_NOWARNINGS="yes" \
-    CURL_OPTIONS="--silent --show-error --retry 5 --location"
-
-RUN echo "Packages" && \
-    apt-get update && apt-get install --no-install-recommends --assume-yes \
-    gnupg2 ca-certificates \
-    # package seems gone, was used in LLVM section below: software-properties-common \
-    build-essential \
-    wget git nano jq \
-    # code analysis
-    cppcheck \
-    valgrind \
-    # profiling
-    # gprof
-    linux-perf \
-    # code coverage  (gcov is part of GCC)
-    gcovr lcov \
-    # tracing
-    strace ltrace \
-    # assembler
-    nasm fasm \
-    # build tools (cmake is build from source)
-    meson \
-    # required by Visual Studio
-    g++ gdb make ninja-build rsync zip sudo \
-    # required by VCPKG
-    openssh-server tar curl unzip pkg-config bash-completion \
-    # optional downloader for VCPKG
-    aria2 \
-    # required by LLVM
-    lsb-release zlib1g-dev \
-    # locale
-    locales \
-    # shell
-    zsh \
-    # optional tools for Doxygen
-    python3 python3-pip \
-    python3-sphinx python3-sphinx-rtd-theme python3-defusedxml sphinx-common \
-    # for the IKOS module
-    python3-venv \
-    graphviz && \
-    # Cleanup
-    apt-get autoremove -y && \
-    apt-get clean autoclean && \
-    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
-
-#
-#   .d8888b.  d8b 888    888               888             .d8888b.  888      8888888
-#  d88P  Y88b Y8P 888    888               888            d88P  Y88b 888        888
-#  888    888     888    888               888            888    888 888        888
-#  888        888 888888 88888b.  888  888 88888b.        888        888        888
-#  888  88888 888 888    888 "88b 888  888 888 "88b       888        888        888
-#  888    888 888 888    888  888 888  888 888  888       888    888 888        888
-#  Y88b  d88P 888 Y88b.  888  888 Y88b 888 888 d88P       Y88b  d88P 888        888
-#   "Y8888P88 888  "Y888 888  888  "Y88888 88888P"         "Y8888P"  88888888 8888888
-#
-
-# Website: https://cli.github.com/
-# Installation Instructions: https://github.com/cli/cli/blob/trunk/docs/install_linux.md#official-sources
-
-SHELL ["/bin/bash", "-o", "pipefail", "-c"]
-RUN echo "GITHUB CLI" && \
-    curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg && \
-    chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg && \
-    echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | tee /etc/apt/sources.list.d/github-cli.list > /dev/null && \
-    apt-get update && apt-get install --no-install-recommends --assume-yes \
-    gh && \
-    # Cleanup
-    apt-get autoremove -y && \
-    apt-get clean autoclean && \
-    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
-
-#
-#   .d8888b.  888b     d888          888
-#  d88P  Y88b 8888b   d8888          888
-#  888    888 88888b.d88888          888
-#  888        888Y88888P888  8888b.  888  888  .d88b.
-#  888        888 Y888P 888     "88b 888 .88P d8P  Y8b
-#  888    888 888  Y8P  888 .d888888 888888K  88888888
-#  Y88b  d88P 888   "   888 888  888 888 "88b Y8b.
-#   "Y8888P"  888       888 "Y888888 888  888  "Y8888
-#
-
-# Latest Release: https://github.com/Kitware/CMake/releases/latest
-
-SHELL ["/bin/bash", "-o", "pipefail", "-c"]
-RUN echo "CMake" && \
-    version="$(curl -s https://api.github.com/repos/Kitware/CMake/releases/latest | jq -r '.tag_name' | cut -c 2-)"; echo "Latest Version: \"$version\"" && \
-    url="https://github.com/Kitware/CMake/releases/download/v$version/cmake-$version-linux-x86_64.sh"; echo "Download URL: \"$url\"" && \
-    curl $CURL_OPTIONS -O $url && \
-    mkdir /opt/cmake && \
-    sh cmake-$version-linux-x86_64.sh --prefix=/opt/cmake --skip-license && \
-    ln -sF /opt/cmake/bin/cmake /usr/bin/cmake && \
-    ln -sF /opt/cmake/bin/ccmake /usr/bin/ccmake && \
-    ln -sF /opt/cmake/bin/cmake-gui /usr/bin/cmake-gui && \
-    ln -sF /opt/cmake/bin/cpack /usr/bin/cpack && \
-    ln -sF /opt/cmake/bin/ctest /usr/bin/ctest && \
-    rm -rf cmake-$version-linux-x86_64.sh
-
-#
-#  888     888  .d8888b.  8888888b.  888    d8P   .d8888b.
-#  888     888 d88P  Y88b 888   Y88b 888   d8P   d88P  Y88b
-#  888     888 888    888 888    888 888  d8P    888    888
-#  Y88b   d88P 888        888   d88P 888d88K     888
-#   Y88b d88P  888        8888888P"  8888888b    888  88888
-#    Y88o88P   888    888 888        888  Y88b   888    888
-#     Y888P    Y88b  d88P 888        888   Y88b  Y88b  d88P
-#      Y8P      "Y8888P"  888        888    Y88b  "Y8888P88
-#
-
-# vcpkg requires curl, unzip, tar, pkg-config (optional cmake).
-# We use the installed binaries from the system.
-# We do not download latest version of CMake and Ninja during vcpkg bootstrap.
-
-ENV VCPKG_ROOT=/opt/vcpkg \
-    VCPKG_TRIPLET=x64-linux \
-    VCPKG_FORCE_SYSTEM_BINARIES=1 \
-    VCPKG_USE_SYSTEM_BINARIES=1
-ENV PATH="${PATH}:${VCPKG_ROOT}"
-
-SHELL ["/bin/bash", "-o", "pipefail", "-c"]
-RUN echo "VCPKG" && \
-    git clone --depth=1 --no-tags \
-    -c core.eol=lf \
-    -c core.autocrlf=false \
-    -c fsck.zeroPaddedFilemode=ignore \
-    -c fetch.fsck.zeroPaddedFilemode=ignore \
-    -c receive.fsck.zeroPaddedFilemode=ignore \
-    https://github.com/microsoft/vcpkg "${VCPKG_ROOT}" && \
-    "${VCPKG_ROOT}"/bootstrap-vcpkg.sh -disableMetrics
-
-#
-#   .d8888b.   .d8888b.         d8888  .d8888b.  888    888 8888888888
-#  d88P  Y88b d88P  Y88b       d88888 d88P  Y88b 888    888 888
-#  888    888 888    888      d88P888 888    888 888    888 888
-#  888        888            d88P 888 888        8888888888 8888888
-#  888        888           d88P  888 888        888    888 888
-#  888    888 888    888   d88P   888 888    888 888    888 888
-#  Y88b  d88P Y88b  d88P  d8888888888 Y88b  d88P 888    888 888
-#   "Y8888P"   "Y8888P"  d88P     888  "Y8888P"  888    888 8888888888
-#
-
-SHELL ["/bin/bash", "-o", "pipefail", "-c"]
-RUN echo "CCACHE" && \
-    version="$(curl -s https://api.github.com/repos/ccache/ccache/releases/latest | jq -r '.tag_name' | cut -c 2-)"; echo "Latest Version: \"$version\"" && \
-    url="https://github.com/ccache/ccache/releases/download/v$version/ccache-$version-linux-x86_64.tar.xz"; echo "Download URL: \"$url\"" && \
-    curl $CURL_OPTIONS -sLO $url && \
-    mkdir -p /opt/ccache/bin &&\
-    tar xf ccache-$version-linux-x86_64.tar.xz --strip-components=1 -C /opt/ccache/bin && \
-	ln -s /opt/ccache/bin/ccache /usr/bin && \
-	rm ccache-$version-linux-x86_64.tar.xz
-
-#
-#  888  .d8888b.  8888888b.  888    888 8888888888 888b    888
-#  888 d88P  Y88b 888   Y88b 888   d88P 888        8888b   888
-#  888 888    888 888    888 888  d8P   888        88888b  888
-#  888 888        888   d88P 888d88K    8888888    888Y88b 888
-#  888 888        8888888P"  8888888b   888        888 Y88b888
-#  888 888    888 888        888  Y88b  888        888  Y88888
-#  888 Y88b  d88P 888        888   Y88b 888        888   Y8888
-#  888  "Y8888P"  888        888    Y88b 8888888888 888    Y888
-#
-
-# We are using the prebuilt binaries for x64.
-
-SHELL ["/bin/bash", "-o", "pipefail", "-c"]
-RUN echo "DOXYGEN" && \
-    version_string="$(curl -s https://api.github.com/repos/doxygen/doxygen/releases/latest | jq -r '.tag_name')"; echo "Latest Version: \"$version_string\"" && \
-    version_number="$(echo $version_string | cut -c 9- | sed 's/_/./g')" && \
-    url="https://github.com/doxygen/doxygen/releases/download/$version_string/doxygen-$version_number.linux.bin.tar.gz"; echo "Download URL: \"$url\"" && \
-    curl $CURL_OPTIONS -sLO $url && \
-    mkdir /opt/doxygen && \
-    tar xf doxygen-$version_number.linux.bin.tar.gz --strip-components=1 -C /opt/doxygen && \
-    ln -s /opt/doxygen/bin/doxygen /usr/bin && \
-    rm doxygen-$version_number.linux.bin.tar.gz
-
-#
-#  8888888 888    d8P   .d88888b.   .d8888b.
-#    888   888   d8P   d88P" "Y88b d88P  Y88b
-#    888   888  d8P    888     888 Y88b.
-#    888   888d88K     888     888  "Y888b.
-#    888   8888888b    888     888     "Y88b.
-#    888   888  Y88b   888     888       "888
-#    888   888   Y88b  Y88b. .d88P Y88b  d88P
-#  8888888 888    Y88b  "Y88888P"   "Y8888P"
-#
-
-COPY --from=ikos-builder /opt/ikos /opt/ikos
-
-ENV PATH="/opt/ikos/bin:${PATH}" \
-	PYTHONPATH="/opt/ikos/python-module"
-
-SHELL ["/bin/bash", "-o", "pipefail", "-c"]
-RUN apt-get update && apt-get install --no-install-recommends --assume-yes \
-    python3 python3-pip python3-venv python3-pygments python3-setuptools && \
-    # Cleanup
-    apt-get autoremove -y && \
-    apt-get clean autoclean && \
-    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* && \
-    # Install IKOS Python module (* for dynamic version)
-	python3 -m pip install --no-cache-dir "$(find /opt/ikos/dist -name "ikos-*.whl")" --target "/opt/ikos/python-module" && \
-    # Test
-	ikos --version
-
-#
-#  888      888      888     888 888b     d888
-#  888      888      888     888 8888b   d8888
-#  888      888      888     888 88888b.d88888
-#  888      888      Y88b   d88P 888Y88888P888
-#  888      888       Y88b d88P  888 Y888P 888
-#  888      888        Y88o88P   888  Y8P  888
-#  888      888         Y888P    888   "   888
-#  88888888 88888888     Y8P     888       888
-#
-
-# For an installation using the llvm.sh setup script:
-# RUN curl -sLO https://apt.llvm.org/llvm.sh && chmod +x llvm.sh && ./llvm.sh ${LLVM_VERSION} all && rm ./llvm.sh
-
-# for installation using add-apt-repository from software-properties-common
-#add-apt-repository -y "deb http://apt.llvm.org/$DEBIAN_VERSION_NAME/ llvm-toolchain$LINKNAME-$LLVM_VERSION main" && \
-#add-apt-repository "deb http://httpredir.debian.org/debian sid main" && \
-
-SHELL ["/bin/bash", "-o", "pipefail", "-c"]
-RUN echo "LLVM" && \
-    if [ "$DEBIAN_VERSION_NAME" == "trixie" ]; then DEBIAN_VERSION_NAME="unstable"; fi && \
-    if [ "$DEBIAN_VERSION_NAME" == "unstable" ]; then LINKNAME=""; else LINKNAME="-$DEBIAN_VERSION_NAME"; fi && \
-    curl -s https://apt.llvm.org/llvm-snapshot.gpg.key | tee /etc/apt/trusted.gpg.d/apt.llvm.org.asc && \
-    echo "deb http://apt.llvm.org/$DEBIAN_VERSION_NAME/ llvm-toolchain$LINKNAME-$LLVM_VERSION main" >> /etc/apt/sources.list.d/llvm.list && \
-    echo "deb http://httpredir.debian.org/debian sid main" >> /etc/apt/sources.list.d/sid.list && \
-    apt-get update && apt-get install --no-install-recommends --assume-yes \
-    # Not all LLVM key packages are installed:
-    # ocaml-dev, doc, examples, libclc, mlir, bolt, flang (fortran), wasm, libllvmlibc
-    # libclc (not installed because, implementation detail and not for external use as OpenCL headers)
-    clang-$LLVM_VERSION \
-    clangd-$LLVM_VERSION \
-    clang-tidy-$LLVM_VERSION \
-    clang-format-$LLVM_VERSION \
-    clang-tools-$LLVM_VERSION \
-    llvm-$LLVM_VERSION-dev \
-    llvm-$LLVM_VERSION-runtime \
-    llvm-$LLVM_VERSION-tools \
-    lld-$LLVM_VERSION \
-    lldb-$LLVM_VERSION \
-    libomp-$LLVM_VERSION-dev \
-    libc++-$LLVM_VERSION-dev \
-    libc++abi-$LLVM_VERSION-dev \
-    libclang-rt-$LLVM_VERSION-dev \
-    libclang-common-$LLVM_VERSION-dev \
-    libclang-$LLVM_VERSION-dev \
-    libclang-cpp$LLVM_VERSION-dev \
-    libfuzzer-$LLVM_VERSION-dev \
-    libunwind-$LLVM_VERSION-dev \
-    libclang-rt-$LLVM_VERSION-dev \
-    libpolly-$LLVM_VERSION-dev && \
-    # Cleanup
-    apt-get autoremove -y && \
-    apt-get clean autoclean && \
-    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
-
-# add llvm to path
-ENV PATH="/usr/lib/llvm-${LLVM_VERSION}/bin:/usr/lib/llvm-${LLVM_VERSION}/include:${PATH}"
-
-# first set LD_LIBRARY_PATH (Debian doesn't set LD_LIBRARY_PATH by default.) and then add LLVM lib folder
-ENV LD_LIBRARY_PATH="/usr/lib:/usr/local/lib"
-ENV LD_LIBRARY_PATH="/usr/lib/llvm-${LLVM_VERSION}/lib:${LD_LIBRARY_PATH:-}"
-
-# remove version from binaries
-RUN ln -s /usr/bin/clang-${LLVM_VERSION} /usr/bin/clang && \
-    ln -s /usr/bin/clang++-${LLVM_VERSION} /usr/bin/clang++ && \
-    ln -s /usr/bin/clang-format-${LLVM_VERSION} /usr/bin/clang-format
-
-# update compiler environment vars
-ENV CC=/usr/bin/clang \
-    CXX=/usr/bin/clang++
-
-# update alternatives
-RUN update-alternatives --install /usr/bin/cc cc /usr/bin/clang 100 && \
-    update-alternatives --install /usr/bin/c++ c++ /usr/bin/clang++ 100
-
-#
-#  888b     d888          888      888
-#  8888b   d8888          888      888
-#  88888b.d88888          888      888
-#  888Y88888P888  .d88b.  888  .d88888
-#  888 Y888P 888 d88""88b 888 d88" 888
-#  888  Y8P  888 888  888 888 888  888
-#  888   "   888 Y88..88P 888 Y88b 888
-#  888       888  "Y88P"  888  "Y88888
-#
-
-# We are using Clang++ for compilation, so this download + compile step must happen after installing LLVM+Clang.
-# We don't need to call mold's ./install-build-deps.sh, because all build dependencies are present.
-# Note to overwrite ld: sudo ln -sf /opt/mold/bin/mold $(realpath /usr/bin/ld)
-
-SHELL ["/bin/bash", "-o", "pipefail", "-c"]
-RUN echo "MOLD" && \
-    version="$(curl -s https://api.github.com/repos/rui314/mold/releases/latest | jq -r '.tag_name' | cut -c 2-)"; echo "Latest Version: \"$version\"" && \
-    git clone --branch "v$version" --single-branch --depth 1 --no-tags https://github.com/rui314/mold.git "/tmp/mold" && \
-    cmake -S /tmp/mold -B /tmp/mold/build -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=clang++ && \
-    cmake --build /tmp/mold/build -j "$(nproc)" && \
-    cmake --install /tmp/mold/build --prefix=/opt/mold && \
-    ln -s /opt/mold/bin/mold /usr/bin && \
-    rm -rf /tmp/mold
-
-#
-#   .d8888b.   .d8888b.   .d8888b.
-#  d88P  Y88b d88P  Y88b d88P  Y88b
-#  888    888 888    888 888    888
-#  888        888        888
-#  888  88888 888        888
-#  888    888 888    888 888    888
-#  Y88b  d88P Y88b  d88P Y88b  d88P
-#   "Y8888P88  "Y8888P"   "Y8888P"
-#
-
-RUN echo "GCC - Extract" && \
-    apt-get update && apt-get install --no-install-recommends --assume-yes \
-    cpp-14 g++-14 && \
-    # Cleanup
-    apt-get autoremove -y && \
-    apt-get clean autoclean && \
-    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
-
-# COPY --from=downloader /tmp/gcc.xz /tmp/gcc.xz
-# RUN echo "GCC - Extract" && \
-#     tar xf /tmp/gcc.xz && rm /tmp/gcc.xz && \
-#     apt-get update && apt-get install --no-install-recommends --assume-yes \
-#     libmpfr-dev libgmp3-dev libmpc-dev
-
-# set default compiler to gcc
-# ENV CC=/usr/bin/gcc \
-#     CXX=/usr/bin/g++
-
-# installing into /usr instead of /usr/local to have consistent paths in CMakePresets:
-# /usr/bin/g++-12
-# /usr/bin/g++-13
-# WORKDIR /gcc-14.2.0
-
-SHELL ["/bin/bash", "-o", "pipefail", "-c"]
-
-# https://gcc.gnu.org/install/configure.html
-# RUN echo "GCC - Compile" && \
-#     ./configure \
-#     --libdir=/usr/lib \
-#     --libexecdir=/usr/lib \
-#     --prefix=/usr \
-#     --program-suffix=-14 \
-#     --build=x86_64-linux-gnu \
-#     --host=x86_64-linux-gnu \
-#     --target=x86_64-linux-gnu \
-#     --disable-multilib \
-#     --disable-libquadmath \
-#     --disable-vtable-verify \
-#     --disable-werror \
-#     --enable-cet \
-#     --enable-lto \
-#     --enable-checking=release \
-#     --enable-clocale=gnu \
-#     --enable-default-pie \
-#     --enable-gnu-unique-object \
-#     --enable-languages=c,c++ \
-#     --enable-libstdcxx-debug \
-#     --enable-libstdcxx-time=yes \
-#     --enable-linker-build-id \
-#     --enable-nls \
-#     --enable-multiarch \
-#     --enable-plugin \
-#     --enable-shared \
-#     --enable-shared-libgcc \
-#     --enable-static \
-#     --enable-threads=posix \
-#     --enable-libsanitizer \
-#     --without-included-gettext \
-#     --without-cuda-driver \
-#     --with-arch-32=i686 \
-#     --with-abi=m64 \
-#     --with-tune=generic \
-#     --with-default-libstdcxx-abi=new \
-#     --with-gcc-major-version-only \
-#     --with-system-zlib && \
-#     make -s -j"$(nproc)" all-gcc > /dev/null 2>&1 && \
-#     make -s -j"$(nproc)" all-target-libgcc > /dev/null 2>&1 && \
-#     make -s -j"$(nproc)" all-target-libsanitizer > /dev/null 2>&1 && \
-#     make -s -j"$(nproc)" all-target-libatomic > /dev/null 2>&1 && \
-#     make install-gcc && \
-#     make install-target-libgcc && \
-#     make install-target-libsanitizer && \
-#     make install-target-libatomic
-
-# return from /gcc-x.y.z folder
-#WORKDIR /
-
-# remove gcc source folder and dependencies
-#RUN echo "GCC - Cleanup" && \
-#    rm -rf gcc-14.2.0 && \
-#    apt-get autoremove -y libmpfr-dev libgmp3-dev libmpc-dev
-
-# reset default compiler to clang
-ENV CC=/usr/bin/clang \
-    CXX=/usr/bin/clang++
-
-#
-#  8888888888P  .d8888b.  888    888
-#        d88P  d88P  Y88b 888    888
-#       d88P   Y88b.      888    888
-#      d88P     "Y888b.   8888888888
-#     d88P         "Y88b. 888    888
-#    d88P            "888 888    888
-#   d88P       Y88b  d88P 888    888
-#  d8888888888  "Y8888P"  888    888
-#
-
-# Setup zsh, ohmyzsh, powerline fonts.
-# Setup zsh plugins: autosuggestions, autocompletions, history search.
-
-ENV TERM=xterm-256color \
-    ZSH_THEME=agnoster
-
-# Setup zsh for the root user
-SHELL ["/bin/bash", "-o", "pipefail", "-c"]
-RUN echo "ZSH" && \
-    apt-get update && apt-get install --no-install-recommends --assume-yes \
-    zsh fontconfig && \
-    # Download and install fonts-powerline
-    # An installation via apt-get is not possible for trixie,
-	# because the package is only available in unstable(sid).
-    # https://packages.debian.org/sid/fonts-powerline
-	# https://api.ftp-master.debian.org/madison?package=fonts-powerline&table=debian
-    FONTS_POWERLINE_VERSION=$(curl -s 'https://api.ftp-master.debian.org/madison?package=fonts-powerline&table=debian&s=unstable&f=json' | jq -r '.[0]["fonts-powerline"].unstable | keys[0]'); echo "Latest Version: \"$FONTS_POWERLINE_VERSION\"" && \
-    FONTS_POWERLINE_URL="http://ftp.de.debian.org/debian/pool/main/p/powerline/fonts-powerline_${FONTS_POWERLINE_VERSION}_all.deb" && \
-    curl -o fonts-powerline.deb -L ${FONTS_POWERLINE_URL} && \
-    dpkg -i fonts-powerline.deb && \
-    rm fonts-powerline.deb && \
-    # Install Oh My Zsh
-    curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh | sh && \
-    # Add Zsh plugins
-    git clone --depth=1 --no-tags https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions && \
-    git clone --depth=1 --no-tags https://github.com/zsh-users/zsh-completions ${ZSH_CUSTOM:=~/.oh-my-zsh/custom}/plugins/zsh-completions && \
-    git clone --depth=1 --no-tags https://github.com/zsh-users/zsh-history-substring-search ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-history-substring-search && \
-    # Update .zshrc
-    sed -i "s/plugins=(git)/plugins=(git zsh-completions zsh-autosuggestions zsh-history-substring-search)/" /root/.zshrc && \
-    sed -i "s/ZSH_THEME=\"agnoster\"/ZSH_THEME=\"robbyrussell\"/" /root/.zshrc && \
-	sed -i "s/# DISABLE_AUTO_UPDATE=\"true\"/DISABLE_AUTO_UPDATE=\"true\"/" /root/.zshrc && \
-	# Cleanup
-	apt-get autoremove -y && \
-    apt-get clean autoclean && \
-    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
-
-# Set the default shell to zsh after it is installed
-ENV SHELL=/bin/zsh
-
-# +-----------------------------+
-# | CLEANUP                     |
-# +-----------------------------+
-
-RUN echo "CLeanup" && \
-    apt-get autoremove -y && \
-    apt-get clean autoclean && \
-    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
-
-# +-----------------------------+
-# | Set Locale + Timezone       |
-# +-----------------------------+
-
-ENV TZ=Europe/Berlin
-
-# configure german locale
-RUN echo "Locale & Timezone" && \
-    ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && \
-    echo $TZ > /etc/timezone && \
-    dpkg-reconfigure tzdata && \
-    sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && \
-    sed -i -e 's/# de_DE.UTF-8 UTF-8/de_DE.UTF-8 UTF-8/' /etc/locale.gen && \
-    echo 'LANG="de_DE.UTF-8"' > /etc/default/locale && \
-    dpkg-reconfigure locales && \
-    update-locale LANG=de_DE.UTF-8 && \
-    echo "export PATH=$PATH" > /etc/environment
-
-#RUN localedef -i de_DE -c -f UTF-8 -A /usr/share/locale/locale.alias de_DE.UTF-8 \
-#    localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8
-# ENV LANG=de_DE.UTF-8 LC_ALL=de_DE.UTF-8
-
-ENV LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 \
-    # Switch back to dialog for any ad-hoc use of apt-get
-    DEBIAN_FRONTEND=dialog
-
-# +----------------------------------+
-# | Stage: mesa-builder              |
-# +----------------------------------+
-
-# FROM cpp-devbox-base AS mesa-builder
-
-# # Mesa Build Options: https://gitlab.freedesktop.org/mesa/mesa/-/blob/main/meson_options.txt
-# #
-# COPY --from=downloader /tmp/mesa.xz /tmp/mesa.xz
-
-# ENV MESA_PACKAGE_FOLDER=/mesa-package
-
-# # +------------------+
-# # | SPIRV-TOOLS      |
-# # +------------------+
-# # Notes:
-# # - SPIRV_VERSION_TAG has to match your LLVM version, see https://github.com/KhronosGroup/SPIRV-LLVM-Translator/releases/latest
-# # - spirv-tools dependency is needed for e.g. spirv-objdump, which is not in the vk sdk
-
-# SHELL ["/bin/bash", "-o", "pipefail", "-c"]
-# RUN SPIRV_VERSION_TAG=$(curl -s https://api.github.com/repos/KhronosGroup/SPIRV-LLVM-Translator/releases/latest | jq -r '.tag_name') && \
-#     LLVM_VERSION=$(llvm-config --version) && \
-#     apt-get update && apt-get install --no-install-recommends --assume-yes \
-#         libcurl4-openssl-dev \
-#         libedit-dev \
-#         libzstd-dev \
-#     # spirv-tools is needed (for e.g. spirv-objdump, because not part of vulkan sdk)
-#         spirv-tools  && \
-#         # Cleanup
-#         apt-get autoremove -y && \
-#         apt-get clean autoclean && \
-#         rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
-#     git clone --branch $SPIRV_VERSION_TAG --single-branch --depth=1 --no-tags https://github.com/KhronosGroup/SPIRV-LLVM-Translator.git && \
-#     mkdir SPIRV-LLVM-Translator/build && \
-#     cd SPIRV-LLVM-Translator/build && \
-#     cmake .. -D BASE_LLVM_VERSION=$LLVM_VERSION && \
-#     make llvm-spirv -j`nproc` && \
-#     cmake --install . --prefix=/usr/local
-
-# SHELL ["/bin/bash", "-o", "pipefail", "-c"]
-# RUN mkdir /tmp/mesa && \
-#     tar xvf /tmp/mesa.xz -C /tmp/mesa --strip-components 1 && \
-#     rm /tmp/mesa.xz && \
-#     #
-#     # Install Mesa dependencies..
-#     #
-#     # TODO not sure if we need all this
-#     #
-#     apt-get update && apt-get install --no-install-recommends --assume-yes \
-#       meson bison byacc flex libzstd-dev pkg-config \
-#       python3-mako python3-ply \
-#       libdrm2 libdrm-dev \
-#       libclc-18-dev \
-#       libexpat1-dev \
-#       libunwind-dev \
-#       libwayland-dev wayland-protocols \
-#       libx11-dev libxext-dev libxfixes-dev \
-#       libxrandr2 libxrandr-dev libxcb-randr0-dev \
-#       libx11-xcb-dev libxcb-dri2-0-dev libxcb-dri3-dev libxcb-present-dev \
-#       libxcb-shm0-dev libxshmfence-dev \
-#       rust-all bindgen cbindgen \
-#       # fix mesa error: libclc shader missing. Consider installing the libclc package
-#       libclc-18 \
-#       # only needed, if vulkan isn't already installed
-#       glslang-tools
-# # Dependencies possibly need when altering Mesa configuration:
-# #      libudev-dev \
-# #      libelf-dev \
-# #      libwayland-egl-backend-dev \
-# #      libxcb-glx0-dev \
-# #      libxxf86vm-dev  && \
-#        # Cleanup
-#        apt-get autoremove -y && \
-#        apt-get clean autoclean && \
-#        rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
-
-# ENV CXXFLAGS="-O2 -g -DDEFAULT_SOFTWARE_DEPTH_BITS=31"
-
-# #
-# # Configure Mesa
-# #
-# # Note: Vulkan drivers require dri3 for X11 support
-# #
-# WORKDIR /tmp/mesa
-# RUN meson build/ \
-#       -D buildtype=release \
-#       -D prefix=/usr \
-#       #-D prefix=/usr/local \
-#       #-D libdir=/usr/local/lib \
-#       -D dri3=enabled \
-#       -D egl=disabled \
-#       -D gallium-drivers=swrast,zink \
-#       -D gallium-nine=false \
-#       -D glx=xlib \
-#       -D gles1=disabled \
-#       -D gles2=disabled \
-#       -D glvnd=disabled \
-#       -D libunwind=enabled \
-#       -D llvm=enabled \
-#       -D microsoft-clc=disabled \
-#       -D osmesa=false \
-#       -D platforms=x11,wayland \
-#       -D valgrind=disabled \
-#       -D vulkan-beta=false \
-#       -D vulkan-drivers=auto && \
-#      #
-#      # Build and Install Mesa
-#      #
-#      ninja -C build/ && \
-#      DESTDIR=${MESA_PACKAGE_FOLDER} && \
-#      ninja -C build/ install && \
-#      rm -rf /tmp/mesa && \
-#      #
-#      # Package Mesa
-#      #
-#      tar cvf mesa-package.tar.gz ${MESA_PACKAGE_FOLDER}
-
-# +----------------------------------+
-# | Stage: cpp-devbox-with-vulkansdk |
-# +----------------------------------+
-
-FROM cpp-devbox-base AS cpp-devbox-with-vulkansdk
-
-# Reuse global arguments
-ARG DEBIAN_VERSION
-ARG DEBIAN_VERSION_NAME
-ARG LLVM_VERSION
-ARG GCC_VERSION
-ARG VULKAN_VERSION
-ARG MESA_VERSION
-
-# +-----------------------------+
-# | METADATA                    |
-# +-----------------------------+
-# Standardized Docker Image Labels
-# https://github.com/opencontainers/image-spec/blob/main/annotations.md
-
-LABEL \
-    maintainer="Jens A. Koch <jakoch@web.de>" \
-    org.opencontainers.image.created="$(date --utc --iso-8601=seconds)" \
-    org.opencontainers.image.authors='Jens A. Koch <jakoch@web.de>' \
-    org.opencontainers.image.url='https://ghcr.io/jakoch/cpp-devbox' \
-    org.opencontainers.image.source='https://github.com/jakoch/cpp-devbox'\
-    org.opencontainers.image.title='ghcr.io/jakoch/cpp-devbox'\
-    org.opencontainers.image.description="C++ DevBox (Debian ${DEBIAN_VERSION}-${DEBIAN_VERSION_NAME} with LLVM ${LLVM_VERSION%%.*} & GCC ${GCC_VERSION%%.*}, VulkanSDK ${VULKAN_VERSION%%.*}, Mesa ${MESA_VERSION%%.*}, CMake, VCPKG, zsh)" \
-    org.opencontainers.image.licenses=MIT
-
-#
-#  888     888          888 888                               .d8888b.  8888888b.  888    d8P
-#  888     888          888 888                              d88P  Y88b 888  "Y88b 888   d8P
-#  888     888          888 888                              Y88b.      888    888 888  d8P
-#  Y88b   d88P 888  888 888 888  888  8888b.  88888b.         "Y888b.   888    888 888d88K
-#   Y88b d88P  888  888 888 888 .88P     "88b 888 "88b           "Y88b. 888    888 8888888b
-#    Y88o88P   888  888 888 888888K  .d888888 888  888             "888 888    888 888  Y88b
-#     Y888P    Y88b 888 888 888 "88b 888  888 888  888       Y88b  d88P 888  .d88P 888   Y88b
-#      Y8P      "Y88888 888 888  888 "Y888888 888  888        "Y8888P"  8888888P"  888    Y88b
-#
-
-COPY --from=downloader /tmp/vulkansdk.xz /tmp/vulkansdk.xz
-
-RUN echo "Vulkan SDK" && \
-    mkdir -p /opt/vulkan && \
-    tar xf /tmp/vulkansdk.xz -C /opt/vulkan && \
-    rm /tmp/vulkansdk.xz
-
-# Note: do not combine the 2 ENV statements.
-# (do not refer to env var within the same statement where it is defined)
-# Note: We are not using VK_ADD_LAYER_PATH, which would search for SDK layers
-# first and then any layers installed on the system. Instead, we use
-# VK_LAYER_PATH to specify the path to the SDK layer manifest .json files.
-ENV VULKAN_SDK=/opt/vulkan/${VULKAN_VERSION}/x86_64
-ENV PATH="$VULKAN_SDK/bin:$PATH" \
-    LD_LIBRARY_PATH="$VULKAN_SDK/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" \
-    VK_LAYER_PATH="$VULKAN_SDK/share/vulkan/explicit_layer.d"
-
-# +-----------------------------+
-# | Mesa                        |
-# +-----------------------------+
-
-# Mesa's software Vulkan implementation is called lavapipe (libvulkan_lvp).
-#
-# To configure Vulkan to use the CPU for rendering, set the environment variable
-# VK_ICD_FILENAMES to the path of the software renderer's JSON file.
-# This JSON file specifies the location of the driver (libvulkan_lvp.so).
-#
-# To test CPU rendering using the Mesa Vulkan drivers, you can use "vkcube",
-# which is a simple spinning-cube app to demonstrate Vulkan functionality.
-#
-
-# Copy the packaged mesa drivers and extract into root.
-#COPY --from=mesa-builder /tmp/mesa-package.tar.gz /tmp
-#RUN tar xvf /tmp/mesa-package.tar.gz -C / --strip-components 1 && \
-#    rm /tmp/mesa-package.tar.gz
-
-RUN echo "Mesa" && \
-    apt-get update && apt-get install --no-install-recommends --assume-yes \
-      libgl1-mesa-dri \
-      mesa-vulkan-drivers && \
-      # Cleanup
-      apt-get autoremove -y && \
-      apt-get clean autoclean && \
-      rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
-
-#
-# https://docs.mesa3d.org/envvars.html
-# LIBGL_ALWAYS_SOFTWARE 1 = use software rendering
-ENV VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/lvp_icd.x86_64.json \
-    LIBGL_ALWAYS_SOFTWARE=1
-
-# The AsciiArt for the VSCode minimap is generated using
-# shellcheck disable=SC2046
-# https://patorjk.com/software/taag/#p=display&h=0&v=0&c=bash&f=Colossal&t=C%2B%2B%20DevBox%0APackages%0AGithub%20CLI%0ACMake%0ADOXYGEN%0AVCPKG%0ACCACHE%0ALLVM%0AGCC%0AZSH%0AVulkan%20SDK
diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
deleted file mode 100644
index ad98c01..0000000
--- a/.devcontainer/devcontainer.json
+++ /dev/null
@@ -1,77 +0,0 @@
-// For format details, see https://aka.ms/vscode-remote/devcontainer.json
-{
-  "name": "C++ DevBox",
-  "build": {
-    // The repository contains two images: bookworm (default) and trixie:
-    // "dockerfile": "./debian/bookworm/Dockerfile",
-    "dockerfile": "./debian/trixie/Dockerfile",
-    // Sets the run context to this .devcontainer folder:
-    "context": "."//,
-    // There are multiple build stages:
-    // "downloader", "cpp-devbox-base" and "cpp-devbox-with-vulkansdk".
-    // To target a specific build stage for testing:
-    //"target": "some-builder"
-  },
-  "capAdd": [
-    "SYS_PTRACE"
-  ],
-  "securityOpt": [
-    "seccomp=unconfined"
-  ],
-  // config settings you would have in ".vscode/settings.json"
-  "customizations": {
-    "vscode": {
-      // Add the IDs of extensions you want installed when the container is created.
-      "extensions": [
-        // EditorConfig
-        "EditorConfig.EditorConfig",
-        // Git + Github
-        "GitHub.vscode-pull-request-github",
-        // C++
-        "ms-vscode.cpptools",
-        "ms-vscode.cpptools-extension-pack",
-        "ms-vscode.cpptools-themes",
-        // CMake
-        "ms-vscode.cmake-tools",
-        "twxs.cmake",
-        // Testing
-        "matepek.vscode-catch2-test-adapter",
-        "ms-vscode.test-adapter-converter",
-        "hbenl.vscode-test-explorer",
-        // LLVM
-        "vadimcn.vscode-lldb",
-        // Spell checking
-        "streetsidesoftware.vscode-spell-checker",
-        // Some additional extensions
-        "Gruntfuggly.todo-tree",
-        "aaron-bond.better-comments",
-        "adam-bender.commit-message-editor",
-        "mhutchie.git-graph"
-      ],
-      "settings": {
-        "extensions.ignoreRecommendations": true,
-        "terminal.integrated.defaultProfile.linux": "zsh",
-        "terminal.integrated.shell.linux": "/bin/zsh",
-        // tell VSCode that you want the shell to be a login, interactive shell
-        "terminal.integrated.shellArgs.linux": [
-          "-l",
-          "-i"
-        ],
-        // LLVM
-        "clangd.path": "clangd",
-        "clang-format.executable": "clang-format",
-        "cmake.cmakePath": "cmake",
-        "cmake.ctestPath": "ctest",
-        "cmake.generator": "Ninja",
-        "cmake.configureOnOpen": true,
-        "lldb.executable": "/usr/bin/lldb",
-        // Spellchecker
-        "cSpell.enabled": true
-      }
-    }
-  },
-  // Use 'postCreateCommand' to run commands after the container is created.
-  "postCreateCommand": "./.devcontainer/scripts/entrypoint.sh",
-  // Set `remoteUser` to `root` to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
-  "remoteUser": "root"
-}
\ No newline at end of file
diff --git a/.devcontainer/scripts/compare-versions.sh b/.devcontainer/scripts/compare-versions.sh
deleted file mode 100644
index efd2acc..0000000
--- a/.devcontainer/scripts/compare-versions.sh
+++ /dev/null
@@ -1,114 +0,0 @@
-#!/bin/sh
-
-# SPDX-FileCopyrightText: 2023-2025 Jens A. Koch
-# SPDX-License-Identifier: MIT
-# This file is part of https://github.com/jakoch/cpp-devbox
-
-# This script compares the versions of packages between Debian releases.
-# It uses the apt-cache madison command to fetch the versions for the bookworm and trixie releases.
-# The versions are then normalized to remove any debian-specific revision or update information.
-# The script prints a table with the package name, source version, and versions for trixie and bookworm.
-# Output format is markdown.
-
-# Requirements:
-# apt install jq, apt-cache, sed, awk, tee, sudo
-#
-# Usage: ./compare-versions.sh <package1> <package2> ...
-#
-
-# Global variables for managing the temporary source file
-TEMP_SOURCE_FILE="/etc/apt/sources.list.d/bookworm-temp.list"
-
-# Function to initialize apt update with the bookworm repository
-add_temporary_apt_list() {
-    # Add bookworm repository temporarily
-    echo "deb http://deb.debian.org/debian bookworm main" | \
-    sudo tee $TEMP_SOURCE_FILE > /dev/null
-
-    # Update package lists for bookworm only
-    sudo apt-get update -o Dir::Etc::sourcelist=$TEMP_SOURCE_FILE \
-                   -o Dir::Etc::sourceparts=/dev/null \
-                   -o APT::Get::List-Cleanup=0 > /dev/null
-}
-
-# Function to remove the temporary apt source file
-remove_temporary_apt_list() {
-    sudo rm -f $TEMP_SOURCE_FILE
-}
-
-# Function to get versions for specific Debian releases and return JSON
-get_versions() {
-    # Fetch versions for bookworm and trixie using apt-cache madison
-    local result=$(apt-cache madison "$1" | awk '
-        /bookworm/ {bookworm_version = $3}
-        /trixie/ {trixie_version = $3}
-        END {
-            printf "{\"bookworm\": \"%s\", \"trixie\": \"%s\"}\n", bookworm_version, trixie_version
-        }')
-
-    # Return JSON result
-    echo "$result"
-}
-
-# Function to normalize version strings
-normalize_version() {
-    # Input: $1 is the version string
-    version="$1"
-
-    # Remove the epoch (if present)
-    normalized_version=$(echo "$version" | sed 's/^[0-9]\+://')
-
-    # Remove any revision or update information (anything after the first hyphen or tilde)
-    normalized_version=$(echo "$normalized_version" | sed 's/[~-][^ ]*$//')
-
-    # Remove any suffix like "+dfsg" after the version
-    normalized_version=$(echo "$normalized_version" | sed 's/\+.*$//')
-
-    # Output the normalized version
-    echo "$normalized_version"
-}
-
-# Function to print a table of package versions
-print_version_table() {
-    # Print header
-    printf "%-16s %-15s %-15s %-15s\n" "" "Source" "Debian" "Debian"
-    printf "%-16s %-15s %-15s %-15s\n" "Package" "Upstream" "Trixie" "Bookworm"
-    echo "-------------------------------------------------------------------------------"
-
-    # Iterate over each package passed as argument
-    for package in "$@"; do
-        # Get the versions for the current package
-        versions=$(get_versions "$package")
-
-        # Parse the JSON result and extract the versions
-        bookworm_version=$(echo "$versions" | jq -r '.bookworm')
-        trixie_version=$(echo "$versions" | jq -r '.trixie')
-
-        # Check if jq failed to parse the versions
-        if [ "$bookworm_version" = "null" ]; then
-            bookworm_version_raw=$(echo "$versions" | jq -r '.bookworm' || echo "$bookworm_version")
-            normalized_bookworm="$bookworm_version_raw"
-        else
-            # Normalize the versions
-            normalized_bookworm=$(normalize_version "$bookworm_version")
-        fi
-
-        if [ "$trixie_version" = "null" ]; then
-            trixie_version_raw=$(echo "$versions" | jq -r '.trixie' || echo "$trixie_version")
-            normalized_trixie="$trixie_version_raw"
-        else
-            # Normalize the versions
-            normalized_trixie=$(normalize_version "$trixie_version")
-        fi
-
-        # Print the row for the current package
-        printf "%-16s %-15s %-15s %-15s\n" "$package" "N/A" "$normalized_trixie" "$normalized_bookworm"
-    done
-}
-
-# Main script execution
-add_temporary_apt_list
-trap remove_temporary_apt_list EXIT  # Ensure cleanup on script exit
-
-# Call the print_version_table function with the desired package names
-print_version_table "$@"
diff --git a/.devcontainer/scripts/entrypoint.sh b/.devcontainer/scripts/entrypoint.sh
deleted file mode 100644
index 41166e3..0000000
--- a/.devcontainer/scripts/entrypoint.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/sh
-
-# SPDX-FileCopyrightText: 2023-2025 Jens A. Koch
-# SPDX-License-Identifier: MIT
-# This file is part of https://github.com/jakoch/cpp-devbox
-
-SCRIPT_DIR=$(dirname "$0")
-
-# Docker Entrypoint
-
-"$SCRIPT_DIR/show-tool-versions.sh"
-
-# VCPKG - update library packages
-
-echo "\n\033[31m[VCPKG] Updating Library Packages\033[0m"
-
-cd "${VCPKG_ROOT}"
-git pull --ff-only
diff --git a/.devcontainer/scripts/show-tool-locations.sh b/.devcontainer/scripts/show-tool-locations.sh
deleted file mode 100644
index 38a6236..0000000
--- a/.devcontainer/scripts/show-tool-locations.sh
+++ /dev/null
@@ -1,73 +0,0 @@
-#!/bin/sh
-
-# SPDX-FileCopyrightText: 2023-2025 Jens A. Koch
-# SPDX-License-Identifier: MIT
-# This file is part of https://github.com/jakoch/cpp-devbox
-
-# This info script shows the locations of tools, compilers and libc.
-# Output format is markdown.
-
-# Function to get all paths of a command and format them comma-separated
-get_command_paths() {
-    commands=$(which -a "$1" | tr '\n' ',' | sed 's/,$//' | sed 's/,/, /g' | cut -c 1-)
-    if [ -n "$commands" ]; then
-      echo "$commands"
-    fi
-}
-
-# Function to print the libc infos
-print_libc_infos() {
-  r1=$(ldd `which cat` | grep libc | awk '{printf ("%s %s %s %s\n", $1, $2, $3, $4)}')
-  r2=$(ldd --verbose /lib/x86_64-linux-gnu/libc.so.6 | grep -E '=>|GLIBC_' | awk '{printf ("%s\t%s\n", $2, $1)}')
-  echo "$r1\n$r2"
-}
-
-# Function to print the tool locations in a table
-show_tool_locations() {
-  printf "\n## Locations\n"
-  echo "\n### \033[31mTools\033[0m"
-  get_command_paths g++-12
-  get_command_paths g++-13
-  get_command_paths g++-14
-  get_command_paths clang++-16
-  get_command_paths clang++-17
-  get_command_paths clang++-18
-  get_command_paths clang++-19
-  get_command_paths cmake
-  get_command_paths meson
-  get_command_paths ninja
-  get_command_paths ccache
-  get_command_paths mold
-  get_command_paths vcpkg
-  get_command_paths lldb
-  get_command_paths valgrind
-  get_command_paths gdb
-  get_command_paths clang-tidy
-  get_command_paths clang-format
-  get_command_paths cppcheck
-  get_command_paths gprof
-  get_command_paths perf
-  get_command_paths strace
-  get_command_paths ltrace
-  get_command_paths lcov
-  get_command_paths gcov
-  get_command_paths gcovr
-  get_command_paths nasm
-  get_command_paths fasm
-  get_command_paths doxygen
-  get_command_paths sphinx-build
-  get_command_paths git
-  get_command_paths gh
-
-  echo "### \033[31mlibc\033[0m"
-  print_libc_infos
-
-  echo "### \033[31mVulkan-SDK Path\033[0m"
-  echo $VULKAN_SDK
-
-  echo "### \033[31mEnvironment Path\033[0m"
-  echo $PATH | tr ':' '\n'
-}
-
-# Call the function to show the tool locations
-show_tool_locations
diff --git a/.devcontainer/scripts/show-tool-versions.sh b/.devcontainer/scripts/show-tool-versions.sh
deleted file mode 100644
index a399b86..0000000
--- a/.devcontainer/scripts/show-tool-versions.sh
+++ /dev/null
@@ -1,130 +0,0 @@
-#!/bin/sh
-
-# SPDX-FileCopyrightText: 2023-2025 Jens A. Koch
-# SPDX-License-Identifier: MIT
-# This file is part of https://github.com/jakoch/cpp-devbox
-
-# This info script shows the version of tools, compilers and libc.
-# Output format is markdown.
-
-# Function to print a table row in Markdown format
-print_row() {
-    printf "| %-13s | %-19s |\n" "$1" "$2"
-}
-
-# Function to check and print GCC versions if installed
-print_row_gcc() {
-    for version in 12 13 14 15 16; do
-        gcc_path="/usr/bin/g++-$version"
-        if [ -x "$gcc_path" ]; then
-            gcc_version=$("$gcc_path" --version | awk 'NR==1 {print $NF}')
-            print_row "GCC $version" "$gcc_version"
-        fi
-    done
-}
-
-# Function to check and print GCC versions if installed
-print_row_clang() {
-    for version in 16 17 18 19 20 21; do
-        clang_path="/usr/bin/clang++-$version"
-        if [ -x "$clang_path" ]; then
-            clang_version=$("$clang_path" --version | head -n1 | awk '{print $4}')
-            print_row "Clang $version" "$clang_version"
-        fi
-    done
-}
-
-# Function to check if a package is installed
-is_installed() {
-  package=$1
-  if dpkg -l | grep "$package" > /dev/null; then
-    return 0
-  else
-    return 1
-  fi
-}
-
-# Function to check if mesa-vulkan-drivers is installed
-is_installed_mesa() {
-  is_installed "mesa-vulkan-drivers"
-}
-
-# Function to check if Vulkan SDK is installed
-is_installed_vulkan_sdk() {
-    is_installed "libvulkan1"
-}
-
-# Function to print the tool versions in a table
-show_tool_versions() {
-    # Assign versions to variables
-    clang_version=$(clang --version | head -n1 | awk '{print $4}')
-    cmake_version=$(cmake --version | head -n1 | awk '{print $3}')
-    meson_version=$(meson --version)
-    ninja_version=$(ninja --version)
-    ccache_version=$(ccache --version | head -n1 | awk '{print $3}')
-    mold_version=$(mold --version | awk '{print $2}')
-    vcpkg_version=$(vcpkg --version | head -n1 | awk '{print substr($6, 0, 19)}')
-    lldb_version=$(lldb --version | awk '{print $3}')
-    valgrind_version=$(valgrind --version | cut -c 10-)
-    gdb_version=$(gdb --version | head -n1 | awk '{print $5}')
-    clang_tidy_version=$(clang-tidy --version | head -n1 | awk '{print $4}')
-    clang_format_version=$(clang-format --version | head -n1 | awk '{print $4}')
-    cppcheck_version=$(cppcheck --version | awk '{print $2}')
-    gprof_version=$(gprof --version | head -n1 | awk '{print $7}')
-    perf_version=$(perf --version | awk '{print $3}')
-    strace_version=$(strace --version | head -n1 | awk '{print $4}')
-    ltrace_version=$(ltrace --version | head -n1 | awk '{print $2}')
-    lcov=$(lcov --version | head -n1 | awk '{print $4}')
-    gcov=$(gcov --version | head -n1 | awk '{print $3}' | cut -d'-' -f1)
-    gcovr=$(gcovr --version | head -n1 | awk '{print $2}')
-    nasm_version=$(nasm --version | head -n1 | awk '{print $3}')
-    fasm_version=$(fasm --version | head -n1 | awk '{print $4}')
-    doxygen_version=$(doxygen -v | awk '{print $1}')
-    sphinx_version=$(sphinx-build --version | awk '{print $2}')
-    git_version=$(git --version | cut -c 13-)
-    github_cli_version=$(gh --version | awk '{print $3}')
-    mesa_version=$(dpkg -l | grep "mesa-vulkan-drivers" | awk '{print $3}')
-    vulkan_version=$(echo $VULKAN_SDK | awk -F '/' '{print $4}')
-
-    printf "## Version Overview\n\n"
-
-    # Print table header in Markdown format
-    printf "| Tool          | Version             |\n"
-    printf "|:--------------|:--------------------|\n"
-
-    # Print each row of the table in Markdown format
-    print_row_gcc
-    print_row_clang
-    print_row "CMake" "$cmake_version"
-    print_row "Meson" "$meson_version"
-    print_row "Ninja" "$ninja_version"
-    print_row "ccache" "$ccache_version"
-    print_row "mold" "$mold_version"
-    print_row "vcpkg" "$vcpkg_version"
-    print_row "lldb" "$lldb_version"
-    print_row "Valgrind" "$valgrind_version"
-    print_row "cppcheck" "$cppcheck_version"
-    print_row "gprof" "$gprof_version"
-    print_row "perf" "$perf_version"
-    print_row "strace" "$strace_version"
-    print_row "ltrace" "$ltrace_version"
-    print_row "lcov" "$lcov"
-    print_row "gcov" "$gcov"
-    print_row "gcovr" "$gcovr"
-    print_row "nasm" "$nasm_version"
-    print_row "fasm" "$fasm_version"
-    print_row "Doxygen" "$doxygen_version"
-    print_row "sphinx" "$sphinx_version"
-    print_row "git" "$git_version"
-    print_row "gh cli" "$github_cli_version"
-    printf "|:--------------|:--------------------|\n"
-    if is_installed_mesa; then
-        print_row "Mesa" "$mesa_version"
-    fi
-    if is_installed_vulkan_sdk; then
-        print_row "Vulkan SDK" "$vulkan_version"
-    fi
-}
-
-# Call the function to show the tool versions
-show_tool_versions
diff --git a/.dockerignore b/.dockerignore
deleted file mode 100644
index a5fa258..0000000
--- a/.dockerignore
+++ /dev/null
@@ -1,25 +0,0 @@
-#
-# Excludes files and folders from the Docker context
-#
-# Docs: https://docs.docker.com/engine/reference/builder/#dockerignore-file
-#
-
-# Folders
-.devcontainer/
-.git/
-.github/
-.vscode/
-assets/
-build-tools/
-devbox-test/
-
-# Files
-.dockleignore
-.editorconfig
-.gitattributes
-.gitignore
-.hadolint.yml
-CHANGELOG.md
-cspell.json
-LICENSE
-README.md
diff --git a/.dockleignore b/.dockleignore
deleted file mode 100644
index 8faaf28..0000000
--- a/.dockleignore
+++ /dev/null
@@ -1,25 +0,0 @@
-#
-# Ignore rules for https://github.com/goodwithtech/dockle
-#
-# https://github.com/goodwithtech/dockle?tab=readme-ov-file#checkpoint-summary
-#
-
-CIS-DI-0001 # Create a user for the container
-# Disabled because:
-# Currently user is root.
-# This is a devcontainer image for usage inside VSCode or a CI pipeline.
-
-CIS-DI-0005 # Enable Content trust for Docker
-# Disabled because:
-# This is open-source. Not messing around with keys and trust for now.
-
-CIS-DI-0006 # Add HEALTHCHECK instruction to the container image
-# Disabled because:
-# The Docker engine itself does not automatically restart unhealthy containers
-# based on HEALTHCHECK pings to the local Docker host.
-# This is also not a server container with a running service,
-# which needs to be kept alive.
-
-CIS-DI-0008 # Confirm safety of setuid/setgid files
-# Disabled because:
-# This is a devcontainer image for usage inside VSCode or a CI pipeline.
diff --git a/.editorconfig b/.editorconfig
deleted file mode 100644
index f387610..0000000
--- a/.editorconfig
+++ /dev/null
@@ -1,57 +0,0 @@
-# This file configures editors using the EditorConfig scheme.
-# https://editorconfig.org/
-
-# guideline support for "Visual Studio 2022" IDE using extension: "PaulHarrington.EditorGuidelinesPreview"
-# https://marketplace.visualstudio.com/items?itemName=PaulHarrington.EditorGuidelinesPreview
-
-# editorconfig support for "VSCode" using extension: "editorconfig.editorconfig"
-# https://marketplace.visualstudio.com/items?itemName=EditorConfig.EditorConfig
-
-root = true
-
-# "visual studio" specific
-vc_generate_documentation_comments = doxygen_slash_star
-
-[*]
-charset = utf-8
-end_of_line = lf
-indent_style = space
-insert_final_newline = true
-
-# "visual studio" specific
-spelling_languages = en-us
-guidelines = 80 dashed, 130
-
-[CMakeLists.txt, *.{cmake}]
-indent_size = 2
-indent_style = space
-
-[*.cmake]
-indent_size = 2
-indent_style = space
-
-[*.{c,cc,cpp,h,hpp,hxx,inl}]
-indent_size = 4
-trim_trailing_whitespace = true
-
-[*.{json,yaml,yml}]
-indent_size = 2
-insert_final_newline = false
-
-[*.sh]
-indent_size = 2
-
-[*.{js,ts}]
-indent_size = 4
-
-[*.{md,markdown}]
-indent_size = 4
-trim_trailing_whitespace = false
-
-# Config files
-[*.{clang-format}]
-indent_size = 2
-
-[Dockerfile]
-indent_style = space
-indent_size = 4
diff --git a/.gitattributes b/.gitattributes
deleted file mode 100644
index 5a481d4..0000000
--- a/.gitattributes
+++ /dev/null
@@ -1,95 +0,0 @@
-# ─────────────────────────────────────────────────────────────────
-# Normalize line endings
-#    - text=auto will convert CRLF to LF in the repo, and back to CRLF on checkout for Windows users
-#    - eol=lf forces LF on all platforms.
-# ─────────────────────────────────────────────────────────────────
-
-*               text=auto
-
-*.md            text eol=lf
-*.sh            text eol=lf
-
-*.ps1           text eol=crlf
-*.bat           text eol=crlf
-*.cmd           text eol=crlf
-
-# ─────────────────────────────────────────────────────────────────
-# Mark certain filetypes explicitly as binary
-# ─────────────────────────────────────────────────────────────────
-*.png           binary
-*.jpg           binary
-*.jpeg          binary
-*.gif           binary
-*.ico           binary
-*.pdf           binary
-*.zip           binary
-
-# Compiled Object files
-*.slo           binary
-*.lo            binary
-*.o             binary
-*.obj           binary
-
-# Precompiled Headers
-*.gch           binary
-*.pch           binary
-
-# Compiled Dynamic libraries
-*.so            binary
-*.dylib         binary
-*.dll           binary
-
-# Compiled Static libraries
-*.lai           binary
-*.la            binary
-*.a             binary
-*.lib           binary
-
-# Executables
-*.exe           binary
-*.out           binary
-*.app           binary
-
-# ─────────────────────────────────────────────────────────────────
-# Custom diff/merge drivers
-# ─────────────────────────────────────────────────────────────────
-*.c             text diff=cpp
-*.cc            text diff=cpp
-*.cxx           text diff=cpp
-*.cpp           text diff=cpp
-*.cpi           text diff=cpp
-*.c++           text diff=cpp
-*.hpp           text diff=cpp
-*.h             text diff=cpp
-*.h++           text diff=cpp
-*.hh            text diff=cpp
-
-# ─────────────────────────────────────────────────────────────────
-# Export‐ignore
-# - This excludes from `git archive` (useful when building tarballs)
-# ─────────────────────────────────────────────────────────────────
-.gitignore      export-ignore
-docs/**         export-ignore
-tests/**        export-ignore
-.github/**      export-ignore
-.vscode/**      export-ignore
-
-# ─────────────────────────────────────────────────────────────────
-# GitHub Linguist overrides
-# - This forces files to count (or not) towards language stats.
-# ─────────────────────────────────────────────────────────────────
-*.md            linguist-documentation
-*.yml           linguist-language=YAML
-*.ui            linguist-generated
-
-# ─────────────────────────────────────────────────────────────────
-# Qt specific
-#    Treat .ui & .qrc files as text (so merges and diffs make sense)
-# ─────────────────────────────────────────────────────────────────
-*.ui            text
-*.qrc           text
-
-# ─────────────────────────────────────────────────────────────────
-# CMake specific
-# ─────────────────────────────────────────────────────────────────
-CMakeLists.txt  text=auto
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
deleted file mode 100644
index 81cc651..0000000
--- a/.github/CODEOWNERS
+++ /dev/null
@@ -1,3 +0,0 @@
-# The following persons will automatically be requested as reviewers for PRs that modify the given paths.
-# See https://help.github.com/articles/about-code-owners/
-* @jakoch
\ No newline at end of file
diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md
deleted file mode 100644
index 01cd2d6..0000000
--- a/.github/CODE_OF_CONDUCT.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# Contributor Covenant Code of Conduct
-
-Please be nice and contribute positively to the project.
diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
deleted file mode 100644
index 46e391a..0000000
--- a/.github/CONTRIBUTING.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# Contributing to this project
-
-Please note that this project is released with a Contributor Code of Conduct. By participating in this project you agree to abide by its terms.
-
-# Reporting Issues
-
-When reporting issues, please try to be as descriptive as possible, and include as much relevant information as you can. A step by step guide on how to reproduce the issue will greatly increase the chances of your issue being resolved in a timely manner.
-
-# Contributing policy
-
-Fork the project, create a feature branch, and send us a pull request.
-
-To ensure a consistent code base, you should make sure the code follows the used standards.
-
-If you would like to help, take a look at the list of open issues.
\ No newline at end of file
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
deleted file mode 100644
index 71085be..0000000
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ /dev/null
@@ -1,5 +0,0 @@
-<!-- Please remember to select the appropriate branch:
-
-For bug fixes pick the oldest branch where the fix applies.
-
-For new features and everything else, use the main branch. Thank you. <3 -->
\ No newline at end of file
diff --git a/.github/SECURITY.md b/.github/SECURITY.md
deleted file mode 100644
index 1e6bedf..0000000
--- a/.github/SECURITY.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# Reporting a vulnerability
-
-If you have found any issues that might have security implications, please send a report privately to jakoch @ web.de
-
-Do not report security reports publicly.
\ No newline at end of file
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
deleted file mode 100644
index f9a13da..0000000
--- a/.github/dependabot.yml
+++ /dev/null
@@ -1,36 +0,0 @@
-# dependabot.yml
-#
-# Dependabot updates dependencies automatically to their latest versions.
-#
-# Docs: https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
-
-version: 2
-
-updates:
-  # Enable automatic version updates for Github Actions
-  - package-ecosystem: "github-actions"
-    # Look for `.github/workflows` in the `root` directory
-    directory: "/"
-    schedule:
-      interval: "monthly"
-    commit-message:
-      prefix: "deps(gha): "
-    labels:
-      - "dependencies"
-    # ignore all patch level updates
-    ignore:
-      - dependency-name: "*"
-        update-types: ["version-update:semver-patch"]
-  # Enable automatic version updates for Dockerfile
-  - package-ecosystem: "docker"
-    directory: "./devcontainer"
-    schedule:
-      interval: "monthly"
-    commit-message:
-      prefix: "deps(docker): "
-    labels:
-      - "dependencies"
-    # ignore all patch level updates
-    ignore:
-      - dependency-name: "*"
-        update-types: ["version-update:semver-patch"]
diff --git a/.github/workflows/check-spelling.yml b/.github/workflows/check-spelling.yml
deleted file mode 100644
index d90c43e..0000000
--- a/.github/workflows/check-spelling.yml
+++ /dev/null
@@ -1,37 +0,0 @@
-#
-# SPDX-FileCopyrightText: 2021-2025 Jens A. Koch.
-# SPDX-License-Identifier: MIT
-#
-# This file is part of https://github.com/jakoch/cpp-devbox
-#
-
-name: "Check Spelling"
-
-on:
-  # This workflow runs on pushing to the default branch.
-  push:
-  # You can manually run this workflow.
-  workflow_dispatch:
-
-jobs:
-
-# ---------------------------------------------------------------------------------------
-
-  check-spelling:
-
-# ---------------------------------------------------------------------------------------
-
-    name: "Spell Checker"
-    runs-on: ubuntu-24.04
-
-    steps:
-      - name: 🤘 Checkout Code
-        uses: actions/checkout@v4 # https://github.com/actions/checkout
-
-      - name: 🔽 Install Dependencies
-        run: sudo npm install -g cspell
-
-      - name: 🙏 Check Spelling using cspell
-        run: |
-          export CSPELL_OUTPUT=$(sudo cspell lint --no-summary --no-progress .)
-          if [ -n "$CSPELL_OUTPUT" ]; then echo "$CSPELL_OUTPUT" && exit 1; fi;
\ No newline at end of file
diff --git a/.github/workflows/clean-workflows.yml b/.github/workflows/clean-workflows.yml
deleted file mode 100644
index d5572ea..0000000
--- a/.github/workflows/clean-workflows.yml
+++ /dev/null
@@ -1,206 +0,0 @@
-#
-# SPDX-FileCopyrightText: 2021 Ching Chow.
-# SPDX-FileCopyrightText: 2021-2025 Jens A. Koch.
-# SPDX-License-Identifier: BSL-1.0
-#
-# This file is part of https://github.com/jakoch/cpp-devbox
-#
-
-name: Clean Workflow Runs
-
-on:
-  # This workflow runs at 03:17 daily.
-  # The irregular time is used to avoid Github high load times.
-  schedule:
-    - cron: "17 3 * * *" # GMT
-  # You can manually run this workflow.
-  workflow_dispatch:
-
-jobs:
-  cleanup-workflows:
-    name: "Clean Workflows"
-    runs-on: ubuntu-24.04
-    timeout-minutes: 10
-
-    steps:
-      - name: ✂ Remove cancelled or skipped workflow runs
-        uses: actions/github-script@v7 # https://github.com/actions/github-script
-        with:
-          github-token: ${{ secrets.GITHUB_TOKEN }}
-          script: |
-            const cancelled = await github.rest.actions.listWorkflowRunsForRepo({
-              owner: context.repo.owner,
-              per_page: 50,
-              repo: context.repo.repo,
-              status: 'cancelled',
-            });
-            const skipped = await github.rest.actions.listWorkflowRunsForRepo({
-              owner: context.repo.owner,
-              per_page: 50,
-              repo: context.repo.repo,
-              status: 'skipped',
-            });
-            for (const response of [cancelled, skipped]) {
-              for (const run of response.data.workflow_runs) {
-                console.log(`[Deleting] Run id ${run.id} of '${run.name}' is a cancelled or skipped run.`);
-                await github.rest.actions.deleteWorkflowRun({
-                  owner: context.repo.owner,
-                  repo: context.repo.repo,
-                  run_id: run.id
-                });
-              }
-            }
-
-      - name: ✂ Remove 30 days old workflows runs
-        uses: actions/github-script@v7 # https://github.com/actions/github-script
-        with:
-          github-token: ${{ secrets.GITHUB_TOKEN }}
-          script: |
-            const days_to_expiration = 14;
-            const ms_in_day = 86400000;
-            const now = Date.now();
-            const pages = 5;
-            // add the workflows runs to remove here
-            const workflows = [
-              'release.yml',
-              'check-spelling.yml'
-            ]
-            let runs_to_delete = [];
-            for (const workflow of workflows) {
-              for (let page = 0; page < pages; page += 1) {
-                let response = await github.rest.actions.listWorkflowRuns({
-                  owner: context.repo.owner,
-                  page: page,
-                  per_page: 50,
-                  repo: context.repo.repo,
-                  workflow_id: workflow
-                });
-                if (response.data.workflow_runs.length === 0) break;
-                if (response.data.workflow_runs.length > 0) {
-                  for (const run of response.data.workflow_runs) {
-                    if (now - Date.parse(run.created_at) > ms_in_day * days_to_expiration) {
-                      runs_to_delete.push([run.id, run.name]);
-                    }
-                  }
-                }
-                if (response.data.workflow_runs.length < 50) break;
-              }
-            }
-            for (const run of runs_to_delete) {
-              console.log(`[Deleting] Run id ${run[0]} of '${run[1]}' is older than ${days_to_expiration} days.`);
-              try {
-                await github.rest.actions.deleteWorkflowRun({
-                  owner: context.repo.owner,
-                  repo: context.repo.repo,
-                  run_id: run[0]
-                });
-              } catch (error) {
-                // ignore errors
-              }
-            }
-
-      # https://api.github.com/repos/jakoch/cpp-devbox/actions/workflows/clean-workflows.yml/runs
-      - name: ✂ Remove runs of the cleanup workflow itself
-        uses: actions/github-script@v7 # https://github.com/actions/github-script
-        with:
-          github-token: ${{ secrets.GITHUB_TOKEN }}
-          script: |
-            const pages = 5;
-            let runs_to_delete = [];
-            // Get all workflows
-            const { data: workflowsData } = await github.rest.actions.listRepoWorkflows({
-              owner: context.repo.owner,
-              repo: context.repo.repo
-            });
-            // Find workflow by name
-            const workflowName = "Clean Workflow Runs";
-            const workflow = workflowsData.workflows.find(w => w.name === workflowName);
-            if (!workflow) {
-              console.log(`❌ No workflow named ${workflowName} found.`);
-              return;
-            }
-            const workflowId = workflow.id;
-            console.log(`✅ Found workflow ID: ${workflowId}`);
-            // Fetch workflow runs
-            for (let page = 0; page < pages; page += 1) {
-              const response = await github.rest.actions.listWorkflowRuns({
-                owner: context.repo.owner,
-                repo: context.repo.repo,
-                workflow_id: workflowId, // Use dynamically fetched ID
-                page: page,
-                per_page: 50,
-              });
-              if (response.data.workflow_runs.length === 0) break;
-              if (response.data.workflow_runs.length > 0) {
-                for (const run of response.data.workflow_runs) {
-                    runs_to_delete.push([run.id, run.name]);
-                }
-              }
-              if (response.data.workflow_runs.length < 50) break;
-            }
-            // Delete workflow runs
-            for (const run of runs_to_delete) {
-              console.log(`[Deleting] Run id ${run[0]} of '${run[1]}'.`);
-              try {
-                await github.rest.actions.deleteWorkflowRun({
-                  owner: context.repo.owner,
-                  repo: context.repo.repo,
-                  run_id: run[0]
-                });
-              } catch (error) {
-                // ignore errors
-              }
-            }
-      - name: ✂ Remove Dependabot workflow runs
-        uses: actions/github-script@v7 # https://github.com/actions/github-script
-        with:
-          github-token: ${{ secrets.GITHUB_TOKEN }}
-          script: |
-            const pages = 5;
-            let runs_to_delete = [];
-            // Get all workflows
-            const { data: workflowsData } = await github.rest.actions.listRepoWorkflows({
-              owner: context.repo.owner,
-              repo: context.repo.repo
-            });
-            // Find workflow by name
-            const workflowName = "Dependabot Updates";
-            const workflow = workflowsData.workflows.find(w => w.name === workflowName);
-            if (!workflow) {
-              console.log(`❌ No workflow named ${workflowName} found.`);
-              return;
-            }
-            const workflowId = workflow.id;
-            console.log(`✅ Found workflow ID: ${workflowId}`);
-            // Fetch workflow runs
-            for (let page = 0; page < pages; page += 1) {
-              const response = await github.rest.actions.listWorkflowRuns({
-                owner: context.repo.owner,
-                repo: context.repo.repo,
-                workflow_id: workflowId, // Use dynamically fetched ID
-                page: page,
-                per_page: 50,
-              });
-              if (response.data.workflow_runs.length === 0) break;
-              if (response.data.workflow_runs.length > 0) {
-                for (const run of response.data.workflow_runs) {
-                  if (run.triggering_actor?.login === 'dependabot[bot]') {
-                    runs_to_delete.push([run.id, run.name]);
-                  }
-                }
-              }
-              if (response.data.workflow_runs.length < 50) break;
-            }
-            // Delete workflow runs
-            for (const run of runs_to_delete) {
-              console.log(`[Deleting] Run id ${run[0]} of '${run[1]}'.`);
-              try {
-                await github.rest.actions.deleteWorkflowRun({
-                  owner: context.repo.owner,
-                  repo: context.repo.repo,
-                  run_id: run[0]
-                });
-              } catch (error) {
-                // ignore errors
-              }
-            }
\ No newline at end of file
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
deleted file mode 100644
index 4c64c50..0000000
--- a/.github/workflows/release.yml
+++ /dev/null
@@ -1,352 +0,0 @@
-#
-# SPDX-FileCopyrightText: 2023-2025 Jens A. Koch
-# SPDX-License-Identifier: MIT
-#
-# This file is part of https://github.com/jakoch/cpp-devbox
-#
-
-name: Release
-
-on:
-  # You can manually run this workflow.
-  workflow_dispatch:
-  # This workflow runs on pushing a semantic versioned tag (e.g. v1.0.0).
-  # This workflow does not run when pushing to the main branch.
-  push:
-    #branches:
-    #  - main
-    tags:
-      - 'v[0-9]+.[0-9]+.[0-9]+'
-  # This workflow runs on schedule: every Sunday at 1 am.
-  schedule:
-    - cron: "0 1 * * 0"
-
-env:
-  DOCKERHUB_IMAGE: ${{ github.repository }}
-  GHCR_IMAGE: ghcr.io/${{ github.repository }}
-
-jobs:
-
-# ---------------------------------------------------------------------------------------
-
-  build:
-
-# ---------------------------------------------------------------------------------------
-
-    name: "Build Container"
-    # https://github.com/actions/runner-images
-    runs-on: ubuntu-24.04
-
-    permissions:
-      contents: read
-      packages: write
-      security-events: write # required for trivy-action
-
-    strategy:
-      fail-fast: false
-      matrix:
-        config:
-          - { platform: "linux/amd64", debian_codename: "bookworm", debian_version: "12"}
-          - { platform: "linux/amd64", debian_codename: "trixie", debian_version: "13" }
-
-    steps:
-      - name: ✂️ Free Disk Space
-        uses: jlumbroso/free-disk-space@v1.3.1 # https://github.com/jlumbroso/free-disk-space
-        with:
-          tool-cache: true
-          docker-images: false
-
-      - name: 🤘 Checkout Code
-        uses: actions/checkout@v4 # https://github.com/actions/checkout
-
-      - name: 🔍 Run hadolint
-        uses: hadolint/hadolint-action@v3.1.0 # https://github.com/hadolint/hadolint-action
-        with:
-          dockerfile: .devcontainer/debian/${{ matrix.config.debian_codename }}/Dockerfile
-          no-fail: true
-
-      - name: 🔒 Login to DockerHub Container Registry
-        if: github.event_name != 'pull_request'
-        uses: docker/login-action@v3 # https://github.com/docker/login-action
-        with:
-          username: ${{ github.actor }}
-          password: ${{ secrets.DOCKERHUB_TOKEN }}
-
-      - name: 🔒 Login to Github Container Registry (GHCR)
-        if: github.event_name != 'pull_request'
-        uses: docker/login-action@v3 # https://github.com/docker/login-action
-        with:
-          registry: ghcr.io
-          username: ${{ github.actor }}
-          password: ${{ secrets.GITHUB_TOKEN }}
-
-      - name: 🔽 Setup QEMU
-        uses: docker/setup-qemu-action@v3 # https://github.com/docker/setup-qemu-action
-        with:
-          platforms: ${{ matrix.config.platform }}
-
-      - name: 🔽 Setup Docker Buildx
-        uses: docker/setup-buildx-action@v3 # https://github.com/docker/setup-buildx-action
-
-      # cpp-devbox:{debian_codename}-{{date}}                # only on scheduled builds
-      # cpp-devbox:{debian_codename}-{{version}}             # only on git tag
-      # cpp-devbox:{debian_codename}-{{major}}.{{minor}}     # only on git tag
-      # cpp-devbox:{debian_codename}-{{date}}-sha-{{sha}}    # only on push, not when tagging
-      # cpp-devbox:{debian_codename}-latest                  # always
-      - name: ✏ Setup Docker Metadata ➔ Stage cpp-devbox-base
-        id: metadata-base
-        uses: docker/metadata-action@v5 # https://github.com/docker/metadata-action
-        with:
-          images: |
-            ${{ env.GHCR_IMAGE }}
-            ${{ env.DOCKERHUB_IMAGE }}
-          flavor: |
-            latest=auto
-            prefix=${{ matrix.config.debian_codename }}-
-          tags: |
-            type=schedule,pattern={{ date 'YYYYMMDD' }}
-            type=semver,pattern={{ version }}
-            type=semver,pattern={{ major }}.{{ minor }}
-            type=raw,value={{ date 'YYYYMMDD' }}-sha-{{ sha }},enabled=${{ github.event_name == 'push' }}
-            type=raw,value=latest
-
-      # cpp-devbox:{debian_codename}-with-vulkansdk-{{date}}                # only on scheduled builds
-      # cpp-devbox:{debian_codename}-with-vulkansdk-{{version}}             # only on git tag
-      # cpp-devbox:{debian_codename}-with-vulkansdk-{{major}}.{{minor}}     # only on git tag
-      # cpp-devbox:{debian_codename}-with-vulkansdk-{{date}}-sha-{{sha}}    # only on push, not when tagging
-      # cpp-devbox:{debian_codename}-with-vulkansdk-latest                  # always
-      - name: ✏ Setup Docker Metadata ➔ Stage cpp-devbox-base-with-vulkansdk
-        id: metadata-base-with-vulkansdk
-        uses: docker/metadata-action@v5 # https://github.com/docker/metadata-action
-        with:
-          images: |
-            ${{ env.GHCR_IMAGE }}
-            ${{ env.DOCKERHUB_IMAGE }}
-          flavor: |
-            latest=auto
-            prefix=${{ matrix.config.debian_codename }}-with-vulkansdk-
-          tags: |
-            type=schedule,pattern={{ date 'YYYYMMDD' }}
-            type=semver,pattern={{ version }}
-            type=semver,pattern={{ major }}.{{ minor }}
-            type=raw,value={{ date 'YYYYMMDD' }}-sha-{{ sha }},enabled=${{ github.event_name == 'push' }}
-            type=raw,value=latest
-
-      - name: ✏ Create info.json
-        run: |
-          jq -n --arg version "${{ github.ref_name }}" \
-                --arg commit "${{ github.sha }}" \
-                --arg date "$(date -u +%F)" \
-                '{ version: $version, commit: $commit, date: $date }' > info-${{ matrix.config.debian_codename }}.json
-
-      - name: Check show-tool-versions.sh and make executable
-        run: |
-          ls -l ${{ github.workspace }}/.devcontainer/scripts/show-tool-versions.sh
-          chmod +x ${{ github.workspace }}/.devcontainer/scripts/show-tool-versions.sh
-
-      # Build Image -> Stage: cpp-devbox-base
-      - name: 📦 🚀 Build Image ➔ Stage cpp-devbox-base
-        id: build-base
-        uses: docker/build-push-action@v6 # https://github.com/docker/build-push-action
-        with:
-          context: .
-          file: .devcontainer/debian/${{ matrix.config.debian_codename }}/Dockerfile
-          target: cpp-devbox-base
-          platforms: ${{ matrix.config.platform }}
-          tags: ${{ steps.metadata-base.outputs.tags }}
-          labels: ${{ steps.metadata-base.outputs.labels }}
-          push: false
-          load: true
-          cache-from: type=registry,ref=ghcr.io/${{ github.repository }}:${{ matrix.config.debian_codename }}-latest-cache
-          cache-to: type=registry,ref=ghcr.io/${{ github.repository }}:${{ matrix.config.debian_codename }}-latest-cache,mode=max
-
-      # Build Image -> Stages: cpp-devbox-base + cpp-devbox-with-vulkansdk = with-vulkansdk
-      - name: 📦 🚀 Build Image ➔ Stage cpp-devbox-with-vulkansdk
-        id: build-base-with-vulkansdk
-        uses: docker/build-push-action@v6 # https://github.com/docker/build-push-action
-        with:
-          context: .
-          file: .devcontainer/debian/${{ matrix.config.debian_codename }}/Dockerfile
-          target: cpp-devbox-with-vulkansdk
-          platforms: ${{ matrix.config.platform }}
-          tags: ${{ steps.metadata-base-with-vulkansdk.outputs.tags }}
-          labels: ${{ steps.metadata-base-with-vulkansdk.outputs.labels }}
-          push: false
-          load: true
-          cache-from: type=registry,ref=ghcr.io/${{ github.repository }}:${{ matrix.config.debian_codename }}-with-vulkansdk-latest-cache
-          cache-to: type=registry,ref=ghcr.io/${{ github.repository }}:${{ matrix.config.debian_codename }}-with-vulkansdk-latest-cache,mode=max
-
-      # This provides: ${{ steps.get_image_name_base.outputs.name }}
-      - name: Get image name for base
-        id: get_image_name_base
-        run: |
-          name=$(echo '${{ steps.build-base.outputs.metadata }}' | jq -r '."image.name" | split(",") | .[0]')
-          echo "name=$name" >> $GITHUB_OUTPUT
-
-      # This provides: ${{ steps.get_image_name_base_with_vulkan.outputs.name }}
-      - name: Get image name for base with vulkan
-        id: get_image_name_base_with_vulkan
-        run: |
-          name=$(echo '${{ steps.build-base-with-vulkansdk.outputs.metadata }}' | jq -r '."image.name" | split(",") | .[0]')
-          echo "name=$name" >> $GITHUB_OUTPUT
-
-      - name: ℹ️ Run cpp-devbox Container to grab version info
-        id: run-container-base
-        run: |
-          README="README-${{ matrix.config.debian_codename }}-base.md"
-          VERSIONS="versions-${{ matrix.config.debian_codename }}-base.md"
-          echo "# cpp-devbox ${{ github.ref_name }} ($(date '+%Y-%m-%d'))" >> $README
-          echo -e "\n" >> $README
-          echo "OS Version:  Debian ${{ matrix.config.debian_version }} ${{ matrix.config.debian_codename }}" >> $README
-          echo "Image Version: ${{ steps.get_image_name_base.outputs.name }}" >> $README
-          echo -e "\n" >> $README
-          docker run --rm -v ${{ github.workspace }}/.devcontainer/scripts:/workspace ${{ steps.get_image_name_base.outputs.name }} /bin/zsh -c "cat /etc/os-release; pwd; ls -l /workspace"
-          docker run --rm -v ${{ github.workspace }}/.devcontainer/scripts:/workspace ${{ steps.get_image_name_base.outputs.name }} /bin/zsh -c "/workspace/show-tool-versions.sh" > $VERSIONS
-          cat $VERSIONS >> $README
-
-      - name: ℹ️ Run cpp-devbox-with-vulkansdk Container to grab version info
-        id: run-container-with-vulkan
-        run: |
-          README="README-${{ matrix.config.debian_codename }}-with-vulkansdk.md"
-          VERSIONS="versions-${{ matrix.config.debian_codename }}-with-vulkan.md"
-          echo "# cpp-devbox ${{ github.ref_name }} ($(date '+%Y-%m-%d'))" >> $README
-          echo -e "\n" >> $README
-          echo "OS Version:  Debian ${{ matrix.config.debian_version }} ${{ matrix.config.debian_codename }} with Vulkan SDK" >> $README
-          echo "Image Version: ${{ steps.get_image_name_base_with_vulkan.outputs.name }}" >> $README
-          echo -e "\n" >> $README
-          docker run --rm -v ${{ github.workspace }}/.devcontainer/scripts:/workspace ${{ steps.get_image_name_base_with_vulkan.outputs.name }} /bin/zsh -c "cat /etc/os-release; pwd; ls -l /workspace"
-          docker run --rm -v ${{ github.workspace }}/.devcontainer/scripts:/workspace ${{ steps.get_image_name_base_with_vulkan.outputs.name }} /bin/zsh -c "/workspace/show-tool-versions.sh" > $VERSIONS
-          cat $VERSIONS >> $README
-
-      - name: Push all images and all tags
-        run: |
-          docker push --all-tags ${{ env.GHCR_IMAGE }}
-          docker push --all-tags ${{ env.DOCKERHUB_IMAGE }}
-
-      - name: List Docker Images
-        run: |
-          docker images --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}\t{{.Size}}"
-          docker images --digests
-
-      - name: Test Docker Image
-        run: |
-          docker run --rm -v "${PWD}/devbox-test:/src" -w /src ghcr.io/jakoch/cpp-devbox:trixie-latest zsh -c "./build.sh"
-
-      - name: 📦 Provide the version info and info.json as a release asset
-        uses: actions/upload-artifact@v4 # https://github.com/actions/upload-artifact
-        with:
-          name: version-info-${{ matrix.config.debian_codename }}
-          path: |
-            info-${{ matrix.config.debian_codename }}.json
-            versions-${{ matrix.config.debian_codename }}-base.md
-            versions-${{ matrix.config.debian_codename }}-with-vulkan.md
-            README-${{ matrix.config.debian_codename }}-base.md
-            README-${{ matrix.config.debian_codename }}-with-vulkansdk.md
-
-      - name: 🛡️🔍 Scan Image for Vulnerabilities using Trivy
-        uses: aquasecurity/trivy-action@master # https://github.com/aquasecurity/trivy-action
-        with:
-          image-ref: '${{ env.GHCR_IMAGE }}:latest'
-          format: 'sarif'
-          output: 'trivy-results.sarif'
-          severity: 'CRITICAL,HIGH'
-          ignore-unfixed: true
-          skip-files: /etc/ssh/ssh_host_rsa_key
-          skip-dirs: gcc-13.2.0,gcc-13.3.0,usr/lib64
-      # Notes for the skips:
-      # - skip-files: /etc/ssh/ssh_host_rsa_key
-      #   The file is skipped, because its reported as "Asymmetric Private Key" alert.
-      #   This is a false positive, because the file is a private key, which is intended to be there.
-      # - skip-dirs: gcc-13.2.0,usr/lib64
-      #   The folders are skipped, because the folders contain many files, which
-      #   are not relevant for the image security. The scan is faster without them.
-
-      - name: 🛡️🔼 Upload Trivy scan results to GitHub Security tab
-        uses: github/codeql-action/upload-sarif@v3 # https://github.com/github/codeql-action
-        with:
-          sarif_file: 'trivy-results.sarif'
-
-      - name: 🛡️🔍 Scan Image for Vulnerabilities using Dockle
-        if: always()
-        uses: goodwithtech/dockle-action@v0.4.15 # https://github.com/goodwithtech/dockle-action
-        with:
-          image: '${{ env.GHCR_IMAGE }}:latest'
-          format: 'list'
-          exit-code: '0'
-          exit-level: 'warn'
-
-      # - name: 🛡️🔍 Scan Image for Vulnerabilities using Docker Scout
-      #   uses: docker/scout-action@v1 # https://github.com/docker/scout-action
-      #   with:
-      #     command: cves,recommendations
-      #     only-severities: critical,high
-      #     image: ${{ steps.metadata-base.outputs.tags }}
-      #     format: 'json'
-      #     sarif-file: 'scout-results.sarif.json'
-      #     summary: true
-
-      # - name: 🛡️🔼 Upload Docker Scout scan results to GitHub Security tab
-      #   uses: github/codeql-action/upload-sarif@v3 # https://github.com/github/codeql-action
-      #   with:
-      #     sarif_file: 'scout-results.sarif.json'
-
-# ---------------------------------------------------------------------------------------
-
-  publish-docs:
-
-# ---------------------------------------------------------------------------------------
-
-    name: "Publish Docs to gh-pages"
-
-    needs: build
-    runs-on: ubuntu-latest
-
-    # run this job only on main branch or on tags, this avoids running on PRs
-    if: github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/')
-
-    steps:
-
-      - name: 🤘 Checkout gh-pages branch
-        uses: actions/checkout@v4
-        with:
-          ref: gh-pages
-          fetch-depth: 1
-
-      - name: 🔽 Download all docs artifacts
-        uses: actions/download-artifact@v4
-        with:
-          pattern: version-info-*
-          merge-multiple: true
-          path: tmp
-
-      - name: 📝 Merge both READMEs into a Github Pages index.md
-        run: |
-          cd tmp
-          echo "# cpp-devbox ${{ github.ref_name }} ($(date '+%Y-%m-%d'))" > index.md
-          echo "" >> index.md
-          echo "## Images" >> index.md
-          echo "" >> index.md
-          for codename in bookworm trixie; do
-            if [ -f README-${codename}-base.md ]; then
-              echo "### Base Image (${codename})" >> index.md
-              grep -A2 '^OS Version:' README-${codename}-base.md >> index.md
-              echo "" >> index.md
-            fi
-            if [ -f README-${codename}-with-vulkansdk.md ]; then
-              echo "### With VulkanSDK (${codename})" >> index.md
-              grep -A2 '^OS Version:' README-${codename}-with-vulkansdk.md >> index.md
-              echo "" >> index.md
-            fi
-          done
-
-      - name: ✔ Commit index.md to gh-pages branch
-        run: |
-          cp tmp/index.md index.md
-          git config --global user.name "github-actions[bot]"
-          git config --global user.email "github-actions[bot]@users.noreply.github.com"
-          git add index.md
-          git commit -m "Publish docs from ${GITHUB_REPOSITORY}@${GITHUB_SHA:0:9}"
-
-      - name: 🚀 Push to gh-pages branch
-        run: |
-          git push origin gh-pages
diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index 581ba42..0000000
--- a/.gitignore
+++ /dev/null
@@ -1,13 +0,0 @@
-# Ignore Visual Studio temporary build folders
-build/
-out/
-
-.idea/
-
-# Visual Studio 2015/2017 cache/options directory
-.vs/
-
-# VCPKG installation folder for dependencies
-vcpkg_installed/
-
-CMakeSettings.json
diff --git a/.hadolint.yml b/.hadolint.yml
deleted file mode 100644
index 81077d5..0000000
--- a/.hadolint.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-# Hadolint configuration file
-
-# Configure ignore rules
-# https://github.com/hadolint/hadolint#rules for a list of available rules.
-# Online Linter
-# https://hadolint.github.io/hadolint/
-ignored:
-  - DL3003 # Use WORKDIR to switch to a directory
-  - DL3008 # Pin versions in apt get install
-  - DL3013 # Pin versions in pip
-  - DL3009 # Delete the apt-get lists after installing something
-  - DL4001 # Either use Wget or Curl but not both.
-  - SC2086 # Double quote to prevent globbing and word splitting.
-trustedRegistries:
-  - docker.io
-  - ghcr.io
diff --git a/.vscode/settings.json b/.vscode/settings.json
deleted file mode 100644
index df3dc8b..0000000
--- a/.vscode/settings.json
+++ /dev/null
@@ -1,142 +0,0 @@
-{
-    // CMake
-    "cmake.buildDirectory": "${workspaceFolder}/out/build/${buildType}",
-    "cmake.installPrefix": "${workspaceFolder}/out/install/${buildType}",
-    "cmake.buildBeforeRun": false,
-    "cmake.configureOnOpen": true,
-    "cmake.loggingLevel": "info",
-    "cmake.useCMakePresets": "always",
-    "cmake.configureSettings": {
-        "CMAKE_BUILD_TYPE": "${buildType}",
-    },
-    "C_Cpp.errorSquiggles": "enabled",
-    // Editor
-    "editor.acceptSuggestionOnEnter": "off",
-    "editor.renderControlCharacters": true,
-    "editor.fontFamily": "JetBrains Mono", // Source Code Pro, Consolas
-    "editor.fontSize": 16,
-    "[Log]": {
-        "editor.fontSize" : 10
-    },
-    "editor.fontLigatures": true,
-    "editor.formatOnType": true,
-    "editor.renderWhitespace": "trailing",
-    "editor.rulers": [
-        {"column":   0, "color": "#5a5a5a80"}, // left boundary is 50% opaque
-        {"column":   2, "color": "#5a5a5a20"}, // tab stops are 12.5% opaque
-        {"column":   4, "color": "#5a5a5a20"},
-        {"column":   6, "color": "#5a5a5a20"},
-        {"column":   8, "color": "#5a5a5a20"},
-        {"column":  10, "color": "#5a5a5a20"},
-        {"column":  79, "color": "#5a5a5a20"}, // right rule minus one
-        {"column":  80, "color": "#ababab30"}, // right rule
-        {"column": 120, "color": "#ff5d5d40"}  // extra right rule
-    ],
-    "extensions.ignoreRecommendations": true,
-    // Files
-    "files.exclude": {
-        ".git": true
-    },
-    "files.watcherExclude": {
-        "**/build/**": true,
-        "**/out/**": true,
-        "**/vcpkg/**": true
-    },
-    "files.associations": {
-		"iosfwd": "cpp",
-		"type_traits": "cpp",
-		"algorithm": "cpp",
-		"any": "cpp",
-		"array": "cpp",
-		"atomic": "cpp",
-		"bit": "cpp",
-		"bitset": "cpp",
-		"cctype": "cpp",
-		"charconv": "cpp",
-		"chrono": "cpp",
-		"cinttypes": "cpp",
-		"clocale": "cpp",
-		"cmath": "cpp",
-		"compare": "cpp",
-		"concepts": "cpp",
-		"condition_variable": "cpp",
-		"cstdarg": "cpp",
-		"cstddef": "cpp",
-		"cstdint": "cpp",
-		"cstdio": "cpp",
-		"cstdlib": "cpp",
-		"cstring": "cpp",
-		"ctime": "cpp",
-		"cwchar": "cpp",
-		"deque": "cpp",
-		"exception": "cpp",
-		"filesystem": "cpp",
-		"format": "cpp",
-		"forward_list": "cpp",
-		"fstream": "cpp",
-		"functional": "cpp",
-		"initializer_list": "cpp",
-		"iomanip": "cpp",
-		"ios": "cpp",
-		"iostream": "cpp",
-		"istream": "cpp",
-		"iterator": "cpp",
-		"limits": "cpp",
-		"list": "cpp",
-		"locale": "cpp",
-		"map": "cpp",
-		"memory": "cpp",
-		"mutex": "cpp",
-		"new": "cpp",
-		"numeric": "cpp",
-		"optional": "cpp",
-		"ostream": "cpp",
-		"queue": "cpp",
-		"random": "cpp",
-		"ranges": "cpp",
-		"ratio": "cpp",
-		"set": "cpp",
-		"span": "cpp",
-		"sstream": "cpp",
-		"stdexcept": "cpp",
-		"stop_token": "cpp",
-		"streambuf": "cpp",
-		"string": "cpp",
-		"system_error": "cpp",
-		"thread": "cpp",
-		"tuple": "cpp",
-		"typeinfo": "cpp",
-		"unordered_map": "cpp",
-		"unordered_set": "cpp",
-		"utility": "cpp",
-		"variant": "cpp",
-		"vector": "cpp",
-		"xfacet": "cpp",
-		"xhash": "cpp",
-		"xiosbase": "cpp",
-		"xlocale": "cpp",
-		"xlocbuf": "cpp",
-		"xlocinfo": "cpp",
-		"xlocmes": "cpp",
-		"xlocmon": "cpp",
-		"xlocnum": "cpp",
-		"xloctime": "cpp",
-		"xmemory": "cpp",
-		"xstddef": "cpp",
-		"xstring": "cpp",
-		"xtr1common": "cpp",
-		"xtree": "cpp",
-		"xutility": "cpp",
-		"*.tcc": "cpp",
-		"cwctype": "cpp",
-		"memory_resource": "cpp",
-		"string_view": "cpp",
-		"numbers": "cpp",
-		"__bit_reference": "cpp",
-		"__locale": "cpp",
-		"__verbose_abort": "cpp",
-		"print": "cpp",
-		"stack": "cpp"
-	},
-	"cmake.ignoreCMakeListsMissing": true
-}
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
deleted file mode 100644
index 0d3691f..0000000
--- a/CHANGELOG.md
+++ /dev/null
@@ -1,206 +0,0 @@
-# Changelog
-
-All changes to the project will be documented in this file.
-
-- The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
-and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
-- The date format is YYYY-MM-DD.
-- The upcoming release version is named `vNext` and links to the changes between latest version tag and git HEAD.
-
-## [vNext] - unreleased
-
-- "It was a bright day in April, and the clocks were striking thirteen." - 1984
-
-## [1.0.12] - 2025-07-30
-
-**Changed**
-- default locale and timezone changed from "Europe/Berlin de_DE.UTF-8" to "America/Los_Angeles en_US.UTF-8"
-- bookworm image: updated Vulkan SDK to v1.4.321.1
-- trixie image: updated Vulkan SDK to v1.4.321.1, Mesa to v25.0.7
-
-## [1.0.11] - 2025-06-13
-
-**Added**
-- images are now also published on Docker Hub (hub.docker.com): https://hub.docker.com/r/jakoch/cpp-devbox
-
-**Changed**
-- trixie image: updated Mesa to v25.0.5 and disabled download as distro version is used
-
-## [1.0.10] - 2025-03-25
-
-**Changed**
-- bookworm & trixie image: updated Vulkan SDK to v1.4.309.0
-- trixie image: updated Mesa to v25.0.2
-
-**Fixed**
-- added missing MESA_VERSION on global version (equals distro version, is used for container description)
-
-**Removed**
-- bookworm & trixie image: removed IKOS static analyzer due to the runtime requirement for LLVM14
-
-## [1.0.9] - 2025-03-10
-
-**Added**
-- bookworm image: configured `LD_LIBRARY_PATH` to include `/usr/lib64` for locating GCC libraries, including `libstdc++`
-- added `devbox-test` application to verify the build and installed compilers and added a test to the CI workflow
-
-**Changed**
-- Excluded all unnecessary files and folders from the Docker build context (.dockerignore)
-- bookworm & trixie image: updated Vulkan SDK to v1.4.304.1
-- bookworm & trixie image: updated LLVM to v20
-
-**Fixed**
-- Symlinked all CMake tools, including `ctest` and `cmake-gui`, to `/usr/bin` for better accessibility
-- fixed env var `VK_LAYER_PATH` by using the `share` folder instead of `etc`
-- trixie image: fixed IKOS installation by adopting the bookworm method of
-  building a Python wheel and installing it during the deployment stage
-
-## [1.0.8] - 2025-02-04
-
-**Changed**
-- bookworm & trixie image: updated IKOS to v3.5
-
-## [1.0.7] - 2025-01-26
-
-**Changed**
-- fixed installation "fonts-powerline" by switching to automatic version detection
-- DISABLE_AUTO_UPDATE of zsh
-
-## [1.0.6] - 2024-12-26
-
-**Added**
-- added linux-perf, strace, ltrace, meson, nasm, fasm, ikos (static analyzer)
-- added spellchecker (streetsidesoftware.vscode-spellchecker as vscode extension)
-- added spellchecker configuration. the main config is '/cspell.json', which
-  points to '/build-tools/cspell/cspell.config.json'.
-- added whitelist for spell checking: '/build-tools/cspell/repo-words.txt'
-
-**Changed**
-- bookworm & trixie images: updated VulkanSDK to 1.3.296.0
-- bookworm image: updated LLVM to 19
-- updated show-tool-versions.sh and show-tool-locations.sh
-- CURL_OPTIONS cleanup, removed CURL_OPTIONS_BAR
-- instead "-y" use "--assume-yes" on apt-get
-- silence warning "debconf: delaying package configuration, since apt-utils is not installed"
-  by using ENV DEBCONF_NOWARNINGS="yes"
-
-## [1.0.5] - 2024-07-09
-
-**Added**
-- added doxygen (latest binary)
-- added python3-sphinx, python3-sphinx-rtd-theme
-- added lcov
-- trixie image: added gcc-14 (from distribution)
-- both with-vulkansdk images: added mesa-vulkan-drivers (for software rendering using llvmpipe)
-
-**Changed**
-- bookworm image: updated gcc to 13.3.0
-- cleanup mold setup
-- tools are symlinked into /usr/bin instead of /usr/local/bin
-- updated scripts (show-tool-version/show-tool-locations) to output markdown
-- changed workflow file to upload version data as release artefact for every image
-
-## [1.0.4] - 2024-07-04
-
-**Changed**
-
-- changed versioning scheme
-  - removed "nightly-" from scheduled builds; its now date only
-- ccache: switched from distribution provided ccache to latest version from github
-- switched to SPDX-FileCopyrightText on copyright lines
-
-## [1.0.3] - 2024-05-23
-
-**Added**
-
-- added mold linker
-
-**Changed**
-
-- changed Github Release workflow to build 4 images:
-  - bookwork: base + with-vulkan
-  - trixie: base + with-vulkan
-- changed versioning scheme
-- updated Vulkan_SDK to v1.3.283.0
-
-## [1.0.2] - 2024-02-15
-
-**Added**
-
-- added nano
-- added AsciiArt to Dockerfile to utilize the VSCode MiniMap better
-- added Trixie Dockerfile into ./devcontainer/debian/trixie
-
-**Changed**
-
-- moved Bookworm Dockerfile into ./devcontainer/debian/bookworm
-- changed Github release workflow file
-  - use docker/metadata-action and docker/build-push-action
-- removed usages of sudo
-- ignore hadolint warning disallowing both curl and wget
-- fixed the need to redeclare the VULKAN_VERSION in multiple build stages
-  by introducing global build args and reusing them in FROM sections
-- reduced number of ENV declarations by using line continuations
-- updated Vulkan_SDK to v1.3.275.0
-
-## [1.0.1] - 2023-10-09
-
-**Added**
-
-- integrated all .devcontainer "features" into the Dockerfile
-  - added vcpkg
-  - added zsh, omyzsh, powerline fonts
-  - added zsh plugins: autosuggestions, autocompletions, history search
-  - added github cli
-  - added cmake latest version
-- added libclang-rt-17-dev
-- added "created" annotation to container description
-
-**Changed**
-
-- remoteUser is now "root"
-
-**Removed**
-
-- removed the .devcontainer "features" key
-
-## [1.0.0] - 2023-10-01
-
-**Added**
-
-- added devcontainer feature: github-cli, zsh-plugins
-- integrated zsh-plugins: git, autosuggestions, autocompletions
-- vscode extensions: editorconfig, test-adapter for catch2 and test-explorer
-- added container labels
-- integrated Vulkan SDK
-- added 2 docker stages: cpp-devbox-base and cpp-devbox-with-vulkansdk
-- changed workflow to publish 2 images
-- added libfuzzer-dev
-- added GCC 13.2.0
-
-**Changed**
-
-- german locale "de_DE.UTF-8" is installed and configured, but the default locale is set to "en_US.UTF-8".
-- small fixes to show-tool-versions.sh
-- Dockerfile: uses ARGS for DEBIAN_VERSION, DEBIAN_VERSION_NAME, LLVM_VERSION, GCC_VERSION
-
-**Removed**
-
-- cmake.configureSetting - CMAKE_EXPORT_COMPILE_COMMANDS ON (you may set this in your project presets)
-
-<!-- Section for Reference Links -->
-
-[vNext]: https://github.com/jakoch/cpp-devbox/compare/v1.0.12...HEAD
-[1.0.12]: https://github.com/jakoch/cpp-devbox/releases/tag/v1.0.12
-[1.0.11]: https://github.com/jakoch/cpp-devbox/releases/tag/v1.0.11
-[1.0.10]: https://github.com/jakoch/cpp-devbox/releases/tag/v1.0.10
-[1.0.9]: https://github.com/jakoch/cpp-devbox/releases/tag/v1.0.9
-[1.0.8]: https://github.com/jakoch/cpp-devbox/releases/tag/v1.0.8
-[1.0.7]: https://github.com/jakoch/cpp-devbox/releases/tag/v1.0.7
-[1.0.6]: https://github.com/jakoch/cpp-devbox/releases/tag/v1.0.6
-[1.0.5]: https://github.com/jakoch/cpp-devbox/releases/tag/v1.0.5
-[1.0.4]: https://github.com/jakoch/cpp-devbox/releases/tag/v1.0.4
-[1.0.3]: https://github.com/jakoch/cpp-devbox/releases/tag/v1.0.3
-[1.0.2]: https://github.com/jakoch/cpp-devbox/releases/tag/v1.0.2
-[1.0.1]: https://github.com/jakoch/cpp-devbox/releases/tag/v1.0.1
-[1.0.0]: https://github.com/jakoch/cpp-devbox/releases/tag/v1.0.0
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index c7d1367..0000000
--- a/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) Jens A. Koch.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
\ No newline at end of file
diff --git a/README.md b/README.md
deleted file mode 100644
index ad4e867..0000000
--- a/README.md
+++ /dev/null
@@ -1,239 +0,0 @@
-![jakoch-cpp-devbox](assets/cpp-devbox-repo-card.png)
-
-# C++ DevBox [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/jakoch/cpp-devbox/release.yml?branch=main&style=flat&logo=github&label=Image%20published%20on%20GHCR)](https://github.com/jakoch/cpp-devbox)
-
-A Docker-based development container for C/C++ development.
-
-**Debian Linux 12 Bookworm with LLVM 20 & GCC 12+13, VulkanSDK 1.4.304.1, Mesa, CMake, VCPKG, mold, zsh**
-
-**Debian Linux 13 Trixie with LLVM 20 & GCC 14, VulkanSDK 1.4.304.1, Mesa, CMake, VCPKG, mold, zsh**
-
-## What is this?
-
-This repository maintains Dockerfiles for generating two container images based on two Debian Linux versions.
-
-One image includes GCC and LLVM.
-
-The other image includes GCC, LLVM, and Vulkan SDK with Mesa.
-
-Both images are build using Debian 12 Bookworm and Debian 13 Trixie.
-
-All images are published to the Github Container Registry (GHCR) and the Docker Hub (hub.docker.com).
-
-The purpose of these images is to setup a C++ development environment within Visual Studio Code using a [devcontainer config](https://github.com/jakoch/cpp-devbox#fetching-the-prebuilt-container-images-using-a-devcontainer-config).
-
-## Images and Sizes
-
-[bookworm-latest]: https://ghcr.io/jakoch/cpp-devbox:bookworm-latest
-[trixie-latest]:   https://ghcr.io/jakoch/cpp-devbox:trixie-latest
-[bookworm-with-vulkansdk-latest]: https://ghcr.io/jakoch/cpp-devbox:bookworm-with-vulkansdk-latest
-[trixie-with-vulkansdk-latest]: https://ghcr.io/jakoch/cpp-devbox:trixie-with-vulkansdk-latest
-
-| ⭣ Version Tag &nbsp;&nbsp; OS ⭢ | Debian 12 - Bookworm | Debian 13 - Trixie |
-|-----------------------------------|---------------------------|--------------------|
-| Latest | ![bookworm-latest](https://ghcr-badge.egpl.dev/jakoch/cpp-devbox/size?color=%2344cc11&tag=bookworm-latest&label=image+size&trim=) <br> [bookworm-latest] | ![trixie-latest](https://ghcr-badge.egpl.dev/jakoch/cpp-devbox/size?color=%2344cc11&tag=trixie-latest&label=image+size&trim=) <br>[trixie-latest]
-| Latest "with-vulkansdk" | ![bookworm-with-vulkansdk-latest](https://ghcr-badge.egpl.dev/jakoch/cpp-devbox/size?color=%2344cc11&tag=bookworm-with-vulkansdk-latest&label=image+size&trim=) <br>[bookworm-with-vulkansdk-latest] |   ![trixie-with-vulkansdk-latest](https://ghcr-badge.egpl.dev/jakoch/cpp-devbox/size?color=%2344cc11&tag=trixie-with-vulkansdk-latest&label=image+size&trim=) <br> [trixie-with-vulkansdk-latest]
-
-You find the [versioning scheme for images below](#versioning-scheme-for-images).
-
-## What is pre-installed?
-
-Here is a basic overview of the pre-installed tools. For details, please refer to the Dockerfiles.
-
-On top of the base image the following tools are installed:
-
-- zsh with plugins: autosuggestions, completions, history substring search
-- git, nano, jq
-- curl, wget
-- cppcheck, valgrind
-- lcov, gcov, gcovr
-- strace, ltrace
-- perf, gprof
-- nasm, fasm
-- meson
-- CMake (latest version)
-- ccache (latest version)
-- vcpkg (latest version)
-- mold (latest version)
-- Doxygen (latest version)
-- git, github cli
-
-### [Dockerfile for Debian 12 - Bookworm](https://github.com/jakoch/cpp-devbox/blob/main/.devcontainer/debian/bookworm/Dockerfile) (stable)
-
-The following C/C++ compilers and their toolchains are available:
-
-- LLVM 20.1.0
-- GCC 12.2.0
-- GCC 13.4.0
-
-### [Dockerfile for Debian 13 - Trixie](https://github.com/jakoch/cpp-devbox/blob/main/.devcontainer/debian/trixie/Dockerfile) (unstable)
-
-The following C/C++ compilers and their toolchains are available:
-
-- LLVM 20.1.0
-- GCC 13.3.0
-- GCC 14.2.0
-
-### VulkanSDK
-
-The `with-vulkansdk` image additionally contains:
-
-- Vulkan SDK 1.3.296.0
-- Mesa 22.3.6 (bookworm), 24.2.8 (trixie)
-  - (for software rendering with [LLVMpipe](https://docs.mesa3d.org/drivers/llvmpipe.html))
-
-[What is the latest version of VulkanSDK?](https://vulkan.lunarg.com/sdk/latest.json)
-
-## Prerequisites
-
-You need the following things to run this:
-
-- Docker
-- Visual Studio Code
-
-## How to run this?
-
-There are two ways of setting the container up.
-
-Either by building the container image locally or by fetching the prebuilt container image from a container registry.
-
-### Building the Container Image locally using VSCode
-
-- **Step 1.** Get the source: clone this repository using git or download the zip
-
-- **Step 2.** In VSCode open the folder in a container (`Remote Containers: Open Folder in Container`):
-
-   This will build the container image (`Starting Dev Container (show log): Building image..`)
-
-   Which takes a while...
-
-   Then, finally...
-
-- **Step 3.**  Enjoy! :sunglasses:
-
-### Fetching the prebuilt container images using Docker
-
-This container image is published to the Github Container Registry (GHCR) and the Docker Hub (hub.docker.com).
-
-You may find the Docker Hub repository here: https://hub.docker.com/r/jakoch/cpp-devbox
-
-You may find the GHCR package here: https://github.com/jakoch/cpp-devbox/pkgs/container/cpp-devbox
-
-In order to pull from GHCR add the prefix (`ghcr.io/`).
-
-**Command Line**
-
-You can install the container image from the command line:
-
-```bash
-docker pull ghcr.io/jakoch/cpp-devbox:bookworm-latest
-```
-
-```bash
-docker pull jakoch/cpp-devbox:bookworm-latest
-```
-
-For the image containing Vulkan SDK append `with-vulkansdk-latest`:
-
-```bash
-docker pull jakoch/cpp-devbox:bookworm-with-vulkansdk-latest
-```
-
-**Dockerfile**
-
-You might also use this container image as a base image in your own `Dockerfile`:
-
-```bash
-FROM jakoch/cpp-devbox:bookworm-latest
-```
-
-### Fetching the prebuilt container images using a .devcontainer config
-
-**Devcontainer.json**
-
-You might use this container image in the `.devcontainer/devcontainer.json` file of your project:
-
-```json
-{
-  "name": "My C++ Project DevBox",
-  "image": "ghcr.io/jakoch/cpp-devbox:bookworm-latest"
-}
-```
-
-**Devcontainer.json + with-vulkansdk image**
-
-You might use this container image in the `.devcontainer/devcontainer.json` file of your project:
-
-```json
-{
-  "name": "My C++ Project DevBox",
-  "image": "ghcr.io/jakoch/cpp-devbox:bookworm-with-vulkansdk-latest"
-}
-```
-
-#### Developer Notes
-
-### Fetching the bleeding-edge prebuilt container images
-
-The bleeding-edge container versions are build using Debian 13 - Trixie.
-
-The Trixie base image ships GCC 13.2 and LLVM 16 by default.
-For GCC its also the latest available upstream version.
-For LLVM we installed the latest available upstream version: LLVM 18.
-
-These images are unstable because:
-
-- a) the Debian base image Trixie itself unstable,
-- b) LLVM 18 has package requirements, which can not be resolved with Trixie packages alone, so several Debian SID packages are required.
-
-
-### Versioning Scheme for Images
-
-The container images use the following versioning scheme.
-
-The base URL for GHCR.io is: `ghcr.io/jakoch/cpp-devbox:{tag}`.
-
-#### Scheduled Builds
-
-The following container tags are created for scheduled builds:
-
-- `ghcr.io/jakoch/cpp-devbox:{debian_codename}-{date}}`
-- `ghcr.io/jakoch/cpp-devbox:{debian_codename}-with-vulkansdk-{{date}}`
-
-#### For git push
-
-The following container tags are created only on push, not when tagging:
-
-- `ghcr.io/jakoch/cpp-devbox:{debian_codename}-with-vulkansdk-{{date}}-sha-{{sha}}`
-- `ghcr.io/jakoch/cpp-devbox:{debian_codename}-{{date}}-sha-{{sha}}`
-
-#### For git tag
-
-The following container tags are created for git tags:
-
-- `ghcr.io/jakoch/cpp-devbox:{debian_codename}-{{ version }}`
-- `ghcr.io/jakoch/cpp-devbox:{debian_codename}-{{ major }}.{{ minor }}`
-
-- `ghcr.io/jakoch/cpp-devbox:{debian_codename}-with-vulkansdk-{{ version }}`
-- `ghcr.io/jakoch/cpp-devbox:{debian_codename}-with-vulkansdk-{{ major }}.{{ minor }}`
-
-#### Latest
-
-The container tag "latest" is applied to the latest build:
-
-- `ghcr.io/jakoch/cpp-devbox:{debian_codename}-latest`
-- `ghcr.io/jakoch/cpp-devbox:{debian_codename}-with-vulkansdk-latest`
-
-### Field Notes for building devbox-test locally
-
-- Before building, please remove any CMake build artifacts from the `devbox-test` directory. Otherwise, these files may be copied into the container and block a
-  clean rebuild.
-- To build and run `devbox-test`, use the following command (for Linux/macOS):
-  ```
-  docker run --rm -v "$(PWD)/devbox-test:/test-src" -w /test-src ghcr.io/jakoch/cpp-devbox:trixie-latest zsh -c "./build.sh"
-  ```
-- On Windows, use a relative path for the volume mount:
-  ```
-  docker run --rm -v ".\devbox-test:/test-src" -w /test-src ghcr.io/jakoch/cpp-devbox:trixie-latest zsh -c "./build.sh"
-  ```
-- This command mounts the `devbox-test` folder into the container as `/test-src`, then runs `build.sh` inside the container using `zsh`.
diff --git a/assets/cpp-devbox-repo-card.png b/assets/cpp-devbox-repo-card.png
deleted file mode 100644
index 3acdc8a..0000000
Binary files a/assets/cpp-devbox-repo-card.png and /dev/null differ
diff --git a/assets/cpp-devbox-repo-card.xcf b/assets/cpp-devbox-repo-card.xcf
deleted file mode 100644
index 9a60e6d..0000000
Binary files a/assets/cpp-devbox-repo-card.xcf and /dev/null differ
diff --git a/build-tools/cspell/cspell.config.json b/build-tools/cspell/cspell.config.json
deleted file mode 100644
index 3b9bedb..0000000
--- a/build-tools/cspell/cspell.config.json
+++ /dev/null
@@ -1,67 +0,0 @@
-{
-  "$schema": "https://raw.githubusercontent.com/streetsidesoftware/cspell/main/cspell.schema.json",
-  "version": "0.2",
-  "id": "jakoch-cpp-devbox-cspell-config",
-  "name": "jakoch cpp-devbox cspell Config",
-  "language": "en-US,de-DE",
-  "minWordLength": 4,
-  "globRoot": "../../",
-  "files": [
-    ".devcontainer/devcontainer.json",
-    ".devcontainer/**/Dockerfile",
-    ".devcontainer/scripts/*.sh",
-    "*.yml",
-    ".github/workflows/*.yml",
-    "*.md",
-    ".github/**/*.md",
-    "docs/**/*.md"
-  ],
-  "ignorePaths": [
-    ".git/*/**",
-    ".git/!(COMMIT_EDITMSG)",
-    ".vscode/**",
-    "build-tools/**",
-    ".clang-format",
-    "*.bat",
-    "*.cmake",
-    "*.json",
-    "*.lock",
-    "*.log",
-    "cspell.json",
-    "cspell*.{json,yaml}",
-    "LICENSE"
-  ],
-  "dictionaryDefinitions": [
-    {
-      "name": "repo-words",
-      "addWords": true,
-      "scope": [
-        "workspace"
-      ],
-      "path": "./repo-words.txt",
-      "description": "A list of words related to this repository."
-    }
-  ],
-  "dictionaries": [
-    "repo-words"
-  ],
-  "languageSettings": [
-    {
-      "languageId": "*",
-      "allowCompoundWords": false
-    },
-    {
-      "languageId": "markdown",
-      "caseSensitive": true
-    }
-  ],
-  "patterns": [
-    {
-      "name": "a-regexp",
-      "pattern": "SOME_[A-Z]+_H_"
-    }
-  ],
-  "ignoreRegExpList": [
-    "a-regexp"
-  ]
-}
\ No newline at end of file
diff --git a/build-tools/cspell/repo-words.txt b/build-tools/cspell/repo-words.txt
deleted file mode 100644
index 1d699f0..0000000
--- a/build-tools/cspell/repo-words.txt
+++ /dev/null
@@ -1,138 +0,0 @@
-agnoster
-aquasecurity
-Ascii
-autoclean
-autocompletions
-autoremove
-bindgen
-buildtype
-buildx
-Buildx
-byacc
-cbindgen
-ccache
-clangd
-clocale
-cppcheck
-ctest
-cuda
-CXXFLAGS
-DAPRON
-DCMAKE
-DDEFAULT
-debconf
-DEBCONF
-debian
-Debian
-defusedxml
-DESTDIR
-devbox
-dfsg
-distro
-DLLVM
-DMPFR
-Dockerfiles
-DOCKERHUB
-dpkg
-DPPL
-fasm
-Filemode
-fontconfig
-gcov
-gcovr
-githubcli
-gles
-glslang
-glvnd
-gprof
-graphviz
-hadolint
-ikos
-jakoch
-jlumbroso
-keyrings
-lavapipe
-libatomic
-libboost
-libc
-libclang
-libclc
-libdrm
-libedit
-libelf
-libexecdir
-libexpat
-libfuzzer
-libgcc
-libgl
-libgmp
-libmpc
-libmpfr
-libomp
-libpolly
-libppl
-libquadmath
-libsanitizer
-libsqlite
-libstdc
-libstdcxx
-libtbb
-libudev
-libunwind
-libvulkan
-libwayland
-libx
-libxcb
-libxext
-libxfixes
-libxrandr
-libxshmfence
-libxxf
-libz
-libzstd
-linux
-lldb
-llvmpipe
-localedef
-localtime
-ltrace
-nasm
-mlibc
-multiarch
-multilib
-noninteractive
-NOWARNINGS
-objdump
-ohmyzsh
-omyzsh
-osmesa
-pipefail
-powerline
-pygments
-PYTHONPATH
-randr
-realpath
-robbyrussell
-sarif
-setuptools
-shellcheck
-sourcelist
-sourceparts
-spirv
-SPIRV
-swrast
-trixie
-Trixie
-tzdata
-udate
-valgrind
-vcpkg
-venv
-vkcube
-vtable
-vulkan
-vulkansdk
-werror
-xlib
-zink
-zoneinfo
diff --git a/cspell.json b/cspell.json
deleted file mode 100644
index 01dc15d..0000000
--- a/cspell.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "import": [
-      "build-tools/cspell/cspell.config.json"
-  ]
-}
\ No newline at end of file
diff --git a/devbox-test/.gitignore b/devbox-test/.gitignore
deleted file mode 100644
index 25cb496..0000000
--- a/devbox-test/.gitignore
+++ /dev/null
@@ -1,10 +0,0 @@
-# Ignore build folders for test app
-build/
-out/
-
-CMakeFiles/
-
-cmake_install.cmake
-CMakeCache.txt
-CTestTestfile.cmake
-Makefile
diff --git a/devbox-test/CMakeLists.txt b/devbox-test/CMakeLists.txt
deleted file mode 100644
index 15059c5..0000000
--- a/devbox-test/CMakeLists.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-cmake_minimum_required(VERSION 3.25)
-
-set(CMAKE_VERBOSE_MAKEFILE ON)
-
-project(devbox_test LANGUAGES CXX)
-
-add_executable(app
-    src/main.cpp
-)
-
-enable_testing()
-
-add_test(NAME test COMMAND app)
diff --git a/devbox-test/build.sh b/devbox-test/build.sh
deleted file mode 100755
index 6756699..0000000
--- a/devbox-test/build.sh
+++ /dev/null
@@ -1,54 +0,0 @@
-#!/bin/bash
-
-set -eou pipefail
-
-# test that specific compiler versions exists
-if ! /usr/bin/clang++-20 --version &>/dev/null; then
-  echo -e "\e[31m ❌ Clang++20 not found!\e[0m"
-  exit 1
-fi
-
-if ! /usr/bin/g++-14 --version &>/dev/null; then
-  echo -e "\e[31m ❌ G++14 not found!\e[0m"
-  exit 1
-fi
-
-echo -e "\e[33m== Building devbox-test ==\e[0m"
-
-# create and switch to build dir (Build Tree)
-mkdir -p build-gcc build-clang
-
-echo -e "\e[33m== Build with GCC 14 ==\e[0m"
-
-cd build-gcc
-# configure
-cmake -S .. -DCMAKE_CXX_COMPILER=/usr/bin/g++-14
-# verify configuration
-#cmake -LAH ..
-# build
-cmake --build .
-# test
-# test
-if ctest; then
-    echo -e "\e[32m ✅ [GCC] Build and tests completed successfully!\e[0m"
-else
-    echo -e "\e[31m ❌ Tests failed!\e[0m"
-    exit 1
-fi
-cd ..
-
-echo -e "\e[33m== Build with Clang 20 ==\e[0m"
-
-cd build-clang
-cmake -S .. -DCMAKE_CXX_COMPILER=/usr/bin/clang++-20
-cmake --build .
-# test
-if ctest; then
-    echo -e "\e[32m ✅ [CLANG] Build and tests completed successfully!\e[0m"
-else
-    echo -e "\e[31m ❌ Tests failed!\e[0m"
-    exit 1
-fi
-cd ..
-
-
diff --git a/devbox-test/src/main.cpp b/devbox-test/src/main.cpp
deleted file mode 100644
index 5a2267d..0000000
--- a/devbox-test/src/main.cpp
+++ /dev/null
@@ -1,6 +0,0 @@
-#include <iostream>
-
-int main() {
-    std::cout << "Hello World!\n";
-    return 0;
-}
diff --git a/index.md b/index.md
new file mode 100644
index 0000000..b04b351
--- /dev/null
+++ b/index.md
@@ -0,0 +1,24 @@
+# cpp-devbox main (2025-08-03)
+
+## Images
+
+### Base Image (bookworm)
+OS Version:  Debian 12 bookworm
+Image Version: ghcr.io/jakoch/cpp-devbox:bookworm-20250803
+
+
+### With VulkanSDK (bookworm)
+OS Version:  Debian 12 bookworm with Vulkan SDK
+Image Version: ghcr.io/jakoch/cpp-devbox:bookworm-with-vulkansdk-20250803
+
+
+### Base Image (trixie)
+OS Version:  Debian 13 trixie
+Image Version: ghcr.io/jakoch/cpp-devbox:trixie-20250803
+
+
+### With VulkanSDK (trixie)
+OS Version:  Debian 13 trixie with Vulkan SDK
+Image Version: ghcr.io/jakoch/cpp-devbox:trixie-with-vulkansdk-20250803
+
+
