Configuration Guide
SnapDog is configured using a single snapdog.toml file. The server parses this file at startup (defaults to /etc/snapdog/snapdog.toml, or specified via the --config CLI argument).
1. Global Keys
name(String, default:"SnapDog") The display name of the audio controller server. Used as the default broadcast name formDNS, the base MQTT topic node, and system status listings.
2. Table Reference
[system]
Handles server execution settings, logging outputs, and local state directories.
log_level(String, default:"info") Sets logging verbosity. Options:trace,debug,info,warn,error.log_file(String, optional) Path to a local log file. If set, logs will rotate daily in addition to standard output.state_dir(String, default:platform-dependent) Directory where SnapDog saves state files like EQ configurations, current volume levels, and dynamic client mappings.- Defaults to
/var/lib/snapdogundersystemdor platform data folders (~/.local/state/snapdogon Linux,~/Library/Application Support/SnapDogon macOS).
- Defaults to
[audio]
Controls formatting and preemption rules for audio streams.
sample_rate(Integer, default:48000) Sets the target resampling frequency in Hz. All sources are resampled to this rate before encoding. Supported values:44100,48000,88200,96000,176400, or192000.bit_depth(Integer, default:16) PCM encoding bit depth. Options:16,24, or32bits.channels(Integer, default:2) Number of output channels (e.g.2for stereo,1for mono).source_conflict(String, default:"last_wins") Preemption rules when multiple sources try to play on the same zone:"last_wins": The newest request (e.g. starting a Spotify stream or manual radio click) overrides the active source."receiver_wins": AirPlay or Spotify Connect streams block any incoming Subsonic or radio play requests until the receiver stream stops.
zone_switch_fade_ms(Integer, default:300, max:1000) Fade duration in milliseconds when a SnapDog speaker switches between audio zones. Set to0to disable.source_switch_fade_ms(Integer, default:300, max:1000) Fade duration when changing the audio source (e.g., Radio → Spotify) within a single zone.
[http]
Configures the REST API, WebSocket notifications, and static WebUI hosting.
port(Integer, default:5555) The TCP port on which the web server listens.bind(String, default:"::") Listen interface IP. The default::listens on IPv6 and, on dual-stack systems, IPv4 as well. Set"0.0.0.0"for IPv4-only all-interface binding or a concrete IP address for one interface.base_url(String, default:"http://localhost:5555") External base URL of the server (e.g.,http://192.168.1.50:5555orhttps://music.example.com). Used by integrations that need absolute URLs, such as MQTT discovery and some cover-art metadata.tls_cert(String, optional) Path to a PEM-formatted TLS certificate chain. Required together withtls_keyto activate HTTPS.tls_key(String, optional) Path to an unencrypted PEM TLS private key.api_keys(Array of Strings, optional) If configured, activates token authentication. REST requests useAuthorization: Bearer <key>; WebSocket connections to/wspass the same key as?token=<key>.api_docs(Boolean, default:true) Exposes the embedded Scalar API Reference UI dynamically athttp://<host>:<port>/docs. Only applicable if the binary was compiled with theapi-docsfeature flag.
[snapcast]
Manages the embedded Snapcast synchronizer backend.
address(String, default:"127.0.0.1") The hostname or IP address of the Snapcast server.jsonrpc_tcp_port(Integer, default:1705) TCP port used to communicate JSON-RPC control events.jsonrpc_portis accepted as an alias.streaming_port(Integer, default:1704) TCP port where Snapcast client devices connect to pull the encoded PCM audio data.codec(String, default:"flac") Streaming compression encoder. Options:"pcm","flac","f32lz4","f32lz4e"(encrypted floats).encryption_psk(String, optional) Pre-shared key (PSK) used to encrypt the stream whencodec = "f32lz4e"is active.group_volume_mode(String, default:"compressed") Defines how zone-level volume adjustments scale connected client speakers:"absolute": Changes the volume of all clients to match the zone volume."relative": Scales each client proportionally (client_vol * zone_vol / 100)."compressed": Soft relative scaling using a square-root curve, ensuring quiet clients do not drop too quickly.
managed(Boolean, default:true) If true, starts the built-in Rust snapcast server inside the daemon process.verbose(Boolean, default:false) Enables verbose console logging for the underlying Snapcast protocol encoder.unknown_clients(String, default:"accept") Action when an unconfigured MAC address connects:"accept": Admits the speaker and assigns it to thedefault_zone."ignore": Accepts connection but excludes the client from WebUI controls."reject": Drops connection immediately.
default_zone(String, optional) Name of the fallback zone to place new clients into. Defaults to the first defined zone.
[mdns]
enabled(Boolean, default:true) Enables Bonjour/mDNS service advertisement.advertise_snapcast(Boolean, default:false) Additionally advertises the_snapcast._tcpservice type for discovery by generic Snapcast mobile apps.
[dbus]
enabled(Boolean, default:true) Exposes the MPRIS2 audio control interface on Linux D-Bus.
[airplay]
mode(String, default:"airplay2") AirPlay protocol compatibility:"airplay1"or"airplay2".password(String, optional) If set, requires verification to stream to the AirPlay receiver.bind(Array of Strings, optional) Restricts the AirPlay receiver to bind to specific network interfaces.
[spotify]
name(String) Device name advertised to Spotify Connect clients.bitrate(Integer, default:320) Streaming bitrate. Options:96,160, or320kbps.
[subsonic]
url(String) URL of the Subsonic API endpoint (e.g. Navidrome or Gonic).username(String) Connection username.password(String) Connection password.format(String, default:"raw") Transcoding stream request format:"raw","flac","mp3", or"opus".tls_skip_verify(Boolean, default:false) Skips certificate checks for self-signed certificates.
[subsonic.cache]
path(String) Local folder for pre-caching track streams. Defaults to the platform cache directory (~/Library/Caches/SnapDog/trackson macOS,$XDG_CACHE_HOME/snapdog/tracksor~/.cache/snapdog/trackson Linux).max_size_mb(Integer, default:2048) Maximum size in MB before LRU track eviction occurs.
[mqtt]
broker(String) MQTT broker host and port (e.g.192.168.1.10:1883).client_id(String, default:"snapdog") Unique client ID.username(String, optional) Broker username.password(String, optional) Broker password.base_topic(String, default:"snapdog/") Base namespace path under which states are published and commands are received. A trailing slash is added automatically if omitted.
[knx]
role(String, default:"client") KNX integration mode:"client"(connects to gateway tunnel) or"device"(registers as an ETS-programmable device). The older key namemodeis accepted as an alias.url(String, optional) Gateway connection URL (e.g.udp://192.168.1.50:3671).individual_address(String, optional) KNX individual address (e.g.1.1.100) for ETS programming.persist_ets_config(Boolean, optional) Saves ETS parameter changes to local persistent memory across restarts.start_prog_mode(Boolean, default:false) Starts with KNX physical programming mode enabled for ETS addressing.
3. Array Configuration Tables
[[zone]]
Multiple zones can be defined using array of tables.
name(String) Unique name for the room (e.g."Living Room").icon(String, default:"🎵") Icon or emoji used in the WebUI.sink(String, optional) Manual override for the Snapcast audio sink path.airplay_name(String, optional) Override for the AirPlay receiver name.group_volume_mode(String, optional) Zone-specific override for[snapcast].group_volume_mode. Options:"absolute","relative", or"compressed".knx(Table, optional) Explicit group addresses for this zone. Supported keys includeplay,pause,stop,track_next,track_previous,control_status,volume,volume_status,volume_dim,mute,mute_status,mute_toggle, track metadata/status fields, playlist controls, shuffle/repeat controls, and presence controls. Unconfigured group addresses are ignored.presence(Table, optional) Presence-activated playback and auto-off settings.auto_off_delaydefaults to900seconds;default_sourceand schedule entrysourcevalues usenone,radio:<index>, orplaylist:<id>. Schedule entries usefromandtoin 24-hourHH:MMformat, and overlapping or overnight ranges are rejected.
[[client]]
Defines output speaker hardware mapped to zones.
name(String) Friendly name for the speaker (e.g."Living Room Left").mac(String) Lowercase MAC address identifying the client device.zone(String) Initial zone mapping. Must match a defined[[zone]].name.icon(String, default:"🎵") Icon or emoji used in the WebUI.max_volume(Integer, default:100) Limits the maximum volume output (0-100) to protect speaker hardware.knx(Table, optional) Explicit group addresses for this client. Supported keys:volume,volume_status,volume_dim,mute,mute_status,mute_toggle,latency,latency_status,zone,zone_status, andconnected_status.
[[radio]]
Defines global internet radio streams.
name(String) Station name.url(String) Streaming source stream URL (supports direct links, M3U/PLS, and HLS).cover(String, optional) URL to a cover art image to display when this station is playing.
4. Environment Variable Overrides
The server applies these environment variables after loading snapdog.toml:
SNAPDOG_HTTP_PORT— Overrides[http].port.SNAPDOG_HTTP_API_KEYS— Comma-separated API keys replacing[http].api_keys.SNAPDOG_SUBSONIC_PASSWORD— Overrides[subsonic].passwordwhen Subsonic is configured.SNAPDOG_MQTT_PASSWORD— Overrides[mqtt].passwordwhen MQTT is configured.SNAPDOG_SNAPCAST_ENCRYPTION_PSK— Overrides[snapcast].encryption_psk.
Next Steps
CLI Reference Check server startup options, port overrides, and local soundcard driver setups.
REST API Reference Query system endpoints, trigger playback, adjust mixers, and configure DSP equalizer nodes.