Post-transplant medication, vitals, and lab tracker. Vanilla JS PWA — no framework, no build step, no server. Your data lives in your own Google Sheets.
- Medication schedule — define meds with times, doses, alternating dose rules (odd/even days, weekday patterns), and conditional meds (e.g. "take if BP > 140/90")
- Daily tracker — check off meds, log blood pressure (AM/PM), weight, temperature, notes
- Fluid tracking — water intake and urine output with running totals
- Lab results — creatinine, tacrolimus levels with history
- Offline-first — works without internet, syncs when back online
- Multi-device — data syncs through Google Sheets, accessible from any device
- Sign in with Google
- The app creates a Google Sheet in your Drive (you own the data)
- All tracking data syncs to that sheet automatically
- You can open the sheet directly anytime — it's a normal spreadsheet
npx serve -l 3000 .Open http://localhost:3000.
vercelThe included vercel.json handles SPA routing.
The app needs a Google Cloud project with:
- APIs enabled: Google Sheets API, Google Drive API
- OAuth consent screen: External, no scopes needed on the consent screen itself
- OAuth client: Web application type, with your domain in Authorized JavaScript origins
- API key: unrestricted is fine (browser-visible by design)
Update CLIENT_ID and API_KEY in js/auth.js with your own credentials.
- Vanilla JS (ES modules, no bundler)
- Google Identity Services (GIS) for auth
gapi.clientfor Sheets/Drive API calls- Service worker for offline caching
- localStorage for offline state + sync queue
index.html Main page (all views)
css/styles.css Styles
js/
auth.js Google sign-in + gapi init
sheets.js Google Sheets API wrapper
store.js localStorage state + Sheets sync
schedule.js Med schedule config + versioning
tracker.js Daily tracker UI (meds, fluids, vitals)
editor.js Med schedule editor UI
labs.js Lab results UI
app.js Entry point, routing, glue
sw.js Service worker (stale-while-revalidate)
manifest.json PWA manifest
vercel.json Vercel SPA config
MIT