## This file is valid when copied as-is. To enable an example line, remove only
## its first `#`; the remaining indentation is the intended YAML indentation.
#debug: false
#headless: false
#remote_configuration: false
#remote_file_management: false
#instance_name: default
#flags:
# no_logo: false
# no_start: false
# no_config_watch: false
# no_connect: false
# no_share_scan: false
# force_share_scan: false
# force_migrations: false
# no_version_check: false
# log_sql: false
# log_unobserved_exceptions: false
# experimental: false
# volatile: false
# case_sensitive_reg_ex: false
# legacy_windows_tcp_keepalive: false
# optimistic_relay_file_info: false
#soulseek:
# liked_interests: [] # published to native Soulseek interests after login
# hated_interests: [] # published to native Soulseek dislikes after login
#relay:
# enabled: false
# mode: controller # controller (default), agent, or debug (for local development)
# # controller config is required when running in 'agent' mode
# # this specifies the relay controller that will be controlling this agent
# controller:
# address: https://some.site.com:5000
# ignore_certificate_errors: false
# api_key:
# secret:
# downloads: false
# # agent config is optional when running in 'controller' mode
# # this specifies all of the agents capable of connecting
# agents:
# my_agent:
# instance_name: my_agent # make sure the top-level instance_name of the agent matches!
# secret:
# cidr: 0.0.0.0/0,::/0
#permissions:
# file:
# mode: ~ # not for Windows, chmod syntax, e.g. 644, 777. can't escalate beyond umask
#directories:
# incomplete: ~
# downloads: ~
#shares:
# directories:
# - ~
# filters:
# - \.ini$
# - Thumbs.db$
# - \.DS_Store$
# probe_media_attributes: true # set false on slow/remote storage to skip TagLib audio probing during scans
# cache:
# storage_mode: memory
# workers: 4 # default is conservative; lower this on weaker hosts, raise it carefully if scans are too slow
# retention: ~ # retain indefinitely (do not automatically re-scan)
#rooms:
# - ~
#transfers:
# upload:
# slots: 20
# speed_limit: 1000 # in kibibytes
# limits:
# queued:
# files: 500
# megabytes: 5000
# daily:
# files: 1000
# megabytes: 10000
# failures: 200
# weekly:
# files: 5000
# megabytes: 50000
# failures: 1000
# download:
# slots: 500
# speed_limit: 1000
# completed_layout: remote_folder # default; preserves source folder/file names. Other values: uploader_folder (//), batch_id, or flat
# completed_path_template: '' # optional override; e.g. '{uploader}/{remote_folder}'. Tokens: {uploader}, {remote_folder}, {remote_parent}, {remote_filename}, {batch_id}, {request_name}, {date}, {date:yyyy-MM}
# retry:
# incomplete: resume # resume or overwrite
# attempts: 1
# delay: 5000
# max_delay: 60000
# auto_retry:
# enabled: true # retry failed downloads conservatively; disable if you only want manual retries
# retry_delay_seconds: 1800 # wait this long after a failed transfer before retrying it
# check_interval_seconds: 300 # scan for failed transfers this often
# max_attempts: 5 # maximum automatic retries per username+filename per process lifetime; 0 means retry forever
# max_files_per_cycle: 10 # global Soulseek retry budget per scan
# max_files_per_peer_per_cycle: 1 # avoid repeatedly hitting one remote peer in a scan
# peer_cooldown_seconds: 900 # wait this long before contacting the same peer again via auto-retry
# alternate_sources_enabled: true # prefer cooled-down alternate sources from local HashDb/search before retrying the same peer
# max_alternate_source_searches_per_cycle: 1 # bounded network searches per scan when local evidence has no alternate
# alternate_source_size_tolerance_percent: 5 # maximum size difference for alternate-source retry candidates
# auto_replace_stuck: true
# auto_replace_threshold: 5.0
# auto_replace_interval: 60
# groups:
# default:
# upload:
# priority: 500
# strategy: roundrobin
# slots: 10
# limits:
# queued:
# files: 150
# megabytes: 1500
# daily: ~ # no daily limits (weekly still apply)
# weekly:
# files: 1500
# megabytes: 15000
# failures: 150
# leechers:
# thresholds:
# files: 1
# directories: 1
# upload:
# priority: 999
# strategy: roundrobin
# slots: 1
# speed_limit: 100
# limits:
# queued:
# files: 15
# megabytes: 150
# daily:
# files: 30
# megabytes: 300
# failures: 10
# weekly:
# files: 150
# megabytes: 1500
# failures: 30
# blacklisted:
# members:
# -
# cidrs:
# -
# patterns:
# - ^spammer_[0-9]+$
# user_defined:
# my_buddies:
# upload:
# priority: 250
# strategy: firstinfirstout
# slots: 10
# limits:
# queued:
# files: 1000 # override global default
# members:
# - alice
# - bob
#player:
# external_visualizer:
# enabled: false # opt in only; launches on the slskdN host, not the browser device
# name: MilkDrop3
# path: "" # e.g. C:\Tools\MilkDrop3\MilkDrop 3.exe or /usr/local/bin/milkdrop3-wine
# working_directory: "" # optional; defaults to the executable directory when omitted
# arguments: [] # optional configured-only args; the browser cannot supply launch args
#dht:
# enabled: true # public BitTorrent DHT rendezvous; set false to stop DHT startup and dependent services
# lan_only: false # set true to block public BitTorrent DHT bootstrap/discoverability
# overlay_port: 50305 # TCP slskdN mesh overlay rendezvous. Can share the same numeric port as dht_port because TCP/UDP port spaces are separate.
# advertised_overlay_port: 0 # optional public TCP overlay port to announce when VPN/NAT rewrites overlay_port; 0 uses overlay_port
# vpn_port_sync: disabled # auto-follow VPN port forwarding for advertised_overlay_port; requires integration.vpn.enabled + port_forwarding
# # disabled - no sync; advertised_overlay_port is used as-is (default)
# # primary - track VPNStatus.ForwardedPort (standard gluetun: one port, updated every reconnect)
# # target_port - track the VPN port-forward slot whose local port equals overlay_port (multi-slot forwarding)
# dht_port: 50305 # explicit stable UDP port for the public BitTorrent DHT; forward/allow-list this port if rendezvous is enabled
# bootstrap_routers:
# - router.bittorrent.com
# - router.utorrent.com
# - dht.transmissionbt.com
# announce_interval_seconds: 900
# discovery_interval_seconds: 600
# min_neighbors: 3
# bootstrap_timeout_seconds: 120 # warm startup when a saved DHT node table exists
# cold_bootstrap_timeout_seconds: 180 # first startup or missing saved DHT node table
# lan_only_bootstrap_timeout_seconds: 30 # shorter because public bootstrap routers are disabled
# enable_upnp: false # opt in only; when true slskdn will try to map overlay/dht ports automatically
# enable_stun: true
#destinations:
# folders:
# # Paths must exist inside the host/container and be writable by slskdN.
# # Set default: true on at most one folder. It becomes the daemon-wide
# # destination for downloads without an explicit Search/Browse UI choice.
# - name: "Music"
# path: "/downloads/music"
# default: true
# - name: "Audiobooks"
# path: "/downloads/audiobooks"
#blacklist:
# enabled: true
# file:
#wishlist:
# enabled: true # background wishlist searching; on by default
# interval_seconds: 3600 # delay between full wishlist scan cycles (min 300)
# auto_download: false # global default; per-item autoDownload overrides this
# max_results: 100
#filters:
# search:
# request:
# - ^.{1,2}$
# search_retention:
# max_age_days: 30 # auto-delete searches older than this (0 = no age limit)
# max_count: 1000 # keep at most this many searches (0 = no count limit)
# cleanup_interval_seconds: 86400 # how often to run cleanup (default: daily)
#web:
# port: 5030
# socket: ~
# https:
# disabled: false
# port: 5031
# force: false
# certificate:
# pfx: ~
# password: ~
# url_base: /
# content_path: wwwroot
# enforce_security: false # PR-01: when true, strict auth/CORS/startup checks; ModelState 400 when invalid
# allow_remote_no_auth: false # when no-auth, allow non-loopback only if true
# max_request_body_size: 10485760 # PR-09: Kestrel Limits.MaxRequestBodySize in bytes; default 10 MB
# logging: false
# authentication:
# disabled: false
# username: slskd
# password: "" # set a non-empty password before enabling metrics auth
# passthrough: # PR-03: when no-auth, AllowedCidrs can allow non-loopback in addition to loopback
# allowed_cidrs: ~ # optional; e.g. 127.0.0.1/32,::1/128
# jwt:
# key: ~
# ttl: 604800000
# api_keys:
# my_api_key:
# key:
# role: readonly # readonly, readwrite, administrator
# cidr: 0.0.0.0/0,::/0
# cors:
# enabled: false
# allowed_origins: [] # e.g. [https://app.example.com] when enabled; required when enabled
# allow_credentials: false
# allowed_headers: [] # empty = any
# allowed_methods: [] # empty = any
# rate_limiting: # PR-09: HTTP rate limits (api, federation inbox, mesh gateway). Per-IP.
# enabled: true
# api_permit_limit: 200
# api_window_seconds: 60
# federation_permit_limit: 30
# federation_window_seconds: 60
# mesh_gateway_permit_limit: 60
# mesh_gateway_window_seconds: 60
#retention:
# search: 10080 # 7 days, in minutes
# transfers:
# upload:
# succeeded: 1440 # 1 day, in minutes
# errored: 30
# cancelled: 5
# download:
# succeeded: 1440 # 1 day, in minutes
# errored: 20160 # 2 weeks, in minutes
# cancelled: 5
# files:
# complete: 20160 # 2 weeks, in minutes
# incomplete: 43200 # 30 days, in minutes
# logs: 180 # days
#logger:
# disk: false
# no_color: false
# loki: ~
#diagnostics:
# allow_memory_dump: false # when false, /api/v0/application/dump returns 404
# allow_remote_dump: false # when false, dump allowed only from loopback (127.0.0.1, ::1)
#metrics:
# enabled: false
# url: /metrics
# authentication:
# disabled: false
# username: slskd
# password: "" # set a non-empty password before enabling metrics auth
#telemetry:
# tracing:
# enabled: false # Enable OpenTelemetry distributed tracing (default: false)
# exporter: console # Exporter type: console, jaeger, otlp (default: console)
# jaeger_endpoint: http://localhost:4317 # Jaeger OTLP collector endpoint (default: unset)
# jaeger_port: 4317 # Jaeger OTLP collector port when endpoint is a host only (default: 4317)
# otlp_endpoint: http://localhost:4317 # OTLP collector endpoint (default: http://localhost:4317)
#song_id:
# max_concurrent_runs: 2 # Process SongID jobs in the background with a fixed worker pool while allowing unbounded queueing
#player:
# external_visualizer:
# enabled: false # Enable authenticated API launch of a locally configured external visualizer helper
# name: MilkDrop3
# path: "" # Executable or launcher script path. Keep empty unless you trust the local slskdN admin surface.
# working_directory: "" # Optional working directory for the launcher
# arguments: [] # Optional argument list passed as separate process arguments
#virtualSoulfind:
# bridge:
# enabled: false # Opt in to the legacy Soulfind protocol bridge.
# bindAddress: 127.0.0.1 # Loopback by default. Non-loopback requires auth and a password.
# port: 2242
# maxClients: 10
# requireAuth: true # Secure default. Set a strong password before enabling.
# password: ""
# maxRequestsPerMinute: 60 # Per connected client.
# maxTransfersPerSession: 10 # Total downloads initiated by one connection.
# disasterMode:
# auto: false # Legacy auto-fallback. Opt-in only. Default behavior is Soulseek + mesh together.
# force: false # Force legacy fallback for testing only.
# unavailableThresholdMinutes: 10
# enableGracefulDegradation: true
# recoveryCheckIntervalMinutes: 5
# recoveryHealthyChecksRequired: 3
#virtualSoulfindV2:
# enabled: true
#signalSystem:
# enabled: true
# meshChannel:
# enabled: true
# btExtensionChannel:
# enabled: true # requires a configured BitTorrent extension sender
#PodCore.Security (MessageSigner). Binds to PodCore:Security.
#PodCore.Join binds to PodCore:Join. Off accepts legacy non-Ed25519 join/leave
#signatures for compatibility; Warn logs legacy or missing signatures; Enforce
#requires ed25519:, a valid Ed25519 public key, fresh
#timestamp, and a join Nonce for replay protection.
#PodCore:
# Security:
# SignatureMode: Off # Off | Warn | Enforce
# Join:
# SignatureMode: Off # Off | Warn | Enforce
#feature: # Experimental feature and hosted-service gates. See docs/runtime-feature-gating.md.
# Gold Star Club is strictly opt-in and is separate from the pod API gate:
# enable it only with feature.Pods: true and the daemon environment variable
# SLSKDN_POD_GOLD_STAR_CLUB_AUTOJOIN=true. Any other or missing value keeps the
# reserved pod dormant (the environment variable is intentionally not YAML).
# swagger: true # Enable Swagger API documentation UI (default: true)
# CollectionsSharing: true # Enable Collections, ShareGroups, ShareGrants APIs (default: true)
# Streaming: true # Enable streaming API (/api/v0/streams/{contentId}) (default: true)
# StreamingRelayFallback: true # Enable relay streaming fallback (controller proxies to agent) (default: true)
# MeshParallelSearch: true # Mesh overlay search alongside Soulseek (default: true)
# MeshPublishAvailability: true # Availability publication to the slskdN mesh DHT (default: true)
# IdentityFriends: true # Identity/Friends APIs and mDNS friend-code advertising (default: true)
# ScenePodBridge: false # Opt in to experimental Scene ↔ Pod Bridging (default: false).
# # When enabled, search results from both Pod/Mesh and Soulseek Scene are merged and deduplicated.
# # Keep disabled if you want the proven upstream-compatible Soulseek search path.
# # Pod results can be downloaded from remote mesh peers if not available locally.
# # Scene results use the standard Soulseek download pipeline.
# SongId: true # Experimental SongID analysis APIs (default: true).
# Mesh: true # Mesh APIs and mesh hosted services (default: true).
# Dht: true # DHT APIs; dht.enabled must also be true (default: true).
# Pods: true # Pod APIs and pod services (default: true); Gold Star also requires explicit environment opt-in.
# SocialFederation: true # ActivityPub/social federation APIs (default: true).
# VirtualSoulfind: true # VirtualSoulfind APIs (default: true).
# MultiSourceDownloads: true # Multi-source/swarm download APIs (default: true).
# ScenePodBridgeOptions:
# ProxyTransfers: false # Proxy scene downloads through pod (future feature, intentionally disabled)
# ExportPodAvailability: false # Export pod availability to scene (future feature, intentionally disabled)
# Solid: true # Enable Solid (WebID, Solid-OIDC) (default: true)
# # Note: Even when enabled, remote fetches are blocked until AllowedHosts is configured (SSRF safety)
#solid:
# allowedHosts: [] # Empty = deny all remote fetches (SSRF safety). Add hostnames like ["your-solid-idp.example", "your-pod-provider.example"]
# # IMPORTANT: Solid feature is enabled by default, but will not work until you add at least one hostname here
# timeoutSeconds: 10
# maxFetchBytes: 1000000
# allowInsecureHttp: false # ONLY for dev/test. Keep false in production
# redirectPath: "/solid/callback"
#security:
# enabled: true # Enable security features (path traversal protection is ALWAYS enabled)
# profile: Standard # Security profile: Minimal, Standard, Maximum, or Custom
# network_guard:
# enabled: true
# max_connections_per_ip: 10
# max_global_connections: 100
# max_messages_per_minute: 60
# max_message_size: 10485760 # 10 MB
# violation_tracker:
# enabled: true
# violations_before_auto_ban: 5
# base_ban_duration_minutes: 60
# path_guard:
# enabled: true # Path traversal protection (ALWAYS enabled, even if security.enabled is false)
# max_path_length: 512
# max_path_depth: 20
# content_safety:
# enabled: true
# verify_magic_bytes: true
# quarantine_suspicious: true
# quarantine_directory: ~
# block_executables: true
# peer_reputation:
# enabled: true
# trusted_threshold: 70
# untrusted_threshold: 20
# adversarial: # Security:Adversarial (privacy, padding, anonymity, etc.)
# privacy:
# padding:
# max_unpadded_bytes: 0 # 0=default 1MB. PR-11 DoS limit for Unpad.
# max_padded_bytes: 0 # 0=default 2MB. PR-11 DoS limit for Unpad.
# anonymity: # I2P, RelayOnly, Tor. AnonymityLayerOptions.
# relay_only:
# relay_peer_data_endpoints: [] # ["host:port"] per relay's QUIC data overlay; used when TrustedRelayPeers not resolved. Required for RelayOnly until peer-id resolution.
# relay_authentication_token: "" # Must match the trusted relay's overlay_data token.
# # trusted_relay_peers: []
# # max_chain_length: 3
#soulseek:
# address: vps.slsknet.org
# port: 2271
# username: ~
# password: ~
# description: "A slskdN user. Unofficial fork of slskd: https://github.com/snapetech/slskdn"
# picture: path/to/slsk-profile-picture.jpg
# listen_ip_address: 0.0.0.0 # do not use 127.0.0.1/::1 for live peer traffic; remote peers will not be able to connect back
# listen_port: 50300
# obfuscation:
# enabled: true
# mode: compatibility # compatibility keeps regular outbound dials first; prefer prioritizes compatible obfuscated dials
# listen_port: 0 # 0 derives from listen_port + 1 when runtime support exists
# advertise_regular_port: true
# prefer_outbound: true # only changes outbound priority when mode is prefer
# private_message_auto_response:
# enabled: false
# message: "Hi, I'm human and testing a slskdN client. Shares may be temporarily unavailable while I validate the client."
# cooldown_minutes: 360
# diagnostic_level: Info
# distributed_network:
# disabled: false
# disable_children: false
# child_limit: 25
# logging: false
# connection:
# timeout:
# connect: 10000
# inactivity: 60000
# transfer: 60000
# buffer:
# read: 16384
# write: 16384
# transfer: 262144
# write_queue: 250
# proxy:
# enabled: false
# address: ~
# port: ~
# username: ~
# password: ~
#overlay:
# enable: false
# listen_port: 50305 # UDP overlay control shares the DHT UDP forward by default
# enable_quic: true
# quic_listen_port: 50305 # public QUIC overlay port; shares the DHT UDP forward when share_quic_with_dht_port is true
# share_quic_with_dht_port: true # DHT binds 50305/udp and demuxes DHT, UDP overlay, and QUIC traffic
# quic_backend_listen_port: 55305 # loopback-only MsQuic listener behind the shared public UDP port; do not forward this
# trusted_certificate_pins: {} # { "203.0.113.10:50305": ["base64-spki-sha256"] }; direct QUIC clients fail closed without a matching endpoint pin.
#overlay_data:
# enable: false # QUIC data plane; requires a stable MsQuic/runtime stack
# listen_port: 50401
# relay_authentication_token: "" # Required to enable RELAY_TCP; use a high-entropy shared secret.
# allowed_relay_destinations: [] # Exact public host:port destinations; private and loopback addresses are always denied.
# max_concurrent_relays: 4
# max_relay_bytes_per_direction: 67108864
# max_relay_duration_seconds: 300
# trusted_certificate_pins: {} # { "203.0.113.10:50401": ["base64-spki-sha256"] }; required for outbound data-plane QUIC.
#integrations:
# vpn:
# enabled: false
# port_forwarding: false
# self_hosted_relay: false # enable only for the authenticated slskdN VPS companion; requires port_forwarding
# polling_interval: 2500
# gluetun:
# url: "http://100.64.0.1:8010" # use the relay's private Tailscale/WireGuard address in self-hosted relay mode
# timeout: 5000
# api_key: "" # use the independent relay status key, never the slskdN API key
# lidarr:
# enabled: false
# url: "http://127.0.0.1:8686"
# api_key: ""
# timeout_seconds: 20
# sync_wanted_to_wishlist: false # when true, Lidarr Wanted/Missing albums become slskdN Wishlist searches
# sync_interval_seconds: 3600
# max_items_per_sync: 100
# auto_download: false # applies only to Wishlist items created by Lidarr sync
# wishlist_filter: ""
# wishlist_max_results: 100
# auto_import_completed: false # when true, clean completed download directories are submitted to Lidarr manual import
# import_mode: "move" # move or copy
# import_replace_existing_files: false
# delete_rejected_downloads: false # delete only exact files rejected by Lidarr; never recursively deletes the directory
# blacklist_rejected_downloads: false # ignore the exact Wishlist peer+remote directory after rejection
# import_path_from: "" # optional local slskdN completed path prefix
# import_path_to: "" # optional Lidarr-visible completed path prefix
# spotify:
# enabled: false # enables Spotify source-feed imports and account connection
# client_id: ""
# client_secret: "" # optional for OAuth; required for app-token public imports without a connected account
# redirect_uri: "" # optional; defaults to /api/v0/integrations/spotify/callback on the current host
# timeout_seconds: 20
# max_items_per_import: 500
# market: "US" # used for artist top-track imports
# youtube:
# enabled: false
# api_key: "" # YouTube Data API key for source-feed playlist expansion
# lastfm:
# enabled: false
# api_key: "" # Last.fm API key for loved/recent/top track source-feed imports
# webhooks:
# my_webhook:
# on:
# - DownloadFileComplete
# call:
# url: https://192.168.1.42:8080/slskd_webhook
# headers:
# - name: X-API-Key
# value: foobar1234
# - name: Authorization
# value: Bearer eyJ...ssw5c
# - name: User-Agent
# value: slskd/0.0
# ignore_certificate_errors: false
# timeout: 5000 # in milliseconds
# retry:
# attempts: 3
# scripts:
# run_command_with_linux_system_shell: # automatically uses the executable defined in $SHELL
# on:
# - DownloadFileComplete
# run:
# command: 'echo "$SLSKD_SCRIPT_DATA" >> linux_system_shell.txt'
# run_with_sh:
# on:
# - DownloadFileComplete
# run:
# executable: /bin/sh
# args: '-c "echo $SLSKD_SCRIPT_DATA >> linux_sh.txt"'
# run_with_sh_and_args_list:
# on:
# - DownloadFileComplete
# run:
# executable: /bin/sh
# arglist:
# - -c
# - echo $SLSKD_SCRIPT_DATA >> linux_sh_and_args_list.txt
# run_command_with_windows_system_shell: # automatically uses cmd.exe (included with all Windows installs)
# on:
# - DownloadFileComplete
# run:
# command: 'echo "%SLSKD_SCRIPT_DATA%" >> windows_system_shell.txt'
# run_with_windows_cmd:
# on:
# - DownloadFileComplete
# run:
# executable: cmd.exe
# args: '/c "echo "%SLSKD_SCRIPT_DATA%" >> windows_cmd.txt"'
# run_with_windows_git_bash:
# on:
# - DownloadFileComplete
# run:
# executable: C:\Program Files\Git\bin\bash.exe
# args: '-c "echo "$SLSKD_SCRIPT_DATA" >> windows_git_bash.txt"'
# run_with_windows_cmd_and_args_list:
# on:
# - DownloadFileComplete
# run:
# executable: cmd.exe
# arglist:
# - /c
# - 'echo "%SLSKD_SCRIPT_DATA%" >> windows_cmd_and_args_list.txt'
# ftp:
# enabled: false
# address: ~
# port: ~
# username: ~
# password: ~
# remote_path: /
# encryption_mode: auto
# ignore_certificate_errors: false
# overwrite_existing: true
# connection_timeout: 5000
# retry_attempts: 3
# pushbullet:
# enabled: false
# access_token: ~
# notification_prefix: "From slskdN:"
# notify_on_private_message: true
# notify_on_room_mention: true
# retry_attempts: 3
# cooldown_time: 900000
# ntfy:
# enabled: false
# url: ""
# access_token: ""
# notification_prefix: "slskdN"
# notify_on_private_message: true
# notify_on_room_mention: true
# pushover:
# enabled: false
# user_key: ""
# token: ""
# notification_prefix: "slskdN"
# notify_on_private_message: true
# notify_on_room_mention: true
#Mesh runtime controls require feature.Mesh. There is no mesh.enabled option.
#The public BitTorrent DHT finds overlay endpoints; mesh DHT stores small signed
#metadata; file and chunk bytes travel over the slskdN mesh overlay, not DHT or BitTorrent.
#Mesh.Security (PR-01, §8). Binds to Mesh:Security when Mesh section is used.
#mesh:
# enable_dht: true # slskdN mesh-DHT descriptor/content metadata publishing and refresh
# enable_overlay: true # slskdN mesh overlay availability and data paths
# enable_stun: true # external STUN address discovery
# enable_soulseek_capability_handshake: true # signed slskdN runtime capabilities over Soulseek peer messages
# enable_soulseek_rendezvous: false # opt-in only; publishes the public slskdn-mesh-v1 Soulseek interest tag
# probe_soulseek_rendezvous_capabilities: true # probe rendezvous candidates for runtime capability descriptors
# dht:
# bootstrap_nodes: 60
# overlay:
# udp_port: 50301
# quic_port: 50302
# security:
# enforceRemotePayloadLimits: true # when true, enforce max size and safe deserialization on overlay/transport
# maxRemotePayloadSize: 1048576 # 1 MiB; max for remote JSON/MessagePack payloads
#
#Mesh:SyncSecurity (T-1432, T-1433, T-1434, T-1435). Rate limiting, quarantine, proof-of-possession, consensus, alert thresholds.
# sync_security:
# max_invalid_entries_per_window: 50 # T-1432: entries before rate limit. Default 50.
# max_invalid_messages_per_window: 10 # T-1432: messages before rate limit. Default 10.
# rate_limit_window_minutes: 5 # T-1432/1433: window for rate limit and quarantine. Default 5.
# quarantine_violation_threshold: 3 # T-1433: violations in window to quarantine. Default 3.
# quarantine_duration_minutes: 30 # T-1433: quarantine length. Default 30.
# proof_of_possession_enabled: false # T-1434: require PoP before accepting new hashes. Default false.
# consensus_min_peers: 5 # T-1435: min peers to query for hash consensus. Default 5.
# consensus_min_agreements: 3 # T-1435: min agreeing peers to accept hash. Default 3.
# alert_threshold_signature_failures: 50 # Alert when exceeded. 0=disabled. Default 50.
# alert_threshold_rate_limit_violations: 20 # Alert when exceeded. 0=disabled. Default 20.
# alert_threshold_quarantine_events: 10 # Alert when exceeded. 0=disabled. Default 10.