Skip to main content
home35 Designs
All workApp

Camera Bridge

Most network cameras can't record to Apple Home on their own. Camera Bridge talks to them over RTSP and ONVIF and publishes each one to the Home app as a HomeKit camera, with HomeKit Secure Video recording, live view, snapshots and doorbells. The HomeKit Accessory Protocol is implemented from scratch in portable Swift. The same engine runs Camera Bridge OS, a small Linux system for a mini PC that also records every camera around the clock and is set up entirely from a browser.

The Camera Bridge logo: a camera lens with a suspension bridge inside it

At a glance

Type
App
Industry
Smart home
Built with
Swift 6.4 with its own HomeKit Accessory Protocol stack, on Debian 13 built with mkosi
Platforms
Camera Bridge OS for Linux (beta); the earlier Mac app is archived
Codebase
About 99,000 lines of engine code and 104,000 lines of tests
Commits
892 on the engine and OS since September 30, 2026, plus 58 on the website

One engine, two platforms

The whole engine is one Swift package. Every module except the Apple platform layer is portable Swift, and a test keeps it that way.

A platform supplies a short list of services: networking, mDNS, a secret store, network-change events and codecs. On a Mac they come from Network.framework, the Keychain and VideoToolbox. On Linux they come from POSIX sockets, Avahi, an AES-GCM encrypted file store and ffmpeg with VA-API hardware encoding.

HomeKit Secure Video wants H.264 passed through untouched, so the bridge only transcodes where it has to: audio, H.265 cameras and the timestamp overlay.

  • Camera Bridge monitor wall showing eight sample cameras as test patterns
  • Camera detail view with HomeKit readiness, recording and motion status, using sample data

An appliance that looks after itself

Camera Bridge OS installs from a USB stick. It joins the network by cable, or opens a setup hotspot for a phone, then installs itself to the PC's internal disk from a web page. No keyboard, screen or Mac is needed.

Updates are A/B. The new version is written to the idle slot and gets three boots to pass a health check of the daemon, mDNS and the data partition; if it never passes, the box falls back to the previous version on its own. Releases are signed with minisign, and every file is hash-checked twice: once by an unprivileged downloader in a sandbox, and again by the root step that writes it.

The daemon runs as an unprivileged user and never starts anything privileged. Jobs like installing to disk or joining Wi-Fi go through request files: the names come from a fixed list, the bodies are built only from validated values, and a root helper checks both again. There is no sudo, no setuid program and no shell in the path.

  • Welcome sheet listing what Camera Bridge needs before setup
  • HomeKit settings listing each camera's accessory in the Home app

Secure by default

The web interface serves the local network only and refuses unknown host names, which blocks DNS rebinding. Passwords are hashed with PBKDF2 at 600,000 rounds, wrong guesses lock out for longer each time, and sessions are 256-bit tokens kept only as hashes. Every request that changes something needs a matching origin and a CSRF token, and a strict Content Security Policy allows nothing but the bridge's own files.

Camera passwords, HomeKit keys and API keys live in the encrypted secret store and never appear in an answer, a log or the diagnostics. The firewall denies everything inbound that the bridge doesn't need, and there is no telemetry.

An optional internet guard makes the box a watched camera's DNS server. It answers every lookup with "does not exist", so the camera can't reach its cloud, and shows the owner what the camera tried to reach.

Recording, events and AI descriptions

The box records around the clock to its SSD or an attached drive, within limits on age and size. A timeline in the browser scrubs every camera at once, and clips export as MP4, copied untouched unless the owner asks for labels or straightening to be burned in.

Motion, person, vehicle, animal and package events come from the camera's own ONVIF events or native interface, or from built-in motion detection. They become Home notifications and recording triggers.

AI descriptions stay off until the owner turns them on for a camera. Each event then sends at most five still pictures to Claude or to an OpenAI-compatible service, which can be a model running at home. The key is write-only, the client never follows a redirect, and a daily limit caps the calls.

  • camera-bridge.app home page for Camera Bridge OS
  • Why Camera Bridge page comparing Apple Home camera support

The website and docs

camera-bridge.app is a Next.js site with a small JSON API. It serves the camera-profile feed, takes opt-in setup reports that are validated and scrubbed before they reach private storage, and reads GitHub Releases, so the download buttons always point at the newest Camera Bridge OS.

Analytics are first-party and cookieless. Each visitor is a hash with a salt that changes every day, the IP address is never stored, and Do Not Track and Global Privacy Control are honored.

  • Camera compatibility page
  • Getting-started welcome page of the Camera Bridge docs

Highlights

  • The HomeKit Accessory Protocol and HomeKit Secure Video, implemented from scratch in Swift.
  • One portable engine for macOS and Linux, with a test that keeps it portable.
  • A/B system updates with signed releases, three boot attempts and automatic rollback.
  • A privilege-separated daemon: no sudo, no setuid and no shell between the web page and root.
  • About 104,000 lines of tests for about 99,000 lines of engine code.
  • AI event descriptions that are off by default and can stay on the home network.

Let's talk.

Tell me what you're building. I read every message myself and usually reply within one business day.