尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證MedicineTracker is a clean, dark theme, senior-friendly medicine tracking web and mobile application built to help you stay on top of your daily medicines, build lasting healthy habits, and monitor your consistency over time.
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
A medicine reminder and pill identification app for elderly users. Runs in the browser, backed by Supabase (Postgres, Auth, Realtime, Storage). Only the person taking the medicines has an account - a helper never signs up at all, they just enter a code.檢視完整 README ↗A medicine reminder and pill identification app for elderly users. Runs in the browser, backed by Supabase (Postgres, Auth, Realtime, Storage). Only the person taking the medicines has an account - a helper never signs up at all, they just enter a code.
It solves three problems:
A helper's edits reach the elder's phone within a few seconds, live - no exporting or importing a file. See docs/architecture.md for how.
The app asks one question on first run - "Who uses this phone?" - and becomes a different app depending on the answer.
| Simple (the person taking medicines) | Supporter (the person helping) | |
|---|---|---|
| Sees | Today, Fill the box, Settings | Today, Calendar, Medicines, Box, Settings |
| Does | Marks doses done, checks photos | Adds medicines, photos, times; follows the day |
| Account | Signs in with Google, once | None. Enters a code from the simple person's Settings screen |
| Interface | Warm dark canvas, 17px text floor, 44px target floor, 54–64px primary actions | Cool grey canvas, 13–16px text, denser lists and forms |
The simple side is built around one claim: marking a dose is one tap from the first screen. No calendar tab, no cycling controls, no confirm dialogs - undo is always one tap away in the same place the mark was made. See docs/ui.md for the rules behind that and what they cost.
The simple person's Google account owns the household and its share code. A supporter's device holds only that code - nothing about a supporter is ever stored server-side. That's a deliberate tradeoff at this app's scale (a handful of households): lower friction for the helper, at the cost of not knowing which supporter made a given edit, and a code rotation cutting off everyone who had the old one, not just one person. See docs/architecture.md for the reasoning.
The mode can be changed at any time in Settings, and is not hidden behind a gesture.
Both phones and the daily routine are in docs/flow.md, written to be read aloud over a call.
The short version: the elder installs the app and signs in with Google. Settings shows their code. The helper installs the app, chooses "I help someone", and enters that code - no account needed. From then on, anything the helper adds or changes appears on the elder's phone automatically.
The app needs a Supabase project behind it - see docs/setup.md for the complete, step-by-step one-time setup (Supabase project, Google OAuth, migration, VAPID keys, deploying). js/config.js holds the public project URL and keys; see the comment there for why those are safe to commit.
Still no build step, no npm install, no node_modules for the frontend itself.
python3 -m http.server 8000
Then open http://localhost:8000/. Service workers and IndexedDB both work on localhost without HTTPS. You'll need js/config.js pointing at a real Supabase project (see above) for sign-in and sync to do anything.
One thing to know while working on the UI: the service worker serves js/ and css/ network-first with a 2.5s timeout, so an edit normally reaches a reload - but a stale cache can still win, and then you are debugging code that is not running. If a change seems not to apply, unregister the worker and clear its caches from DevTools (or in the console: navigator.serviceWorker.getRegistrations().then(r => r.forEach(x => x.unregister())), then caches.keys().then(k => k.forEach(c => caches.delete(c)))) and reload twice.
Push to main and point GitHub Pages at the repository root, same as always - the frontend is still a static site with relative paths. js/config.js's values are safe to commit, so there's nothing to inject at deploy time.
The service worker fetches network-first, so a deploy reaches the phone on the next open with no cache version to bump and nothing to clear.
Free at this app's scale (a handful of households): Supabase's free tier covers the database, auth, storage, and Edge Function calls with room to spare, and GitHub Pages hosting stays free. The one thing worth watching: Supabase free projects pause after 7 days with zero activity - the reminder cron running every few minutes should prevent that in practice, but it's worth confirming rather than assuming.
display=swap. Offline, or before it arrives, the app renders in the system stack - a visual downgrade, not a functional one, since nothing is hidden and the fallback's metrics are close enough not to reflow the cards. This reverses the earlier "no webfont" rule; docs/ui.md has the reasoning.| File | What is in it |
|---|---|
| docs/flow.md | Start here. What both people do, step by step, and what to do when something goes wrong |
| docs/architecture.md | How it works: data model, the rules that must not be broken |
| docs/repo-structure.md | What every file does |
| docs/ui.md | Every screen, and the design rules behind them. Current as of the v4 elder-first redesign |
| docs/notifications.md | Every push the app sends: when it fires, what it says, and where to change the wording |
| docs/phase-3-plan.md | Historical: organiser mode, the plan and what it got wrong. Shipped; the screens have since been redrawn |
| docs/medicine-tracker-plan-v3.md | Historical: the original local-only build spec, superseded by the online-sync design above |
| docs/next-steps.md | Everything deliberately deferred (reminders and two-way sync are now done) |
| docs/setup.md | Start here if you're standing this up. Backend setup, step by step: Supabase project, Google OAuth, migration, VAPID keys, deploying |