Skip to content

pablodz/neverdrop

Repository files navigation

NeverDrop

Multi-platform live streaming relay. Receives RTMP from OBS and retransmits to multiple RTMP destinations simultaneously (Kick, Twitch, YouTube, etc.). Includes live WebRTC preview, priority-based input fallback, and FLV clip failover.

                          ┌──────────┐
               RTMP ─────>│          │────RTMP──> Kick
         Test signals ───>│ NeverDrop│────RTMP──> Twitch
         Fallback clips ─>│  Relay   │────RTMP──> YouTube
                          │  Engine  │
                          │          │────WebRTC──> Browser preview
                          └──────────┘

Quick start

Docker

mkdir -p videos

docker run -d \
  --name neverdrop \
  -p 1935:1935 \
  -p 3000:3000 \
  pablogod/neverdrop

Or with docker-compose.yml:

services:
  neverdrop:
    image: pablogod/neverdrop
    container_name: neverdrop
    ports:
      - 1935:1935
      - 3000:3000
    restart: unless-stopped

Development

make run
# or directly:
go run ./cmd/neverdrop/

Open http://<vps-ip>:3000 in your browser.

How it works

Pushing a stream from OBS

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.

Required OBS configuration

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.

Panel

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. 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

Fallback

When no live input is connected, the relay automatically falls back to:

  1. Fallback generator — synthetic test pattern (1920×1080, "FALLBACK" text overlay)
  2. FLV clips — loops .flv files from the videos/ directory
  3. Idle — no output sent

Outputs (destinations)

Click ➕ Add, fill in:

  • Name (e.g. "Twitch")
  • Protocol (RTMP — only supported protocol)
  • URL + Stream Key

Then click Start. Stats and chart appear once streaming.

Configuration

Variable Default Description
API_PORT 3000 Web UI port
RTMP_PORT 1935 RTMP 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)

Preview

Each input stream has a WebRTC preview. Browsers with WebRTC support will show a live (~2s delay) picture of what's being relayed.

About

Stream like your internet never fail

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages