go2rtc
Ultimate camera streaming gateway with low latency
go2rtc is a camera streaming application that supports RTSP, WebRTC, HomeKit, and many other protocols with very low latency. It is widely used as a streaming layer for surveillance and smart-home camera setups.
Key features
- Multi-protocol camera streaming
- Ultra-low latency WebRTC
- HomeKit support
- Single binary
Pros & cons
Strengths
- Very low latency
- Lightweight and flexible
Trade-offs
- Streaming layer, not a full NVR
- Config requires some knowledge
go2rtc replaces
Last reviewed Aug 26, 2026 · 817 words
go2rtc's core idea is that your camera should be connected to once, by one process, and everything else should get its video from that process. A cheap IP camera falls over at 3 or 4 simultaneous RTSP clients; behind go2rtc it serves 1, and your NVR, your wall dashboard, your phone over WebRTC and Apple Home all consume the copy. Latency over WebRTC is under a second in a browser, which is the difference between a doorbell feed you glance at and one you ignore because the person left 5 seconds ago.
A config file shorter than this paragraph
streams:
front_door: rtsp://admin:[email protected]:554/stream1
garage:
- rtsp://admin:[email protected]:554/h264Preview_01_main
- ffmpeg:garage#audio=opus
That is a complete go2rtc.yaml. Run the single binary, or alexxit/go2rtc in Docker with /config mounted, and open port 1984 for a web UI that lists every stream, shows what codecs it carries, and plays it in the browser with one click. Sources are not limited to RTSP: onvif:// discovers cameras, rtmp://, http:// MJPEG, exec: for anything ffmpeg or a script can produce, and native handlers for several camera brands that speak proprietary protocols. The second example above shows the pattern that solves most "why is there no sound" problems: the ffmpeg: source re-encodes the audio to Opus, which is what browsers can play, while the video passes through untouched.
WebRTC works on the LAN by default and breaks the moment you leave it
RTSP restreaming from go2rtc is on port 8554 and behaves like any TCP service. WebRTC is different: the browser and go2rtc negotiate a direct media path, and go2rtc has to tell the browser an address it can actually reach. Inside the LAN with network_mode: host in Docker, it just works, and host networking is the recommended deployment for exactly this reason; bridged networking hides the real interface and the candidates go2rtc advertises are wrong. Away from home you have two honest options: a VPN such as Tailscale so the phone is effectively on the LAN, or forwarding TCP and UDP 8555 and adding your public address to the webrtc.candidates list. Skip both and the stream will connect, negotiate for a few seconds and fail, which is the single most common go2rtc support thread.
HomeKit without Home Assistant in the middle
go2rtc can present any stream as a native HomeKit camera. Add a homekit: section naming the stream, scan the pairing code from the web UI in the Home app, and the camera appears in Apple Home with live view, snapshots in notifications and, for cameras with a microphone and speaker, two-way audio. No bridge, no Home Assistant, no HomeKit Secure Video subscription. This alone justifies the tool for anyone with an Apple household and a shelf of non-HomeKit cameras. The reverse also works: homekit:// as a source pulls video from a HomeKit-only camera into go2rtc so it can be recorded by something else.
You are probably already running it
Since Frigate 0.12 the NVR has bundled go2rtc as its restream layer, which is why Frigate's docs talk about go2rtc streams inside the Frigate config. Home Assistant ships it inside the official WebRTC integration and as an add-on, and the popular WebRTC Camera custom card is built on it. The practical consequence is that you may not need a separate container. If Frigate is your NVR, configure the cameras in its go2rtc: block and point Home Assistant and the browser at Frigate's copy on 1984 and 8555. Run go2rtc standalone when you have no Frigate, when you want HomeKit without the rest, or when the NVR machine is not where the low-latency viewing should happen.
It is a gateway, not a recorder
The catalogue's con is the right framing: go2rtc does not record, detect motion, or keep history. It moves video between protocols. For recording and object detection, Frigate is the usual pairing, with Scrypted as the alternative that leans further into HomeKit and doorbells; the video surveillance category covers the recorders. What go2rtc contributes is the part those tools are worst at, which is showing you the live picture right now with no lag, in whatever app you are already holding.
What I'd do
Frigate as the recorder with its embedded go2rtc for cameras that are recorded, and a standalone go2rtc on the same host only if I want HomeKit. Host networking, cameras restreamed once, ffmpeg:#audio=opus on any stream I need to hear in a browser, and Tailscale for remote viewing rather than exposing 8555. At 128 MB of RAM and a single Go binary, it is the cheapest component in the camera stack and the one that most improves the daily experience of actually looking at the cameras.
Compare go2rtc
10 head-to-head comparisons.
Similar video surveillance apps
MediaMTX
Video SurveillanceReady-to-use media server and RTSP/WebRTC proxy
Replaces Wowza
OpenALPR
Video SurveillanceAutomatic license plate recognition library
Replaces Rekor Scout, Plate Recognizer
CompreFace
Video SurveillanceSelf-hosted face recognition service with REST API
Replaces Amazon Rekognition
OpenCvSharp
Video Surveillance.NET wrapper for OpenCV computer vision
Replaces Commercial vision SDKs
ZoneMinder
Video SurveillanceFull-featured closed-circuit television software suite
Replaces Blue Iris, Milestone XProtect
Cameradar
Video SurveillanceRTSP stream discovery and access-auditing tool for cameras
Replaces Commercial camera audit tools