Every release is an image on GitHub's registry
(ghcr.io/pointbluetechnology/dirxml-dev-web:<version>, and latest) with its notes on the
releases page. An upgrade replaces
the image and keeps everything you have: the repository, your workspaces, tokens, configuration,
vault connections and the audit log all live outside it.
- Find the version you run. The page's top bar shows
web … · core …, and/api/sessionreports it. - Read the release notes of every release since then. A change in default behaviour is always the first thing in a release's notes; anything you must do yourself is spelled out there.
- Back up the folder (local install) or the data volume and
./config(team server). An upgrade does not touch them, but a backup costs a minute.
Only the latest release gets security fixes (SECURITY.md).
Knowing when there's one. Since 0.67.0 the server asks GitHub once a day for the latest
release, in the background, and keeps the answer in its data folder. When a newer one is out, the
page's top bar says so ("0.68.0 is available ↗", linking its release notes). × hides the note
until the next release. A server that can't reach GitHub simply never shows it. To turn the check
off (an air-gapped server, CI), put release.check=false in hosted.properties, or set
IDMWEB_NO_UPDATE_CHECK in the server's environment.
Run setup again with the new version, then start it. The folder is kept: setup rewrites the compose file for the new image, and keeps your repository, tokens and configuration.
macOS, and Windows in PowerShell:
docker run --rm --pull always -v "$HOME/idmweb:/idmweb" ghcr.io/pointbluetechnology/dirxml-dev-web:latest setupLinux:
docker run --rm --pull always -u "$(id -u):$(id -g)" -v "$HOME/idmweb:/idmweb" ghcr.io/pointbluetechnology/dirxml-dev-web:latest setupThen, everywhere:
docker compose -f "$HOME/idmweb/compose.yml" up -dlatest takes the newest release, and --pull always makes Docker fetch it. Without that flag,
docker run uses whatever latest it already holds, which is the release you're on, and nothing
changes. Name a version (:0.59.0) to take exactly that one; then no --pull is needed. If you
gave --port, --user or --podman the first time, give them again. Your browser session
survives the upgrade, and the page comes back to the branch and view you were on.
Setup also refreshes the agent kit in the folder's agent/. If you use an agent, run its setup
again (/mcp__dirxmldev__setup in Claude Code) so its skills are the new version's
(agents.md). Agent tokens survive the upgrade.
The top bar shows web … · core …, and it should name the new release. setup also prints the
image it wrote into the folder (image …:<version>), and that is the version the container runs:
docker inspect idmweb --format "{{.Config.Image}}"Still on the old version? Usually one of these:
setupran without--pull always, from thelatestDocker already held. Run it again with the flag, or name the version.- Only
setupran. Rundocker compose … up -das well: setup writes the compose file, and compose replaces the container. - The folder isn't the one the container uses. Mount the same folder setup used the first time.
Installs made with setup.sh from the release zip use the same folder. Stop the old container
first, because the new compose file names the container idmweb:
docker compose -f "$HOME/idmweb/compose.yml" downThen run the two commands above. The old helper ~/idmweb/idm still works, but
docker exec idmweb idm … replaces it, and you can delete it along with ~/idmweb/.engine.
The image is a variable in the server's .env (IDMWEB_IMAGE). Set it to the new version, pull,
and recreate the container:
cd /path/to/the/server # the directory with compose.yml and .env
sed -i 's#^IDMWEB_IMAGE=.*#IDMWEB_IMAGE=ghcr.io/pointbluetechnology/dirxml-dev-web:0.57.0#' .env
docker compose pull idmweb && docker compose up -d idmwebPeople signed in are asked to sign in again only if the release notes say so. Agent tokens are
kept; people's agents get the new version's skills by running the setup prompt again. Check the new
version in /api/session or the page's top bar. Keycloak and Caddy are upgraded on their own
schedule; nothing in a DirXMLDevWeb release requires a newer one unless its notes say so.
An image from a registry of your own (a mirror) works the same: push the release's image there and
point IDMWEB_IMAGE at it.
Update both checkouts and rebuild:
cd ~/IdeaProjects/DirXMLDev && git pull && mvn -q install
cd ~/IdeaProjects/DirXMLDevWeb && git pull && (cd web && npm ci && npm run build) && mvn -q packagebin/idmweb serve <tree> then runs the new version. hosted/docker/single-user/setup.sh rebuilds
the image from the checkouts the same way.
Run the same steps with the previous version's tag: setup with :<previous version> for the
local install, or IDMWEB_IMAGE=…:<previous version> for the team server. Your data is untouched,
unless the newer release's notes say it changed a file's format. In that case they also say
whether going back is safe.