diff --git a/README.md b/README.md
index 6f7173b55073ecc6c4ce9423d3bc7104009e2881..da5807a8828751b46b0afd2c0571bfa2efba254a 100644
--- a/README.md
+++ b/README.md
@@ -16,6 +16,8 @@ The *LarvaTagger* project is divided into several components. Although this READ
 
 This package features a web-based graphical user interface (GUI) for visualizing the tracked larvae and assigning discrete behavior tags, at each time step.
 
+As a web GUI, a public instance can be found at [nyx.pasteur.cloud](https://nyx.pasteur.cloud/larvatagger). Demo data can be found in the [Quick start](#quick-start-with-docker) section below.
+
 A command-line interface (CLI) is also available for batch processing, including the automatic tagging of track data files, training new taggers from labeled data, etc.
 
 Although *LarvaTagger.jl* alone comes with no automatic tagger, it is designed to work primarily in combination with [*MaggotUBA*](https://gitlab.pasteur.fr/nyx/MaggotUBA-adapter) for the identification of larval actions or postures.
@@ -53,7 +55,7 @@ Change directory (`cd`) to the Downloads directory. In this example, we will ass
 
 On macOS and Linux, change the permissions of the script file so that it can be executed:
 ```
-chmod a+x larvatagger.sh
+chmod +x larvatagger.sh
 ```
 
 The demo data can be opened in the web browser for visual inspection, on macOS and Linux with:
@@ -132,12 +134,6 @@ cd LarvaTagger
 julia --project=. -e 'using Pkg; Pkg.instantiate()'
 ```
 
-In May 2024, the gitlab.pasteur.fr server began to request an authentication token on cloning public repositories.
-If the `git clone` command requests an authentication token you do not have, do instead:
-```
-curl -sSL https://gitlab.pasteur.fr/nyx/larvatagger.jl/-/archive/main/larvatagger.jl-main.tar.gz | tar zxv && mv larvatagger.jl-main LarvaTagger
-```
-
 Calling `Pkg.instantiate` in a copy of the project is preferred over using `Pkg.add`,
 because *LarvaTagger.jl* depends on several unregistered packages.
 
@@ -218,7 +214,7 @@ Feel free to adjust the value if the 2D view is too small or large.
 
 ## Automatic tagging
 
-*LarvaTagger.jl* comes with no automatic tagger per default, unless run using Docker or installed with the *scripts/install.sh* script and the `--with-default-backend` option.
+*LarvaTagger.jl* comes with no automatic tagger per default, unless you run the Docker image or you installed LarvaTagger with the *scripts/install.sh* script and the `--with-default-backend` option.
 
 To extend the editor with automatic tagging capabilities, see the [recommended installation steps for *TaggingBackends* and *MaggotUBA*](https://gitlab.pasteur.fr/nyx/TaggingBackends#recommended-installation).
 
diff --git a/doc/develop.md b/doc/develop.md
index 6648bcc4d7fc50bd7eea01fd4623dca63c3f870e..322d13fb760e0dc08b1552165cfaa3e48aca21d4 100644
--- a/doc/develop.md
+++ b/doc/develop.md
@@ -59,3 +59,5 @@ scripts/larvatagger-gui.jl http://localhost:9285
 The `docker=docker` environment variable is required if command `podman` is available.
 The `scripts/larvatagger.sh` script falls back on using `podman` instead of `docker`, if `podman` is available, but it is recommended to perform tests using Docker.
 In addition, at present, building the image works with Docker buildx only.
+
+See also the `recipes/release.sh` script.
diff --git a/recipes/README.md b/recipes/README.md
index 5ad9e8eba19161dc6f1bc7f2593a96e387537981..f0302b08f7149ec1c08abb039558d66cb71fdd64 100644
--- a/recipes/README.md
+++ b/recipes/README.md
@@ -149,10 +149,6 @@ Optionally, you can also get the default backend (currently *20230311*) with:
 ```
 scripts/larvatagger.sh build --with-default-backend
 ```
-Currently, Docker images on Docker Hub are built with:
-```
-scripts/larvatagger.sh --target confusion build --with-default-backend
-```
 
 If you want another tagger, *e.g.* the *20230129* tagger implemented by the *20230129* branch of the *MaggotUBA-adapter* repository, do:
 ```
@@ -177,7 +173,7 @@ docker pull flaur/larvatagger
 ```
 
 Beware that images that ship with a tagging backend are relatively large files (>5GB on disk).
-If you are not interested in automatic tagging, use the `flaur/larvatagger:0.19-standalone` image instead.
+If you are not interested in automatic tagging, use the `flaur/larvatagger:0.20-standalone` image instead.
 
 ### Upgrading
 
diff --git a/recipes/release.sh b/recipes/release.sh
new file mode 100755
index 0000000000000000000000000000000000000000..396d85810578e9f7385bedc97fcbf336869d495b
--- /dev/null
+++ b/recipes/release.sh
@@ -0,0 +1,26 @@
+#!/bin/sh
+
+set -e
+
+RELEASE=$1
+
+if [ -z "$RELEASE" ]; then
+  echo "Usage: $0 <version-number>"
+  exit 1
+fi
+
+docker=docker LARVATAGGER_IMAGE=flaur/larvatagger:$RELEASE-standalone scripts/larvatagger.sh build
+docker=docker LARVATAGGER_IMAGE=flaur/larvatagger:$RELEASE-20230311 scripts/larvatagger.sh --target confusion build --with-default-backend
+docker tag flaur/larvatagger:$RELEASE-20230311 flaur/larvatagger:latest
+docker build -t flaur/larvatagger:$RELEASE-bigfat -f recipes/Dockerfile.pasteurjanelia --no-cache .
+
+test/predict_and_retrain.sh
+
+cat <<EOF
+Next steps are:
+docker login
+docker push flaur/larvatagger:$RELEASE-standalone
+docker push flaur/larvatagger:$RELEASE-20230311
+docker push flaur/larvatagger:$RELEASE-bigfat
+docker push flaur/larvatagger:latest
+EOF
diff --git a/test/deploy_and_test.sh b/test/deploy_and_test.sh
index b0c01135993e026b23fa15c76f0603cb7648b8f2..0de55088c010f5f1ddc210710a850c58bf671e46 100755
--- a/test/deploy_and_test.sh
+++ b/test/deploy_and_test.sh
@@ -23,7 +23,8 @@ if ! [ -f scripts/install.sh ]; then
 fi
 
 scripts/install.sh --uninstall
-scripts/install.sh --with-default-backend
+LARVATAGGER_BRANCH=dev \
+  scripts/install.sh --with-default-backend
 
 #############
 ## Maestro ##
diff --git a/test/predict_and_retrain.sh b/test/predict_and_retrain.sh
index 771145dbfda52ccd5b086d616f5d6abdd89a7ffb..fd68d62e626d057d0301b9fdeff312f3c97ca3bd 100755
--- a/test/predict_and_retrain.sh
+++ b/test/predict_and_retrain.sh
@@ -3,6 +3,8 @@
 # this script performs a few tests with the Docker image
 # TODO: implement more use cases as in scenarii.sh
 
+set -e
+
 trap 'rm -rf "$TMPDIR"' EXIT
 
 TMPDIR=$(mktemp -d) || exit 1