Phase 1 & 2: full-stack family dashboard scaffold

- pnpm monorepo (apps/client + apps/server)
- Server: Express + node:sqlite with numbered migration runner,
  REST API for all 9 features (members, events, chores, shopping,
  meals, messages, countdowns, photos, settings)
- Client: React 18 + Vite + TypeScript + Tailwind + Framer Motion + Zustand
- Theme system: dark/light + 5 accent colors, CSS custom properties,
  anti-FOUC script, ThemeToggle on every surface
- AppShell: collapsible sidebar, animated route transitions, mobile drawer
- Phase 2 features: Calendar (custom month grid, event chips, add/edit modal),
  Chores (card grid, complete/reset, member filter, streaks),
  Shopping (multi-list tabs, animated check-off, quick-add bar, member assign)
- Family member CRUD with avatar, color picker
- Settings page: theme/accent, photo folder, slideshow, weather, date/time
- Docker: multi-stage Dockerfile, docker-compose.yml, entrypoint with PUID/PGID
- Unraid: CA XML template, CLI install script, UNRAID.md guide
- .gitignore covering node_modules, dist, db files, secrets, build artifacts

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-29 21:56:30 -05:00
parent 6e44883365
commit 35ed5223a0
58 changed files with 6224 additions and 0 deletions

38
docker-compose.yml Normal file
View File

@@ -0,0 +1,38 @@
services:
family-planner:
build:
context: .
dockerfile: Dockerfile
container_name: family-planner
restart: unless-stopped
ports:
- "${PORT:-3001}:3001"
environment:
# App
PORT: 3001
TZ: ${TZ:-America/New_York}
# File paths inside the container
DATA_DIR: /data
PHOTOS_DIR: /photos
# Drop privileges to this UID/GID (Unraid: nobody=99, users=100)
PUID: ${PUID:-99}
PGID: ${PGID:-100}
volumes:
# Persistent database storage — map to wherever you keep appdata
- ${DATA_PATH:-./data}:/data
# Your photo library — mount read-only
# Change the left side to your actual photos folder path
- ${PHOTOS_PATH:-./photos}:/photos:ro
healthcheck:
test: ["CMD", "wget", "-qO-", "http://localhost:3001/api/settings"]
interval: 30s
timeout: 10s
retries: 3
start_period: 10s