A node reads a single TOML file, config.toml, from its home directory
(written by merod init and re-read on merod run). This page documents every
section, key, type, default, and meaning, grounded in the structs the node
actually deserializes.
These live at the root of the file, outside any section.
Key
Type
Default
Meaning
mode
"standard" | "readonly"
"standard"
Node role. readonly disables JSON-RPC execution and is used for observer / TEE nodes. (The values serialize lowercase; the merod init --mode flag spells the read-only value read-only.)
Whether to advertise external addresses to peers. Gates external_address.
external_address
array of multiaddr
[]
Operator-supplied external addresses, seeded into the swarm’s confirmed external-address set (used for static-IP / hosted deployments instead of AutoNAT discovery).
Bounds on-disk delta-log growth by pruning history older than a recent retain
window. Enabled by default; set enabled = false to opt out.
Key
Type
Default
Meaning
enabled
bool
true
Whether periodic DAG compaction runs.
min_deltas_before_compact
integer
10000
Minimum delta rows a context must hold before it is eligible for compaction.
retain_recent_count
integer
1000
Number of most-recent deltas retained after a sweep. Must be strictly below min_deltas_before_compact.
check_interval
duration (seconds)
3600
Interval between compaction sweeps. Serialized as a plain integer count of seconds (e.g. check_interval = 3600), not a { secs, nanos } table. Must be non-zero.
The defaults keep ~1000 recent deltas per context and only start pruning once a
context holds 10000 — fine for a quiet node, but a busy data-plane context can
accumulate that history quickly. A production excerpt that prunes more
aggressively on a high-write deployment:
[dag_compaction]
enabled = true
# Start pruning sooner on a high-write context...
min_deltas_before_compact = 4000
# ...but keep a generous recent window so peers can still catch up via deltas
# instead of falling back to a full snapshot.
retain_recent_count = 1500
# Sweep more often than the 1h default so growth is bounded between checks.
check_interval = 900
Keep retain_recent_count comfortably above the largest delta gap a lagging
peer is expected to close incrementally: prune below that and the peer can only
reconverge via a full snapshot. retain_recent_count must stay strictly below
min_deltas_before_compact, and check_interval must be non-zero — the node
refuses to start with [dag_compaction] enabled = true and either invariant
violated, rather than silently letting the delta log grow unbounded.
DAG compaction is one of two independent background maintenance loops; the
other is the tombstone garbage collector, and the two reclaim different
things:
Loop
Reclaims
Cadence
Operator-tunable?
DAG compaction
old delta-log history older than the recent retain window
[dag_compaction] check_interval (default 1h)
Yes — the [dag_compaction] keys above.
Tombstone GC
expired CRDT tombstones (the markers a deleted entity leaves behind)
fixed 12h
No — not a config.toml key.
When an entity is deleted, the CRDT layer keeps a tombstone so the deletion
can win against a concurrent or out-of-order write that arrives later. A
tombstone is retained for a fixed 24h before it becomes eligible for
collection, and the GC loop runs every 12h, scanning each context and
deleting tombstones older than that window. Both durations are compile-time
constants, not config keys — there is no [gc] section and no gc_interval
knob, so nothing here needs (or accepts) tuning. The retention window is
deliberately longer than the GC interval, and shorter than the offline window
that forces a full resync, so a node that reconnects within the window can still
reconcile deletions incrementally.