A self-hosted family dashboard built for a wall-mounted touchscreen. Combines calendar, chores, messages, security cameras, weather, Home Assistant integration, and more — all in one polished interface your whole family can use.
| Dashboard | Chores |
|---|---|
![]() |
![]() |
| Messages | Security |
|---|---|
![]() |
![]() |
- Greeting with time of day, date, and rotating family quote
- Up Next — upcoming calendar events
- Chores Today — today's chore assignments; shows streak leaderboard when all done
- Lunch Menu — school lunch pulled from Nutrislice (BCPS and others); shows tomorrow after 5 PM
- Message preview pill — latest family note displayed above the grid; ✏️ button to post directly without leaving the dashboard
- Live Home Assistant status badges (garage, alarm) in the header
- Weather widget — current conditions + tomorrow's forecast (high/low + precipitation %)
- Stock ticker (slim banner, configurable symbols)
- Auto-refreshes every 5 minutes
- Leave quick notes for the family (e.g. "I'm at practice, home by 6")
- Color-coded per person with avatar
- Unread badge on the nav link — clears when you visit the page
- Quick-compose from the dashboard without navigating away
- Messages auto-expire after 7 days
- Month view with color-coded event dots per family member
- Tap any event to see a detail popover — title, time, location (tappable → Google Maps), description, person tag, delete button
- Tap a day to see all events in a side panel
- Google Calendar sync — shared family calendar + per-member calendars
- Location field synced from Google Calendar automatically
- Add events directly with optional location and Google Calendar targeting
- Daily chore assignments per family member with morning/afternoon/evening grouping
- Points system with Chore Champions leaderboard
- Day streaks — consecutive days of completed chores, shown on dashboard
- Recurring chores (daily, weekly, custom days)
- Color-coded cards with each person's color
- Camera feeds — live MJPEG streams via Home Assistant proxy (no go2rtc required)
- Fullscreen camera modal with prev/next arrows, dot indicators, keyboard arrow keys, and swipe gestures
- Garage doors — open/close control with live state
- Alarm panel — arm home, arm away, disarm with optional PIN
- Dark mode — automatically switches after sunset (default 9 PM–7 AM)
- Auto-dim — screen goes nearly black after inactivity (default 5 min); any touch restores it
- Both configurable in Settings → General → Night Mode
The app ships with a Web App Manifest so you can install it to your tablet's home screen:
- On iPad/iPhone: Safari → Share → Add to Home Screen
- On Android: Chrome → ⋮ → Add to Home Screen / Install App
Launches full-screen in landscape with no browser chrome.
Organized into 4 tabs:
- Family — members (name, color, avatar) + Google Calendar connection
- Home — Home Assistant URL/token/entities + camera feeds
- Integrations — Weather zip, lunch school, stock symbols, slideshow
- General — Timezone + Night Mode (dark hours + auto-dim timeout)
cp .env.example .env
nano .env.env contents:
# The public URL where Family Hub is accessible (used for Google OAuth redirects)
APP_BASE_URL=http://192.168.1.100:3000
# Google OAuth credentials (see "Set up Google OAuth" below)
GOOGLE_CLIENT_ID=your_client_id_here
GOOGLE_CLIENT_SECRET=your_client_secret_hereImportant: The
.envfile is gitignored and will never be committed.
Required only for Google Calendar sync.
- Go to https://console.cloud.google.com
- Create a project → enable the Google Calendar API
- Create OAuth 2.0 Client ID credentials (Web application type)
- Add these Authorized redirect URIs (replace with your
APP_BASE_URL):http://192.168.1.100:3000/api/auth/google/callback/family http://192.168.1.100:3000/api/auth/google/callback/member - Copy the Client ID and Secret into your
.env
docker compose up -d --buildNavigate to http://your-server-ip:3000
Add each person — name, color, avatar emoji. They appear in the sidebar and can be assigned to chores and calendars.
- HA URL — e.g.
http://192.168.1.100:8123 - Long-Lived Access Token — Home Assistant → Profile → Security → Long-Lived Access Tokens
- Entities — add entity IDs to monitor:
cover.garage_door— garage dooralarm_control_panel.home— alarm panel
- Cameras — add HA camera entity IDs (e.g.
camera.driveway) for live feeds on the Security page
In Settings → General → Night Mode:
- Set dark mode start/end hours (default 9 PM – 7 AM)
- Set auto-dim timeout (default 5 minutes of inactivity)
Select your local timezone — affects all date/time displays and the lunch menu.
Enter your US zip code for current conditions and tomorrow's forecast on the dashboard.
- Connect a shared family Google account for the main calendar
- Choose which Google Calendars to sync
- New events created in Family Hub are added to your selected calendar
- Event locations sync automatically from Google Calendar
Enter your Nutrislice school domain (e.g. bcps) in Settings → Integrations → Lunch.
- Upload photos (JPG, PNG, GIF, WebP)
- Set inactivity timeout and photo interval
- Click the 📷 button (bottom-right) to start manually
git pull
docker compose up -d --buildAll data is stored in ./data/familyhub.db (SQLite). Back this file up regularly.
Uploaded slideshow photos are stored in ./data/photos/.
Runs on port 3000 by default. Change the left side of "3000:3000" in docker-compose.yaml to use a different port.



