25 April 2026 · 8 min read

Building Lumen — Why I Wrote a Native Frigate iOS Client

A solo dev's story of building a 6-platform Frigate NVR companion in Swift 6. What worked, what didn't, and why I wouldn't recommend doing this to anyone.

The problem

I run Frigate on a Proxmox box at home. Five cameras, a Coral USB accelerator, the usual prosumer setup. Frigate is excellent — accurate AI detection, low resource use, well-documented. But its mobile story on iOS is bad.

Frigate has a web UI. The web UI works on iOS Safari. Most "Frigate iOS apps" you'll find on the App Store are WKWebView wrappers around that web UI. They work, sort of. But:

  • No widgets, no Live Activities, no Watch complications, no Apple TV.
  • Performance is mediocre because every interaction goes through a WebView.
  • iOS-native niceties — pull-to-refresh, swipe-to-archive, share extensions — don't exist.
  • Some of these apps route through cloud relays for "convenience", which means your camera streams pass through someone else's server. Hard pass.

I wanted something that felt like an Apple app. So I started building one.

What "native" actually means here

Lumen is pure Swift 6 with strict concurrency. Zero @unchecked Sendable. SwiftUI for the UI layer with platform-specific Views as needed. The networking layer talks directly to Frigate's HTTP and WebSocket APIs — there's no relay, no proxy, no LorisLabs server in the middle. Your iPhone makes requests to http://your-frigate-server:5000. That's it.

From day one, the design constraint was: one codebase, six platforms. iPhone, iPad, Mac (Catalyst-free, real native Mac), Apple TV, Apple Watch, Vision Pro. SwiftUI mostly delivers on that promise in 2026. Mostly.

What worked

  • SwiftUI's adaptive layout is genuinely great for multi-platform. NavigationSplitView, the hierarchy of List/Form/Group, and platform-aware modifiers like .toolbarBackground let me ship a single view tree that looks correct on every device.
  • Swift 6 concurrency caught bugs I'd have shipped otherwise. Sendable warnings on the WebSocket handler exposed a real race condition in event ingestion. The compiler stopped me from racing my own state.
  • Local Swift packages for FrigateKit, IntelligenceKit (face/LPR), and a UI design system. Editing one package in Xcode, testing it standalone, rebuilding the app — clean separation, fast iteration.
  • StoreKit 2 is much cleaner than the v1 receipt-validation theater. Free trial, monthly, annual, lifetime — all in one Product array, signed transactions verifiable client-side, no server needed.

What didn't

  • watchOS still has its own quirks. NavigationStack on Watch silently drops some modifiers. Networking to a local NVR from Watch requires the iPhone proxy, with all the unreliability that implies.
  • tvOS focus engine needs careful tuning. Tab bar focus, button hover states, sibling view jumps — every screen needed a focus pass.
  • Vision Pro spatial layouts are ambitious but the "show 12 cameras on virtual walls" UX I prototyped didn't justify the complexity. Shipping a flat 2D layout there for now.
  • Apple's auto-grandfathering on subscription price changes is opaque. I spent a lot of time understanding what users would actually see when prices changed. (More on that in the comparison page.)
  • App Store review for IAPs is stricter than for app updates. Missing review screenshots block submissions. Subscription localization changes go through a separate review queue. Plan accordingly.

What I wish I'd known on day one

  • Build the privacy story into the architecture, not the marketing copy. "We don't collect data" only works if the architecture literally cannot collect data. Lumen has no analytics SDK, no cloud relay, no server-side telemetry — these are architectural decisions, not policy decisions.
  • Start with Pro pricing in the wrong place; you can fix it later. I shipped Lumen with $9.99/year Pro Annual. The marketing description literally said "less than $1/mo". After 6 months of data, that's far below segment rates and leaves real money on the table. Repricing on a live subscription is non-trivial — Apple's notification flow gets involved when increases exceed thresholds. Iterating on this is part of the business.
  • The community is ready to pay if you ship something good. Frigate users are technical. They self-host. They run Home Assistant. They'll pay $50 lifetime for a real Apple app if it solves a real problem better than the alternatives. You don't need to find a market — you need to build the thing.

Numbers, since you asked

Lumen launched on the App Store in early 2026. As of April 2026, with zero marketing spend:

  • ~1,062 free downloads per month, 35% from the US, 30% from Western Europe
  • ~1.8% install-to-paid conversion (acceptable for utility freemium)
  • Pro Lifetime is the most-bought tier (47% of paid IAPs)
  • Average rating is currently low because of an early auth bug — fixed in 1.8.6, expected to climb

The numbers aren't huge. It's a side project, not a startup. But they're real, and they grew organically because Frigate users found it on their own. That validates the product more than any marketing campaign would.

If you're thinking about building something similar

Two things. First: don't if your goal is money. The economics of indie iOS apps in 2026 are punishing. The App Store taxes 30% (15% if you're under $1M and enrolled in the Small Business Program — do enroll), the discoverability is approximately zero unless Apple features you, and the market is saturated for general-purpose apps.

Second: do if you have a niche you understand and care about. Frigate users are a tribe. Self-hosted NVR is a sub-tribe. Apple-platform self-hosted NVR users are a sub-sub-tribe. None of those sub-tribes will be served by a Y Combinator startup — too small, too technical. They'll be served by indie devs who eat their own dog food.

Lumen is what happens when one of those indie devs is also stubborn enough to ship a 6-platform Swift 6 app for a few hundred users. Whether that ROI works for you is a personal question.

Try Lumen

Free download, fully usable on the free tier (4 cameras). 7-day free trial on Pro Annual if you want to test the AI features.

Download on the App Store

If you've built a Frigate setup, I'd genuinely love feedback. Email me: [email protected] · or open an issue on the support page.


— LorisLabs Team, building privacy-first Apple platform apps. Self-hosted tools, AI-augmented development.