Configuration reference¶
Kite uses strict, versioned YAML. Unknown fields and invalid fallback graphs prevent startup or reload.
Server¶
server.http_address enables plaintext HTTP/1.1 and the legacy ICE request-line adapter. It is empty by default. server.https_address serves HTTP/1.1 and HTTP/2. server.http3_address serves QUIC on UDP, normally using the same port number. public_https_port controls the advertised Alt-Svc port.
server.hls_enabled controls live HLS output (.m3u8 playlists and MPEG-TS segments) for mounts with the mp3 or aac-adts profile. It is enabled by default and can be toggled live.
server.status_page_enabled controls the built-in HTML status and player page served at /, /index.html, and /status.xsl. It is enabled by default and can be toggled live.
Changing any listener address at runtime requires a restart.
TLS¶
development: creates an ephemeral self-signed certificate on each start.files: loadscertificate_fileandprivate_key_file; changes are picked up for new TLS handshakes.acme: obtains certificates for the explicithostsallowlist using the configured email and cache directory. Sethttp_challenge_address: ":80"when HTTP-01 is required.
An alternative ACME directory can be configured with acme_directory_url, which is useful for Pebble testing.
For a public ACME deployment, point every hostname in tls.hosts at the server, allow inbound TCP 80 and TCP/UDP 443, and keep tls.cache_directory on persistent storage. The HTTP challenge listener owns its configured internal port while ACME is active; do not also configure server.http_address on that port. The production Compose example maps host ports 80/443 to unprivileged container ports and publishes the admin API only on host loopback (127.0.0.1:9090).
Source credentials¶
Each mount requires exactly one credential source (unless configured as a relay without direct source ingest):
source:
username: source
password_bcrypt: "$2a$12$..."
or password_env, or password_file. Environment and file values may be plaintext or bcrypt hashes. Files and environment variables are resolved at authentication time, allowing secret rotation without a config reload.
Relay (Master/Slave pull replication)¶
Mounts can pull an upstream stream from an external Icecast or Kite server:
mounts:
- path: /relayed
profile: mp3
relay:
url: "https://upstream.example.com/live"
username: relay_user # optional
password_env: RELAY_PASS # or password, or password_file
retry_delay: 3s # default: 3s
Kite requests ICY metadata (Icy-MetaData: 1) from the upstream server, extracts StreamTitle metadata updates on the fly without audio artifacts, and distributes the clean audio frames to local listeners.
If source credentials are also defined on a relay mount, a live source (e.g. DJ) connecting via PUT or SOURCE will temporarily preempt the relay stream. When the direct source disconnects, the relay automatically reconnects and resumes.
Profiles¶
mp3→audio/mpegaac-adts→audio/aacogg-opus→audio/ogg; codecs=opusopaque→ an explicitly configuredcontent_type; fallback is disabled
Kite parses MP3 frames, ADTS frames, and Ogg pages before fan-out. Every mount in a fallback chain must use the same profile.
Fallback (AutoDJ)¶
Fallback candidates are evaluated in order of priority:
fallback:
- mount: /backup
- folder: /var/lib/kite/music # directory of audio files (recursive)
shuffle: true # randomize playback order
- playlist: /var/lib/kite/playlists/hits.m3u # M3U playlist file
shuffle: false
- file: ./emergency.mp3 # single fallback audio file
title: Emergency programming # optional title override
Kite switches after source_timeout without valid input. It returns to a stable primary after failback_delay. Listener connections remain open. The switch occurs at a media frame/page boundary; Kite does not decode, crossfade, or normalize audio.
Extended Fallback & AutoDJ Features¶
- Folder & Playlist Support: Configure
folder: path/to/dirorplaylist: path/to/playlist.m3u. - Automatic ID3 Metadata Extraction: When moving between tracks in a folder or playlist, Kite automatically extracts
ArtistandTitlefrom ID3v2 (v2.2, v2.3, v2.4) and ID3v1 tags (or formats the filename) without external dependencies. Metadata updates are broadcast to web status listeners via SSE and inserted into ICY streaming clients aticy_meta_intervalboundaries. - Shuffle & Continuous Loop: When
shuffle: trueis enabled, the track rotation is randomized and continuously looped with automatic reshuffle at loop boundaries. - Immediate Preemption: When a live DJ or Relay connects, fallback playback immediately stops. When the live source disconnects, fallback immediately resumes.
Kite validates every configured fallback file, folder, and playlist during startup and before a dynamic configuration commit. A missing file or invalid directory rejects the configuration without changing runtime state.
Fallback audio is looped and paced using metadata.bitrate, or 128 kbit/s if omitted.
Buffering¶
buffer_duration determines the bounded per-listener queue. A client that falls beyond the live window is disconnected instead of increasing latency and memory indefinitely. Tune metadata.bitrate accurately to make this bound representative.
CORS¶
List allowed browser origins per mount. "*" is suitable only for public streams. WebSocket requests are rejected when their Origin is not allowed.