Docs
Self-hosted Frigate companion app · setup, configuration, troubleshooting
Last updated July 2026
On this page
These docs assume you already run Frigate NVR — the community build or Frigate+ NVR commercial — and want a phone-shaped window into it. If you don't have Frigate yet, start at the Frigate project's official documentation, get a single camera working in the web UI, then come back here.
01Quick start
You need two things: the app, and the URL your Frigate web UI answers on. Everything else is optional.
1. Add your server
On first launch, ViewPane asks for a server name, a Local URL, and (optionally) an External URL. The Local URL is what you type into a browser on your home network to reach Frigate — typically http://192.168.x.x:5000, or your auth proxy's port if you run one (see Frigate config). If Frigate asks for a login, enter the same credentials in the app; they're stored in your phone's OS keychain and sent only to your server.
2. Capture thumbnails
The Live tab shows one tile per camera. Tiles start empty — tap the refresh button in the toolbar to capture a snapshot from every camera. Thumbnails are yours to curate: they stay put until you refresh them, so you can pick the frames you like. Long-press a tile to reset one.
3. Go fullscreen
Tap any tile for the fullscreen live view — native-codec video streamed straight from your server, with pinch-to-zoom, pan, and landscape support. If fullscreen shows a stream error, your Frigate needs its restream (go2rtc) enabled — covered in the next section.
No Frigate yet?
Tap Try Demo Mode on the first screen. The whole app runs on sample data — no server, no account, nothing leaves the phone.
02Frigate config requirements
ViewPane talks to the standard Frigate HTTP API — version 0.13 or newer, community or Frigate+. Three config areas matter:
Snapshots + recordings
Event thumbnails need snapshots enabled; clip playback and the continuous-recording downloader need record enabled:
cameras:
front_door:
snapshots:
enabled: true
record:
enabled: true
retain:
days: 7 Restream (go2rtc) for fullscreen live
The fullscreen live view streams from Frigate's built-in go2rtc restream at /api/go2rtc/api/stream.mp4. If your cameras are defined under Frigate's go2rtc block (the recommended setup in Frigate's own docs), this already works. If fullscreen shows "check your Frigate restream config", add your camera streams to the go2rtc section of your Frigate config.
frigate-auth coexistence
If you front Frigate with the community frigate-auth nginx proxy (or any Basic-auth reverse proxy), point ViewPane at the proxy's port, not raw 5000, and enter the proxy credentials in the app's server settings. Your existing login keeps working everywhere else — ViewPane just presents the same credentials.
03Push relay setup
Push notifications (Pro) run through a small relay container you host next to Frigate. It subscribes to Frigate's MQTT event stream and forwards alerts to your phone — no cloud service ever holds your events. Add it to your existing compose file:
services:
viewpane-relay:
image: ghcr.io/kampbell562/viewpane-relay:latest
container_name: viewpane-relay
restart: unless-stopped
ports:
- "8787:8787"
environment:
MQTT_URL: mqtt://mosquitto:1883
REGISTER_SECRET: <generate-a-long-random-string>
volumes:
- viewpane-relay-data:/data
volumes:
viewpane-relay-data: Generate the secret with openssl rand -hex 32. It's what proves your phone is allowed to register with your relay — treat it like a password.
Then in the app: Settings → Motion Alerts → enter http://<your-server>:8787 and the same secret → Connect. Once connected, the Notification Rules screen gives you per-camera toggles, daily schedules, and a critical-alert channel that can bypass Do Not Disturb. If Frigate's mqtt.topic_prefix isn't the default frigate, set MQTT_TOPIC_PREFIX to match.
04Tailscale walkthrough
Tailscale gives you remote access with zero port-forwarding. Four steps:
- Install Tailscale on the machine running Frigate and sign in.
- Install the Tailscale app on your phone, same account, toggle it on.
- Make sure MagicDNS is enabled in your Tailscale admin console (it is by default on new tailnets).
- In ViewPane, set the server's External URL to
http://<machine-name>:5000(or your auth proxy's port) — the machine name from your Tailscale admin console, not an IP.
Use the MagicDNS name, not the 100.x.x.x IP. ViewPane deliberately refuses plain-HTTP URLs on the 100.64/10 carrier-grade NAT range: on some mobile carriers that range is reachable outside your tailnet, which could leak credentials. The MagicDNS hostname only resolves inside your tailnet, so it's safe — and it survives IP changes.
With both URLs set, ViewPane races local against external on every connect and picks whichever answers — walk out the door and the badge flips from LOCAL to EXTERNAL on its own. WireGuard works the same way: any VPN that presents your server on a private address (10.x, 172.16–31.x, 192.168.x) is fine, as is any HTTPS reverse proxy.
05MQTT auth
If your broker currently runs with allow_anonymous true, lock it down — the relay and Frigate each get their own user:
# on the broker host mosquitto_passwd -c /mosquitto/config/passwd frigate mosquitto_passwd /mosquitto/config/passwd viewpane-relay
# mosquitto.conf allow_anonymous false password_file /mosquitto/config/passwd listener 1883
Point Frigate's mqtt: block at the frigate user, and give the relay its credentials via MQTT_USERNAME / MQTT_PASSWORD environment variables. Restart the broker first, then Frigate, then the relay — the relay reconnects automatically, but starting it last avoids a burst of auth-failure log noise.
Keep port 1883 off the public internet: bind it to localhost / your Docker network / your tailnet. The relay is the only thing that needs to reach it besides Frigate itself — your phone never talks to MQTT directly.
06FAQ
Does ViewPane work without Tailscale?
Yes. On your home network, the Local URL is all you need. For remote access, anything that presents your server on a private address works — Tailscale, WireGuard, or an HTTPS reverse proxy with a domain.
Why does the app reject my external URL?
ViewPane blocks plain-HTTP URLs on public and carrier-grade-NAT addresses on purpose — sending your Frigate credentials unencrypted over the open internet is how they get stolen. Use a Tailscale MagicDNS name, a VPN private address, or HTTPS.
Does it work with Reolink / Amcrest / Hikvision / brand-X cameras?
Camera brand doesn't matter. ViewPane talks to Frigate, and Frigate talks to the cameras. If your camera works in Frigate's web UI, it works in ViewPane.
Does it work with a commercial Frigate appliance?
Yes — same API, same app. Community build, Frigate+ models, and commercial appliances all present the standard Frigate HTTP API.
What's actually free?
One server, the multi-camera grid, fullscreen live view with pinch-to-zoom, the last 20 events, LAN + Tailscale access, and demo mode — permanently. Pro ($9.99/year) adds push notifications, full event history with filters, clip playback and download, unlimited servers, and Live Wall.
How does Pro billing work?
Pro is a yearly subscription billed by the App Store or Google Play. It renews through your store account and you cancel it there too — ViewPane never sees your payment details, only a yes/no entitlement.
Which OS versions?
Android 10+ and iOS 16+.
07Troubleshooting
"Server Unreachable"
Check the URL in a browser on the same network first. The usual suspects: wrong port (your auth proxy's port vs Frigate's raw 5000), phone on cellular with no External URL configured, or Tailscale toggled off on the phone.
Connected, but "Couldn't Load Cameras"
The URL answered, but with something that isn't the Frigate API — usually a reverse proxy's login page. Point the app at your auth proxy and put the proxy credentials in the app's server settings instead of logging in via browser.
Fullscreen shows a stream error
The live view needs Frigate's go2rtc restream — see Frigate config. The grid thumbnails and events will still work without it.
Push notifications stopped arriving
In order: is the relay container running (docker logs viewpane-relay)? Does Settings still show the relay as connected? Are notifications paused in the app (check the pause button on the Live tab)? Is the camera muted or outside its schedule in Notification Rules? If the relay logs show MQTT auth errors, re-check the broker credentials.
Clips won't play or download
Clips need record enabled and retention long enough that the event's footage still exists. Very old events fall out of retention — the snapshot stays, the clip doesn't.
Live Wall feels slow away from home
By design: over an external connection the Live Wall caps its refresh around 1.5 fps so each frame completes before the next one fires. On LAN it runs at your configured rate.
Still stuck?
Send a bug report with your app version, device, Frigate version, and what you expected vs. what happened — a real human reads every one.