Run A Maker Unattended
Use a service only after interactive maker startup works. This example is for a native Linux installation with systemd. Raspiblitz manages its own service through the terminal menu; container operators should use the maker Compose configuration.
Decide How To Unlock The Wallet
A service cannot answer an interactive password prompt. For unattended startup,
it needs the wallet-file password and, if used, the BIP39 passphrase. The
[wallet] settings mnemonic_password and bip39_passphrase supply them, but
store them in plain text. Restrict the config to its owner with chmod 600 and
protect the host and its backups. An attacker able to read the encrypted wallet
and these credentials can spend its funds.
MNEMONIC_PASSWORD in a protected systemd EnvironmentFile is an alternative
to the config entry, not a way to avoid storing a secret. For interactive-only
unlocking, keep using jm-maker start from a terminal; do not enable boot startup.
Create The Service
Create /etc/systemd/system/jm-maker.service, replacing youruser, paths, and
the backend/Tor unit names with those on your host:
[Unit]
Description=JoinMarket NG Maker
After=network-online.target bitcoind.service tor.service
Wants=network-online.target bitcoind.service tor.service
StartLimitIntervalSec=0
[Service]
Type=simple
User=youruser
ExecStart=/home/youruser/.joinmarket-ng/venv/bin/jm-maker start --mnemonic-file /home/youruser/.joinmarket-ng/wallets/default.mnemonic
Restart=on-failure
RestartSec=30
NoNewPrivileges=true
PrivateTmp=true
[Install]
WantedBy=multi-user.target
The service user needs access to its wallet, config, and Tor control cookie. Dependencies start services in order; they do not prove the backend has synced. Check the journal after startup and resolve repeated errors.
For a separate configuration location, add --config-file /etc/joinmarket/config.toml
and --data-dir /var/lib/joinmarket to ExecStart, with a matching wallet path
and ownership. Do not copy another wallet's data directory over this one.
Services that import a TUI-generated .maker.env must also declare its source:
EnvironmentFile=-/home/youruser/.joinmarket-ng/.maker.env
Environment="JOINMARKET_STAGED_CREDENTIALS_FILE=/home/youruser/.joinmarket-ng/.maker.env"
This is equivalent to jm-maker start --staged-credentials-file PATH. Staged
BIP39 credentials, including an empty passphrase, require an expected wallet
fingerprint. Python validates the effective credential against both that binding
and the selected identity before backend access. It does not execute the file or
import its secrets; systemd supplies credentials through EnvironmentFile.
After upgrading, restage old unbound BIP39 credentials explicitly. Password-only
legacy staging is unchanged. If staging is missing, startup requires either an
explicitly configured BIP39 credential (including empty) or a registered selected
identity whose requirements can be satisfied. An inherited credential alone does
not authorize this missing-file fallback. Manual CLI invocations without a staging
declaration are unaffected by stale .maker.env files.
On Raspiblitz, update the appliance scripts and reconcile the unit as admin/root, then restart explicitly after installing the flag-supporting NG release. Older NG versions ignore the environment marker and do not enforce this contract. The appliance still deletes staging after stop/failure and retries automatically; BIP39-only staging may also be lost during appliance updates. These lifecycle limitations are unchanged. Restaging or configuring credentials is explicit; upgrades do not register identities or trigger rescans.
Start And Check
After arranging noninteractive credentials:
sudo systemctl daemon-reload
sudo systemctl start jm-maker
journalctl -u jm-maker -f
Confirm that offers are published. Only then enable boot startup:
sudo systemctl enable jm-maker
Use sudo systemctl stop jm-maker before maintaining or moving the wallet.
Do not start an interactive maker while the service is using it.