Skip to content
DatanoiseTV edited this page Jun 18, 2026 · 3 revisions

TinyIce

One binary. Audio and video. Scales to six figures of listeners.

TinyIce is an Icecast-compatible streaming server written in Go. It ingests audio and video from the usual broadcast tools (BUTT, Mixxx, OBS, ffmpeg, a browser), transcodes audio in pure Go with no FFmpeg dependency, and serves listeners over Icecast, HLS, and WebRTC — all from a single ~25 MB static binary with the admin UI, player, and assets embedded.

This wiki is the operator and developer reference. The repository README is the fast tour; these pages go deeper.


Start here

If you want to… Read
Get a server running in two minutes Quick Start
Install a binary, Docker image, or .deb/.rpm Installation
Copy a real-world setup (radio, video, ABR, relay, Compose…) Examples and Recipes
Understand every key in tinyice.json Configuration
Send audio/video into TinyIce Streaming Sources
Get audio/video back out (HLS, WebRTC, player) Playback and Output
Run a file-based station AutoDJ
Re-encode a stream to MP3 or Opus Transcoding
Fire notifications on stream events Webhooks
Set up users, passkeys, OIDC, API tokens Authentication and Users
Lock the server down Security
Script against the HTTP API HTTP API
Wire up Prometheus / Grafana Observability
Deploy to systemd / Docker / behind a proxy Deployment
Understand the internals Architecture
Build from source and contribute Developing
Diagnose a problem Troubleshooting and FAQ
Look up a flag, subcommand, or signal Command Line and Signals

At a glance

Ingest Icecast2 SOURCE/PUT · RTMP (H.264 + AAC/MP3) · SRT MPEG-TS · WebRTC browser broadcasting · Icecast relay pull
Output Icecast passthrough · HLS audio · HLS audio + video · WHEP / WebRTC playback · OBS simulcast (master playlist) · embeddable player
Codecs MP3 · Ogg Opus · Ogg Vorbis · FLAC / FLAC-in-Ogg · WAV (8/16/24/32-bit & float) · H.264 · AAC-LC
Transcoder Pure-Go multi-codec decode → MP3 or Opus with automatic resampling. No FFmpeg dependency.
AutoDJ Multi-instance, keyframe-accurate pacing, shuffle/loop/queue, MPD protocol per instance, external track hooks
Auth Username + bcrypt · Passkeys (WebAuthn) · OIDC/OAuth2 · Bearer API tokens · per-mount source passwords
Player 16:9 video layout · live poster thumbnails · stats overlay (codec/res/fps/GOP/bitrate, dropped frames, buffer, latency) · 60 s DVR seek
Ops Prometheus metrics · structured logging · ACME auto-HTTPS · zero-downtime hot-swap · multi-arch Docker on GHCR
Deploy One static Go binary (~25 MB), all assets embedded · multi-stage Docker image · .deb / .rpm packages

Design philosophy

  • One binary, no runtime dependencies. Pure-Go SQLite, pure-Go audio decode/encode, embedded frontend. Cross-compiles to Linux, macOS, Windows, and FreeBSD without a C toolchain. No FFmpeg, no GCC.
  • Zero-allocation broadcast path. Every mount is a shared circular buffer; listeners hold an offset into it rather than a per-connection copy. The dominant cost at scale is network bandwidth, not CPU or RAM. See Architecture and Deployment for the numbers.
  • Icecast-compatible, not Icecast-bound. Existing encoders and players keep working; HLS and WebRTC are added on top for modern clients.
  • Honest defaults. Secure credentials are generated on first run, mutating admin actions are CSRF-protected, outbound URLs are SSRF-guarded, and the packaged systemd unit ships masked so an unconfigured daemon can't auto-start.

Licensed under the Apache License 2.0.

Clone this wiki locally