Our product

Halo

In TestFlight beta

A photo curator that runs entirely on the phone. It reads the last 30 days of a camera roll and returns a reel worth sharing.

The brief

An overwhelming camera roll is not a search problem

People who shoot heavily on their phone do not lack photos. They lack a way through them. The obvious build is a cloud service that ingests the library and ranks it. That was ruled out on day one: uploading someone's camera roll in order to rank it is a cost, a liability, and a promise we did not want to make.

  • No developer servers, no accounts, no photo uploads
  • Results reproducible, not a black box
  • The whole flow works with nothing configured up front

What we built

Deterministic scoring, on the device, end to end

Halo scores photos on the phone — sharpness, lighting, expression, document exclusion, duplicate clustering — then walks the user through picking, reviewing, editing and exporting a reel. Nothing is uploaded. There is no backend to run.

All logic lives in a HaloKit Swift package rather than the app target, so the suite runs headlessly with no simulator. The app target is a thin wrapper. Persistence is SwiftData. iOS 17 and later, iPhone and iPad.

The pipeline

Six stages. All of them on the device.

Halo processes photos through six ordered stages: scan, score, pick, review, studio and export. Every stage runs on the device.

  1. Scan

    Read the library through the permission the user granted.

  2. Score

    Rate each photo on sharpness, lighting and expression.

  3. Pick

    Cluster duplicates, drop documents, keep the standouts.

  4. Review

    The user accepts or rejects, in a grid.

  5. Studio

    Arrange and edit the picks into a reel.

  6. Export

    Render on the device, hand off to the iOS share sheet.

Where it stands

In beta, and honest about it

Halo is not on the App Store yet. It is a working app in TestFlight beta, with its privacy policy and support page published before submission rather than after.

  • The full suite runs headlessly, so a regression is caught before a simulator boots
  • Everything the app remembers lives on the device, in SwiftData
  • No analytics, no crash reporter, nothing that phones home

Role

Designed, built and shipped in-house

Product, architecture, scoring engine, interface and release engineering. Unlike the client work on this site, this one is ours end to end — which is why it can be named.

What this proves we can build

Product engineering

A product carried from a vision document to a working release, not a prototype.

Privacy by design

An architecture where the privacy promise is a property of the system, not a policy page.

On-device processing

Scoring pipelines that run on the client, deterministically and reproducibly.

Test architecture

A codebase arranged so its own suite runs headlessly, with no simulator.

Want something built like this?

Same hands, same standard.

Book a call