Skip to content

Update JoinMarket NG

Review the release notes, check your backups, and stop wallet processes cleanly before updating. Let any active transaction or tumbler phase finish. Afterward, restart with the updated software and check wallet state; resume a saved tumble explicitly.

Existing users: If you currently update by piping the main installer from curl, switch to the authenticated local updater. It preserves the trusted rollback baseline and avoids treating unreleased installer code as the version already installed.

bash ~/.joinmarket-ng/install.sh --update

If that file does not exist yet, follow Older Installations once to create it.

Saved Updater

After a successful verified installation, update with the installer saved in your data directory:

bash ~/.joinmarket-ng/install.sh --update

The saved updater authenticates the current release installer before updating the application. It preserves your existing config.toml, refreshes the nearby config.toml.template, and shows the template differences when available. Settings you omit use the new version's built-in defaults, which may change between releases. Do not replace your configuration with the full template. Review the relevant release notes before adopting new settings.

To install a particular release, add --version X.Y.Z. This selects the application release; the saved installer still refreshes to the latest authenticated installer.

When updating from the TUI, the output is saved in a private update.log.* file under your data directory's logs folder. After the update, a scrollable viewer opens at the end of the log so you can review configuration-template differences and any errors. Use the arrow keys or Page Up/Page Down to scroll, then press q to continue. If less is unavailable, the TUI waits for Enter instead. The log remains available after you leave the TUI. A successful update exits the TUI; a failed update returns to the update menu after review.

Older Installations

Installations created before the saved updater can migrate with one final HTTPS bootstrap:

curl -sSL https://raw.githubusercontent.com/joinmarket-ng/joinmarket-ng/main/install.sh | bash -s -- --update

This bootstrap trusts GitHub and TLS for that run. It is not a retroactive authenticity guarantee for the old installation. After it succeeds, use the saved updater for subsequent updates.

Custom Directories

If the data directory or virtual environment is custom, preserve both settings when updating outside the generated activate.sh environment:

JOINMARKET_DATA_DIR=/srv/joinmarket \
  bash /srv/joinmarket/install.sh --update --venv /opt/jmng-venv

The generated activate.sh exports JOINMARKET_DATA_DIR and JMNG_VENV_DIR. Source it before normal commands so they use the same installation.

Do not use --dev, --version main, or --skip-verify for a funded wallet; those paths bypass signed release verification. See supply-chain security for the trust model and manual verification.

Multiple Installations

The updater manages one virtual environment: ~/.joinmarket-ng/venv, or JMNG_VENV_DIR when set. A source checkout or an earlier install can leave a second installation, and commands then run whichever comes first in PATH. The TUI refuses to update a different installation than the one it runs from.

Check which installation each command comes from:

command -v jm-ng jm-wallet jm-maker
jm-ng --version
~/.joinmarket-ng/venv/bin/python -c 'from jmcore.version import get_version; print(get_version())'

Keep one installation. Wallets, config.toml, and history live in the data directory, not in the virtual environment, so retiring an unused environment does not touch them. To retire an outdated default environment while using another installation:

rm -rf ~/.joinmarket-ng/venv

Then remove the source ~/.joinmarket-ng/activate.sh line from your shell startup file, and point any systemd ExecStart= paths at the installation you keep (see maker service). To return to the updater-managed installation instead, run the saved updater, which recreates a missing environment and activate.sh.