surfaces
2SwiftUI/SwiftData on iPhone, and a separate web companion. Same brush and floss catalog.
HAAMi tooteväljaanne · The small daily things
Consistency keeps the small daily things — especially morning and evening brush and floss — on a today list that waits for a tap. The iPhone app and the web companion share a catalog and a confirmation rule. They do not share a database.

surfaces
2SwiftUI/SwiftData on iPhone, and a separate web companion. Same brush and floss catalog.
confirmation
TapCompletions need a tap or an explicit confirmation. Brushing is never auto-verified from Health.
export
v1formatVersion 1, covered by tests. Reset clears SwiftData, App Group, Keychain, and notifications in source.
public host
Previewconsistency.haam.co uses the in-browser session fallback. No D1 on that host.
The job
Morning and evening brush and floss are easy to mark done if Health or a busy calendar is allowed to speak for you. I wanted a today list that still waits for a person.
The iPhone can have widgets, Shortcuts, and Live Activities. The web companion can be opened on another machine. They share a catalog and a rule. They do not sync.
Clinical guidance, social accountability, third-party OAuth, and a public App Store listing are not in this evidence.
The day
Simulator tests cover catalog, day keys, export version, and undo. HealthKit, widgets, and CloudKit need a signed device and are not claimed as verified here.
01
The default catalog is morning and evening brush and floss. Parity tests keep the web list aligned with the iPhone list.
02
Health and Calendar may add context. They do not tick the row. Completions require a tap or an explicit confirmation.
03
A completion can be taken back. The in-memory SwiftData tests cover that path.
04
Export writes formatVersion 1. Reset is a full local clear on device. The web host does not offer an in-app reset in this pass.
Design decisions
consistency.haam.co
Confirmation
A wearable can notice movement. It cannot floss for you. I kept brushing and flossing off the auto-complete path even when Health or Calendar is connected.
Independence
Sync would have been the attractive lie. CloudKit is configured for signed devices and is not two-device verified. There is no CloudKit↔D1 bridge. Each surface owns its own check-ins.
System surfaces
App Group snapshot, widgets, Shortcuts, and Live Activities are in source. Simulator success is not a physical iPhone log. The public web host is a preview of the companion, not the iPhone.
The working stack
iPhone
Today, confirm, sources, privacy, export, reset. iOS 26 / Xcode 27 locally.
Web
Same catalog. Public host uses in-browser session fallback; D1 is optional and not on consistency.haam.co.
Tests
Web npm test in CI. Swift tests for catalog, dayKey, export version, completion undo.
Host
Vercel Next.js of the web companion. iOS remains a local/TestFlight prototype.
In evidence
01A today list that waits for a tap
02Matching brush and floss catalogs on iPhone and web
03Export formatVersion 1 in tests
04A public web preview that does not pretend to be the signed iPhone
Where it stops
HealthKit, Calendar, notifications, widgets, Shortcuts, Live Activities, and CloudKit are not recorded as passed on a physical iPhone in the evidence file. Two-device iCloud is not verified.
Do not say it syncs across iPhone and web. Do not claim a public release or habit outcomes.
HAAM’s role
Human-in-the-loop rule, two-surface independence, default catalog, SwiftUI/SwiftData tree, web companion, tests, and privacy docs. Direct work, 2026.
Optional analytics. Google Analytics and Clarity load only if allowed; form, email, and chat content are excluded.