← All posts

June 20 — a portable enrichment import, a console that runs the pipeline, and a brand pinned down

This was a sprawling day — closer to a week's worth of small fronts than one story. The throughline, if there is one: most of it was about making Loupe runnable by someone who isn't me, and the rest was making it look like one coherent product while I was in there anyway.

Built / shipped

The portable Apple-enrichment path, end to end. This is the big one. Loupe's enrichment database — aesthetic scores, scene labels, people seeds — is derived entirely from a macOS photo library, which until now meant my macOS photo library. I built the whole chain so a second person can produce theirs:

I validated it against my own 81,000-photo library: the new build went from ~73,000 bridged records to ~76,800, zero regressions, and it actually corrected 700-odd previously mis-stamped photos. A filesize-tightened matcher recovered files that the old, stricter logic had refused.

A setup console that can run the pipeline. The console used to be a read-only status page. Now it can start the hand-run stages — ingest, contact-sheet generation, face detection — as detached, single-flighted, resumable jobs, each with its own trigger card. You click "Develop," it kicks off ingestion in the background and streams progress with a live rate and ETA; the same machinery generalizes across all three stages.

Frontend out of the monolith. The app's frontend was 2,000+ lines of HTML/CSS/JS embedded inside a 4,400-line Python server file. I lifted it out into its own files in two stages — first the whole page as one literal, then splitting the CSS and JS into real static assets — verified at each step by a byte-for-byte diff of the served page.

A unified brand, and real email. I rebuilt the marketing site's wordmark from the app's exact mark so the site and the app now render identically, synced the site's mockup navigation to the app's real nav, added a People feature section, folded in a founder origin beat and a "how it decides" section, and swapped the closer to the brand tagline. On the design side, I produced a canonical design-system spec and a self-demonstrating visual-system teaching guide, and confirmed the design tooling is now at parity with both the app and the site. I also stood up real email on the marketing domain — diagnosed that the early-access form had no backend and the address couldn't even receive mail, then set up a proper custom-domain mailbox with the full DNS record set verified live.

Problems & fixes

Decisions

Learned

Still open / next