Jam is the web interface for JoinMarket, the CoinJoin implementation with no coordinator, no company, no central honeypot: users pay fees to random peers (referred to as “makers”) instead of trusting a mixing service. The vast majority of users running Jam today did so by running a node from a distro (Umbrel, RaspiBlitz, etc…), and are running v0.4.x.
It’s familiar, but under the hood a completely different engine has been implemented. This is what changed and why you should update to this version now.
The engine swap is the main story
Jam is a two part system: a UI that runs in your browser, and a wallet daemon that holds your keys and connects to your Bitcoin node.
- v0.4.x: Run the original code, JoinMarket (clientserver) v0.4.x. This is a dead end and has been upstream archived since April 2026. It appears to be broken on Bitcoin Core v30. Distros have been telling their users to pin Bitcoin Core to v29.2.
- v2.0 now runs off of the new JoinMarket NG (not sure what the NG stands for yet) which is the currently actively developed continuation of the JoinMarket codebase. v2.0 uses modern descriptor wallets, is compatible with the current version of Core (v29/v30), and can even use Neutrino if you'd rather not run an archival node. You can spin it up literally on any device.
What's genuinely better in v2
I finally got around to setting up a container to test out the latest version of Soda. The UX improvements and usability enhancements are very nice. The orderbook now loads much more quickly. Creating a Sweep and offers has also become much easier. For example, in offers, there are now preselected fee options to match the overall design, as apparently offers with fee not matching the public fee grid will be excluded in sweep rounds. Current default takers require quantized fees for the offer to be considered.
When using it, you'll find much better:
- Transparent coin control. Sweeps and fidelity-bond operations now pin the exact UTXOs and show them in the confirm dialog, instead of re-deriving inputs at broadcast time. You see what gets spent before you sign it.
- A real privacy default. JoinMarket NG auto-freezes coins that arrive on a previously-used, empty address (the forced-address-reuse trick chain analysis loves) so they can't silently link your CoinJoins via common-input-ownership. Explicit unfreeze if you disagree.
- Honest taker/maker behavior. Taker policy settings (
minimum_makers, bondless-fee policy) are honored through the web API, not just the CLI; tumbler surfaces failure reasons; retries smarter; makers detect when Tor drops their onion service; rotate identity instead of advertising a dead address for a day; PoDLE commitments rotate when peers get swapped out. - Modern plumbing. PSBT v2 and offline signing, explicit UTXO selection for CoinJoins, BIP-329 labels that distinguish CoinJoin output vs. change vs. deposits, message signing, better i18n and orderbook stats.
- Packaging. One Docker image (
standalone-ng) bundles UI + daemon + Tor + orderbook watcher with GPG-verified builds; an experimental Flatpak bundles NG + Neutrino. Start9 already ships it. Umbrel, notably, still only has v0.4.1 in its app store — Umbrel users run the container by hand (or wait).
Should you switch?
- Learning, small amounts, distro-packaged: staying on 0.4.1 for now is fine. But know it's frozen, and Core v30 is coming for it.
- Care about long-term maintenance: for modern Core, or Neutrino, v2.0 is the only path forward. The team itself calls the NG backend bleeding edge so try it with test amounts first.
- Makers: read the JoinMarket NG 0.40 config diff before restarting your offers — offer randomization semantics (size_factor now only affects maxsize; advertised minsize is pinned) and Tor-control settings changed.
v0.4.1 and v2.0 are separate wallets with incompatible formats. Don't point both at the same seed. Migrate deliberately: recovery words offline first, recover in the new wallet, verify the balance, then retire the old app. If you've never written those words down, do that before anything else.
Repos
- Jam UI: https://github.com/joinmarket-webui/jam
- Docker images (standalone-ng, ui-only): https://github.com/joinmarket-webui/jam-docker
- JoinMarket NG backend: https://github.com/joinmarket-ng/joinmarket-ng
Docs
- Jam docs & FAQ: https://jamdocs.org
- JoinMarket NG docs (incl.
jmwalletd): https://joinmarket-ng.github.io/joinmarket-ng/ - Live order book: https://joinmarket-ng.sgn.space
Support
Great post!
NG stands for "Next Generation"😉
It is in continuous development, but it's externally audited before every release and is the most used implementation in mainnet.
Thanks for the clarification, I'd have never guessed.
How comfortable do you feel inviting users to migrate to the latest version?
Do you have a plan to update the containers for the various distros? Anything scheduled for S9?
The Jam v2 beta works pretty well, IMO it's already better than v1.
I remember there was a Jam v2 beta for S9 already!