|
DOVE is an API driven Video/Audio Editor for live mixing with an intuitive web based Interface.
Developed by and for DORFTV. Inspired by bbc/brave. |
![]() |
![]() |
Inputs → Scenes → Program → Outputs
Inputs — media sources: local files, network streams, web pages, yt-dlp URLs, cameras, test patterns.
Scenes — compositor layouts combining multiple inputs. Each scene has slots with per-slot position, size, z-order, alpha, and volume controls.
Program — the currently live scene, sent to all active outputs simultaneously. Cut or crossfade between scenes.
Outputs — streaming destinations (SRT, RTMP, HLS, WebRTC, Decklink, etc.). Multiple outputs can share an encoder; dedicated encoders per output are also possible.
| Type | Description |
|---|---|
uridecodebin3 |
Local files and streams (HTTP, SRT, RTMP, RTSP) |
playlist |
Sequence of video clips and HTML pages |
wpesrc |
Web page rendered as video (HTML/CSS/JS overlays) |
ytdlp |
YouTube, Twitch, and hundreds of other sites via yt-dlp |
nodecg |
NodeCG broadcast graphics |
v4l2src |
Webcams and capture cards (V4L2) |
imagesrc |
Still images (PNG, JPEG, WebP, SVG) |
testsrc |
SMPTE color bars and test patterns |
whip |
Browser screen share or webcam via WebRTC (experimental) |
Input Pickers (Proxies) — Configurable dropdowns in the "Add Input" dialog for fast discovery of local files, webcams, NodeCG sources, MediaMTX/OvenMedia streams, SRT relays, and playlists. Define in config.toml with [proxy.<name>] sections. See dove/docs/proxies.md.
| Type | Description |
|---|---|
srtsink |
SRT push to a remote listener |
srtserversink |
SRT server mode (remotes connect to DOVE) |
rtmpsink |
RTMP push |
rtspclientsink |
RTSP push |
hlssink2 |
HLS segments (also used for previews) |
splitmuxsink |
Segmented file recording |
decklink |
SDI/HDMI via Blackmagic Design card |
shout2send |
Icecast/Shoutcast audio stream |
Hardware-accelerated encoding via VAAPI (AMD/Intel) or Vulkan Video. Software fallback via x264 / x265. Set video_encoder.name = "auto" to pick the best available encoder at startup. Multiple outputs can share a single encoder, or each output can have its own dedicated encoder. See dove/docs/encoders.md.
| Encoder | Type |
|---|---|
x264 |
Software |
openh264 |
Software alternative |
vah264enc / vaapih264enc |
VAAPI (AMD/Intel) |
vulkanh264enc |
Vulkan (Mesa 26+, GStreamer 1.28+) |
mpph264enc |
Rockchip hardware |
Per-input dynamic filter chains, applied at runtime without pipeline restart.
Audio: highpass, lowpass, 3-band/10-band EQ, compressor (LSP), expander (LSP), gate (LSP), limiter, amplify, pan, invert, echo, denoise, loudnorm. See dove/docs/audio-filters.md.
Video: color balance, flip/mirror, crop, color effects, blur, chroma key. Experimental (requires frei0r-plugins): pixelate, cartoon, glow, vignette, film grain, glitch, scanlines, sobel edge, color halftone. See dove/docs/video-filters.md.
- WebRTC — sub-second latency preview in the browser.
- HLS — works in restricted networks, through any reverse proxy over HTTPS.
Full keyboard control for live production: scene selection (1–9), cut/crossfade (Enter), transition toggle (T), and more. Press ? in the UI for the full list. See dove/docs/keyboard-shortcuts.md.
Want a ready-to-run setup with example inputs and scenes? See dove-demo for a pre-configured docker-compose stack you can spin up in one command.
To install DOVE from scratch:
git clone https://github.com/dorftv/dove.git && cd dove
cp config-example.toml config.tomlSoftware rendering (no GPU):
docker compose upAMD GPU (VAAPI + Vulkan):
docker compose -f docker-compose.yml -f docker-compose.amd.yml upIntel GPU (VAAPI + Vulkan):
docker compose -f docker-compose.yml -f docker-compose.intel.yml upCopy config-example.toml to config.toml and edit as needed. See dove/docs/config.md for all options.
[main]
default_resolution = "HD720" # QHD, FullHD, HD720, nHD, …
default_framerate = "30/1"
volume = 0.7
[preview.scenes]
type = ["webrtcbin", "hlssink2"]
video_encoder.name = "auto"Optional OIDC authentication (Keycloak, Authentik, Authelia, etc.). Disabled by default — enable with:
[auth]
enabled = true
issuer = "https://auth.example.com/realms/dove"
client_id = "dove-app"
client_secret = "your-secret"Four roles: User, Supervisor, Outputs, Admin. See dove/docs/auth.md for setup, role details, API tokens, and nginx integration.
In-app help is available at /help after starting DOVE. All docs are in the dove/docs/ directory:
Setup — Interface overview · Configuration · Authentication
Pipeline — Inputs (uridecodebin3 · playlist · wpesrc · ytdlp · nodecg · testsrc · screencast) · Input Pickers · Scenes · Outputs · Encoders
Effects & Output — Audio filters · Video filters · Previews
Operations — Debugging · Connection Status
- GStreamer 1.26+
- FastAPI + uvicorn — REST API and WebSocket
- Nuxt 4 — web frontend
- Python 3.12 or 3.13
Note: Python 3.14 is not supported for native installs due to PyGObject/GStreamer thread interaction bugs. Use Python 3.12 or 3.13. The Docker images ship Python 3.13 and are unaffected.
Running DOVE natively (pip install on Debian 13, or from a checkout): see dove/docs/install.md.
Contributions are welcome! Please open an issue first to discuss larger changes. For bug reports, include the GStreamer version, config, and relevant logs.
- Decklink requires a supported Blackmagic Design card and the
decklinkGStreamer plugin - WebRTC previews use
announced_ipfor the server's public IP — set inconfig.tomlor viaANNOUNCED_IPenv var


