Files
honeyDueWeb/docs/00-overview.md
T
Trey t e2172c20f2 Rebrand from Casera/MyCrib to honeyDue
Total rebrand across Web project:
- Package name: casera-web -> honeydue-web
- Cookie: casera-token -> honeydue-token
- Theme store: casera-theme -> honeydue-theme
- File sharing: .casera -> .honeydue, component/function renames
- casera-file-handler.tsx -> honeydue-file-handler.tsx
- All UI text, metadata, OG tags updated
- Domains: casera.treytartt.com -> honeyDue.treytartt.com
- Demo data emails updated
- All documentation updated

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 06:33:59 -06:00

116 lines
6.0 KiB
Markdown

# honeyDue Web App — Build Plan Overview
## What We're Building
Full parity web app for honeyDue: **46 screens**, **104 API operations**, **4 domains** (Residences, Tasks, Contractors, Documents), plus auth, onboarding, subscriptions, settings, and a **sandboxed demo mode** with mock data.
## Tech Stack
| Layer | Choice |
|---|---|
| Framework | Next.js 15 (App Router) |
| Language | TypeScript |
| Styling | Tailwind CSS 4 |
| Components | shadcn/ui + Radix primitives |
| State (server) | TanStack Query v5 |
| State (client) | Zustand |
| Forms | React Hook Form + Zod validation |
| Auth | httpOnly cookie storing API token, Next.js middleware for route protection |
| Kanban | dnd-kit (drag-and-drop) for task board |
| Charts/metrics | Recharts (for summary dashboard) |
| Icons | Lucide (matches shadcn/ui) |
| Testing | Vitest + Playwright |
| Deployment | Docker → Dokku (separate app) |
## Why Next.js + shadcn/ui
- SSR for the marketing landing + demo preview (SEO, social sharing)
- shadcn/ui gives the exact component primitives this app needs (kanban boards, forms, dialogs, data tables)
- TanStack Query maps perfectly to the existing `APILayer``DataManager` cache pattern
- Separate Dokku app keeps deployment independent
- Biggest ecosystem for finding solutions
## Project Structure
```
honeyDueAPI-Web/
├── src/
│ ├── app/ # Next.js App Router
│ │ ├── (marketing)/ # Public pages (landing, pricing)
│ │ ├── (auth)/ # Login, Register, Forgot Password, Reset
│ │ ├── (onboarding)/ # Multi-step onboarding flow
│ │ ├── (demo)/ # Demo mode (sandboxed)
│ │ │ └── layout.tsx # Wraps demo in DemoProvider context
│ │ ├── (app)/ # Authenticated app
│ │ │ ├── residences/ # List, [id] detail, new, [id]/edit
│ │ │ ├── tasks/ # Kanban board, new, [id]/edit, [id]/complete
│ │ │ ├── contractors/ # List, [id] detail, new, [id]/edit
│ │ │ ├── documents/ # Tabs (warranties/documents), [id] detail
│ │ │ └── settings/ # Profile, notifications, themes, subscription
│ │ └── layout.tsx # Root layout
│ ├── components/
│ │ ├── ui/ # shadcn/ui primitives
│ │ ├── forms/ # Reusable form components
│ │ ├── cards/ # ResidenceCard, TaskCard, ContractorCard, etc.
│ │ ├── kanban/ # KanbanBoard, KanbanColumn, TaskActions
│ │ └── shared/ # EmptyState, LoadingOverlay, ErrorBanner, etc.
│ ├── lib/
│ │ ├── api/ # API client (typed fetch wrappers per domain)
│ │ ├── demo/ # DemoDataProvider + mock data seeds
│ │ ├── auth/ # Token management, middleware helpers
│ │ ├── hooks/ # useResidences, useTasks, etc. (TanStack Query)
│ │ └── types/ # TypeScript types matching API DTOs
│ ├── stores/ # Zustand stores (auth, theme, demo state)
│ └── styles/ # Tailwind theme config, design tokens
├── public/ # Static assets
├── Dockerfile
├── next.config.ts
├── tailwind.config.ts
├── package.json
└── CLAUDE.md
```
## Build Phases
| Phase | Focus | Details |
|-------|-------|---------|
| [Phase 1](./01-foundation.md) | Foundation | Scaffold, auth, layout, design system |
| [Phase 2](./02-core-crud.md) | Core CRUD | 4 domains: residences, tasks, contractors, documents |
| [Phase 3](./03-advanced-features.md) | Advanced Features | Sharing, subscription, notifications, onboarding |
| [Phase 4](./04-demo-mode.md) | Demo Mode | Mock data, in-memory store, session isolation |
| [Phase 5](./05-polish-deploy.md) | Polish & Deploy | Responsive, error handling, Dockerfile, tests |
## Web-Only Adaptations
| Mobile Feature | Web Equivalent |
|---|---|
| Push notifications | Not needed (no push API for web in scope) |
| Widgets | Not applicable |
| .honeydue file import/export | File download (export) + drag-and-drop or file picker (import) |
| Apple/Google Sign In | OAuth redirect flow (same backend endpoints) |
| StoreKit subscription | Stripe Checkout or link to App Store (TBD) |
| Camera capture | File upload input (no camera API needed) |
| Haptics | N/A |
| Background refresh | TanStack Query `refetchInterval` + window focus refetch |
## Risks & Mitigations
| Risk | Mitigation |
|---|---|
| Kanban board performance with many tasks | Virtualize columns with `react-window`, limit initial render to 50 tasks per column |
| Demo mode state leaking between sessions | Session ID in httpOnly cookie, Zustand store scoped to session, auto-clear on expiry |
| File upload size limits | Match backend 10MB limit, client-side validation before upload |
| OAuth redirect for Apple/Google | Use backend's existing social auth endpoints, redirect flow instead of native SDK |
| Subscription without StoreKit | Phase 1: link to App Store. Phase 2: add Stripe for web-only purchases (requires backend work) |
| 46 screens is a lot of UI | shadcn/ui + consistent patterns reduce per-screen effort to ~1-2 hours each after foundation is built |
## Security Considerations
| Concern | Approach |
|---|---|
| Auth token in browser | httpOnly cookie, not accessible to JS, CSRF protection via SameSite=Strict |
| Demo mode data isolation | No backend calls, purely client-side, session-scoped store, no persistence |
| API compatibility | 100% same endpoints, same token format (`Token <hex>`), same request/response shapes |
| Mobile feature gaps | Push notifications and widgets explicitly excluded. Everything else covered. |
| Deployment independence | Separate Dokku app, own domain (e.g., `app.honeydue.treytartt.com`), no coupling to Go API deployment |