The iOS app is built and running on an iPhone 16 Pro simulator — every one of the five spec screens, driven by a hand-authored dataset that stands in for the pipeline until it ships. Tonight I took it from a working skeleton to something with a face: real typefaces, a copper fox mark, frictionless search, and a full visual polish pass. 14 tests green
The project is generated from project.yml via XcodeGen. From the repo:
Bundle ID com.larch.ios · display name Basefox. Source of truth is
basefox-spec-v03.md. Build/run notes in app/README.md.
One shared geometry drives the in-app mark and a generated 1024px icon — fox on ink, warm not tacticool.
Space Grotesk, Barlow, Spline Sans Mono bundled & registered. Variable faces driven by their weight axis.
Results the moment you type — brands, categories, occasions, grouped, each with its best discount.
The deferred community write-path renders as real, self-explaining controls — never a silent dead button.
Press-scale on every card, navigation haptics, instant content on launch (no splash flicker).
Ranking, staleness, eligibility, verified-negative, tax-free valuation, search order, deep-link builder.
Also live in the app (drive them by tapping): the category board with sort chips + the Foxhole section, the occasion board (Back to School) with baskets and a timing banner, the verified-negative brand view (“no discount anywhere — we checked”), and the profile sheet with the tax-math widget.
The fox on base — clever on your behalf, the one who knows where
everything is. Geometry is shared between the icon and the in-app header mark, so they can never drift.
Accent #DE5527 on ink #20242B.
flag The v3 mockup (checkpoint-v3.html) isn’t in the repo.
I built to the written design tokens in the spec — exact palette, the three fonts, 12pt radii, hairlines. I can’t claim
pixel-fidelity to a mockup I don’t have. If you drop it in, I’ll reconcile.
flag The tax widget uses one “best discount” across the whole catalog, not per-category. Fine for a demo; worth revisiting once the dataset is large.
Deliberately deferred (per spec): remote fetch is wired but dormant
(DataStore.remoteURL is nil until the pipeline publishes); dark mode skipped in v0; community write-path,
push, and accounts are Phase 2. Codename Larch keeps “Basefox” to display strings only, so renames stay cheap.
checkpoint-v3.html once it’s in the repo.remoteURL to a published dataset.json to see the fetch→cache→bundle chain live.