Track tasks, workouts, meals, and health data with Apple Watch sync and AI logging
AI summary · website and README
HealthHTML · JavaScriptGitHub @chinmayp123OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
A personal life dashboard that aligns your day — tasks, workouts, nutrition, weigh-ins, and schedule in one place, with optional AI logging and Apple Watch sync. Built with vanilla HTML, CSS, and JavaScript — no framework, no build step, no bundler.
Installable as a PWA, syncs across devices via Firebase, and works offline.
For designers (start here for a design pass)
Everything visual lives in one file: style.css (~6,300 lines). There is no CSS framework, no Tailwind, no CSS-in-JS — just plain CSS with custom properties.Read the full README ↗(formerly LifeStack)
A personal life dashboard that aligns your day — tasks, workouts, nutrition, weigh-ins, and schedule in one place, with optional AI logging and Apple Watch sync. Built with vanilla HTML, CSS, and JavaScript — no framework, no build step, no bundler.
Installable as a PWA, syncs across devices via Firebase, and works offline.
Everything visual lives in one file: style.css (~6,300 lines). There is no CSS framework, no Tailwind, no CSS-in-JS — just plain CSS with custom properties.
The entire theme is driven by CSS variables defined at :root in style.css. Change these and the whole app reskins:
| Token | Night (dark) / Day (light) | Role |
|---|---|---|
--bg-primary | #0e0f0e / #eceee9 | Page background (flat, no gradients) |
--bg-card / --bg-secondary / --bg-input | #171917 / #f7f8f5 | Surfaces |
--bg-hover | #1f221f / #e3e6e0 | Hover |
--border / --track | #262925 / #d5d8d1 | Hairlines, unfilled progress |
--text-primary / --secondary / --muted | #eeefeb #aeb2ab #8a8f88 / #121412 #4f544e #686d66 | Text hierarchy (muted clears 4.5:1 on cards) |
--accent / --accent-ink | cobalt #6c86ff on #0e0f0e / #2446f0 on #fff | The one accent: now line, primary button, focus, selected. Picked in Settings; --accent-hover / --accent-glow derive from it |
--c-sleep --c-food --c-water --c-move --c-meet --c-habit | see :root | Category colours; --green/--yellow/--blue/--purple alias move/habit/water/sleep; macros are --macro-protein/carbs/fat |
--red | #fb923c / #c2410c | Warn: overdue, danger |
--radius / --radius-sm / --radius-chip / --radius-now / --radius-sheet | 16 / 10 / 6 / 18 / 24px | Corner rounding |
--font-display / --font-body / --font-mono | Bricolage Grotesque / Geist / JetBrains Mono | Display, UI, every number |
--shadow, --sidebar-width | — | Elevation + layout |
Structure: index.html holds all markup. Each screen is a <div class="view" id="...View"> (dashboard, tasks, board, calendar, gym, cardio, diet, settings) toggled by switchView() in js/app.js. Content is grouped into .card blocks. The layout is a fixed left .sidebar + main content on desktop, collapsing to a top bar + bottom .bottom-nav on mobile (@media (max-width: 900px)).
It's fully responsive and theme-token-driven, so most redesigns are CSS-only — recolor by editing the :root tokens, restyle components by editing their classes, no JS required. To preview changes, see Running locally below and open the app in a browser (or resize to phone width / use device-emulation).
Current aesthetic: v3 "Day Line" (design/v3/BUILD_SPEC_v3.md): flat warm-grey surfaces, one cobalt accent, six category colours, Bricolage Grotesque display type and mono numbers. Day (html[data-theme="light"]) and Night (:root) — style both when touching colors. Base components are the .dl-* classes at the end of style.css; preview them in design/v3/components.html.
These three are the fitness/nutrition modules and share conventions. Each renders from its own JS file into a #...View container; the markup for their input controls is static in index.html, and the list/summary areas are filled by innerHTML from JS. Restyling is CSS-only — the JS writes class names, not inline styles (except progress widths / conic-gradient rings). Every one leads with its primary logging control at the top so logging never needs a scroll.
| Page | View / file | Key sections (CSS class → what it is) | Notes for redesign |
|---|---|---|---|
| Gym | #gymView / js/gym.js | .gym-date-bar (day nav) · .gym-add-bar (add exercise + sets, top) · .gym-stats · .gym-workout (logged list) · .weight-card (body weight + spark) · .coach-card (targets + rule-based tips) · .streak-card (streak + 16-week heatmap) | Densest page. The heatmap and stat tiles are the visual anchors. |
| Cardio | #cardioView / js/cardio.js | .cardio-add-card (type tabs run/ride/swim + distance/duration, top) · .cardio-watch-chip (Apple Health cross-check) · .cardio-day (sessions) · .cardio-week (weekly volume tiles) · .cardio-race (countdown + projected finish) · .cardio-coach | Newest page, lightest styling — most room for a designer. Pace shows in each sport's own units. |
| Diet | #dietView / js/diet.js | .diet-summary (macro rings) · .diet-log-card (food search + add, incl. photo logging) · food list grouped by meal · .diet-goals · water tracker | Macro rings (.diet-goals) and the meal-grouped list are the centerpiece. |
Shared building blocks worth reusing rather than reinventing: .card, .btn-primary / .btn-secondary, the stat-tile pattern (label + big value + sub), progress bars/rings, and status dots (--green / --yellow / --red). The three modules can be turned on/off in Settings, so don't assume all three are always in the nav.
Do not touch the data flow: the render functions (renderGym, renderCardio, renderDiet) read from state and must not be made to write. Any save goes through saveData(state) on an explicit user action only — see the data-safety note in Data & privacy.
HEALTH-SYNC.md and the AI features note below for setupHEALTH-SYNC.md.style.css)js/firebase-sync.js)sw.js service worker, offline-capablemain)No install or build. Either open index.html directly, or serve it (recommended, so the service worker and relative paths behave):
npx http-server -p 8080 -c-1 .
# then open http://localhost:8080
To test on a phone, open http://<your-computer-lan-ip>:8080 on the same Wi-Fi.
localStorage for offline use.users/<profile-id>, picked once per device on first launch and stored in localStorage['daylign_profile']. Nothing is read from or written to the cloud until a profile is chosen. This gives people separation, not security — the database has no auth rules, so it stops accidental clobbering between people who trust each other, and is not a permission system. Switch or start fresh from Settings, Profile.lifestack is never written again and is kept as a frozen backup.goals._onboarded marker, so a returning person on a new device is never walked through it again. Skippable, and Settings, Help, Replay setup runs it again without touching logged data (js/onboarding.js).state.modules, synced). Off hides them from every nav surface and drops their dashboard cards; the data is never deleted and returns when re-enabled. Tasks, Board, Calendar and Dashboard are core. The Categories/Projects sidebar sections only appear on those task-oriented views (TASKMETA_VIEWS).users tree directly and never loads another profile into the running app: renderers no longer save (the renderDiet() save-on-render was removed in v3), but loading someone else's data into state would still let the next save of yours write it to your own node.foodBank root node (like external, a separate shared root), and every profile reads it — so one person's dishes become searchable for everyone, tagged "Community" in search. Publishing is additive; deleting a food from your own bank never removes it from the shared pool. js/firebase-sync.js (loadSharedFoods / publishFoodToBank).external Firebase node the app only reads — app writes can never overwrite it. Per person: for the original profile, for everyone else.index.html — All markup (one .view per screen)
style.css — All styles + :root design tokens (~6.4k lines after the v3 cleanup)
sw.js — Service worker (offline / PWA). Revalidates with the
server on every request so a deploy is never masked by
the HTTP cache. Bump CACHE on every ship.
manifest.json — PWA manifest
HEALTH-SYNC.md — Apple Health / Watch shortcut setup
firebase-rules*.json — Drafted DB security rules (NOT yet applied — see below)
design/v3/ — The v3 "Day Line" spec, mockups, coverage map and
the coverage check (V3_COVERAGE_CHECK.md)
js/
Core
state.js — Data model, the 18 synced keys, localStorage persistence
utils.js — $ / $$, dates, toasts, sumMacros, empty states,
keyboard-access promotion, global error handlers
app.js — Entry point, switchView, render(), event binding
firebase-sync.js — Cloud sync, the sync pill, the sync conflict notice,
external (Apple Health) reads
profile.js — Per-person profiles: first-launch gate, node paths
onboarding.js — Setup: first run for new profiles, and Replay setup
Tasks & planning
line.js — The day line: one timeline of the day, used by Today,
Calendar's day view and Diet
now-block.js — Today's pinned block of the day's numbers
today.js — The no-time tray, triage sheet, due soon, this week
dashboard.js — renderDashboard (Today's render order), morning routine
tasks.js — Tasks list view + auto-archive rule (isArchived, 1 week)
board.js — Board, the second face of Tasks
task-sheet.js — The one task editor (sheet), with priority
modal.js — Task done toggle; drag-to-dismiss for sheets
calendar.js — Month/week/agenda calendar + the event sheet
inbox.js — Tester reports from report.html (/inbox), on the Board
Training
gym.js — Strength logging, body weight, burn, streaks,
MUSCLE_GROUPS map, rest timer
cardio.js — Sessions, pace, weekly volume, race prediction,
one-tap "same as usual" logging + streak
training.js — Training shell: Strength / Cardio / Coach / Sleep tabs
strength.js — Progression analytics: est. 1RM (Epley), plateau
detection, PRs, muscle balance
sleep.js — Sleep logging + the readiness score it feeds
coach.js — Training decision surface (train/rest, what, volume,
deload, recovery)
brief.js — Daily brief on Today: one prioritised focus across
training, nutrition and tasks. Shares coach.js's engine
so the two can never contradict each other.
Diet (split from one 2k-line file; load order matters)
diet-data.js — FOOD_DATABASE + diet state vars
diet-core.js — Quick-add, "Your Usuals", Food Library toggle
diet-view.js — renderDiet (reads only): the day, meal sheet, Food library
diet-food.js — Search, food bank, manual entry form
diet-goals.js — Goals, recommendations, advice, review, water
Cross-cutting
insights.js — Analytics view: 8 charts, Week/Month/Year/All, CSV export
layout.js — Arrange Today sheet (order, hide, saved layouts)
settings.js — Settings index and pages, categories manager, the
confirm sheet, restore
settings-prefs.js — Device prefs: accent, widget visibility, workout
defaults and workout time, accessibility
preferences.js — Settings: theme switch, AI key
enhancements.js — Theme (System / Light / Dark), avatar sheet, Ctrl K
global.js — The + sheet, install banner, offline notice
collapsible.js — Reusable collapse-on-mobile card behaviour
weight-sheet.js — The one weigh-in sheet (weight, waist, 30-day line)
import-csv.js — Spreadsheet import (Settings, Import a spreadsheet)
pull-refresh.js — Pull to refresh
ai-usage.js — Anthropic token/cost tracker
food-photo.js — Photo food logging (Claude vision)
voice.js — Voice sheet: natural-language commands
No build step. Every file is a plain <script> in index.html and shares
one global scope — there are no ES modules, no imports and no bundler. Two
consequences that matter when editing:
state.js and utils.js must come before
anything that uses state, $ or esc. The five diet-*.js files must
stay in their listed order; they were split from a single file purely by
slicing at function boundaries.<script> tag in
index.html, an entry in sw.js ASSETS (or it breaks offline), and
usually a call inside render() in app.js.Rendering. render() in app.js calls every view's renderer
unconditionally; views are shown/hidden with CSS, not unmounted. Renderers
rebuild their section with innerHTML and re-attach listeners, so:
bindBoardDropTargets() exists because that bug shipped once.layout.js applies
CSS order instead of moving nodes, because a re-render would undo the move.Persistence. writeStateToLocal() in state.js is the single writer for
all 18 synced localStorage keys; saveData() and applyFirebaseData() both go
through it so the two can't drift. Both callers guard it — a full or disabled
localStorage must never abort the cloud write.
Preferences vs state. Device-local settings (theme, accent, widget
visibility, layouts) live in localStorage under daylign_prefs and are
deliberately NOT synced — they describe one device. Everything in the 18-key
state object syncs. A new synced key must be added in four places:
loadData(), writeStateToLocal(), CLOUD_KEYS (state.js) and SYNC_KEYS
(firebase-sync.js).
FIREBASE-RULES.md is the
runbook for the console steps and the final firebase-rules.json.layout.js uses pointer
events and does work on touch.MIT
external/*external/u/<profile-id>/*localStorage (tf_anthropic_key) — never committed to the repo or synced to Firebase — so a public repo never exposes a billable key. AI features are entirely optional and dormant until a key is added.