JSJorge Sebastián Soriano ES

Case study · Data product

LifeOS: from Garmin and ARX exports to weekly KPIs

It brings into one dashboard what is usually spread across a spending sheet, the gym app, the sports watch and the master's platform. It calculates weekly indicators and suggests priorities with explicit rules. I use it every day.

Where it's used
Daily use · sign-up by invitation only
Status
In daily use since May 2026
My role
Product, architecture, data model, integrations and testing. Code with AI
Technologies
Next.js, React, TypeScript, Supabase with RLS, Zod, Recharts, Vitest
Monthly dashboard with sport, health, master's and finance indicators
Demo: monthly summary with indicators and priorities. Fictitious profile.

The problem

Anyone juggling work, training and an online master's decides each week what to spend, how much to train and what to study with scattered data and no shared view.

What it does

  • A dashboard with four instruments (sport, health, master's and finance), a balance indicator and the week's priority actions.
  • Logging an expense instantly recalculates estimated savings and the deviation from the target.
  • Detects training overload and switches recovery status to “Watch”.
  • Weighted average for the master's by semester and a warning for assignments that carry a lot of weight in the grade.

Integrations that neither duplicate nor overwrite

Idempotency

Repeating a sync changes nothing: only rows that have changed are written, and anything the user entered by hand is respected.

ARXFirestore, read-onlyCronwith a secretIdempotent upsertonly what changesPostgres + RLSSupabaseDashboard and MCPread-only MCP
  • ARX has no API. LifeOS reads its Firestore from the server with a read-only service account. It rereads a few days back because past days can be edited in ARX.
  • Garmin comes in through TCX files, with a preview, sport classification and detection of duplicates against sessions that arrive by another route.
  • Read-only MCP server with OAuth 2.1, PKCE, 60-minute tokens and revocable rotating refresh tokens. Seven tools, and every query filters by user.
  • Explicit mappers between Postgres rows and domain types. Thanks to them the demo replaces the backend without touching components or calculations.

What is real and what is demo

PartIn the demoDetail
Calculations, rules, forms, importers and chartsRealThe same code as the app, compiled into a single HTML file.
Finance, health, training and master's dataSyntheticFictitious profile generated in the browser with a fixed seed.
BackendSyntheticAn in-memory adapter replaces Supabase with the same API.
Login, real RLS, ARX sync and MCPNot includedOnly in the real version.

Results

167automated testsoriginal project
103tests in the demoincluding dataset consistency
7MCP toolsall read-only

Limitations and next steps

  • The readings use fixed rules, not a statistical model. The natural next step is a weight trend with confidence intervals.
  • On Vercel's free plan, the ARX sync runs once a day.
  • The demo does not keep data between sessions.

Demo screenshots

All with synthetic data. The demo interface is in Spanish.

Monthly summary with indicators and priorities
Monthly summary with indicators and priorities
Finance: savings are recalculated when an expense is logged
Finance: savings are recalculated when an expense is logged
Workouts with an overload alert
Workouts with an overload alert
Strength and volume charts
Strength and volume charts
Health and nutrition
Health and nutrition
Master's: weighted average and assignments
Master's: weighted average and assignments
Calendar with imported sessions
Calendar with imported sessions
Scenario simulator
Scenario simulator