7.4 KiB
Status
Living progress tracker. Update at the end of each task. The canonical brief is CLAUDE.md; task briefs live in docs/tasks/.
Done
-
01 — Repo init & tooling (commit
b89690a). pnpm 10 + TS strict + ESLint flat + Prettier. All acceptance criteria green. -
02 — Next.js app skeleton. Next.js 15 + React 19 + Tailwind v4 + shadcn/ui (button, card, input, dialog).
pnpm devserves placeholder,pnpm buildproduces.next/standalone/,pnpm lintclean. Added.npmrcwithnode-linker=hoistedfor Windows symlink compatibility. -
03 — Drizzle + Postgres setup. drizzle-orm + postgres driver + drizzle-kit wired up.
src/modules/_core/schema.tsdeclaresusers,households,household_members.docker-compose.dev.yamlstarts Postgres 16.drizzle/0000_silent_magma.sqlgenerated and applied.tsc --noEmitpasses. -
04 — Module loader & registry.
src/modules/_core/module.tstypes (ModuleManifest,EntityTypeRegistration,DashboardWidget, etc.),registry.tssingleton withregisterModule/getRegistry/getEntityType/getWidget, barrel_core/index.ts. Stub manifests forcalendar,lists,notes.src/modules/index.tsloader. Root layout imports loader;AppNavreads registry for nav links./debug/registrydumps full registry JSON (dev only). Uses zod v4 + built-inz.toJSONSchema().tsc --noEmit,pnpm build,pnpm lintall clean. -
05 — Compose + Caddy.
Dockerfile(3-stage: deps/builder/runner, pnpm fetch + offline install, non-rootnextjsuser,output: standalone),deploy/compose.yaml(famapp + famapp-db + full Authentik stack onfamapp_net),deploy/Caddyfile.snippet,.env.production.example.docker build -t famapp .succeeds (~311 MB);docker compose -f deploy/compose.yaml configvalidates clean. Added.dockerignoreandpublic/.gitkeep. -
06 — Authentik OIDC.
next-auth@beta+@auth/drizzle-adapterwired up.src/lib/auth.tsconfigures OIDC provider (Authentik), database sessions,authorizedcallback guarding all routes except/login,/s/*,/api/auth/*.src/middleware.tsexportsauthas middleware.src/app/api/auth/[...nextauth]/route.tsmounts the handlers.src/app/login/page.tsxhas a single "Sign in with SSO" server action.getCurrentUser()available for server components/actions. Schema extended:users→ addedname/emailVerified/image; newaccounts,sessions,verificationTokenstables; migration0001_auth_tables.sqlgenerated.deploy/authentik/README.mddocuments the manual Authentik bootstrap.tsc --noEmitandpnpm lintpass clean. -
07 — Household seed.
pnpm db:seedinserts household "Home" idempotently (powered bytsx).signIncallback assignsownerto the first member of the household andmemberto all subsequent users.getCurrentSession()insrc/lib/session.tsreturns{ user, household, role }and throws if unauthenticated or unmembered./settings/householdrenders member list for all roles and a rename form for owner only.tsc --noEmitandpnpm lintboth clean. -
08 — Theming infrastructure. CSS-variable multi-theme system (
default+warm) ×{light, dark, system}.users.theme+users.themeModecolumns in migration0002_naive_starbolt.sql. Theme registry insrc/modules/_core/themes.ts(THEMES/THEME_MODES arrays — adding a third theme is one CSS block + one registry entry). Root layout reads session and setsdata-theme/darkon<html>server-side; inline pre-paint<script>covers system mode and signed-out pages (no flash).useTheme()hook optimistically flips attributes, writeslocalStorage, and callssetUserThemeserver action.<ThemePicker />component mounts on/settings(select for theme, segmented buttons for mode).tsc --noEmit,pnpm lint,pnpm buildall clean. -
10 — Calendar module. Added
calendarsandcalendar_eventsschema + migration0003_rainy_ravenous.sql, default Home/Personal calendar seeding, first-login default calendar creation, visibility-safe calendar/event queries, CRUD server actions, FullCalendar-backed/calendarUI with sidebar calendar management and event create/edit/delete/drag updates. Calendar manifest now registers share/reminder/search capabilities, two configurable widgets, and quick-add entries. Added Playwright happy-path spec intests/e2e/calendar.spec.ts.pnpm db:generate,pnpm typecheck,pnpm lint, andpnpm buildpass. -
11 — Lists module. Added
listsandlist_itemsschema + migration0004_opposite_wraith.sql, default Shopping/Tasks seeding on first access/sign-in/seed, household-gated list and item CRUD server actions, reorder support, and PostgresLISTEN/NOTIFYto SSE bridge documented in ADR0002. Added/listsgrouped index,/lists/[id]keyboard-first item entry with checkbox toggles and swipe/delete, manifest entity/search/widget/quick-add registrations, and Playwright happy-path spec intests/e2e/lists.spec.ts.pnpm typecheck,pnpm lint, andpnpm buildpass.
Next up
- 12 — Notes module (or next task in
docs/tasks/).
Development login/testing notes
- Local development can use the documented Dev login flow in
docs/dev-login.md. It creates a database-backed Auth.js session forDEV_LOGIN_EMAILwhenENABLE_DEV_LOGIN=trueandNODE_ENV !== "production". - The production cleanup gate is tracked in
docs/tasks/09-production-dev-login-removal.md. Complete it before first production deployment.
Phase 1 remaining
- 03 Drizzle + Postgres → 04 module loader → 05 compose/Caddy → 06 Authentik OIDC → 07 household seed → 08 theming infrastructure (newly added; multi-theme + per-user dark/light, must land before module work so module UIs adopt the token system from day one).
Recent architectural decisions
- Calendars are first-class entities. Like lists, users can create as many as they want with
privateorhouseholdvisibility. Both calendar entities are independently shareable. Updated CLAUDE.md data model + task 10. - Uniform widget contract — no singletons. Every dashboard widget declares a
configSchemaanddefaultConfig; every placement is an independent instance. Same widget can appear N times on a dashboard pointed at different things. Updated task 04; tasks 11/12 widget sections updated to match. - Per-user customizable dashboards. Each user can have any number of named dashboards, switch between them, drag/resize widgets, and configure each placement. Tasks 25 (multiple dashboards) and 26 (customizable layout + widget configuration) added; phase 3 index updated.
How to resume in a fresh session
- Open the repo root in VS Code.
- Tell Claude: "Read CLAUDE.md and STATUS.md, then complete docs/tasks/03-drizzle-postgres.md. Stop at the acceptance criteria."
- After it lands, append the result to the Done section here, bump Next up, and commit.
Environment notes
- Repo: https://github.com/ginnoir/famapp (HTTPS remote on
origin). - Local dev tooling installed: Node 22+, pnpm 10.33.3.
.envis not committed; copy.env.example→.envwhen needed.- VS Code recommended extensions in
.vscode/extensions.json; copy.vscode/settings.json.example→.vscode/settings.jsonfor the workspace defaults. - Memory files (cross-session, only seen by Claude):
C:\Users\MattC\.claude\projects\C--Users-MattC-Documents-famapp\memory\.