個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證A wall-display family dashboard: shared calendar, weather, meals, shopping, to-do, chores, and budget on one screen. Three files — HTML, CSS, JS — no build step, no framework. Google Calendar + Photos via OAuth, Firestore for shared state, Netlify Functions for event discovery.
翻譯準備中
正在載入完整 README。
檢視完整 README ↗A no-build family wall dashboard — Google Calendar, keyless weather, shared shopping/to-do/budget, AI meal planning, chores and an ambient screensaver.
Setup guide · Feature reference · Easter eggs · Architecture notes
A wall-display family dashboard — calendar, weather, shopping, meals, chores and more — built as four plain files with no build step, no npm install, and no framework.
family-hub.html + family-hub.css + family-hub.js, plus hub-theme.css for the theme tokens. Drop them in a folder, serve them, done.
Family Hub is the screen that lives on the kitchen wall. It pulls in everyone's Google Calendars, shows the weather and the radar, keeps a shared shopping list that updates on every phone in the house at once, plans the week's meals, tracks chores, and fades into a screensaver when nobody's looking at it.
It's deliberately low-tech under the hood: CDN <script> tags (Firebase 9 compat + Google
Identity Services), vanilla JS, CSS custom properties. There is nothing to compile — what
you edit is what the browser runs.
Calendar
.ics feed (school, sports, Outlook) with no Google sign-in at all; recurrence (RRULE/EXDATE/TZID) is expanded client-sideHousehold
Ambient
pond/Presentation
git clone https://github.com/mattohara42/family-hub.git
cd family-hub
python3 -m http.server 8080
Then open http://localhost:8080/family-hub.html.
⚠️ Opening the file directly (
file://) will not work for anything Google-related — OAuth requires anhttp://localhostor HTTPS origin.
Weather, the word of the day and the jokes work immediately with no configuration. Everything else needs accounts — see family-hub-setup.md for the full walkthrough (Google Cloud OAuth client, Firebase project, API keys, authorized origins).
Production runs on Netlify as a static site at familial.netlify.app, plus a handful of serverless functions:
| Function | Purpose |
|---|---|
netlify/functions/events.js | Event-discovery aggregation across several ticketing/library APIs |
netlify/functions/ai.js | Gemini proxy — keeps the API key server-side |
netlify/functions/ics.js | ICS feed proxy (CORS + SSRF-guarded) |
netlify/functions/news.js | RSS/Atom proxy for headline feeds |
Publish directory is .; the build command (node netlify-build.js) stamps a fresh
cache version into sw.js so each deploy invalidates the old service-worker cache, and
writes config.js from env vars when they're set (below).
Backend keys are set as Netlify environment variables — GEMINI_KEY, TICKETMASTER_KEY,
OWM_KEY. Client-side config (Firebase, Google OAuth client ID) lives in config.js. A fork
running its own Google/Firebase projects sets GOOGLE_CLIENT_ID and FIREBASE_CONFIG on
Netlify instead of editing that file; see family-hub-setup.md.
Any new serving origin must be added to Google Cloud Console → Authorized JavaScript Origins and Firebase Console → Authorized Domains, or sign-in silently fails.
family-hub.html markup + CDN script tags (no inline CSS/JS)
hub-theme.css theme tokens: fonts, palettes, material tokens (loads first)
family-hub.css all other styling — layout, components, theme structure
family-hub.js all logic + the config block at the top
config.js Firebase + Google client ID (rewritten from env vars on deploy)
manifest.json sw.js PWA manifest and service worker
firestore.rules Firestore security rules (auth-gated)
netlify.toml headers, redirects, CSP-adjacent config
netlify/functions/ serverless backends
pond/ vendored Pond Chimes screensaver (git subtree — don't edit in place)
tests/ node --test unit tests
docs/ brainstorms, plans, prototypes
npm test # node --test tests/*.test.js
Covers the Netlify functions (event-discovery aggregation, recipe scraping, Home Assistant)
and the browser app's pure helpers (the event date/time shift, the outdoor-task scorer, meal
images). Function tests import the real code through its _test export; browser-app tests
cannot — family-hub.js is a no-build monolith with nothing to require — so each of those
carries its own copy of the function it exercises, and the two must be kept in sync. See
BACKEND_TESTING_SETUP.md for running the functions locally.
| Doc | What's in it |
|---|---|
| FEATURES.md | The reference map — every feature's functions, state, HTML anchors and storage keys |
| family-hub-setup.md | End-user setup: accounts, keys, origins, step by step |
| CLAUDE.md | Architecture invariants and known gotchas (read this before changing anything structural) |
| EVENT_DISCOVERY.md | Event discovery design and API details |
| RETROSPECTIVE.md | Lessons learned along the way |
| EASTER_EGGS.md | The phrase cheat sheet |
*_BACKLOG.md | Per-area backlogs — weather, meals, assistant, screensaver, easter eggs |
The architecture invariants in CLAUDE.md are the house rules: no build tooling,
CSS stays in the CSS file, pond/ is vendored and updated only via
git subtree pull, and mobile tabs are registry-driven rather than hand-written per card.
There's a feature checklist there too.
MIT © Matt O'Hara.
The vendored pond/ subtree is Pond Chimes,
also MIT, and carries its own LICENSE. Third-party CDN libraries (Firebase, Google Identity
Services, Tone.js) remain under their own licenses.