-
Notifications
You must be signed in to change notification settings - Fork 17
Home
DatanoiseTV edited this page Jun 18, 2026
·
3 revisions
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.
| 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 |
| 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 |
- 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.
Repository · Releases · Issues · Security policy · Apache-2.0
Getting started
Streaming
Integrations
Operations
Internals
Help