Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Configuration Flag Reference

This chapter is the complete reference for every configuration key satd recognizes — what it does, its default, whether it reloads live on SIGHUP, and whether it is Bitcoin Core-compatible or a satd extension.

For how configuration is sourced and the live-reload mechanics, see Configuration, Tuning & Reload. This chapter is the flat per-key index. The auth-related keys (authfile, *authbearer/*auth, *allowremote, cookie/rpcuser/rpcauth) are explained in context in Authentication & Authorization; the sync / consensus / storage-tuning keys (assumevalid, consensus, shadow*, dbcache, prefetchworkers, maxahead, storageprofile, the rocksdb* / compaction* family, reindex) in Initial Block Download & Fast Sync.

How satd reads configuration

Goal: drop in your existing Bitcoin Core bitcoin.conf and have it just work. satd reads Core's configuration surface directly — same bitcoin.conf / satd.conf key=value + [network] section syntax and the same CLI flag names (-datadir, -rpcport, …). Supported-flag names and semantics track Bitcoin Core v30.

  • Resolution order: -conf=<path> if given, else <datadir>/bitcoin.conf, else <datadir>/satd.conf. CLI flags always win over file values.
  • What happens to each config-file key (the four-way disposition that makes drop-in safe):
    1. Honored — satd implements it. The common operator surface.
    2. Skipped with a warning — a recognized Core v30 option satd doesn't implement but is safe to skip. The node still starts; a WARN line names the ignored key (and the satd equivalent, if any). This is what lets a real bitcoin.conf boot unedited.
    3. Rejected at load — a small set where silently skipping would mislead you about the node's security / exposure / privacy posture (see Unsupported Core keys). Fail-closed with guidance.
    4. Rejected as a typo — a key that is neither a satd option nor a known Core v30 option. Rejected so a fat-fingered security option (e.g. rpcusser=) can't silently disable auth.
  • Never silently ignored. Skipped keys always warn; nothing a config asks for is dropped without the operator being told.
  • -profile=<preset> seeds a hardware/role profile (archival, pruned-home, mining, regtest-dev, signet-watchtower); explicit flags override the profile's values.

Compatibility is pinned to Bitcoin Core v30 — and only v30. The drop-in target is a frozen, verifiable surface, not "whatever Core ships next." Keys Core adds in v31 or later (e.g. limitclustercount, limitclustersize, privatebroadcast, txospenderindex) are not recognized and are rejected as typos until this pin is deliberately bumped. Keys Core removed at or before v30 (e.g. upnp, maxorphantx) are likewise not honored. If you migrate a bitcoin.conf from a newer Core, a v31+ key will fail to start satd with an "unknown key" error — that is intentional, not a bug.

Building on satd? Don't poll or shell-hook — stream. This reference is for operating the node. If you are writing software that consumes node state (blocks, mempool, address activity, reorgs), the supported integration path is the Streaming Consumption API (gRPC / WebSocket / ZMQ): reorg-safe, durable cursor replay, decoupled from consensus. The Core *notify shell hooks and ad-hoc RPC polling are provided for compatibility and quick scripts only — they have no delivery guarantee, no replay, and no reorg awareness.

Legend

  • Reloadhot: applied live on SIGHUP (systemctl reload satd). restart: wired into long-lived state at startup; reported as "restart required" on reload, never silently ignored. (TLS certificate contents reload via SIGUSR1 even where the key is restart — see Live TLS Certificate Reload.)
  • Compatcore: same key name and substantially the same semantics as Bitcoin Core. satd: a satd-specific extension (no Core equivalent, or satd-only semantics). Best-effort classification; a key "modeled on" Core behavior but without a Core flag of the same name is satd.

Every key listed in the per-category tables below is honored (disposition #1 — satd implements it). Recognized Core v30 keys satd does not honor are not in these tables; they are enumerated, with their warn-and-skip or fail-closed disposition, under Unsupported Core keys: skipped vs rejected. So: in a table here ⇒ supported; in the unsupported-keys section ⇒ warn-and-continue (or rejected); in neither ⇒ rejected as a typo.


Network selection

KeyDefaultReloadCompatDescription
regtestoffrestartcoreUse the regtest network.
testnetoffrestartcoreUse the testnet network.
testnet4offrestartcoreUse the testnet4 network.
signetoffrestartcoreUse the signet network.
chainmainrestartcoreUnified network selector: main|test|signet|regtest|testnet4. Alternative to the per-net flags.

The bare selectors (signet=1, testnet4=1, …) and chain= are honored both on the command line and in bitcoin.conf (Bitcoin Core parity). CLI selectors take precedence over the config file. Selecting more than one network — two bare selectors, or a chain= that disagrees with a bare selector — is a startup error rather than a silent pick.

Filesystem

KeyDefaultReloadCompatDescription
datadirplatform defaultrestartcoreData directory.
blocksdir<datadir>/blocksrestartcoreAlternative location for blocks/ and flat-file undo data.
confbitcoin.conf in datadirrestartcoreConfig file path.
includeconfnonerestartcoreAdditional config file to splice in; honored only inside a config file.
pidnonerestartcoreWrite PID to file.
profilenonerestartsatdNamed preset: archival|pruned-home|mining|regtest-dev|signet-watchtower; CLI flags override it.

Daemon control

KeyDefaultReloadCompatDescription
daemonoffrestartcoreRun in background; accepted for compatibility (no-op — use systemd).
serveronrestartcoreAccept RPC commands; accepted for compatibility (always on).
logformattextrestartsatdLog output format: text or json. Only verbosity hot-reloads, not the format.
logtimestampsonrestartcorePrepend a timestamp to each log line. Disable (-nologtimestamps) when journald / the container runtime already stamps lines.
logthreadnamesoffrestartcorePrepend the originating thread name to each log line.
logsourcelocationsoffrestartcorePrepend source file:line to each log line.
debugnonehotcoreEnable debug logging for a category (repeatable; bare/all/1 = everything).
debugexcludenonehotcoreDisable debug logging for a category debug would otherwise enable.
loglevelinfohotcoreGlobal verbosity (trace/debug/info/warn/error) or a per-category override (net:debug). Maps onto satd's tracing filter: a bare level sets the default for targets not already overridden — it does not lower a more specific -debug/RUST_LOG directive (so -debug=net -loglevel=error still logs net at debug). A category:level pair overrides that subsystem.
allowignoredconfoffrestartcoreSuppress startup warnings about includeconf files satd had to ignore.
maxshutdownsecs30hotsatdMax graceful-shutdown flush duration (seconds) before force exit.

RPC server

KeyDefaultReloadCompatDescription
rpcport8332 (network-dependent)restartcoreRPC server port. Defaults: main 8332, test 18332, testnet4 48332, signet 38332, regtest 18443.
rpcbind127.0.0.1:<rpcport>restartcoreBind plain-HTTP JSON-RPC to address (repeatable). Non-loopback requires rpcallowip.
rpcallowiploopback onlyrestartcorePer-request source-IP allowlist for JSON-RPC (repeatable).
rpcusernonehotcoreRPC username.
rpcpasswordnonehotcoreRPC password.
rpcthreads16restartcoreMax concurrent in-flight RPC method calls.
rpcworkqueue64restartcoreMax queued RPC requests beyond rpcthreads before HTTP 429 (Core returns 503 — documented divergence).
apithreadsmax(2, cores/4)restartsatdWorker threads for the isolated API runtime (Esplora/Electrum/events gRPC/metrics).
rpcreadonlybindnonerestartsatdBind an opt-in read-only JSON-RPC listener (reads + mempool submit) on the API runtime.
rpcreadonlyport8330restartsatdDefault port for rpcreadonlybind entries without an explicit port.
rpcreadonlyallowiploopback onlyrestartsatdSource-IP allowlist for the read-only listener.
rpcreadonlythreads= rpcthreadsrestartsatdMax in-flight calls on the read-only listener.
rpcreadonlyworkqueue= rpcworkqueuerestartsatdRead-only listener work-queue depth before HTTP 429.
rpcreadonlytlsbindnonerestartsatdTLS bind for the read-only listener (requires cert+key).
rpcreadonlytlscertnonerestartsatdPEM certificate (chain) for the read-only TLS listener.
rpcreadonlytlskeynonerestartsatdPEM private key for the read-only TLS listener.
rpcreadonlymtlsfalserestartsatdRequire a client cert (mTLS) on the read-only TLS surface.
rpcreadonlymtlsclientcanonerestartsatdCA bundle client certs must chain to on the read-only TLS surface.
rpcreadonlymtlsclientallowany CA-signedrestartsatdAllowlist of client-cert subjects on the read-only TLS surface.
rpcauthnonehotcoreHMAC-SHA256 RPC credential user:salt$hash (Core rpcauth format; repeatable).
authfilenonerestartsatdPath to unified-auth bearer-token file (TOML); enables the opt-in bearer-auth layer. Token contents reload live.
rpcauthbearerfalserestartsatdHonor Authorization: Bearer tokens on the JSON-RPC listeners (requires authfile).
rpccookiefile$DATADIR/.cookierestartcoreOverride the auto-generated cookie file path.
rpccookiepermsowner (0600)restartcoreCookie file permissions: owner(0600)|group(0640)|all(0644).
rpcdefaultunitsbtchotsatdDefault units for RPC amount fields: btc (Core-compatible) or sats.
rpcdisableauthfalserestartsatdDisable HTTP Basic auth on the JSON-RPC TLS surface; only valid with rpcmtls=1.
rpcextendederrorsoffhotsatdEmit structured error payloads (category/suggestion/debug) on RPC errors.

RPC TLS

(satd-specific — Core's RPC is HTTP-only behind a TLS-terminating sidecar.)

KeyDefaultReloadCompatDescription
rpctlsbindnonerestartsatdBind the JSON-RPC TLS listener (requires cert+key).
rpctlscertnonerestartsatdPEM TLS certificate for the JSON-RPC server.
rpctlskeynonerestartsatdPEM TLS private key for the JSON-RPC server.
rpctlshandshaketimeout10restartsatdPer-handshake timeout (seconds) for the JSON-RPC TLS surface.
rpcmtlsfalserestartsatdRequire mutual TLS on the JSON-RPC TLS listener.
rpcmtlsclientcanonerestartsatdPEM CA bundle to verify client certs when rpcmtls=1.
rpcmtlsclientallowany CA-signedrestartsatdAllowlist of accepted client-cert CN/DNS-SAN values.

P2P

KeyDefaultReloadCompatDescription
listenonrestartcoreAccept P2P connections.
networkactiveonhotcoreStart with P2P networking enabled. =0 boots with networking paused (no inbound accepts, no outbound dials); toggle at runtime with the setnetworkactive RPC.
blocksonlyfalsehotcoreSuppress P2P transaction relay; locally-submitted txs still relayed.
v2transporttruehotcoreOffer/accept BIP 324 v2 encrypted transport (Core default since v26).
v2onlyfalsehotsatdRefuse peers that do not speak BIP 324 v2 (privacy / anti-surveillance lever).
externalipnonehotcoreExternal address to advertise to peers (repeatable).
whitelistnonehotcoreGrant net permissions to peers by source subnet (repeatable).
whitelistrelayonhotcoreGrant relay to whitelisted peers with default permissions (relay their txes even under -blocksonly). Entries with an explicit perms@ prefix are unaffected.
whitelistforcerelayoffhotcoreGrant forcerelay to whitelisted peers with default permissions. Entries with an explicit perms@ prefix are unaffected.
whitebindnonerestartcoreBind an extra permissioned P2P listener (repeatable).
asmapnonerestartcoreasmap file for ASN-based addrman bucketing (eclipse resistance).
portnetwork defaultrestartcoreP2P listen port.
bind0.0.0.0restartcoreBind P2P to this address.
connectnonehotcoreConnect only to specific peer(s) (repeatable). Connect-only exclusivity is a startup decision (restart to change).
addnodenonehotcoreAdd a node to connect to (does not disable DNS seeding).
seednodenonehotcoreOne-shot seed peer connected at startup to bootstrap discovery.
maxconnections125hotcoreMaximum total connections.
maxinboundperip3hotsatdMax simultaneous inbound peers from one source IP (Core-style flood guard; no Core flag).
maxuploadtarget0 (unlimited)hotcoreSoft cap (bytes/24h) on historical block upload.
dnstruerestartcoreAllow DNS lookups for -addnode/-seednode/-connect.
dnsseedtruerestartcoreQuery DNS seeds for peer addresses (requires dns).
forcednsseedfalserestartcoreAlways query DNS seeds even with a populated address book.
fixedseedstruerestartcoreAllow the compiled-in fixed-seed fallback.
bantime86400hotcoreBan duration in seconds.
timeout5000 mshotcoreP2P connection timeout in milliseconds (accepts 5s/5000ms).
onlynetallrestartcoreRestrict to network types: ipv4, ipv6, onion.
signetseednodebuilt-in seedsrestartcoreAdditional signet seed node (repeatable; signet only).
signetchallengedefault signetrestartcoreCustom signet challenge script, hex (BIP 325; signet only).

BIP35 mempool requests. satd answers a peer's mempool message (which asks us to announce our entire mempool) only for peers granted the mempool net permission — -whitelist=mempool@<subnet>, all@<subnet>, or a bare -whitelist=<subnet> entry (whose implicit permission set includes mempool, as in Core). It is not implied by noban@. The response honors the requesting peer's fee filter, and dumps to one peer are rate-limited (at most one per 30 s). satd does not advertise NODE_BLOOM (BIP37 bloom filters are unsupported); mempool requests from peers without the permission are ignored — softer than Bitcoin Core with bloom disabled, which disconnects such peers unless they have noban.

Proxy / Tor

KeyDefaultReloadCompatDescription
proxynonerestartcoreSOCKS5 proxy for all outbound connections.
proxyrandomizeonrestartcoreUse fresh random SOCKS5 credentials per connection so Tor isolates each peer on its own circuit (IsolateSOCKSAuth). Relies on Tor's default SocksPort isolation; a no-op on a non-Tor SOCKS proxy (or one with IsolateSOCKSAuth disabled), where credentials are simply not negotiated. Set =0 to opt out.
onion= -proxyrestartcoreSOCKS5 proxy for .onion connections.
torcontrol127.0.0.1:9051restartcoreTor control port for the hidden service. Auth is negotiated via PROTOCOLINFO: SAFECOOKIE (stock-Tor default) when no password is set, else password, else null.
torpasswordnonerestartcoreTor control port password (for a HashedControlPassword setup). Leave unset to use SAFECOOKIE cookie auth.
listenonionoff (on if torcontrol set)restartcoreCreate a Tor v3 hidden service via the control port.

Consensus

KeyDefaultReloadCompatDescription
assumevalidper-network hashrestartcoreSkip script verification up to HASH (0=verify all, all=skip old blocks).
assumevalidage86400restartsatdWith assumevalid=all, still verify scripts for blocks newer than SECS.
checkpointsonrestartcoreEnforce the built-in block checkpoints. -checkpoints=0 disables checkpoint validation.
stopatheightnonerestartcoreStop once the active-chain tip reaches HEIGHT.
consensusrust-shadowrestartsatdConsensus engine: cpp|rust|rust-shadow|cpp-shadow.

Indexing

KeyDefaultReloadCompatDescription
txindexoffrestartcoreMaintain a full transaction index.
addressindexonrestartsatdMaintain an address-history index (backs native Electrum/Esplora).
addrindexsubscriptions10000hotsatdMax concurrent per-scripthash status subscriptions.
blockfilterindexoffrestartcoreBIP 158 compact-block-filter index (basic/0/1).
peerblockfiltersoffhotcoreAdvertise NODE_COMPACT_FILTERS and serve BIP 157 filters; implies blockfilterindex=basic.

Mempool / relay policy

KeyDefaultReloadCompatDescription
mempoolfullrbfonhotsatdEnable full replace-by-fee. Core removed this flag in v28 (full-RBF is now unconditional there); satd retains it as a toggle.
maxmempool300 MBhotcoreMaximum mempool size in MB.
minrelaytxfee1000 sat/kvBhotcoreMinimum relay fee rate.
dustrelayfee3000 sat/kvBhotcoreDust relay fee rate.
datacarrieronhotcoreAccept OP_RETURN outputs.
datacarriersize83 byteshotcoreMaximum OP_RETURN size in bytes (0 = reject all).
limitancestorcount25hotcoreMaximum unconfirmed ancestor count.
limitdescendantcount25hotcoreMaximum unconfirmed descendant count.
mempoolexpiry336 hhotcoreMempool entry expiry in hours.
persistmempoolonhotcorePersist the mempool to mempool.dat across restarts.
rebroadcastinterval0 (auto)hotsatdSeconds between rebroadcasts of unconfirmed local transactions (those submitted here via sendrawtransaction, the MCP tool, Esplora POST /tx, or Electrum transaction.broadcast). 0 = auto: a randomized 10–15 min interval per pass, matching Bitcoin Core. A locally-submitted tx is re-announced until enough peers take it (see broadcastconfirmpeers) or it leaves the mempool, so it still propagates if no peer was connected at submit time; the pending set is persisted in mempool.dat so it also survives restarts. A SIGHUP interval change applies after the in-flight sleep completes.
broadcastconfirmpeers1hotsatdDistinct peer IPs that must take a locally-broadcast tx — fetch it from us via getdata (primary signal) or announce it back via inv — before it is considered propagated and rebroadcast stops. Counted per IP, not per connection, so a reconnecting host is one witness. Raising it demands wider observed propagation before giving up retries.
permitbaremultisigonhotcoreAllow bare multisig outputs.
acceptnonstdtxnoffhotcoreRelay and accept non-standard transactions (bypass the standardness relay checks — oversize, dust, OP_RETURN/datacarrier, non-standard scripts). Consensus rules are never relaxed. Intended for test/dev networks.

Esplora

(satd-specific — native Esplora REST server. See Esplora REST API.)

KeyDefaultReloadCompatDescription
esploraonrestartsatdRun the native Esplora REST server (requires addressindex=1).
esplorabind127.0.0.1:3000restartsatdBind the Esplora REST listener.
esploratlsbindnonerestartsatdBind the Esplora TLS listener (requires cert+key).
esploratlscertnonerestartsatdPEM TLS certificate for the Esplora server.
esploratlskeynonerestartsatdPEM TLS private key for the Esplora server.
esploramtlsfalserestartsatdRequire mutual TLS on the Esplora TLS listener.
esploramtlsclientcanonerestartsatdPEM CA bundle to verify client certs when esploramtls=1.
esploramtlsclientallowany CA-signedrestartsatdAllowlist of accepted client-cert CN/DNS-SAN values.
esploraprefix/restartsatdURL prefix to mount the API under (/api for blockstream-style).
esploracorsnonerestartsatdAllowed CORS origin (repeatable).
esplorarequesttimeout30restartsatdPer-request handler timeout (seconds).
esploramaxconns256restartsatdHard cap on concurrent in-flight Esplora requests.
esplorasseconns= esploramaxconnsrestartsatdHard cap on simultaneously-open SSE streams (0 disables SSE).
esploraauthnonerestartsatdEsplora auth mode: none|cookie|userpass.
esploraauthbearerfalserestartsatdHonor bearer tokens (esplora:read) on the Esplora server (requires authfile).
esploracookiefileshared .cookierestartsatdCookie file when esploraauth=cookie.
esplorauserpassnonerestartsatdStatic user:pass when esploraauth=userpass.

Electrum

(satd-specific — native Electrum protocol server.)

KeyDefaultReloadCompatDescription
electrumoffrestartsatdRun the native Electrum protocol server (requires addressindex=1 and txindex=1).
electrumbind127.0.0.1:50001restartsatdBind the Electrum plain-TCP listener.
electrumtlsbindnone (std port 50002)restartsatdBind the Electrum TLS listener (requires cert+key).
electrumtlscertnonerestartsatdPEM TLS certificate for the Electrum server.
electrumtlskeynonerestartsatdPEM TLS private key for the Electrum server.
electrummtlsfalserestartsatdRequire mutual TLS on the Electrum TLS listener.
electrummtlsclientcanonerestartsatdPEM CA bundle to verify client certs when electrummtls=1.
electrummtlsclientallowany CA-signedrestartsatdAllowlist of accepted client-cert CN/DNS-SAN values.
electrummaxconns64restartsatdHard cap on simultaneously-open Electrum connections.
electrummaxsubsperconn1000restartsatdPer-connection scripthash subscription cap.
electrumrequesttimeout30restartsatdPer-request handler timeout (seconds).
electrummaxbatchrequests100restartsatdMax requests per JSON-RPC batch line. Wallets (Sparrow) batch their whole gap-limit window of subscribes at scan time.
electrummaxbroadcastpackagetxs25restartsatdMax txs per blockchain.transaction.broadcast_package.
electrumfeehistogramttl10restartsatdTTL (seconds) for the mempool.get_fee_histogram cache.
electrumbannerpowered by satd <ver>restartsatdOverride for server.banner.

Storage / pruning / reindex

KeyDefaultReloadCompatDescription
prune0 (no pruning)restartcorePrune block data to target size in MB.
reindexoffrestartcoreRebuild block index and chain state from block files on disk.
reindexchainstateoffrestartcoreRebuild the UTXO set from existing block files (Core -reindex-chainstate).
checkblockindexoff (on for regtest)restartcoreAudit block-index / active-chain consistency at startup (Core -checkblockindex).
dbcache450 MB (or auto)restartcoreTotal write-cache size in MB, or auto for adaptive sizing.
storageprofilessdrestartsatdStorage class for chainstate tuning: ssd or hdd.
prefetchworkersCPU coresrestartsatdNumber of IBD prefetch worker threads.
maxahead50000restartsatdMax blocks ahead during IBD: number, N%, or all.
maxopenfiles2048restartsatdRocksDB max_open_files cap; -1 = unlimited.
rocksdbbackgroundjobsfrom storageprofilerestartsatdOverride RocksDB max_background_jobs (advanced).
rocksdbsubcompactionsfrom storageprofilerestartsatdOverride RocksDB max_subcompactions (advanced).
rocksdbwalmbfrom storageprofilerestartsatdOverride RocksDB max_total_wal_size in MB (advanced).
compactiondiagintervalsecs60 (0 disables)restartsatdPer-CF pending-compaction diagnostic log interval.
compactionintervalsecs1800 (0 disables)restartsatdPeriodic forced-compaction interval in seconds.
compactionl0at16restartsatdForce chainstate compaction when L0 SST count ≥ N.
ibdl0pauseat64 (0 disables)restartsatdPause the IBD connector when chainstate L0 SST count ≥ N.
stallwatchdogsecs300 (0 disables)restartsatdStall-watchdog forensic-dump threshold (seconds without tip advance).
stallabortsecs300restartsatdAdditional grace after the forensics dump before abort().
shadowqueuesize4194304restartsatdShadow-verification queue capacity.
shadowworkers4restartsatdShadow-verification worker threads.

Mining

KeyDefaultReloadCompatDescription
blockmaxweight4000000restartcoreMaximum block weight for templates.
blockmintxfee1000 sat/kvBrestartcoreMinimum tx fee for the block template.
parrestartcoreScript-verification threads; accepted for compatibility (no-op).

Events

(satd-specific event bus. The eventszmq* spelling is satd's — Core uses per-topic -zmqpub*=<addr> flags — but the hashtx/hashblock payloads are Core ZMQ wire-format compatible.)

KeyDefaultReloadCompatDescription
eventsnodeidauto (persisted to <datadir>/node_id)restartsatdStable per-node identifier (32-char hex) stamped on events envelopes.
eventsregionnonerestartsatdOptional region tag (≤8 ASCII bytes) on events envelopes.
eventsgrpcbindoffrestartsatdhost:port to bind the events gRPC streaming server.
eventsgrpcallowremotefalserestartsatdPermit eventsgrpcbind on a non-loopback address (requires eventsgrpcauth).
eventsgrpcauthfalserestartsatdRequire bearer tokens (stream:subscribe) on events gRPC (requires authfile).
eventsgrpcmaxconns64 (0 disables)restartsatdHard cap on simultaneously-open events gRPC connections.
eventsgrpcmaxsubscriptions256 (0 disables)restartsatdHard cap on concurrent events gRPC Subscribe streams.
streamwsoffrestartsatdhost:port for the streaming JSON-over-WebSocket + SSE transport (/ws + /sse).
streamwsallowremotefalserestartsatdPermit streamws on a non-loopback address (requires streamwsauth).
streamwsauthfalserestartsatdRequire bearer tokens (stream:subscribe) on streamws (requires authfile).
streamwsmaxconns256restartsatdHard cap on simultaneously-open streamws connections.
streamwsmaxsubscriptions256restartsatdHard cap on watch-set entries per streamws connection.
streamwsmaxmessagebytes262144restartsatdCap on a single inbound WebSocket message/frame in bytes.
streammaxresyncblocks10000 (0 disables)restartsatdMax blocks the watch matcher re-scans in one catch-up after lagging.
streamprefixminbits8restartsatdMinimum bit-length for a privacy-preserving script-prefix watch.
streamprefixmaxbits32restartsatdMaximum bit-length for a script-prefix watch (range [min, 32]).
eventszmqbindoffrestartsatdZMQ endpoint for the events PUB sink.
eventszmqhashtxon when boundrestartsatdEnable the Core wire-format hashtx topic.
eventszmqhashblockon when boundrestartsatdEnable the Core wire-format hashblock topic.
eventszmqmpevicton when boundrestartsatdEnable mpevict topic (mempool eviction w/ reason; JSON).
eventszmqmpreplaceon when boundrestartsatdEnable mpreplace topic (RBF replacement; JSON).
eventszmqmpconfirmon when boundrestartsatdEnable mpconfirm topic (mempool tx confirmed; JSON).
eventszmqnodeeventon when boundrestartsatdEnable nodeevent topic (full envelope JSON).

Webhooks / notifications

KeyDefaultReloadCompatDescription
blocknotifynonerestartcoreShell command run on each new best block; %s is replaced by the block hash. Commands run serially on a dedicated subscriber task (a slow hook never stalls block connection — notifications coalesce instead). The command body is not logged (it may embed credentials).
alertnotifynonerestartcoreShell command run on each new node warning; %s is replaced by the warning text. Deduped by warning id (a repeated condition fires once, not per repeat). Runs serially like blocknotify.
startupnotifynonerestartcoreShell command run once after the node finishes starting up (no %s). Detached — a slow hook doesn't delay the daemon. Prefer a systemd ExecStartPost=.
shutdownnotifynonerestartcoreShell command run once at the start of a graceful shutdown, before the final flush (no %s). Bounded by maxshutdownsecs so a hung hook can't wedge teardown. Prefer a systemd ExecStopPost=.
reorgwebhooknonehotsatdHTTP(S) endpoint receiving a POST on reorg detection.
reorgwebhooksecretnonehotsatdHMAC-SHA256 secret signing webhook bodies via X-Satd-Signature.

Notifications are convenience, not the integration path. The *notify shell hooks (blocknotify, alertnotify, startupnotify, shutdownnotify) exist for drop-in Bitcoin Core compatibility and quick scripts. They are best-effort, fire-and-forget shell execs with no delivery guarantee, no replay, and no reorg awareness. To build on satd, use the Streaming Consumption API (gRPC / WebSocket / ZMQ) — it is reorg-safe, offers durable cursor replay, and is decoupled from consensus. For lifecycle actions, prefer your service manager (systemd ExecStartPost= / ExecStopPost=). satd honors these four hooks; only walletnotify is unsupported (satd is keyless — watch scripts via the streaming/Esplora API). A node started with any of these hooks logs this guidance at startup.

MCP

(satd-specific — Model Context Protocol server.)

KeyDefaultReloadCompatDescription
mcpoffrestartsatdEnable the MCP server.
mcpportnonerestartsatdEnable the MCP HTTP transport on this port.
mcpbind127.0.0.1restartsatdMCP HTTP bind address (non-loopback requires auth + TLS).
mcpcertnonerestartsatdPEM TLS certificate for the MCP server (enables HTTPS; requires mcpkey). Required for any non-loopback bind.
mcpkeynonerestartsatdPEM TLS private key for the MCP server (requires mcpcert).
mcpmtlsfalserestartsatdRequire mutual TLS on the MCP listener (requires mcpcert/mcpkey + mcpmtlsclientca).
mcpmtlsclientcanonerestartsatdPEM CA bundle that client certs must chain to when mcpmtls.
mcpmtlsclientallowanyrestartsatdAllowlist of accepted client-cert CN / DNS-SAN values.
mcpauthfalserestartsatdRequire bearer tokens (mcp:*) on the MCP HTTP server (requires authfile).
mcpallowremotefalserestartsatdPermit a non-loopback MCP HTTP bind (requires mcpauth + TLS).

Metrics / health

KeyDefaultReloadCompatDescription
metricsportnonerestartsatdEnable Prometheus /metrics + /healthz + /readyz on this port (unauthenticated).
metricsbind127.0.0.1restartsatdMetrics/health HTTP bind address.

Unsupported Core keys: skipped vs rejected

A Core v30 option satd doesn't honor is handled one of two ways so that an existing bitcoin.conf still drops in.

Skipped with a warning (the node still starts)

Recognized Core v30 options satd doesn't implement but that are safe to skip are ignored with a startup WARN line — the node boots without them. The warning names the satd equivalent where one exists. This covers the low-value long tail, e.g.:

Key(s)Warning guidance
restsatd ships native Esplora REST instead of Core's /rest/; enable with -esplora (on by default).
zmqpub* (hashtx/hashblock/rawtx/rawblock/sequence + *hwm)Core's per-topic ZMQ is replaced by the events bus (-eventszmqbind + -eventszmqhashtx/-eventszmqhashblock, Core wire-format).
peerbloomfiltersBIP37 unsupported (privacy/DoS); use BIP157/158 (-blockfilterindex/-peerblockfilters).
natpmpsatd doesn't implement PCP/NAT-PMP port mapping; configure port forwarding externally. (upnp was removed in Core v29 and is rejected as unknown — same as Core v30.)
debuglogfile, shrinkdebugfile, printtoconsole, logratelimitsatd logs to stdout/journald; no debug.log.
logtimemicrossatd's logger always emits sub-second timestamps; there is no seconds-only mode, so the toggle has no effect. Use -logtimestamps=0 to drop timestamps entirely.
maxorphantxRemoved in Core v30 too.
wallet, walletdir, walletnotify, …satd is keyless (no wallet); use external wallets + PSBT, and watch scripts via the streaming/Esplora API.
coinstatsindex, loadblock, checkblocks/checklevel, bytespersigop, maxsigcachesize, blockversion, printpriority, txreconciliation, discover, persistmempoolv1, acceptstalefeeestimates, blocksxor, settings, daemonwait, deprecatedrpc, rpcdoccheck, …Recognized Core v30 options satd does not implement; skipped (generic warning).

Rejected at load (fail-closed)

A small set stays fatal, because silently skipping them would mislead you about the node's security / exposure / privacy posture. Each rejects with an actionable message:

Key(s)Reason
i2psam, i2pacceptincomingI2P out of scope — skipping would route traffic over clearnet instead of the privacy network you configured. Tor is satd's anonymity network (-proxy/-onion/-torcontrol).
rpcwhitelist, rpcwhitelistdefaultsatd uses capability-scoped bearer tokens (-authfile); skipping would leave RPC less restricted than your Core config intends. See Authentication & Authorization.

Typos

A key that is neither a satd option nor a known Core v30 option is rejected at load as a likely typo — this is what stops a fat-fingered rpcusser= from silently disabling authentication. Note this also catches Core v31+ keys: the compatibility surface is frozen at v30, so a key Core only added later is treated as unknown until the pin is deliberately bumped.

Compatibility scope. "Supported" is the commonly-used Core v30 operator surface, with semantics pinned to Core v30 only (not later releases). The long tail is skipped-with-warning rather than honored. To consume node events from your own software, use the Streaming Consumption API, not the *notify hooks or RPC polling.