Simon-Pierre Boucher
All apps & projects
Focale icon
iOS App
Swift

Focale

A manual camera and a photo library that answers questions

Two products that save each other: photos taken in Focale arrive already understood, and your old library catches up in the background — Vision on everything, Foundation Models on candidates only, nothing ever leaving the device.

37

Swift files, 4,554 lines

2

indexing tiers (Vision + FM)

< 50 ms

shutter-path target

100%

on-device — no cloud path

4

TestFlight builds shipped

0

photos duplicated or modified

Overview

Focale is two products in one. First, a manual camera worth using on its own: ISO, shutter speed, focus, white balance, exposure compensation, and zoom — every control verified against the hardware before it is shown, so there is never a dead button. ProRAW, lens selection, self-timer, recipes (named presets exportable as .focalerecipe files), and three reassignable gesture layouts. The shutter is sacred: no inference, no disk, no allocation in the trigger path.

Second, a searchable photo library. At capture time Focale records context at zero inference cost — active recipe, declared project, manual settings, scene signal, coarse location — and writes it into the photo's EXIF metadata without re-encoding, so the information survives even if the app is uninstalled. Indexing is two-tier: Vision runs on everything (OCR, visual fingerprints, classification), while Foundation Models touches only photos that earn it — because 40,000 photos at 1–3 s each is 11–33 hours of compute.

Search is natural language — "the garage receipt from last fall" becomes a structured filter executed instantly against the local database. The model parses the query, never the photos. Living albums are defined by a query and fill themselves; "similar photos" uses fingerprint distance with zero LLM. Generated content is always badged, OCR beats the model for any number, and indexing progress is honest. Nothing leaves the device — no photo duplicated, moved, or modified.

Key Features

True manual controls

ISO, shutter, focus, white balance, EV, zoom — each verified against the hardware before display. ProRAW, lens choice, flash, timer, rule-of-thirds grid.

Recipes & layouts

Complete named presets recallable in one gesture and shareable as .focalerecipe files, plus three interface profiles with fully reassignable gestures.

Capture context in EXIF

Recipe, project, settings, scene signal, and coarse location recorded at zero inference cost — written into the photo's own metadata, not just a database.

Two-tier indexing

Tier 1 Vision on everything: OCR, visual fingerprints, classification. Tier 2 Foundation Models only on candidates — the calculation that keeps 40,000 photos tractable.

Natural-language search

"The garage receipt from last fall" → a structured filter run instantly on the local index. The model parses the query, never the photos.

Living albums

Albums defined by a query that fill themselves, creatable from any search — plus similar-photos by fingerprint distance, zero LLM.

How It Works

  1. Keep the shutter sacred

    No inference, no disk write, no allocation in the trigger path — screen blink and immediate haptic, with a sub-50 ms response target.

  2. Record context for free

    At capture, the active recipe, project, manual settings, scene brightness, and coarse location are stored — in the local base and in the photo's EXIF.

  3. Index newest-first, always

    Recent photos index in the foreground on launch; the deep back-catalog catches up at night, on charge, via BGProcessingTask with incremental resume.

  4. Spend the model wisely

    Vision runs on every photo; Foundation Models only on photos taken in Focale, favorites, or explicit requests — with a full deterministic fallback below A17 Pro.

  5. Answer instantly

    Natural queries compile to structured filters over the SwiftData index and rank locally — search feels instant because no model ever touches the photo at query time.

Tech Stack

Platform

Swift 6 (strict concurrency)
SwiftUI + @Observable
iOS 26.0+
XcodeGen

Camera & photos

AVFoundation (dedicated serial queue)
PhotoKit (localIdentifier, no duplication)
ProRAW
EXIF writing without re-encode

Intelligence

Vision (OCR, feature prints, classification)
Apple Foundation Models (@Generable)
SwiftData index
BGProcessingTask night catch-up

Highlights

  • Every camera control is hardware-verified before display — no dead buttons, ever
  • Capture context lives in the photo's EXIF: uninstall the app, keep the information
  • OCR is the silent winner: receipts, whiteboards, serial numbers — and it beats the model for any digit
  • Faces are counted locally, never identified; coarse location only, never raw coordinates
  • Swift 6 isolation crashes in PhotoKit closures diagnosed and fixed — with the pattern documented in the repo
  • Useful before the index is complete: progressive results, honest progress, newest-first

Explore Focale

Manual camera + searchable photo library — the full source is on GitHub.