ViewPane
Features Pricing Docs Blog Report a bug Get notified
Documentation

Docs

Self-hosted Frigate companion app · setup, configuration, troubleshooting

Last updated July 2026

Hit a bug? Tell us. Structured form with the fields we need to reproduce — app version, OS, device, Frigate version, steps, and an attachment slot for logs or a screenshot.
Report a bug

On this page

  1. Quick start
  2. Frigate config requirements
  3. Push relay setup
  4. Tailscale walkthrough
  5. MQTT auth
  6. FAQ
  7. Troubleshooting

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.

Have a setup question we should answer here?
Email ken@campbellsoftstudios.com — real questions become real FAQ entries.
Docs Blog Features Pricing Press Privacy Terms Report a bug
© 2026 CampbellSoft Studios · Made for the Frigate community.