Tracking doc. ⬜ not started · 🔄 in progress · ✅ done.
Decisions, full feature catalog, and grounding (reader3/EPUB, landscape, Withings, image pipeline, gym sheet, RevampPrince seed) — see DECISIONS.md, FEATURE-CATALOG.md, research/.
ARCHITECTURE.md, CLAUDE.md, stack grounded & pinned (research/stack-grounding.md), adversarial review (research/architecture-review.md).
- ✅ Stack & architecture locked; review folded in; scaffold regenerated to final stack.
- ✅ Public OSS repo: github.com/Princeu3/LifeOS (MIT).
- ✅ Railway
LifeOSproject + Postgres 18.4 provisioned; Cloudflare R2lifeos-mediawired + verified. - ✅ Alembic
0001migration applied —pgvectorextension +timeline_eventsspine + 11 domain tables (sleep, food, body_metrics, photos, mood, bristol, urine, products, care_routines, care_routine_runs). - ✅ Capture → DSPy/OpenRouter parsing verified end-to-end (freeform → routed structured entry → persisted). Parsed
structuredstored on each event. - ✅ Normalize
structured→ typed domain rows (app/normalize.py): capture now projects the parse into SleepLog/FoodLog/MoodLog/Bristol|UrineLog/CareRoutineRun and back-links viaevent.ref_table/ref_id(lossless — full parse stays onevent.structured). Lenient Pydantic coercion (AliasChoices +mode=beforevalidators, never raises) + range clamping. Parser hardened:nowinput for relative-time→ISO, per-domain key hints,JSONAdapter.GET /timeline/{event_id}hydrates the typed row; web entries expand to show structured fields. - ✅ Timeline read API + daily timeline UI + capture screen wired to the live API.
- ✅ Capture idempotency (
0003): client generates a UUIDclient_tokenonce per queued capture (Dexie), reused on every sync retry, sent as theIdempotency-Keyheader. Server dedupes onUNIQUE (user_id, client_token)— fast-path returns the existing event (skips the LLM), and races are caught viaIntegrityError→rollback→re-select. Replay returns 200 withdeduplicated=true. - ✅ Passkey auth (WebAuthn) (
0004): up to 2 passkeys + single-use recovery code. py_webauthn server +@simplewebauthn/browser; stateless signed bearer tokens (localStorage, no cross-site cookies);rp_id/origin env-pinned fromFRONTEND_ORIGIN. First-passkey bootstrap gated byAUTH_BOOTSTRAP_TOKEN. capture/timeline/photos now require auth;<img>uses a short-lived per-photo media token (?t=). Web gate (Auth.tsx) + CSP.⚠️ *.up.railway.appis a public suffix → rp_id works but a custom domain is recommended (hostname churn invalidates passkeys). - ⬜ Seed care products/routines from RevampPrince (local-only seed).
- ✅ Photo capture vertical slice — upload face/skin/body/nails/hair → R2 (AES-256-GCM on sensitive;
0002migration addsenc_nonce/content_type) → ZDR Claude vision observations (app/vision.py,exclude_from_cloud_airespected) →photoTimelineEvent → thumbnail + observations on the timeline. Client downsamples to ≤2048px pre-upload. Routes:POST /photos,GET /photos/{id},GET /photos/{id}/image(decrypt-on-read proxy). - ✅ Ghost-overlay alignment —
web/PhotoComposer.tsx: livegetUserMediacamera with the previous same-type photo overlaid translucently (opacity slider) so you match framing; canvas-capture → File (no mirror, so preview/ghost/saved align), front/back toggle, track cleanup, file-input fallback.GET /photos/latest?photo_type=returns the ghost ref (+ media token); upload auto-chainsprev_photo_idto the last same-type photo. - ✅ Withings →
body_metricsauto-sync (0006): OAuth connect (/withings/authorize→/callback, signed token exchange) + Notify webhook (/withings/notify, query-secret validated, HEAD 200, returns fast) that defers awithings_syncjob to the worker; the job refreshes the rotating token,getmeas(meastypes 1,5,6,8,11,76,77,88) backfilling vialastupdate, idempotent upsert by Withingsgrpid→body_metrics+body_metrictimeline events. Web "⚖️ Connect Withings" button. Worker service deployed (Procrastinate;schema --applyon start). NeedsWITHINGS_CLIENT_ID/SECRETfrom a Withings dev app. - ✅
apideployed & live on Railway (Docker) → https://api-production-507b.up.railway.app (/docs,/health,/timeline).workerdeferred until its jobs exist. - ✅ Web PWA deployed & live → https://web-production-168bf.up.railway.app (Caddy static + SPA fallback; CORS wired to the api). Full stack verified end-to-end in prod (capture → OpenRouter → timeline).
Books + EPUB reader · wardrobe + outfits (nano-banana + rembg, R2) · gym (Nippard schema) · work-hours · supplements/meds · symptoms · weather+location.
Voice (ElevenLabs) → structured entry · photo feature-extraction · nightly insight engine (confidence-scored, causal-leaning). Begin LAZY embedding generation.
Dashboards/trends · doctor PDF reports · annual wrap-ups · semantic search (chat substrate) · one-click export · (future, owner-gated) conversational assistant, autonomous agents, proactive SMS/email.