Configuration
JoinMarket NG loads settings in this order (highest priority first):
- CLI arguments
- Environment variables
~/.joinmarket-ng/config.toml- Built-in defaults
Config File
Main config path:
~/.joinmarket-ng/config.toml
Template/reference:
- Bundled inside the
jmcorepackage atjmcore/src/jmcore/data/config.toml.template(the canonical source, loaded at runtime viaimportlib.resources).
The installer creates a starter config automatically from the bundled template.
Config Updates
Your config.toml is never modified automatically after creation. When updating via install.sh --update, the installer compares your config against the bundled template and prints any new sections or keys that are available but not yet in your file. You can then copy them manually from the bundled config.toml.template.
If config.toml is missing entirely (fresh install), it is created from the template.
The comparison is available programmatically via jmcore.settings.config_diff(), which returns a dict of missing sections and missing keys (per section) without modifying the file.
Section Names
Top-level sections in config use these names:
[tor][bitcoin][network_config][wallet][logging][notifications][maker][taker][directory_server][orderbook_watcher]
Environment Variable Mapping
Nested fields use double underscores:
TOR__SOCKS_HOSTBITCOIN__RPC_URLNETWORK_CONFIG__NETWORKMAKER__MIN_SIZETAKER__COUNTERPARTY_COUNT
Some CLI flags still support legacy env var names (for compatibility), but config/env should prefer the canonical section-based names above.
Minimal Example
[bitcoin]
backend_type = "descriptor_wallet"
rpc_url = "http://127.0.0.1:8332"
rpc_user = "rpcuser"
rpc_password = "rpcpassword"
[network_config]
network = "mainnet"
[tor]
socks_host = "127.0.0.1"
socks_port = 9050
Backend Options
descriptor_wallet(recommended)neutrino
Wallet History Reconstruction
[wallet].reconstruct_history defaults to true. When a wallet with no local
protocol history is imported from seed, JoinMarket NG defers while a Bitcoin
Core rescan is active, then enumerates confirmed wallet transactions on the
next wallet sync and persists guessed maker, taker, send, and deposit
rows in history.csv.
These rows have source=onchain; live protocol rows have source=protocol and
are never overwritten.
Set reconstruct_history = false to disable the automatic pass. The explicit
jm-wallet reconstruct-history command remains available and preserves all
protocol-recorded rows.
The reconstruction uses JoinMarket's equal-output CoinJoin heuristic. The CoinJoin amount and equal-output count are observable, but maker/taker role and fees are not unambiguous on-chain. Reconstructed role and fee fields are therefore estimates, and counterparty nicknames cannot be recovered. The manual command waits for an active Bitcoin Core rescan before purging or rebuilding rows. Reconstructed maker guesses are excluded from the legacy yield-generator earnings report, whose fee fields are authoritative. History statistics include reconstructed rows and are labeled as estimates when present.
Neutrino TLS Settings
When using the neutrino backend with TLS enabled (default), set:
neutrino_tls_cert-- path to the neutrino-api TLS certificate (PEM)neutrino_auth_token-- API bearer token stringneutrino_auth_token_file-- path to a file containing the token (alternative toneutrino_auth_token)
The neutrino_url must use https:// when TLS is enabled.
See Neutrino TLS and Installation for the practical migration/setup steps.
Directory Server Heartbeat Settings
The [directory_server] section supports heartbeat liveness controls:
heartbeat_sweep_interval(default60.0): seconds between sweep cyclesheartbeat_idle_threshold(default600.0): idle seconds before probingheartbeat_hard_evict(default1500.0): idle seconds before unconditional evictionheartbeat_pong_wait(default30.0): seconds to wait for PONG reply
These values are tuned to match joinmarket-rs defaults for interoperability.
Notes
- BIP39 passphrases are not intended to be stored in config for normal operations.
- Keep secrets out of shell history; prefer config file permissions and environment handling best practices.