A personal health analytics dashboard powered by Apple Health data plus Vertex AI and Claude chat. It visualizes sleep, steps, heart rate, and HRV with life events annotated on charts.
Want to explore without setting anything up? Use the hosted version at somada.app.
- Sign up with email, upload your
export.xml, and your data is parsed entirely in the browser before being saved to your account in Supabase. - AI chat (Gemini and Claude) is available out of the box — no API key needed.
- You can also bring your own Vertex AI or Anthropic key in Settings if you prefer to route chat through your own account.
Data note: each account's health data is stored in its own row in a shared Supabase instance, protected by row-level security so only the signed-in owner can read or write it. If you want your data to never leave your own infrastructure, use the self-hosted path below.
The repo is open source. Fork or clone it and run everything yourself. Your data stays on your own Supabase project and your own Vercel deployment (or any other host).
In your Supabase SQL editor, run the files in supabase/migrations/ in order
(0001_initial_health_data.sql, then 0002_per_user_health_data.sql). Each user gets
their own row protected by row-level security. Optionally run supabase/seed_demo.sql
to add the synthetic demo dataset that new accounts browse before uploading their own data.
Fork the repo and import it into Vercel. Set these environment variables in your Vercel project:
| Variable | Purpose |
|---|---|
SUPABASE_URL |
Supabase project URL |
SUPABASE_ANON_KEY |
Supabase anon public key |
VERTEX_API_KEY |
Server-side Vertex AI key for shared "Somada AI" mode (optional) |
VERTEX_MODEL |
Optional. Defaults to gemini-2.5-flash |
ANTHROPIC_API_KEY |
Server-side Claude key for shared Claude mode (optional) |
CLAUDE_MODEL |
Optional. Defaults to claude-sonnet-4-6 |
Both AI keys are optional — if you skip them, users can still chat by saving their own key in Settings (BYOK).
Open your deployed app and sign up with Supabase auth.
On your iPhone:
Health app → profile picture → Export All Health Data
Unzip the export and upload export.xml in the app. Parsing runs in the browser and then saves to your Supabase.
Edit the LIFE_EVENTS array in index.html (and parse_health.py if using local dev), then re-upload export.xml.
Run the app entirely on your machine — no Supabase or Vercel account needed.
Windows Command Prompt:
set VERTEX_API_KEY=your_key_here
set ANTHROPIC_API_KEY=your_key_hereWindows PowerShell:
$env:VERTEX_API_KEY="your_key_here"
$env:ANTHROPIC_API_KEY="your_key_here"Or create a .env file:
VERTEX_API_KEY=your_key_here
ANTHROPIC_API_KEY=your_key_herepython parse_health.py export.xmlThis creates health_data.json.
python server.pyOpen http://localhost:8080.
A rebuilt frontend lives in web/ (Vite + React + TypeScript) and is served at /app/ next to the classic page, which stays at / until the new app reaches parity. Today it has sign-in (email/password and Google), an app shell, and a dashboard placeholder; charts, upload and chat are still in the classic app.
Develop it with two terminals:
vercel dev # serves the Python API on :3000 (needs SUPABASE_* env vars)
npm --prefix web install
npm --prefix web run dev # http://localhost:5173/app/ (proxies /api to :3000)Checks: npm --prefix web run lint, typecheck, test, build. The Vercel build assembles both apps with scripts/build-site.mjs.
For Google sign-in on the new app, add https://<your-domain>/app/ (and any preview URLs) to the Redirect URLs in Supabase Authentication settings.
Open it with the trailing slash (/app/).
If the classic page is missing at http://localhost:3000/ under vercel dev, build it first with npm --prefix web run build && node scripts/build-site.mjs.
- Dashboard views for steps, sleep, resting HR, and HRV
- Browser-side Apple Health XML parsing — data never touches a server during upload
- AI chat over your health data using Vertex AI (Gemini) or Claude
- Bring your own API key (Vertex or Anthropic) via Settings
- Life-event annotations across charts and AI context