Jamorham
Nightscout용 xDrip+ 버전
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
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.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.