A lightweight macOS status bar app for viewing live camera feeds from a UniFi Protect controller.
Click the camera icon in your menu bar to instantly see all your cameras in a resizable popover — no browser or UniFi Protect app needed.
- Live RTSP streaming via a custom RTSP/RTP client built on Network.framework (no AVFoundation RTSP dependency)
- H.265 (HEVC) and H.264 codec support, including multi-slice encoding (e.g. G4 Doorbell Pro)
- Automatic aspect ratio detection — wide cameras like the G6 180 display at their native ratio
- Resizable camera feeds — right-click any camera to set Small / Medium / Large sizing
- Drag-and-drop reordering — arrange cameras however you want
- Hide cameras — hide feeds you don't need via right-click or Settings
- Resizable popover — drag to resize; size is saved per display
- Per-display layouts — different camera arrangements and popover sizes on your laptop vs. external monitor
- Global keyboard shortcut — toggle the popover from anywhere, configurable in Settings
- Self-signed TLS support — connects to controllers using self-signed certificates without system-wide trust changes
- Closes on outside click — click anywhere outside the popover to dismiss it
- macOS 13.0 or later
- A UniFi Protect controller with the Integration API enabled
- An API key generated from the controller's settings
- Build and run the app (see Building)
- Click the camera icon in the menu bar
- Right-click the icon or click the gear icon to open Settings
- Enter your controller's IP address and API key
- Click Test Connection to verify
- Close settings — your cameras will appear in the popover
The project uses XcodeGen to generate the Xcode project.
# Install XcodeGen (if needed)
brew install xcodegen
# Generate the Xcode project
xcodegen generate
# Open in Xcode
open QuickProtect.xcodeprojAlternatively, compile directly with swiftc:
swiftc \
-sdk $(xcrun --show-sdk-path) \
-target arm64-apple-macos13.0 \
-framework AppKit -framework SwiftUI -framework AVFoundation \
-framework CoreMedia -framework Network -framework Security \
-framework Combine -framework Carbon \
-o QuickProtect \
QuickProtect/*.swift \
QuickProtect/**/*.swiftQuickProtect is not signed with an Apple Developer certificate. When you first open it, macOS will block it with a message like "QuickProtect can't be opened because Apple cannot check it for malicious software."
To allow it:
- Open System Settings → Privacy & Security
- Scroll down to the Security section
- You'll see "QuickProtect" was blocked to protect your Mac with an Open Anyway button
- Click Open Anyway and confirm
You only need to do this once. After that, QuickProtect will open normally.
UniFi Protect does not expose public cloud APIs for video streaming. The official remote method (WebRTC via protect.ui.com) has no public API for third-party apps. This means QuickProtect requires network access to your controller's local IP.
To use QuickProtect when you're away from home, connect to your home network first using a VPN:
Tailscale is a zero-config WireGuard VPN that creates a private network between your devices.
- Install Tailscale on your Mac and on a device on your home network (e.g., your UniFi gateway, a Raspberry Pi, or any always-on machine)
- Enable subnet routing to expose your home LAN (e.g.,
10.0.1.0/24) - Connect to Tailscale on your Mac — your controller's local IP is now reachable
- QuickProtect works as if you were at home
If you have a UniFi Gateway, Teleport is a built-in WireGuard VPN:
- In the UniFi console, go to Settings → Teleport & VPN → Teleport
- Generate an invitation link and open it on your Mac (via the WiFiman app)
- Once connected, your controller's local IP is reachable
- QuickProtect works as if you were at home
Any VPN solution that gives you access to your home LAN will work — WireGuard, OpenVPN, ZeroTier, etc. Just ensure the controller's IP is routable through the VPN tunnel.
QuickProtect connects to your UniFi Protect controller using the Integration API (/proxy/protect/integration/v1/). It authenticates with an API key and creates on-demand RTSP sessions for each camera.
Since macOS 13+ dropped AVFoundation support for RTSP URLs, QuickProtect includes a custom RTSP/RTP client that:
- Opens a TLS connection via
NWConnectionwith per-connection certificate verification bypass - Runs the RTSP state machine (OPTIONS → DESCRIBE → SETUP → PLAY)
- Parses RTP interleaved framing and reassembles H.264/H.265 NAL units
- Groups NAL units into access units using the RTP marker bit (required for multi-slice cameras)
- Feeds AVCC-formatted data into
AVSampleBufferDisplayLayerfor hardware-accelerated decoding
MIT
