Skip to content

Decisions (v0) ​

The PRD ("Newborn Log — PRD") plus the changes agreed while planning, and the calls made during the overnight build. Each entry says why.

Product ​

TopicDecisionWhy
NameWee Hours (com.hejitech.weehours)Built for the wee hours with a wee one. Short, warm, not clinical
App Store nameWee Hours: Hands-Free Baby Log (30 chars, the limit); the home screen stays "Wee Hours"The name drives search; "hands-free" is what sets it apart. The subtitle can carry "baby tracker" or "voice"
PlatformNative iOS + watchOS first; Android laterSiri, Action Button, widgets and Live Activities are what let the phone stand on its own
TrackingA type registry; every category is optional (bottle, breast, pumping, solids, diaper, sleep, growth: weight, height, head size)Support every family; fewer enabled options also make the model more accurate
AdviceThe app records facts; MCP exposes them; the user's own agent interpretsNo medical advice from us; no aggregation in the app beyond the status line
Pediatrician PDFDropped; raw CSV export insteadAggregation is the agent's job
BillingMonthly / yearly subscription and a lifetime purchase, per household, 14-day trialAs requested. Judgment call: tap logging stays free after the trial so parents never lose access to their own log

Architecture ​

TopicDecisionWhy
Decision modelOne unified model: Laya (0.4B ModernBERT, Q8 GGUF) via llama.cpp, on-deviceYour choice. llama.cpp has decision models only in llama-server, so the decision path is ported to Swift (ios/LayaRuntime), with parity tested against the server
Question designEvent type = category × phase, not one 13-way questionZero-shot Laya: 81% vs 13% type accuracy, and 0% vs 89% wrong auto-commits (eval/results)
Time and numbersClock times, relative times, ml/oz, kg/lb are parsed deterministicallyThe PRD already did this for clock times; Laya scored 21% on the "when" question
CalibrationPer-question temperature on top of Laya's own, fitted by logeval --fitThresholds only mean something if probabilities are calibrated
SyncSupabase (Postgres + RLS), append-only events, an outbox plus a seq cursorAndroid later; MCP needs server-side reads
Glasses voiceThe glasses upload audio as a capture; a household phone processes it on open or on background refresh. Event id = f(capture id)No server inference cost; all processing stays on the phone; two phones converge
Glasses gesturesTyped events go straight to Supabase (offline outbox); hold-to-speak attaches to the entry you just madeTime-critical facts (last feed) never wait for voice processing
AuthSupabase Auth (Google, Apple, email for dev), shared by the app and MCP OAuth; personal access tokens for other agentsOne identity everywhere
Local-only mode"Use without an account" keeps the household on the phone (no Supabase); signing in later re-homes the never-synced rows and uploads themThe phone must stand alone; nothing is lost when moving to an account
Consistencyspec/ is the single source; Swift and TypeScript run the same derivation fixturesPrevents status drift between the phone, glasses and MCP

Monorepo (2026-10-15) ​

TopicDecisionWhy
HomeWee Hours moved into the HEJI monorepo (tianhaoz95/hejitech-apps, projects/weehours) with its history; the old repo is archivedShare one Supabase project (one plan's quota) and CI plumbing across the HEJI apps; easier to build an ecosystem
DatabaseIts own Postgres schema weehours and bucket weehours in the shared project, not publicWaypack predates the convention and owns public (it has its own entitlements table); accounts are shared, data isn't
MCP OAuthThe site's Cloudflare Worker is the OAuth server (@cloudflare/workers-oauth-provider, like Waypack); the MCP server moved from a Supabase Edge Function into that WorkerOwner's choice (a). Supabase's OAuth server has one consent URL per project, relative to the Site URL, which Waypack owns. A neutral shared consent router stays an option for later projects
Sign-up rowsWaypack's on_auth_user_created trigger is dropped; each app creates its rows on first useOwner direction: one user pool for every app
SigningTestFlight CI uses the team-wide HEJI identities Waypack uses (same certificates)Owner direction; one set of secrets, never minting certificates
Google sign-inThe shared project's Google provider (HEJI web client) through Supabase in the system browser sheet with PKCE, returning to weehours://login-callback; the site uses the same providerOwner request (2026-10-16). Reuses what Waypack set up, so no iOS OAuth client or GoogleSignIn SDK; Google shows the shared HEJI branding
Build numbersStay UTC timestampsBuilds already uploaded use them; Waypack's 2000 + run number would go backwards

Several children (2026-10-17) ​

TopicDecisionWhy
Now screenDirection 03 "Log-for bar" from reports/weehours-multi-child: every shown child's status side by side, a sticky "Log for" bar over the buttons (any number of children, plus Both/All), foldable to one line; with one shown child, no bar and no extra cardOwner's pick, with: arbitrary child count, no wasted space for one child, fold for long stretches with one child
Which children a phone showsPer phone (Settings → Children → Show on this iPhone); archiving is household-wideOwner request: a family with three children can keep two on this phone
Per childName, birth date, colour, bottle size and quick-feed override; categories, reminders' intervals, caregivers, night window and duty stay household-wideRecommended in the proposal; nothing else asked for
Several at onceOne event per child sharing a group field; Undo takes them back togetherEach child keeps a clean log; MCP and CSV need no new concept
VoiceNames in the sentence win ("the twins", "both of them" = all); otherwise the device's current childNames are parsed deterministically, so the model's questions don't change
PriceUnchanged: one purchase covers every childRecommended; families with twins shouldn't pay twice

Not done yet ​

See the report (report/v0/site, "What's verified") for what was verified in simulators and what still needs devices or the hosted project.

Source available under the PolyForm Perimeter License 1.0.1.