Multi-platform streaming relay. Receives RTMP/SRT from OBS and retransmits to multiple destinations simultaneously (Kick, Twitch, YouTube, etc.). Includes live WebRTC preview, priority-based input fallback, and FLV clip failover.
┌──────────┐
RTMP ─────>│ │────RTMP──> Kick
SRT ─────>│ NeverDrop│────RTMP──> Twitch
Test signals ───>│ Relay │────RTMP──> YouTube
Fallback clips ─>│ Engine │────SRT ──> Custom
│ │
│ │────WebRTC──> Browser preview
└──────────┘
mkdir -p videos
docker run -d \
--name neverdrop \
-p 1935:1935 \
-p 3000:3000 \
-p 10080:10080 \
pablogod/neverdropOr with docker-compose.yml:
services:
neverdrop:
image: pablogod/neverdrop
container_name: neverdrop
ports:
- 1935:1935
- 3000:3000
- 10080:10080
restart: unless-stoppedmake run
# or directly:
go run ./cmd/neverdrop/Open http://<vps-ip>:3000 in your browser.
Set your OBS output to:
Server: rtmp://<vps-ip>:1935/live
Stream Key: any-name-you-choose
The stream key becomes the input ID in the panel. You can push multiple streams with different keys — they appear as Priority Inputs.
All inputs must use the same encoding parameters. The relay is calibrated for:
| Setting | Value |
|---|---|
| Resolution | 1920×1080 |
| Framerate | 30 fps |
| Keyframe interval | 1s (recommended for low-latency switching) |
| Audio encoder | AAC |
| Audio sample rate | 48000 Hz |
Critical: The keyframe interval must be ≤ 2s. Higher values cause 8+ second delays when switching inputs and visible glitches on Kick/YouTube players. Lower values (0.5–1s) provide the best viewer experience at the cost of slightly higher bitrate.
The web UI shows:
- Relay — live video preview, bitrate, uptime, data sent, and a bitrate chart
- Outputs — configured destinations. Click Add to set one up, then Start to begin pushing. Each output has its own bitrate chart and stats
- Priority Inputs — each incoming stream listed with priority order. Click ▲/▼ to reorder. The highest-priority connected stream is the active source
- Logs — real-time server log output (always visible)
- 🧪 Test — generates a local test stream to try the relay without OBS
When no live input is connected, the relay automatically falls back to playing FLV clips from the videos/ directory. Drop .flv files in that folder and restart the relay.
Input source priority: Live stream → Fallback clips → Idle
Click ➕ Add, fill in:
- Name (e.g. "Twitch")
- Protocol (RTMP or SRT)
- URL + Stream Key
Then click Start. Stats and chart appear once streaming.
| Variable | Default | Description |
|---|---|---|
API_PORT |
3000 | Web UI port |
RTMP_PORT |
1935 | RTMP ingest port |
SRT_PORT |
10080 | SRT ingest port |
DB_PATH |
neverdrop.db | SQLite database path |
VIDEOS_DIR |
videos | Fallback FLV clips directory |
API_KEY |
(auto) | Auth key for API calls (X-API-Key header) |
The relay video and each input stream have a WebRTC preview. Browsers with WebRTC support will show a live (~2s delay) picture of what's being relayed.
