--- /dev/null
+# so we can log in at all …
+openssh-server
+# necessary on _some_ vservers
+net-tools
+quota
+#
+
 
+++ /dev/null
-# so we can log in at all …
-openssh-server
-# necessary on _some_ vservers
-net-tools
-quota
-#
-
 
+. lib/prefixed_msg
 abort() {
-    echo "$1"
+
+    prefixed_msg "$1"
     exit 1
 }
 
 . lib/abort_if_command_unknown
-
 apt_get_edited() {
+
 abort_if_command_unknown calc
 
 _SEDS=\
         printf '\n\r%s' "${_LINE}"
     else
         if [ "${_PREFIX}" != "${_LAST_PREFIX}" ]; then
-            printf '\n\r# %s' "${_PREFIX}"
+            printf '\n\r# apt_get_edited: %s' "${_PREFIX}"
             _LAST_PREFIX="${_PREFIX}"
         fi
         printf ' %s' "${_COMPRESSED_ITEM}"
 
 check_finished_marker() {
     _PATH_MARKER="${PATH_ROOT_FINISHEDS}/$1"
     if [ ! -f "${_PATH_MARKER}" ]; then
-        abort "# Missing dependency, did not find marker: ${_PATH_MARKER}"
+        abort "Missing dependency, did not find marker: ${_PATH_MARKER}"
     fi
 }
 
 . lib/constants_user  # USERNAME
 . lib/copy_dirtrees_of_tags
 . lib/minimize_installation
-
+. lib/prefixed_msg
 core_setup() {
-    _HOSTNAME="$1"
-    _FQDN="$2"
-    _EXTERNAL_IP="$3"
-    _INSTALL_TAGS="$4"
-
-    minimize_installation ${_INSTALL_TAGS}
-
-    echo '# And now: dist-upgrade …'
-    apt_get_edited '-q -q dist-upgrade' 
-
-    echo "# Setting up user: ${USERNAME}"
-    adduser --quiet --disabled-password --gecos "" "${USERNAME}"
-    usermod -a -G sudo "${USERNAME}"
-
-    echo '# Copying over files, directories …'
-    copy_dirtrees_of_tags ${_INSTALL_TAGS}
-    
-    echo '# Setting hostname …' 
-    hostnamectl hostname "${_HOSTNAME}"
-
-    echo "# Adapting ${_PATH_HOSTS} …"
-    _PATH_HOSTS="${PATH_ETC}/hosts"
-    if [ -z "${_FQDN}" ]; then
-        sed -i 's/REPLACE_WITH_FQDN/REPLACE_WITH_HOSTNAME.local REPLACE_WITH_HOSTNAME.localdomain/g' "${_PATH_HOSTS}"
-    else
-        sed -i 's/REPLACE_WITH_FQDN/'"${_FQDN}"'/g' "${_PATH_HOSTS}"
-        sed -i "s/#REPLACE_WITH_EXTERNAL_IP/${_EXTERNAL_IP}/g" "${_PATH_HOSTS}"
-    fi
-    sed -i 's/REPLACE_WITH_HOSTNAME/'"${_HOSTNAME}"'/g' "${_PATH_HOSTS}"
-    
-    echo '# Syncing clock …'
-    ntpdate-debian -s
+prefixed_msg_init '### core_setup: '
+prefixed_msg 'starting (performing standard installation setup steps)'
+
+_HOSTNAME="$1"
+_FQDN="$2"
+_EXTERNAL_IP="$3"
+_INSTALL_TAGS="$4"
+
+minimize_installation ${_INSTALL_TAGS}
+
+prefixed_msg 'And now: dist-upgrade …'
+apt_get_edited '-q -q dist-upgrade' 
+
+prefixed_msg "Setting up user: ${USERNAME}"
+adduser --quiet --disabled-password --gecos "" "${USERNAME}"
+usermod -a -G sudo "${USERNAME}"
+
+prefixed_msg 'Copying over files, directories …'
+copy_dirtrees_of_tags ${_INSTALL_TAGS}
+
+prefixed_msg 'Setting hostname …'
+hostnamectl hostname "${_HOSTNAME}"
+
+prefixed_msg "Adapting ${_PATH_HOSTS} …"
+_PATH_HOSTS="${PATH_ETC}/hosts"
+if [ -z "${_FQDN}" ]; then
+    sed -i 's/REPLACE_WITH_FQDN/REPLACE_WITH_HOSTNAME.local REPLACE_WITH_HOSTNAME.localdomain/g' "${_PATH_HOSTS}"
+else
+    sed -i 's/REPLACE_WITH_FQDN/'"${_FQDN}"'/g' "${_PATH_HOSTS}"
+    sed -i "s/#REPLACE_WITH_EXTERNAL_IP/${_EXTERNAL_IP}/g" "${_PATH_HOSTS}"
+fi
+sed -i 's/REPLACE_WITH_HOSTNAME/'"${_HOSTNAME}"'/g' "${_PATH_HOSTS}"
+
+prefixed_msg 'Syncing clock …'
+ntpdate-debian -s
+
+prefixed_msg 'finished'
+prefixed_msg_exit
 }
 
 . lib/apt_get_edited
-
+. lib/prefixed_msg
 ensure_packages_of_tags() {
-    # Walk through the package names in ../aptmark/ files to ensure the respective
-    # packages are installed.
-    for _TAG in $@; do
-        _PATH_APTMARK_TAG="../aptmark/${_TAG}"
-        if [ ! -f "${_PATH_APTMARK_TAG}" ]; then
-            continue
-        fi
-        _PACKAGES=$(cat "${_PATH_APTMARK_TAG}" | sed -E 's/#.*//g' | sed -z 's/\n/ /g' | sed 's/  */ /g' | cut -c 2-)
-        echo -n "# For tag '${_TAG}', "
-        if [ -z "${_PACKAGES}" ]; then
-            echo "nothing to install."
-        else
-            echo "ensuring installation of: ${_PACKAGES}"
-            apt_get_edited "-q -q -o Dpkg::Options::=--force-confnew install ${_PACKAGES}"
-        fi
-    done
-    echo ''
+prefixed_msg_init '# ensure_packages_of_tags'
+prefixed_msg 'starting (walking through package names in ../aptmark/ files to ensure respective packages are installed'
+
+for _TAG in $@; do
+    _PATH_APTMARK_TAG="../aptmark/${_TAG}"
+    if [ ! -f "${_PATH_APTMARK_TAG}" ]; then
+        continue
+    fi
+    _PACKAGES=$(cat "${_PATH_APTMARK_TAG}" | sed -E 's/#.*//g' | sed -z 's/\n/ /g' | sed 's/  */ /g' | cut -c 2-)
+    prefixed_msg_no_nl "For tag '${_TAG}', "
+    if [ -z "${_PACKAGES}" ]; then
+        echo "nothing to install."
+    else
+        echo "ensuring installation of: ${_PACKAGES}"
+        apt_get_edited "-q -q -o Dpkg::Options::=--force-confnew install ${_PACKAGES}"
+    fi
+done
+prefixed_msg '\nfinished'
+prefixed_msg_exit
 }
 
         _ABORT_MSG="missing arguments (got $# instead of ${_N_MIN_ARGS})."
     elif [ "$#" -gt "${_N_MAX_ARGS}" ]; then
         shift "${_N_MAX_ARGS}"
-        _ABORT_MSG="unexpected arguments beyond expected number (${_N_MAX_ARGS}): $@"
+        _ABORT_MSG="unexpected arguments beyond expected number (${_N_MAX_ARGS}): $@."
     fi
     if [ ! -z "${_ABORT_MSG}" ]; then 
         if [ ! -z "${_USAGE}" ]; then 
-            _ABORT_MSG="${_ABORT_MSG}\nExpected arguments: ${_USAGE}"
+            _ABORT_MSG="${_ABORT_MSG} Expected arguments: ${_USAGE}"
         fi 
         abort "Aborting due to ${_ABORT_MSG}"
     fi
 
 . lib/copy_dirtrees_of_tags
 . lib/ensure_packages_of_tags
-
+. lib/prefixed_msg
 install_tags() {
+    prefixed_msg_init '# install_tags: '
+
     _INSTALL_TAGS="$@"
-    echo "# Installing packages and files for: ${_INSTALL_TAGS}"
+    prefixed_msg "Installing packages and files for: ${_INSTALL_TAGS}"
     ensure_packages_of_tags ${_INSTALL_TAGS}
     copy_dirtrees_of_tags ${_INSTALL_TAGS}
+    prefixed_msg_exit
 }
 
 . lib/apt_get_edited
 . lib/ensure_packages_of_tags
-
+. lib/prefixed_msg
 minimize_installation() {
-    _INSTALL_TAGS="$@"
-
-    echo '### minimize_installation: narrow system to what is required explicitly by us and Debian'
-    _TOK_REQ=' required'
-    _PATH_LIST_PREFIX=/tmp/list_
-    _PATH_LIST_UNSORTED="${_PATH_LIST_PREFIX}unsorted"
-    _PATH_LIST_WHITE="${_PATH_LIST_PREFIX}white"
-    _PATH_LIST_ALL_PACKAGES="${_PATH_LIST_PREFIX}all_packages"
-    _PATH_LIST_BLACK="${_PATH_LIST_PREFIX}black"
-
-    if ! which calc > /dev/null; then
-        echo '# not found calc, which is needed, so installing …'
-        apt-get -y -q -q install calc > /dev/null
-    fi
-
-    echo "# Collect packages deemed '${_TOK_REQ}' by Debian: "
-    dpkg-query -Wf '${Package} ${Priority}\n' | grep "${_TOK_REQ}" | cut -d' ' -f1 > "${_PATH_LIST_UNSORTED}"
-    sort "${_PATH_LIST_UNSORTED}" > "${_PATH_LIST_WHITE}"
-    echo $(cat "${_PATH_LIST_WHITE}")
-
-    echo -n '# Collect installed packages outside this selection: '
-    dpkg-query -Wf '${Package}\n' > "${_PATH_LIST_UNSORTED}"
-    sort "${_PATH_LIST_UNSORTED}" > "${_PATH_LIST_ALL_PACKAGES}"
-    comm -3 "${_PATH_LIST_ALL_PACKAGES}" "${_PATH_LIST_WHITE}" > "${_PATH_LIST_BLACK}"
-    echo $(cat "${_PATH_LIST_BLACK}")
-
-    echo '# apt-mark auto packages from diff …'
-    apt-mark auto `cat "${_PATH_LIST_BLACK}"` > /dev/null
-    rm "${_PATH_LIST_UNSORTED}" "${_PATH_LIST_ALL_PACKAGES}" "${_PATH_LIST_WHITE}" "${_PATH_LIST_BLACK}"
-
-    echo '# install or mark as manually installed packages from our own selections …'
-    ensure_packages_of_tags ${_INSTALL_TAGS} 
-
-    echo '# run autopurge to get rid of all unwanted packages …'
-    apt_get_edited '-q -q autopurge'
+prefixed_msg_init '### minimize_installation: '
+_INSTALL_TAGS="$@"
+prefixed_msg "starting (narrow system to what is required explicitly by Debian and by us, as per these INSTALL_TAGS: ${_INSTALL_TAGS})"
+
+_TOK_REQ='required'
+_PATH_LIST_PREFIX=/tmp/list_
+_PATH_LIST_UNSORTED="${_PATH_LIST_PREFIX}unsorted"
+_PATH_LIST_WHITE="${_PATH_LIST_PREFIX}white"
+_PATH_LIST_ALL_PACKAGES="${_PATH_LIST_PREFIX}all_packages"
+_PATH_LIST_BLACK="${_PATH_LIST_PREFIX}black"
+
+if ! which calc > /dev/null; then
+    prefixed_msg 'not found calc, which is needed, so installing …'
+    apt-get -y -q -q install calc > /dev/null
+fi
+
+prefixed_msg_no_nl "collect packages deemed '${_TOK_REQ}' by Debian: "
+dpkg-query -Wf '${Package} ${Priority}\n' | grep " ${_TOK_REQ}" | cut -d' ' -f1 > "${_PATH_LIST_UNSORTED}"
+sort "${_PATH_LIST_UNSORTED}" > "${_PATH_LIST_WHITE}"
+echo $(cat "${_PATH_LIST_WHITE}")
+
+prefixed_msg_no_nl 'collect installed packages outside this selection: '
+dpkg-query -Wf '${Package}\n' > "${_PATH_LIST_UNSORTED}"
+sort "${_PATH_LIST_UNSORTED}" > "${_PATH_LIST_ALL_PACKAGES}"
+comm -3 "${_PATH_LIST_ALL_PACKAGES}" "${_PATH_LIST_WHITE}" > "${_PATH_LIST_BLACK}"
+echo $(cat "${_PATH_LIST_BLACK}")
+
+prefixed_msg 'apt-mark auto from diff …'
+apt-mark auto `cat "${_PATH_LIST_BLACK}"` > /dev/null
+rm "${_PATH_LIST_UNSORTED}" "${_PATH_LIST_ALL_PACKAGES}" "${_PATH_LIST_WHITE}" "${_PATH_LIST_BLACK}"
+
+prefixed_msg 'install or mark as manually installed packages from our own selections …'
+ensure_packages_of_tags ${_INSTALL_TAGS} 
+
+prefixed_msg 'run autopurge to get rid of all unwanted packages …'
+apt_get_edited '-q -q autopurge'
+
+prefixed_msg 'finished'
+prefixed_msg_exit
 }
 
--- /dev/null
+prefixed_msg_init() {
+    prefixed_msg_OLD_PREFIX=prefixed_msg_PREFIX
+    prefixed_msg_PREFIX="$1"
+}
+prefixed_msg_exit() {
+    prefixed_msg_PREFIX=prefixed_msg_OLD_PREFIX
+}
+prefixed_msg() {
+    printf '%s%s\n' "${prefixed_msg_PREFIX}" "$1"
+}
+prefixed_msg_no_nl() {
+    printf '%s%s' "${prefixed_msg_PREFIX}" "$1"
+}
 
 . lib/constants_finished
-
+. lib/prefixed_msg
 put_finished_marker() {
-    echo "Marking as finished: $1"
+
+    prefixed_msg "Marking as finished: $1"
     mkdir -p "${PATH_ROOT_FINISHEDS}" 
     touch "${PATH_ROOT_FINISHEDS}/$1"
 }
 
 . lib/constants_user  # PATH_USER_HOME
 . lib/expect_n_args
 . lib/install_tags
+. lib/prefixed_msg
+
+prefixed_msg_init '##### setup_catgirl.sh: '
+prefixed_msg 'starting'
 
 expect_n_args 1 1 'IRC_PASSWORD' $@
 IRC_PASSWORD="$1"
 install_tags catgirl
 
 PATH_USER_CONF_CATGIRL="${PATH_USER_HOME}/.config/catgirl/libera"
-echo "\n# Writing provided password into ${PATH_USER_CONF_CATGIRL} …"
+prefixed_msg "Writing provided password into ${PATH_USER_CONF_CATGIRL} …"
 sed -i "s/REPLACE_WITH_IRC_PASSWORD/${IRC_PASSWORD}/g" "${PATH_USER_CONF_CATGIRL}"
 
-echo "# Activating catgirl tmux session service …"
+prefixed_msg 'Activating catgirl tmux session service …'
 systemctl enable --now catgirl
 
-echo "# Activating catgirl logs encryption service/timer …"
+prefixed_msg 'Activating catgirl logs encryption service/timer …'
 systemctl enable --now encrypt_catgirl_logs.timer
 
+prefixed_msg 'finished'
+prefixed_msg_exit
 
 . lib/check_finished_marker
 . lib/expect_n_args
 . lib/install_tags
+. lib/prefixed_msg
+
+prefixed_msg_init '##### setup_seedbox.sh: '
+prefixed_msg 'starting'
 
 expect_n_args 0 0 '' $@
 
 check_finished_marker 'setup_server'
 install_tags seedbox 
 
-echo '# Setting up upload user/directory …'
+prefixed_msg 'Setting up upload user/directory …'
 adduser --quiet --system --home /home/upload upload
 
-echo '# Activating rtorrent tmux session service …'
-#systemctl enable --now rtorrent
+prefixed_msg 'Activating rtorrent tmux session service …'
+systemctl enable --now rtorrent
+
+prefixed_msg 'finished'
+prefixed_msg_exit
 
 #!/bin/sh
 set -e
 cd $(dirname "$0")
+. lib/abort_if_command_unknown
 . lib/constants_etc  # PATH_ETC
 . lib/constants_ssh  # PATH_REL_SSH, PATH_USER_SSH
 . lib/copy_dirtrees_of_tags
 . lib/core_setup
 . lib/expect_n_args
 . lib/path_tmp_timestamped
+. lib/prefixed_msg
 . lib/put_finished_marker
 
+prefixed_msg_init '##### setup_server.sh: '
+prefixed_msg 'starting (setting up basics of standard server)'
+
 INSTALL_TAGS='all server user'
 
+abort_if_command_unknown gpg
 expect_n_args 2 3 'CADDY_PASSWORD, HOSTNAME, [FQDN]' $@
 CADDY_PASSWORD="$1"
 HOSTNAME="$2"
 PATH_CADDY_REPO='https://dl.cloudsmith.io/public/caddy/stable'
 PATH_DUMP='/var/www/dump'
 
-echo -n '# Determining external IP …'
+prefixed_msg_no_nl 'Determining external IP …'
 for _CANDIDATE in $(hostname -I); do
     _START=$(echo ${_CANDIDATE} | cut -d'.' -f1)
     if [ "$(echo -n ${_START} | wc -c)" -gt 3 ]; then  # ignore IPv6
 echo " it's: ${EXTERNAL_IP}"
 
 if [ ! -z "${FQDN}" ]; then
-    echo "# Ensuring provided FQDN ${FQDN} maps to it …"
+    prefixed_msg "Ensuring provided FQDN ${FQDN} maps to it …"
     IP_BY_DNS=$(getent ahostsv4 "${FQDN}" | head -1 | cut -d' ' -f1)
     if [ ! "${IP_BY_DNS}" = "${EXTERNAL_IP}" ]; then
         abort "DNS mapping provided FQDN '${FQDN}' to ${IP_BY_DNS} rather than this system's external IP ${EXTERNAL_IP}."
     fi
 fi
 
-echo '# Ensure we have curl (for caddy installation preparation) …'
+prefixed_msg 'Ensure we have curl (for caddy installation preparation) …'
 apt-get -y install curl > /dev/null
 PATH_CURL_ERROR="$(path_tmp_timestamped curl_error)"
-echo '# Retrieve caddy repo key …'
+prefixed_msg 'Retrieve caddy repo key …'
 set +e
 curl -1Lf "${PATH_CADDY_REPO}/gpg.key" 2> "${PATH_CURL_ERROR}" | gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
 RESULT="$?"
     exit 1
 fi
 PATH_APT_CADDY_REPO='/etc/apt/sources.list.d/caddy-stable.list'
-echo "# Adding caddy repo to ${PATH_APT_CADDY_REPO} …"
+prefixed_msg "Adding caddy repo to ${PATH_APT_CADDY_REPO} …"
 curl -1LfsS "${PATH_CADDY_REPO}/debian.deb.txt" > "${PATH_APT_CADDY_REPO}"
 
 core_setup "${HOSTNAME}" "${FQDN}" "${EXTERNAL_IP}" "${INSTALL_TAGS}"
 
-echo '# Moving SSH data from root to user …'
+prefixed_msg 'Moving SSH data from root to user …'
 mkdir -p "${PATH_USER_SSH}"
 mv "/root/${PATH_REL_SSH}/authorized_keys" "${PATH_USER_SSH}/"
 chown -R "${USERNAME}:${USERNAME}" "${PATH_USER_SSH}"
 
-echo '# Setting up minimal borg user …'
+prefixed_msg 'Setting up minimal borg user …'
 adduser --quiet --system --home "${PATH_BORG_HOME}" --shell /bin/sh borg
 cp -a "${PATH_USER_SSH}" "${PATH_BORG_HOME}/"
 chown -R borg:nogroup "${PATH_BORG_HOME}/${PATH_REL_SSH}"
 
-echo '# Enabling firewall …'
+prefixed_msg 'Enabling firewall …'
 systemctl --quiet enable --now nftables
 
-echo "# Creating web-accessible directories …"
+prefixed_msg "Creating web-accessible directories …"
 mkdir -p "${PATH_DUMP}/private" "${PATH_DUMP}/public"
 
-echo "# Adapting ${PATH_CADDYFILE} …"
+prefixed_msg "Adapting ${PATH_CADDYFILE} …"
 CADDY_PW_HASH=$(caddy hash-password --plaintext "${CADDY_PASSWORD}")
 if [ -z "${FQDN}" ]; then
     ADDRESS_TO_CADDY="${EXTERNAL_IP}"
 sed -i 's|REPLACE_WITH_HASH|'"${CADDY_PW_HASH}"'|g' "${PATH_CADDYFILE}"
 sed -i 's/REPLACE_WITH_FQDN/'"${ADDRESS_TO_CADDY}"'/g' "${PATH_CADDYFILE}"
 
-echo "# Restarting caddy …"
+prefixed_msg "Restarting caddy …"
 systemctl reload caddy
 
 put_finished_marker 'setup_server'
+prefixed_msg 'finished'
+prefixed_msg_exit
 
-../../../bookworm/scripts/lib/minimize_installation
\ No newline at end of file
+../../../trixie/scripts/lib/minimize_installation
\ No newline at end of file
 
+++ /dev/null
-../../bookworm/aptmark/all
\ No newline at end of file
 
+++ /dev/null
-../../bookworm/aptmark/server_basic
\ No newline at end of file
 
+++ /dev/null
-../../bookworm/scripts/lib
\ No newline at end of file