JoinMarket (Bitcoin CoinJoin) modern alternative implementation https://joinmarket-ng.github.io/joinmarket-ng/
  • Python 91.2%
  • Shell 5.9%
  • TypeScript 1.1%
  • Dockerfile 0.6%
  • JavaScript 0.5%
  • Other 0.7%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
m0wer c1384d3acc
fix(jmwallet): clamp background rescan start height to chain tip
The jmwalletd rescanblockchain endpoint drives rescans through
start_background_rescan, which forwarded out-of-range heights straight
to Bitcoin Core. Heights above the tip (e.g. JAM's default 481824 on
signet/regtest) failed server-side with 'RPC error -8: Invalid
start_height' after the API had already returned 200 OK. Normalize the
height in a helper shared with rescan_blockchain: clamp into
[0, chain tip] and floor at the wallet creation height.

Fixes #556

Changelog: Rescans requested above the chain tip (e.g. JAM's default mainnet SegWit height on signet/regtest) are clamped to the tip instead of failing server-side after a 200 OK response
2026-07-09 22:40:43 +02:00
.github test(orderbook_watcher): add browser tests for the web UI 2026-07-09 09:36:57 +02:00
completions build: update base images, dependencies, cli help, and completions 2026-06-03 09:26:25 +02:00
directory_server fix(jmcore): keep strong references to fire-and-forget tasks 2026-07-08 13:17:08 +02:00
docs docs(jmwallet): document reserving and labeling deposit addresses 2026-07-09 13:25:29 +02:00
flatpak build: update base images, dependencies, cli help, and completions 2026-06-23 19:55:21 +02:00
jmcore fix(jmcore): demote transport dial logs to DEBUG 2026-07-09 09:36:42 +02:00
jmwallet fix(jmwallet): clamp background rescan start height to chain tip 2026-07-09 22:40:43 +02:00
jmwalletd fix(jmwalletd): expose running tumble as legacy schedule in /session 2026-07-08 22:58:23 +02:00
maker fix(jmcore): keep strong references to fire-and-forget tasks 2026-07-08 13:17:08 +02:00
media style: logo improvements 2026-03-11 07:20:43 +01:00
orderbook_watcher feat(orderbook_watcher): make fee chart tooltip actionable for takers 2026-07-09 09:53:56 +02:00
scripts test(orderbook_watcher): add browser tests for the web UI 2026-07-09 09:36:57 +02:00
signatures build: add GPG signature for release 0.33.0 2026-06-25 21:44:28 +05:30
taker fix(taker): make maker auth_pub UTXO binding case-insensitive 2026-07-09 22:26:25 +02:00
tests feat(jmwallet): persist issued and reserved deposit addresses 2026-07-09 10:31:34 +02:00
tumbler fix(tumbler): honor tumbler pacing settings in the standalone CLI 2026-07-08 12:49:51 +02:00
.coveragerc build: more accurate coverage reporting 2026-04-09 16:13:46 +02:00
.dockerignore feat: Jam integration 2026-03-03 16:07:37 +01:00
.gitignore test(orderbook_watcher): add browser tests for the web UI 2026-07-09 09:36:57 +02:00
.pre-commit-config.yaml refactor(taker): extract fill/auth phases and reduce complexity 2026-06-15 10:19:22 +02:00
AGENTS.md test(orderbook_watcher): add browser tests for the web UI 2026-07-09 09:36:57 +02:00
CHANGELOG.md release: 0.33.0 2026-06-24 10:47:33 +02:00
complexipy.toml refactor(taker): extract fill/auth phases and reduce complexity 2026-06-15 10:19:22 +02:00
conftest.py test: isolate proxy env and notifier singleton across tests 2026-06-11 08:35:59 +02:00
docker-compose.jam-ng-signet.yml doc: update comments after mempool.space removal 2026-03-14 08:04:56 +01:00
docker-compose.yml refactor(jmwalletd): drop legacy descriptor_wallet_name setting 2026-06-28 12:03:37 +02:00
install.sh release: 0.33.0 2026-06-24 10:47:33 +02:00
LICENSE feat: initial commit 2025-11-15 18:31:58 +01:00
mkdocs.yml docs: publish jmwalletd and tumbler in site nav and API reference 2026-07-08 13:07:44 +02:00
properdocs.yml build(docs): remove mkdocs naming from docs tooling 2026-04-08 17:19:15 +02:00
pytest.ini test(jmwalletd): add tumbler_e2e marker and JMWALLETD_URL env override 2026-04-29 14:48:47 +02:00
README.md docs: publish jmwalletd and tumbler in site nav and API reference 2026-07-08 13:07:44 +02:00
requirements-docs.in docs: dynamic API reference generation with mkdocs-gen-files 2026-02-25 18:55:04 +01:00
requirements-docs.txt build: update base images, dependencies, cli help, and completions 2026-06-23 19:55:21 +02:00
SECURITY.md docs: add SECURITY.md with vulnerability disclosure policy 2026-06-08 08:37:24 +02:00

JoinMarket NG Logo

JoinMarket NG

JoinMarket NG is a modern implementation of the JoinMarket CoinJoin protocol for Bitcoin privacy.

It is wire-compatible with the reference JoinMarket network and supports both liquidity taking (jm-taker) and liquidity making (jm-maker).

Start Here

Quick Start

  1. Install (Linux/macOS):

The installer needs curl to fetch itself and uses sudo to install system packages on Debian/Ubuntu (so on a fresh minimal image you'll want curl, sudo, and your user added to the sudo group; on macOS you'll want Homebrew). Everything else (gnupg, git, build tools) is installed for you on first run.

curl -sSL https://raw.githubusercontent.com/joinmarket-ng/joinmarket-ng/main/install.sh | bash
source ~/.joinmarket-ng/activate.sh
  1. Edit ~/.joinmarket-ng/config.toml and set your backend (descriptor_wallet for Bitcoin Core, or neutrino):
[bitcoin]
backend_type = "descriptor_wallet"
rpc_url = "http://127.0.0.1:8332"
rpc_user = "your_rpc_user"
rpc_password = "your_rpc_password"
  1. Create wallet and get deposit addresses:
jm-wallet generate
jm-wallet info
  1. Run CoinJoin as a taker, or start earning fees as a maker:
jm-taker coinjoin --amount 1000000 --destination INTERNAL
# or
jm-maker start

Module Docs

Community

License

MIT: https://joinmarket-ng.github.io/joinmarket-ng/license/

Acknowledgements

JoinMarket NG builds on the work of the original JoinMarket project. Special thanks to Adam Gibson (@AdamISZ) and all past and present JoinMarket contributors.

Thanks to @1440000bytes (Floppy) for the ongoing external audit, and to @L3ftBlank for beta testing and contributions. And to everyone who has opened an issue, submitted a PR, or joined a discussion. You're part of this too!

Sustained by grants from OpenSats and the HRF Bitcoin Development Fund. Keeping this project free, open, and independent.