Files
Moonbase/CLAUDE.md
2026-06-16 00:18:06 -05:00

3.8 KiB

Moon Base — Project Notes

Property management for the Moon homestead (Eau Claire, WI). Next.js 14 + Prisma + Postgres. Same conventions as FMB (/Users/bonnamoon/Projects/fullmoonbakehouse). Repo on Gitea: bonna61/Moonbase. Live at NAS:8053. See README.md for the user-facing overview.

Modules (all live)

  • Garden — Plant registry + care/harvest logs, plant groups, reusable PlantType records, Wikipedia photos. Plants sit on the shared location tree.
  • Inventory — durable Items that nest (parentItemId), with Labels (M:N via LabelOnItem), ItemAttachment, and ItemLog. Shares the Location spine.
  • LocationsLocation tree (self-ref parentId) shared by plants + items.
  • RemindersTask + TaskCompletion; recurrence in src/lib/tasks/schedule.ts.
  • REST API/api/v1/* authed by ApiToken (per-scope; logic in src/lib/api/).
  • Suggestions@otm/account-panel (Gitea npm registry) → files issues to the repo.
  • Backup & Restore/api/admin/backup + /api/admin/restore (admin only).
  • Self-update — admin "Pull & rebuild" (see Deploy).

Local dev

  • DB: postgresql://tonym@localhost:5432/moonbase_dev; copy .env.example.env.
  • npm install, npm run dev (3000). After schema edits: npx prisma generate.
  • npx prisma migrate deploy provisions Bonna + Tony. npm run db:seed for demo data (SEED_MODE=minimal = accounts only).
  • Backfills for the location/plant-type refactors: npm run db:backfill-locations, npm run db:backfill-plant-types.

Deploy — git checkout on the NAS (NOT rsync)

The NAS appdata (/mnt/user/appdata/moonbase) is a real git checkout tracking origin/master (remote URL carries the token). Deploy by:

git push origin master
ssh root@192.168.0.5 'cd /mnt/user/appdata/moonbase && git pull && docker compose up -d --build'

Or admins click Settings → Updates → Pull & rebuild, which signals the privileged updater sidecar (docker socket + adnanh/webhook) to run the same git pull && compose up -d --build app detached; the UI polls /api/version and reloads. Never rsync over the appdata dir — it fights the checkout.

  • Secrets (NEXTAUTH_SECRET, GITEA_TOKEN, UPDATER_SECRET) live in a gitignored host .env next to the compose file, interpolated in — never committed.
  • Docker runtime mirrors FMB: node:20-bookworm-slim + openssl, runs as root, full node_modules, next start. Migrations run on container start via the entrypoint (waits for Postgres first). Image gotcha: don't let npx prisma resolve at runtime — with no local prisma on PATH it pulls Prisma 7, which rejects url in the datasource.

Conventions (same as FMB)

  • Every commit bumps APP_VERSION in src/lib/version.ts + a plain-English entry atop src/lib/changelog.ts (the footer shows it + an "update available" badge from src/lib/update-check.ts). Minor for features/migrations, patch for fixes.
  • AuditEvent on every mutation — append-only.
  • Soft-delete via active=false.
  • Pure core + colocated test — logic in src/lib/... with a .test.ts; routes thin.

Auth

  • Username OR email login. Accounts bonna / tony, role ADMIN.
  • getSession() / requireAuth() / isAdmin() in src/lib/auth.ts.
  • Forced password change is wired (provisioned accounts ship moonbase! + mustChangePassword=true): the dashboard layout redirects to /change-password (outside the layout group; backed by /api/account/change-password). Don't remove that redirect.
  • NEXTAUTH_SECRET is asserted at runtime in production (skipped during build).

Color palette

Forest / earth theme: --canopy (sidebar), --leaf (accent), --soil (text), --dew (bg), --ember (destructive).