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

113
unraid/family-planner.xml Normal file
View File

@@ -0,0 +1,113 @@
<?xml version="1.0"?>
<Container version="2">
<!--
Unraid Community Applications Template
Family Planner — self-hosted family dashboard
To use: place this file in /boot/config/plugins/dockerMan/templates-user/
Then open the Docker tab → Add Container and select "Family Planner".
-->
<Name>family-planner</Name>
<Repository>ghcr.io/your-username/family-planner:latest</Repository>
<Registry>https://ghcr.io/your-username/family-planner</Registry>
<Network>bridge</Network>
<Shell>sh</Shell>
<Privileged>false</Privileged>
<Overview>
A sleek, modern family dashboard with a shared calendar, chore assignments,
shopping lists, dinner meal planner, message board, countdown timers,
and a full-screen photo slideshow screensaver.
Includes dark/light mode with accent color selection.
</Overview>
<Category>Productivity: Tools:</Category>
<WebUI>http://[IP]:[PORT:3001]/</WebUI>
<!-- Update this once you have a real icon hosted somewhere -->
<Icon>https://raw.githubusercontent.com/your-username/family-planner/main/unraid/icon.png</Icon>
<ExtraParams>--restart=unless-stopped</ExtraParams>
<!-- ── Ports ──────────────────────────────────────────────────────── -->
<Config
Name="Web UI Port"
Target="3001"
Default="3001"
Mode="tcp"
Description="Port the Family Planner web interface is served on."
Type="Port"
Display="always"
Required="true"
Mask="false">3001</Config>
<!-- ── Volumes ────────────────────────────────────────────────────── -->
<Config
Name="App Data"
Target="/data"
Default="/mnt/user/appdata/family-planner"
Mode="rw"
Description="Persistent storage for the SQLite database and app configuration. Must be writable."
Type="Path"
Display="always"
Required="true"
Mask="false">/mnt/user/appdata/family-planner</Config>
<Config
Name="Photos Path"
Target="/photos"
Default="/mnt/user/Photos"
Mode="ro"
Description="Path to your photo library. Subfolders are scanned automatically. Mounted read-only."
Type="Path"
Display="always"
Required="false"
Mask="false">/mnt/user/Photos</Config>
<!-- ── Environment variables ──────────────────────────────────────── -->
<Config
Name="PUID"
Target="PUID"
Default="99"
Mode=""
Description="User ID the container process runs as. Use 'id username' in the Unraid terminal to find your UID. Unraid default nobody=99."
Type="Variable"
Display="advanced"
Required="false"
Mask="false">99</Config>
<Config
Name="PGID"
Target="PGID"
Default="100"
Mode=""
Description="Group ID the container process runs as. Unraid default users=100."
Type="Variable"
Display="advanced"
Required="false"
Mask="false">100</Config>
<Config
Name="TZ"
Target="TZ"
Default="America/New_York"
Mode=""
Description="Your timezone. Used for correct date and time display. See https://en.wikipedia.org/wiki/List_of_tz_database_time_zones"
Type="Variable"
Display="advanced"
Required="false"
Mask="false">America/New_York</Config>
<Config
Name="PORT"
Target="PORT"
Default="3001"
Mode=""
Description="Internal application port. Only change this if you have a port conflict and know what you are doing."
Type="Variable"
Display="advanced"
Required="false"
Mask="false">3001</Config>
</Container>