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

The daemon can be configured via a TOML file. Pass the path with --config:

tesseras-daemon --config /etc/tesseras/config.toml

If no config file is given, the daemon uses sensible defaults. CLI options (--listen, --bootstrap, --data-dir) override the corresponding config values.

Full example

[node]
data_dir = "~/.local/share/tesseras"
listen_addr = "0.0.0.0:4433"

[dht]
k = 20
alpha = 3
bucket_refresh_interval_secs = 3600
republish_interval_secs = 3600
pointer_ttl_secs = 86400
max_stored_pointers = 100000
ping_failure_threshold = 3

[bootstrap]
dns_domain = "_tesseras._udp.tesseras.net"
hardcoded = [
    "boot1.tesseras.net:4433",
    "boot2.tesseras.net:4433",
]

[network]
enable_mdns = true

[observability]
metrics_addr = "127.0.0.1:9190"
log_format = "json"

Sections

[node]

Basic node settings.

KeyTypeDefaultDescription
data_dirpathPlatform-specificWhere to store identity, database, and blobs
listen_addraddress0.0.0.0:4433QUIC listener address

The default data_dir is ~/.local/share/tesseras on Linux and ~/Library/Application Support/tesseras on macOS.

[dht]

Kademlia DHT tuning parameters. The defaults work well for most deployments.

KeyTypeDefaultDescription
kinteger20Maximum entries per routing table bucket
alphainteger3Parallelism for iterative lookups
bucket_refresh_interval_secsinteger3600How often to refresh routing table buckets (seconds)
republish_interval_secsinteger3600How often to republish stored pointers (seconds)
pointer_ttl_secsinteger86400How long to keep a pointer before it expires (seconds)
max_stored_pointersinteger100000Maximum number of pointers to store locally
ping_failure_thresholdinteger3How many consecutive ping failures before removing a peer

[bootstrap]

How the node discovers its first peers when joining the network.

KeyTypeDefaultDescription
dns_domainstring_tesseras._udp.tesseras.netDNS domain for TXT-record-based peer discovery
hardcodedlist of strings["boot1.tesseras.net:4433", "boot2.tesseras.net:4433"]Fallback bootstrap addresses

[network]

Network-level features.

KeyTypeDefaultDescription
enable_mdnsbooleantrueEnable local network discovery via mDNS

[observability]

Monitoring and logging.

KeyTypeDefaultDescription
metrics_addraddress127.0.0.1:9190Address for the Prometheus metrics endpoint
log_formatstringjsonLog output format (json or text)

IPv6 Support

Tesseras supports IPv6 natively. The listen_addr and listen_addrs fields accept both IPv4 and IPv6 addresses.

Listening on IPv6

To listen on all IPv6 interfaces:

[node]
listen_addr = "[::]:4433"

On Linux and most BSDs, binding to [::] also accepts IPv4 connections (dual-stack) by default. On some systems (notably OpenBSD), [::] is IPv6-only due to IPV6_V6ONLY being enabled by default. To guarantee both IPv4 and IPv6 on all platforms, use listen_addrs with explicit addresses:

[node]
listen_addrs = ["0.0.0.0:4433", "[::]:4433"]

For IPv6 loopback only (testing):

[node]
listen_addr = "[::1]:4433"

Bootstrap with IPv6

Bootstrap addresses can be IPv6:

[bootstrap]
hardcoded = [
    "boot1.tesseras.net:4433",
    "[2001:db8::1]:4433",
]

DNS hostnames with both A and AAAA records are resolved to all addresses, so the daemon will connect over whichever protocol is reachable.

IPV6_V6ONLY behavior by OS

OS[::] accepts IPv4?Notes
LinuxYes (dual-stack)IPV6_V6ONLY defaults to 0
macOSYes (dual-stack)IPV6_V6ONLY defaults to 0
FreeBSDYes (dual-stack)IPV6_V6ONLY defaults to 0
OpenBSDNo (IPv6-only)IPV6_V6ONLY always 1
WindowsYes (dual-stack)IPV6_V6ONLY defaults to 0

If you need explicit control, use listen_addrs with both an IPv4 and IPv6 address.

Minimal config

Most users don’t need a config file at all. If you do, a minimal config overriding only what you need is enough:

[node]
listen_addr = "0.0.0.0:5000"

[bootstrap]
hardcoded = ["192.168.1.10:4433"]

All other values use their defaults.