Files
arnaudne cd16c354c0 Initial commit — Grow baby tracker
Next.js 16 App Router, Prisma + PostgreSQL, NextAuth v5 JWT.

Features: dashboard quick-log, timeline, growth charts (WHO percentiles),
stats, journal/notes, doctor notes, milestones, vaccinations, settings,
superadmin panel. Mobile-first with sidebar nav + bottom nav + quick-add FAB.
Dark mode, PWA push notifications, multi-family invite system.

Docker: multi-stage Dockerfile + docker-compose with postgres service.
2026-06-13 01:52:46 +02:00

209 lines
6.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Plan: Baby Tracker Webapp ("Grow")
## Context
Build a beautiful, mobile-responsive webapp for two parents to track their newborn's daily activities in real-time. Parents log actions quickly (one-tap), view a chronological timeline, get reminders, and analyze trends via a stats dashboard and growth charts.
---
## Tech Stack
| Layer | Choice | Reason |
|-------|--------|--------|
| Framework | **Next.js 15** (App Router) | SSR + API routes in one, Vercel deploy |
| Database | **PostgreSQL** | Multi-user, relational, scalable |
| ORM | **Prisma** | Type-safe, easy migrations |
| Auth | **NextAuth.js v5** | Simple 2-parent shared account + invite link |
| UI | **Tailwind CSS + shadcn/ui** | Beautiful, accessible, fast to build |
| Charts | **Recharts** | React-native, works with Tailwind |
| State | **TanStack Query (React Query)** | Cache + real-time polling for 2-parent sync |
| Realtime sync | **Polling (5s)** or **Supabase Realtime** | Keep both parents in sync |
| Push notifs | **web-push** (PWA) | "Last feed 3h ago" alerts |
| Export | **PapaParse (CSV) + jsPDF** | CSV/PDF export |
---
## Data Model (Prisma)
```prisma
model User {
id String @id @default(cuid())
email String @unique
name String
familyId String
family Family @relation(fields: [familyId], references: [id])
}
model Family {
id String @id @default(cuid())
name String
users User[]
babies Baby[]
inviteCode String @unique
}
model Baby {
id String @id @default(cuid())
name String
birthDate DateTime
familyId String
family Family @relation(fields: [familyId], references: [id])
events Event[]
growthLogs GrowthLog[]
}
model Event {
id String @id @default(cuid())
babyId String
baby Baby @relation(fields: [babyId], references: [id])
userId String // who logged it
type EventType
startedAt DateTime
endedAt DateTime? // for timed events
notes String?
metadata Json? // type-specific data (volume, breast side, color, dose...)
createdAt DateTime @default(now())
}
enum EventType {
BREASTFEED
BOTTLE
DIAPER_WET
DIAPER_STOOL
NAP
NIGHT_SLEEP
MEDICATION
TEMPERATURE
}
model GrowthLog {
id String @id @default(cuid())
babyId String
baby Baby @relation(fields: [babyId], references: [id])
date DateTime
weight Float? // grams
height Float? // cm
headCirc Float? // cm
notes String?
}
```
---
## Feature List
### Core Tracking
- **Allaitement** — timer (live), left/right breast toggle, duration saved
- **Biberon** — volume (mL), type (lait maternel / artificiel)
- **Couche** — wet / selles (color picker: jaune/vert/marron/rouge), quantité
- **Sieste** — start/stop timer or manual duration
- **Sommeil nocturne** — start/stop timer or manual
- **Traitement** — name, dose, unit (mL/mg), notes
- **Température** — value + unit
### Notes
Every event has an optional notes field, editable after creation.
### Quick-Log UX
- Home = big action buttons (68 tiles, thumb-friendly)
- One tap → opens modal with minimal required fields → Save
- For timers: tap starts timer (persists on reload), tap again stops
### Timeline
- Chronological feed, grouped by day
- Each entry shows type icon, time, duration/value, who logged, notes snippet
- Tap to expand/edit/delete
### Stats Dashboard
- Today: counts per category, total sleep, total feed time
- Weekly trends: bar charts (feeds/day, sleep/day, diapers/day)
- Feed intervals: avg time between feeds
### Growth Charts
- Plot weight, height, head circumference over time
- Overlay WHO percentile curves (P3, P10, P25, P50, P75, P90, P97)
- Data from `GrowthLog` model
### Reminders / Alerts
- In-app badge: "Dernière tétée il y a 2h45"
- PWA push notification: configurable threshold (e.g. alert if no feed in 3h)
### Multi-parent Sync
- Family created on signup → invite code/link for second parent
- React Query polls every 510s → both parents see same timeline
- Event shows avatar/name of who logged it
### Export
- CSV: all events with filters (date range, type)
- PDF: weekly report summary
- Growth data exportable separately
---
## Pages / Routes
```
/ → redirect to /dashboard
/auth/login → email magic link or credentials
/auth/invite/[code] → join family
/dashboard → quick-log + today's summary + last-event badges
/timeline → full chronological log with filters
/stats → charts and summaries
/growth → growth log + WHO charts
/settings → baby info, family members, notifications, export
```
---
## UI/UX Design Principles
- **Mobile-first**, full responsive
- Large tap targets (min 48px)
- Color-coded event types (each type has icon + color)
- Dark mode support
- Minimal friction: most logs = 2 taps max
- French-first UI (labels in French, date locale fr-FR)
---
## Implementation Phases
### Phase 1 — Foundation
- Next.js 15 project scaffold, Tailwind, shadcn/ui
- Prisma + PostgreSQL schema + migrations
- NextAuth with credentials + invite system
### Phase 2 — Core Logging
- Quick-log home page (all 7 event types)
- Live timer component (persists via localStorage)
- Event modal (type-specific fields)
- Timeline page
### Phase 3 — Stats + Growth
- Stats dashboard with Recharts
- Growth log form + WHO percentile chart
### Phase 4 — Polish + Extras
- PWA manifest + push notifications
- Export (CSV + PDF)
- Settings page
- Dark mode
---
## Verification
- Run `pnpm dev`, log all event types, confirm they appear in timeline
- Log from two browser sessions (two parents), confirm 5s sync
- Check growth chart renders with WHO curves
- Test export (download CSV, open in Excel)
- Test PWA install on mobile + push notification
---
## Key Files to Create
- `prisma/schema.prisma` — full schema
- `src/app/(app)/dashboard/page.tsx` — main quick-log UI
- `src/app/(app)/timeline/page.tsx` — chronological view
- `src/components/event-modal/` — per-type log modals
- `src/components/timer/` — live timer component
- `src/lib/who-percentiles.ts` — WHO curve data
- `src/app/api/events/` — REST endpoints (CRUD)