diff --git a/apps/swh-loader-highpriority/README b/apps/swh-loader-highpriority/README
new file mode 100644
index 0000000000000000000000000000000000000000..41dc186104233ba3f75a3de99b66ca11d7885dd0
--- /dev/null
+++ b/apps/swh-loader-highpriority/README
@@ -0,0 +1,3 @@
+This used to be the "highpriority" image used by the save-code-now functionality
+(bundling multiple [d]vcs loaders into one docker image). It's been deprecated in favor
+of the "savecodenow" image.
diff --git a/apps/swh-loader-savecodenow/Dockerfile b/apps/swh-loader-savecodenow/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..8613caaf29d545ef3e0ba3f879259fdc0856f64f
--- /dev/null
+++ b/apps/swh-loader-savecodenow/Dockerfile
@@ -0,0 +1,39 @@
+# Deeply inspired from the Dockerfile of the swh-graph project
+ARG REGISTRY=container-registry.softwareheritage.org/swh/infra/swh-apps/
+ARG RSVNDUMP=/usr/local/bin/rsvndump
+FROM ${REGISTRY}rsvndump-base:latest AS rsvndump_image
+
+FROM python:3.10-bullseye
+COPY --from=rsvndump_image ${RSVNDUMP} ${RSVNDUMP}
+
+RUN apt-get -y update && \
+    apt-get -y upgrade && \
+    apt-get install -y libcmph-dev librdkafka-dev \
+      libsvn-dev libapr1-dev libaprutil1-dev subversion \
+      cvs bzr opam git patool mercurial && \
+    apt clean && \
+    addgroup --gid 1000 swh && \
+    useradd --gid 1000 --uid 1000 -m -d /opt/swh swh && \
+    mkdir /etc/swh
+
+USER swh
+WORKDIR /opt/swh
+
+COPY --chown=swh:swh requirements-frozen.txt /opt/swh
+COPY --chown=swh:swh entrypoint.sh /opt/swh
+
+ENV PYTHONPATH=/opt/swh
+ENV PATH=/opt/swh/.local/bin:$PATH
+
+RUN chmod u+x /opt/swh/entrypoint.sh && \
+    /usr/local/bin/python -m pip install --upgrade pip && \
+    pip install --no-cache-dir -r requirements-frozen.txt && \
+    pip install gunicorn
+
+ENV SWH_CONFIG_FILENAME=/etc/swh/config.yml
+ENV SWH_WORKER_INSTANCE=loader
+ENV CONCURRENCY=1
+ENV MAX_TASKS_PER_CHILD=5
+ENV LOGLEVEL=INFO
+
+ENTRYPOINT "/opt/swh/entrypoint.sh"
diff --git a/apps/swh-loader-savecodenow/README.md b/apps/swh-loader-savecodenow/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..fe9c404132fd0fcbf24062dc6286556d8c3acde6
--- /dev/null
+++ b/apps/swh-loader-savecodenow/README.md
@@ -0,0 +1,2 @@
+This image is used for the save code now functionality.
+It regroups a number of (d)vcs loaders into a single docker image.
diff --git a/apps/swh-loader-savecodenow/entrypoint.sh b/apps/swh-loader-savecodenow/entrypoint.sh
new file mode 100644
index 0000000000000000000000000000000000000000..7909d473e12fd5a387e5114bd4937bfd950fd4d9
--- /dev/null
+++ b/apps/swh-loader-savecodenow/entrypoint.sh
@@ -0,0 +1,23 @@
+#!/bin/bash
+
+set -e
+
+case "$1" in
+  "shell")
+    shift
+    echo "Running command $@"
+    exec bash -i "$@"
+    ;;
+  *)
+    echo Starting the swh Celery worker for ${SWH_WORKER_INSTANCE}
+    exec python -m celery \
+       --app=swh.scheduler.celery_backend.config.app \
+       worker \
+       --pool=prefork --events \
+       --concurrency=${CONCURRENCY} \
+       --max-tasks-per-child=${MAX_TASKS_PER_CHILD} \
+       -Ofair --loglevel=${LOGLEVEL} \
+       --without-gossip --without-mingle --without-heartbeat \
+       --hostname "${SWH_WORKER_INSTANCE}@%h"
+    ;;
+esac
diff --git a/apps/swh-loader-savecodenow/requirements.txt b/apps/swh-loader-savecodenow/requirements.txt
new file mode 100644
index 0000000000000000000000000000000000000000..6e2bef5bb1158208f7e896b7c6d95dbd9f9e2eff
--- /dev/null
+++ b/apps/swh-loader-savecodenow/requirements.txt
@@ -0,0 +1,7 @@
+swh-loader-bzr
+swh-loader-core
+swh-loader-cvs
+swh-loader-git
+swh-loader-svn
+swh-loader-mercurial
+swh-loader-metadata