Private workspace β sign in to continue.
Tune how you want AI coding agents to work with you, then save or copy the summary to paste at the start of a session.
Handoff + architecture live in the Coding-Projects folder (iCloud) and aren't web-hosted yet. Repos below are the source of truth.
Claude reads this whole workspace (Capture Β· Roadmap Β· AI context Β· this index) at session start via the mikeslife /api/coding-board endpoint β log things here and every session sees them.
A hub-and-spoke: many single-purpose apps (spokes), each its own Firebase project + source of truth, a strategic hub (mikeslife), and an agent (Rupert) that reads curated slices from the spokes, thinks, and writes guidance back. Spokes never talk to each other directly β Rupert is the connective tissue. Tap a section to expand.
flowchart TB USER["π± Mike (iPhone) β installed PWAs + push"] HUB["π¦ mikeslife hub
doc: lifeos/uid"] subgraph RUP["Rupert β agent / data engine"] CLOUD["βοΈ Vercel crons in mikeslife
brief Β· context Β· banners Β· heartbeat
travel Β· fitness-coach Β· updates Β· nutrition
/api/rupert chat (OpenAI or Claude, auto-fallback)"] MINI["π₯οΈ Mac mini (OpenClaw)
adamjobs + social digests only"] end subgraph SPOKES["Spoke apps β each its own Firebase project"] FIT["πͺ fitness"] HLTH["π« health"] MON["π° money"] RENT["π rentals"] UPD["π‘ updates"] NUT["π₯ nutrition"] TRAV["βοΈ travel"] end USER -->|read/write| HUB USER -->|read/write| SPOKES USER -->|peacock chat| CLOUD CLOUD <-->|read slices / write brief, content| HUB CLOUD -->|read curated data via admin SAs| SPOKES CLOUD -->|write banners + generated content| SPOKES MINI -->|digest alerts| HUB HUB -->|FCM push| USER
Today's shift: the Rupert banners for money & rentals moved from the mini to cloud crons (cron-finance-note, cron-rental-note), joining cron-fitness-note. The mini is now down to the non-critical adamjobs/social digests.
| App | Firebase project | Rupert key |
|---|---|---|
| mikeslife (hub) | mikeslife-963c6 | FIREBASE_SERVICE_ACCOUNT |
| mikesfitness | trip-planner-5cc84 (shared) | FIREBASE_SA_FITNESS |
| mikeshealth | mikeshealth-ad213 | FIREBASE_SA_HEALTH |
| mikes-money | mikesmoney-91595 | FIREBASE_SA_MONEY |
| rainbow-rentals | rainbow-rentals | FIREBASE_SA_RAINBOW |
| mikestravel | mikestravel | β (phase 2) |
| mikesupdates | mikesupdates-5f240 | FIREBASE_SA_UPDATES (write) |
| mikesnutrition | mikesnutrition-4a6dc | FIREBASE_SA_NUTRITION (write) |
| mikedulinmd | mikedulinmd-cf65b | public site + this coding workspace |
One app = one project = one source of truth. Only shared project: trip-planner-5cc84 (fitness + mikeandadam). Rupert reaches other projects with per-project admin service-account keys (Vercel env in the cloud).
flowchart LR
subgraph SRC["Spoke sources of truth"]
FIT["πͺ fitness"]
HLTH["π« health"]
MON["π° money"]
GOOG["π§ Google Cal + Gmail"]
end
subgraph CRONS["Vercel context crons (read)"]
CF["cron-fitness-context"]
CH["cron-health-context"]
CM["cron-finance-context"]
CG["cron-google (3d/30msg + delivery sweep)"]
end
SL["lifeos/uid slices:
fitnessContext Β· healthContext
financeContext Β· calendarText
emailText (+snippets +deliveries)"]
subgraph THINK["Rupert thinks β OpenAI or Claude (settings.aiProvider)"]
BR["cron-brief β todayBrief"]
CHAT["/api/rupert chat"]
end
subgraph OUT["Write-out"]
WU["cron-updates β updates"]
WN["cron-nutrition β nutrition"]
WB["banners: fitness/finance/rental-note"]
end
FIT --> CF --> SL
HLTH --> CH --> SL
MON --> CM --> SL
GOOG --> CG --> SL
SL --> BR
SL --> CHAT
THINK --> OUT
Read-in: daily, just before the brief, cloud crons distill each spoke into a few lines in lifeos/uid. Write-out: other crons generate content + banners into the spokes' own Firestore. New: the brain is now provider-agnostic (api/_llm.js) β flip OpenAIβClaude in Settings.
sequenceDiagram autonumber participant G as Google participant SP as Spokes participant L as lifeos/uid participant B as cron-brief participant P as iPhone Note over G,L: context syncs ~10:50 UTC G->>L: cron-google β calendar, email(+deliveries) SP->>L: fitness/finance/health-context β slices Note over B: runs hourly, fires at settings.briefHour (def 7 ET) L->>B: commitments, plans, slices, recent-focus, doneLedger B->>B: Top of mind Β· Focus Β· Health Β· FYI Β· Delivery Β· Looking ahead B->>L: write todayBrief (idempotent per ET day) B->>P: FCM push (suppressed during quiet hours) P->>L: tap β handled β marks plan task done
Today's changes: the brief + check-in crons now run hourly, gated to settings.briefHour (so you can move your brief time); quiet hours suppress the push while still writing data; the Gemini-style brief adds Delivery updates + Looking ahead; and doneLedger stops completed items resurfacing.
flowchart TB HAE["Health Auto Export (iPhone)"] -->|POST webhook + token| HF["Cloud Function: mikeshealthHealthIngest"] HF -->|normalize + write| HD["mikeshealth: dailyMetrics + biology/bio"] HD -->|cron-health-context| L["lifeos.healthContext"] PLAID["Plaid"] -->|syncItem Cloud Function| MD["mikes-money: accounts/transactions"] MD -->|daily dashboardSnapshots| MS["snapshot"] MS -->|cron-finance-context| L2["lifeos.financeContext"] GAPI["Google APIs (OAuth)"] -->|cron-google| L3["lifeos.calendar / emailText"]
Two-hop for health: Apple Health β mikeshealth Cloud Function β Firestore β context cron β lifeos. That Cloud Function deploys separately (firebase deploy --only functions) β it does not ship with Vercel.
Heartbeat (NEW): cron-heartbeat (14:00 UTC) checks that Google + the three context syncs + today's brief actually ran; if anything is >26h stale it pushes one alert β so silent failures surface instead of hiding.
Banners: a rupert/note doc in each spoke's Firestore (now written by cloud crons) drives the shared RupertBanner atop that app.
Push: all notifications come from mikeslife via FCM. Fix today: only the latest FCM token is kept, ending the duplicate-morning-ping bug.
Principles: loose coupling (per-project Firebase, one-directional cross-project access via Rupert's keys) Β· agentSlices not duplication Β· cloud-first (mini now nearly retired) Β· git push auto-deploys frontends + Vercel crons.
Watch out for: Firebase Cloud Functions don't auto-deploy (separate firebase deploy --only functions) Β· local folders can drift behind GitHub (pull/clone fresh) Β· a new Rupertβspoke link needs that project's admin SA in Vercel env (missing = 503) Β· Eastern-time everywhere (never UTC toISOString().split()).
Kanban across all apps. Synced to your account, so add on your phone and it's here on the laptop. Use Copy as Markdown to hand the board to an AI session.