diff --git a/CHECKS b/CHECKS index cb04103..a8bbcbd 100644 --- a/CHECKS +++ b/CHECKS @@ -1,3 +1,3 @@ WAIT=10 ATTEMPTS=6 -/ Casera +/ honeyDue diff --git a/CLAUDE.md b/CLAUDE.md index 25e9099..0b8b92d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,6 +1,6 @@ -# Casera Web (`myCribAPI-Web`) +# honeyDue Web (`honeyDueAPI-Web`) -Next.js web client for the Casera property management platform. Talks to the Go REST API backend. +Next.js web client for the honeyDue property management platform. Talks to the Go REST API backend. ## Build & Run @@ -32,10 +32,10 @@ npm run analyze # Bundle analysis ``` Browser → Next.js page (client component) → apiFetch("/tasks/") → /api/proxy/tasks (Next.js route handler) - → Go API (reads casera-token httpOnly cookie, forwards as Authorization header) + → Go API (reads honeydue-token httpOnly cookie, forwards as Authorization header) ``` -Auth tokens are stored as httpOnly cookies (`casera-token`), never exposed to JS. The Next.js `/api/proxy/[...path]` catch-all route forwards requests to the Go API. +Auth tokens are stored as httpOnly cookies (`honeydue-token`), never exposed to JS. The Next.js `/api/proxy/[...path]` catch-all route forwards requests to the Go API. ### Directory Structure @@ -103,7 +103,7 @@ src/ **Kanban boards**: Tasks display in kanban columns (overdue, due_soon, in_progress, not_started, completed). Uses `@dnd-kit` for drag-and-drop. Column names match Go API: `overdue_tasks`, `due_soon_tasks`, `in_progress_tasks`, `not_started_tasks`, `completed_tasks`. -**Middleware** (`src/middleware.ts`): Checks `casera-token` cookie. Redirects unauthenticated users to `/login` for protected routes. Skips API routes, static files, and public paths. +**Middleware** (`src/middleware.ts`): Checks `honeydue-token` cookie. Redirects unauthenticated users to `/login` for protected routes. Skips API routes, static files, and public paths. ## Conventions @@ -123,7 +123,7 @@ src/ | Variable | Description | Default | |----------|-------------|---------| -| `NEXT_PUBLIC_API_URL` | Go API URL (client-side) | `https://casera.treytartt.com/api` | +| `NEXT_PUBLIC_API_URL` | Go API URL (client-side) | `https://honeyDue.treytartt.com/api` | | `API_URL` | Go API URL (server-side, no proxy) | Falls back to `NEXT_PUBLIC_API_URL` | | `NEXT_PUBLIC_POSTHOG_KEY` | PostHog analytics key | — | | `NEXT_PUBLIC_POSTHOG_HOST` | PostHog host | — | diff --git a/README.md b/README.md index 21d53a6..bfb98c8 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# Casera Web App +# honeyDue Web App -Next.js web client for the Casera property management platform. Connects to the [Go REST API](https://github.com/akatreyt/casera-api) backend. +Next.js web client for the honeyDue property management platform. Connects to the [Go REST API](https://github.com/akatreyt/honeydue-api) backend. ## Features @@ -50,7 +50,7 @@ Open [http://localhost:3000](http://localhost:3000). | Variable | Description | Required | |----------|-------------|----------| -| `NEXT_PUBLIC_API_URL` | Go API base URL (e.g. `https://casera.treytartt.com/api`) | Yes | +| `NEXT_PUBLIC_API_URL` | Go API base URL (e.g. `https://honeyDue.treytartt.com/api`) | Yes | | `API_URL` | Server-side API URL (defaults to `NEXT_PUBLIC_API_URL`) | No | | `NEXT_PUBLIC_POSTHOG_KEY` | PostHog project API key | No | | `NEXT_PUBLIC_POSTHOG_HOST` | PostHog instance URL | No | diff --git a/docs/00-overview.md b/docs/00-overview.md index 0b1353a..56ba436 100644 --- a/docs/00-overview.md +++ b/docs/00-overview.md @@ -1,8 +1,8 @@ -# Casera Web App — Build Plan Overview +# honeyDue Web App — Build Plan Overview ## What We're Building -Full parity web app for Casera: **46 screens**, **104 API operations**, **4 domains** (Residences, Tasks, Contractors, Documents), plus auth, onboarding, subscriptions, settings, and a **sandboxed demo mode** with mock data. +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 @@ -33,7 +33,7 @@ Full parity web app for Casera: **46 screens**, **104 API operations**, **4 doma ## Project Structure ``` -myCribAPI-Web/ +honeyDueAPI-Web/ ├── src/ │ ├── app/ # Next.js App Router │ │ ├── (marketing)/ # Public pages (landing, pricing) @@ -86,7 +86,7 @@ myCribAPI-Web/ |---|---| | Push notifications | Not needed (no push API for web in scope) | | Widgets | Not applicable | -| .casera file import/export | File download (export) + drag-and-drop or file picker (import) | +| .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) | @@ -112,4 +112,4 @@ myCribAPI-Web/ | Demo mode data isolation | No backend calls, purely client-side, session-scoped store, no persistence | | API compatibility | 100% same endpoints, same token format (`Token `), 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.casera.treytartt.com`), no coupling to Go API deployment | +| Deployment independence | Separate Dokku app, own domain (e.g., `app.honeydue.treytartt.com`), no coupling to Go API deployment | diff --git a/docs/01-foundation.md b/docs/01-foundation.md index c0a9467..4863363 100644 --- a/docs/01-foundation.md +++ b/docs/01-foundation.md @@ -18,8 +18,8 @@ Scaffold the project, wire up auth, build the app shell, and establish the desig ## 1. Project Scaffold ```bash -npx create-next-app@latest myCribAPI-Web --typescript --tailwind --eslint --app --src-dir -cd myCribAPI-Web +npx create-next-app@latest honeyDueAPI-Web --typescript --tailwind --eslint --app --src-dir +cd honeyDueAPI-Web npx shadcn@latest init ``` @@ -33,9 +33,9 @@ npm install -D vitest @playwright/test ## 2. TypeScript Types Generate TypeScript types matching the Go API DTOs. Source from: -- `myCribAPI-go/internal/dto/requests/` — request shapes -- `myCribAPI-go/internal/dto/responses/` — response shapes -- `myCribAPI-go/internal/models/` — entity shapes +- `honeyDueAPI-go/internal/dto/requests/` — request shapes +- `honeyDueAPI-go/internal/dto/responses/` — response shapes +- `honeyDueAPI-go/internal/models/` — entity shapes Key types to define in `src/lib/types/`: @@ -73,7 +73,7 @@ api/ ```typescript // src/lib/api/client.ts -const API_BASE_URL = process.env.NEXT_PUBLIC_API_URL || 'https://mycrib.treytartt.com/api'; +const API_BASE_URL = process.env.NEXT_PUBLIC_API_URL || 'https://honeyDue.treytartt.com/api'; async function apiFetch( path: string, @@ -225,7 +225,7 @@ Match the mobile app's theme system: | Desert | TBD | TBD | | Mint | TBD | TBD | -Theme values sourced from `MyCribKMM/composeApp/src/commonMain/.../ui/theme/ThemeColors.kt`. +Theme values sourced from `HoneyDueKMM/composeApp/src/commonMain/.../ui/theme/ThemeColors.kt`. ### Spacing diff --git a/docs/03-advanced-features.md b/docs/03-advanced-features.md index 25d2784..ae5eef4 100644 --- a/docs/03-advanced-features.md +++ b/docs/03-advanced-features.md @@ -4,8 +4,8 @@ Build sharing, subscriptions, notifications, profile, onboarding, and summary me ## Checklist -- [ ] Residence sharing: generate/display share code, join residence, manage users, .casera file export/import -- [ ] Contractor sharing: .casera file export/import +- [ ] Residence sharing: generate/display share code, join residence, manage users, .honeydue file export/import +- [ ] Contractor sharing: .honeydue file export/import - [ ] Subscription: status display, feature comparison, upgrade prompt, usage tracking - [ ] Notification preferences: toggle + time picker per notification type - [ ] Profile: edit name/email, change password, delete account @@ -22,7 +22,7 @@ Build sharing, subscriptions, notifications, profile, onboarding, and summary me | Route | Screen | Description | |-------|--------|-------------| | `/app/residences/[id]/share` | Share Residence | Generate/display share code, manage users | -| `/app/residences/join` | Join Residence | Enter share code or import .casera file | +| `/app/residences/join` | Join Residence | Enter share code or import .honeydue file | ### Share Code Flow @@ -35,15 +35,15 @@ Owner opens Share screen Invitee opens Join screen → Enter share code manually, OR - → Upload .casera file (drag-and-drop zone) + → Upload .honeydue file (drag-and-drop zone) → POST /api/residences/join/ { code: "ABC123" } → On success: redirect to residence detail ``` -### .casera File Handling +### .honeydue File Handling **Export** (owner): -- Button on residence detail: "Export as .casera" +- Button on residence detail: "Export as .honeydue" - Generates JSON file with `{ type: "residence", code: "ABC123", ... }` - Browser downloads the file @@ -73,7 +73,7 @@ Invitee opens Join screen ## 2. Contractor Sharing -### .casera File Export/Import +### .honeydue File Export/Import **Export**: - Button on contractor detail: "Share Contractor" @@ -82,7 +82,7 @@ Invitee opens Join screen **Import**: - Button on contractor list: "Import Contractor" -- File picker or drag-and-drop for .casera file +- File picker or drag-and-drop for .honeydue file - Read JSON, show confirmation dialog, create contractor - `POST /api/contractors/import/` @@ -123,7 +123,7 @@ Check tier limits before allowing creation: ### Upgrade Path (Phase 1) Web users are directed to the mobile app for purchases: -- "Download Casera on the App Store to upgrade" +- "Download honeyDue on the App Store to upgrade" - Link to App Store listing ### Upgrade Path (Future — Phase 2) @@ -215,7 +215,7 @@ Add Stripe Checkout for web-only subscription purchases. Requires backend work t ``` Step 1: Welcome - → "Welcome to Casera! Let's set up your first property." + → "Welcome to honeyDue! Let's set up your first property." Step 2: Choose Path → "Create a new residence" OR "Join an existing residence" @@ -300,7 +300,7 @@ Data sources: At the end of Phase 3, you should have: 1. Residence sharing with code generation, join flow, and user management -2. Contractor sharing via .casera files +2. Contractor sharing via .honeydue files 3. Subscription status with tier limits and upgrade prompts 4. Notification preferences with toggles 5. Profile editing (name, email, password, delete account) diff --git a/docs/04-demo-mode.md b/docs/04-demo-mode.md index bd9f45a..4dcb2cf 100644 --- a/docs/04-demo-mode.md +++ b/docs/04-demo-mode.md @@ -261,7 +261,7 @@ Persistent banner at the top of the demo app: ``` ┌─────────────────────────────────────────────────────────────────┐ -│ 🎯 You're exploring Casera in demo mode. [Sign Up Free] │ +│ 🎯 You're exploring honeyDue in demo mode. [Sign Up Free] │ │ Changes aren't saved. Create an account to get started! │ └─────────────────────────────────────────────────────────────────┘ ``` @@ -282,7 +282,7 @@ Before entering the demo, show a brief preview page: ``` ┌─────────────────────────────────────────────────────┐ │ │ -│ 🏠 Try Casera — No Account Needed │ +│ 🏠 Try honeyDue — No Account Needed │ │ │ │ Manage your home maintenance, track tasks, │ │ organize contractors, and store documents. │ diff --git a/docs/05-polish-deploy.md b/docs/05-polish-deploy.md index d9eb13e..2c6571a 100644 --- a/docs/05-polish-deploy.md +++ b/docs/05-polish-deploy.md @@ -162,7 +162,7 @@ const nextConfig = { output: 'standalone', // Required for Docker images: { remotePatterns: [ - { protocol: 'https', hostname: 'mycrib.treytartt.com' }, // API media + { protocol: 'https', hostname: 'honeyDue.treytartt.com' }, // API media ], }, }; @@ -171,14 +171,14 @@ const nextConfig = { ### Dokku Deployment ```bash -# On mycribDev server -dokku apps:create casera-web -dokku domains:add casera-web app.casera.treytartt.com -dokku config:set casera-web NEXT_PUBLIC_API_URL=https://mycrib.treytartt.com/api -dokku letsencrypt:enable casera-web +# On honeyDueDev server +dokku apps:create honeydue-web +dokku domains:add honeydue-web app.honeyDue.treytartt.com +dokku config:set honeydue-web NEXT_PUBLIC_API_URL=https://honeyDue.treytartt.com/api +dokku letsencrypt:enable honeydue-web # Deploy -git remote add dokku-web dokku@mycribDev:casera-web +git remote add dokku-web dokku@honeyDueDev:honeydue-web git push dokku-web main ``` @@ -316,17 +316,17 @@ Marketing and demo pages need proper meta tags: ```typescript // src/app/(marketing)/page.tsx export const metadata: Metadata = { - title: 'Casera — Home Maintenance Made Simple', + title: 'honeyDue — Home Maintenance Made Simple', description: 'Track tasks, organize contractors, store documents. Manage your home maintenance in one place.', openGraph: { - title: 'Casera — Home Maintenance Made Simple', + title: 'honeyDue — Home Maintenance Made Simple', description: 'Track tasks, organize contractors, store documents.', images: ['/og-image.png'], type: 'website', }, twitter: { card: 'summary_large_image', - title: 'Casera', + title: 'honeyDue', description: 'Home Maintenance Made Simple', images: ['/og-image.png'], }, @@ -391,7 +391,7 @@ Track same events as mobile app for consistent analytics. At the end of Phase 5, you should have: 1. Fully responsive web app (mobile, tablet, desktop) 2. Consistent loading, empty, and error states everywhere -3. Deployed on Dokku at `app.casera.treytartt.com` +3. Deployed on Dokku at `app.honeyDue.treytartt.com` 4. E2E tests covering auth, CRUD, demo mode, and responsive viewports 5. Optimized bundle with code splitting and image optimization 6. SEO-ready marketing and demo pages diff --git a/docs/plans/2026-03-02-core-crud.md b/docs/plans/2026-03-02-core-crud.md index 501e997..78ae980 100644 --- a/docs/plans/2026-03-02-core-crud.md +++ b/docs/plans/2026-03-02-core-crud.md @@ -56,7 +56,7 @@ Task 6: Integration + Verification (sequential — cross-domain wiring) ### Step 1: Install missing shadcn components and @dnd-kit ```bash -cd myCribAPI-Web +cd honeyDueAPI-Web npx shadcn@latest add dialog select textarea tabs skeleton tooltip popover calendar npm install @dnd-kit/core @dnd-kit/sortable @dnd-kit/utilities date-fns ``` @@ -688,7 +688,7 @@ export * from './use-documents'; ### Step 14: Verify build ```bash -cd myCribAPI-Web && npm run build +cd honeyDueAPI-Web && npm run build ``` Expected: Build succeeds with no type errors. @@ -1253,7 +1253,7 @@ export default function EditResidencePage({ ### Step 9: Verify build ```bash -cd myCribAPI-Web && npm run build +cd honeyDueAPI-Web && npm run build ``` Expected: Build succeeds. All 4 residence routes render. @@ -2198,7 +2198,7 @@ export default function TaskDetailPage({ ### Step 11: Verify build ```bash -cd myCribAPI-Web && npm run build +cd honeyDueAPI-Web && npm run build ``` ### Step 12: Commit @@ -2282,7 +2282,7 @@ Follow the same patterns as Residences (Task 2). Key differences: ### Step 9: Verify build ```bash -cd myCribAPI-Web && npm run build +cd honeyDueAPI-Web && npm run build ``` ### Step 10: Commit @@ -2363,7 +2363,7 @@ Key differences from other domains: ### Step 9: Verify build ```bash -cd myCribAPI-Web && npm run build +cd honeyDueAPI-Web && npm run build ``` ### Step 10: Commit @@ -2442,7 +2442,7 @@ export default function DashboardPage() { ### Step 2: Full build verification ```bash -cd myCribAPI-Web && npm run build +cd honeyDueAPI-Web && npm run build ``` Expected: Build succeeds. All routes compile. No type errors. diff --git a/docs/plans/2026-03-03-advanced-features.md b/docs/plans/2026-03-03-advanced-features.md index 3fb19f5..359b81f 100644 --- a/docs/plans/2026-03-03-advanced-features.md +++ b/docs/plans/2026-03-03-advanced-features.md @@ -42,7 +42,7 @@ Task 7: Integration + Verification (sequential — cross-feature wiring) ### Step 1: Install Recharts ```bash -cd /Users/treyt/Desktop/code/MyCrib/myCribAPI-Web +cd /Users/treyt/Desktop/code/HoneyDue/honeyDueAPI-Web npm install recharts ``` @@ -282,7 +282,7 @@ export * from './use-subscription'; ### Step 9: Verify build ```bash -cd /Users/treyt/Desktop/code/MyCrib/myCribAPI-Web && npm run build +cd /Users/treyt/Desktop/code/HoneyDue/honeyDueAPI-Web && npm run build ``` ### Step 10: Commit @@ -302,7 +302,7 @@ git add -A && git commit -m "feat: add Phase 3 foundation — notification hooks - Create: `src/app/app/residences/join/page.tsx` - Create: `src/components/sharing/share-code-display.tsx` - Create: `src/components/sharing/user-management.tsx` -- Create: `src/components/sharing/casera-file-handler.tsx` +- Create: `src/components/sharing/honeydue-file-handler.tsx` - Create: `src/lib/hooks/use-sharing.ts` - Modify: `src/app/app/residences/[id]/page.tsx` (add Share button) - Modify: `src/app/app/contractors/[id]/page.tsx` (add Share/Export button) @@ -320,11 +320,11 @@ git add -A && git commit -m "feat: add Phase 3 foundation — notification hooks - Each user row: name, email, role badge (Owner/Member) - Owner can click "Remove" → ConfirmDialog → `residencesApi.removeResidenceUser(residenceId, userId)` -### .casera File Handler +### .honeydue File Handler -**casera-file-handler.tsx** — Reusable component for both residence and contractor sharing: -- **Export mode**: Takes data object, generates JSON `{ type: "residence"|"contractor", ... }`, triggers browser download as `.casera` file -- **Import mode**: FileUpload drop zone accepting `.casera` files, reads JSON, validates type, calls callback with parsed data +**honeydue-file-handler.tsx** — Reusable component for both residence and contractor sharing: +- **Export mode**: Takes data object, generates JSON `{ type: "residence"|"contractor", ... }`, triggers browser download as `.honeydue` file +- **Import mode**: FileUpload drop zone accepting `.honeydue` files, reads JSON, validates type, calls callback with parsed data - Uses `URL.createObjectURL` + anchor click for download - Uses `FileReader.readAsText` for import @@ -332,19 +332,19 @@ git add -A && git commit -m "feat: add Phase 3 foundation — notification hooks **Residence Share page** (`/app/residences/[id]/share`): - ShareCodeDisplay for generating/displaying share codes -- .casera export button → downloads file with share code embedded +- .honeydue export button → downloads file with share code embedded - UserManagement table - Only accessible to residence owner **Residence Join page** (`/app/residences/join`): - Text input for manual code entry -- .casera file import drop zone +- .honeydue file import drop zone - On submit: calls `residencesApi.joinWithCode()` → redirect to residence detail ### Contractor Sharing -On contractor detail page, add "Share" button → generates .casera file with contractor data for download. -On contractor list page, add "Import" button → opens import dialog → reads .casera file → creates contractor via API. +On contractor detail page, add "Share" button → generates .honeydue file with contractor data for download. +On contractor list page, add "Import" button → opens import dialog → reads .honeydue file → creates contractor via API. ### Query hooks @@ -405,13 +405,13 @@ export function useJoinResidence() { ### Verify build ```bash -cd /Users/treyt/Desktop/code/MyCrib/myCribAPI-Web && npm run build +cd /Users/treyt/Desktop/code/HoneyDue/honeyDueAPI-Web && npm run build ``` ### Commit ```bash -git add -A && git commit -m "feat: add residence sharing (share code, join, user management) and contractor .casera export/import" +git add -A && git commit -m "feat: add residence sharing (share code, join, user management) and contractor .honeydue export/import" ``` --- @@ -489,7 +489,7 @@ export async function deleteAccount(): Promise { ### Verify build ```bash -cd /Users/treyt/Desktop/code/MyCrib/myCribAPI-Web && npm run build +cd /Users/treyt/Desktop/code/HoneyDue/honeyDueAPI-Web && npm run build ``` ### Commit @@ -560,7 +560,7 @@ npx shadcn@latest add switch ### Verify build ```bash -cd /Users/treyt/Desktop/code/MyCrib/myCribAPI-Web && npm run build +cd /Users/treyt/Desktop/code/HoneyDue/honeyDueAPI-Web && npm run build ``` ### Commit @@ -623,11 +623,11 @@ export const useOnboardingStore = create()((set) => ({ - Clean, centered layout (no sidebar or app shell) - Progress indicator (step dots or progress bar) -- Casera logo at top +- honeyDue logo at top ### Steps -**Step 0: Welcome** — "Welcome to Casera!" message, illustration, "Get Started" button +**Step 0: Welcome** — "Welcome to honeyDue!" message, illustration, "Get Started" button **Step 1: Choose Path** — Two cards: "Create a new residence" (House icon) and "Join an existing residence" (Users icon). Clicking sets path and advances. @@ -637,7 +637,7 @@ export const useOnboardingStore = create()((set) => ({ - **Step 4a: Complete** — "You're all set!" Redirect to `/app/residences/${id}` **Path B — Join:** -- **Step 2b: Join Residence** — Code input (6-char) or .casera file import. On submit: joins via API, advances. +- **Step 2b: Join Residence** — Code input (6-char) or .honeydue file import. On submit: joins via API, advances. - **Step 3b: Complete** — "Welcome to the residence!" Redirect to residence detail. ### Onboarding trigger @@ -649,7 +649,7 @@ For now, just mark `localStorage.setItem('onboarding_complete', 'true')` after c ### Verify build ```bash -cd /Users/treyt/Desktop/code/MyCrib/myCribAPI-Web && npm run build +cd /Users/treyt/Desktop/code/HoneyDue/honeyDueAPI-Web && npm run build ``` ### Commit @@ -714,7 +714,7 @@ On residence detail page (`src/app/app/residences/[id]/page.tsx`), add a "Downlo ### Verify build ```bash -cd /Users/treyt/Desktop/code/MyCrib/myCribAPI-Web && npm run build +cd /Users/treyt/Desktop/code/HoneyDue/honeyDueAPI-Web && npm run build ``` ### Commit @@ -732,7 +732,7 @@ git add -A && git commit -m "feat: add enhanced dashboard with charts and task r ### Step 1: Full build verification ```bash -cd /Users/treyt/Desktop/code/MyCrib/myCribAPI-Web && npm run build +cd /Users/treyt/Desktop/code/HoneyDue/honeyDueAPI-Web && npm run build ``` ### Step 2: Route verification @@ -766,8 +766,8 @@ git add -A && git commit -m "feat: complete Phase 3 — advanced features integr At the end of Phase 3, verify: - [ ] **Residence sharing**: generate share code, copy, join with code, manage users (list/remove) -- [ ] **Contractor sharing**: .casera file export from detail, import on list page -- [ ] **.casera files**: download as JSON, import via drag-and-drop +- [ ] **Contractor sharing**: .honeydue file export from detail, import on list page +- [ ] **.honeydue files**: download as JSON, import via drag-and-drop - [ ] **Subscription**: status display with usage bars, feature comparison table, upgrade CTA - [ ] **Feature gating**: upgrade prompt dialog available for tier limit enforcement - [ ] **Notification preferences**: toggle switches per notification type, saves immediately diff --git a/next.config.ts b/next.config.ts index 43f44ec..64d5b9b 100644 --- a/next.config.ts +++ b/next.config.ts @@ -11,7 +11,7 @@ const nextConfig: NextConfig = { remotePatterns: [ { protocol: "https", - hostname: "casera.treytartt.com", + hostname: "honeyDue.treytartt.com", }, ], }, diff --git a/package-lock.json b/package-lock.json index ce9bb0c..a2b413d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { - "name": "casera-web", + "name": "honeydue-web", "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "casera-web", + "name": "honeydue-web", "version": "0.1.0", "dependencies": { "@dnd-kit/core": "^6.3.1", diff --git a/package.json b/package.json index 539e679..f971617 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "casera-web", + "name": "honeydue-web", "version": "0.1.0", "private": true, "scripts": { diff --git a/src/app/(auth)/layout.tsx b/src/app/(auth)/layout.tsx index 73b0912..782575f 100644 --- a/src/app/(auth)/layout.tsx +++ b/src/app/(auth)/layout.tsx @@ -26,13 +26,13 @@ export default function AuthLayout({ children }: { children: React.ReactNode }) Casera - Casera + honeyDue @@ -49,7 +49,7 @@ export default function AuthLayout({ children }: { children: React.ReactNode })

- © {new Date().getFullYear()} Casera + © {new Date().getFullYear()} honeyDue

diff --git a/src/app/(auth)/register/page.tsx b/src/app/(auth)/register/page.tsx index 6367bfd..9b7ac1e 100644 --- a/src/app/(auth)/register/page.tsx +++ b/src/app/(auth)/register/page.tsx @@ -47,7 +47,7 @@ export default function RegisterPage() { return ( Already have an account?{" "} diff --git a/src/app/api/auth/login/route.ts b/src/app/api/auth/login/route.ts index a60330c..652ec57 100644 --- a/src/app/api/auth/login/route.ts +++ b/src/app/api/auth/login/route.ts @@ -11,9 +11,9 @@ import { NextRequest, NextResponse } from 'next/server'; const API_BASE_URL = process.env.API_URL || process.env.NEXT_PUBLIC_API_URL || - 'https://casera.treytartt.com/api'; + 'https://honeyDue.treytartt.com/api'; -const COOKIE_NAME = 'casera-token'; +const COOKIE_NAME = 'honeydue-token'; const COOKIE_MAX_AGE = 60 * 60 * 24 * 30; // 30 days export async function POST(request: NextRequest) { diff --git a/src/app/api/auth/logout/route.ts b/src/app/api/auth/logout/route.ts index 27b8352..1bc5b5a 100644 --- a/src/app/api/auth/logout/route.ts +++ b/src/app/api/auth/logout/route.ts @@ -11,9 +11,9 @@ import { NextRequest, NextResponse } from 'next/server'; const API_BASE_URL = process.env.API_URL || process.env.NEXT_PUBLIC_API_URL || - 'https://casera.treytartt.com/api'; + 'https://honeyDue.treytartt.com/api'; -const COOKIE_NAME = 'casera-token'; +const COOKIE_NAME = 'honeydue-token'; export async function POST(request: NextRequest) { try { diff --git a/src/app/api/auth/me/route.ts b/src/app/api/auth/me/route.ts index 79a076c..84361ee 100644 --- a/src/app/api/auth/me/route.ts +++ b/src/app/api/auth/me/route.ts @@ -11,9 +11,9 @@ import { NextRequest, NextResponse } from 'next/server'; const API_BASE_URL = process.env.API_URL || process.env.NEXT_PUBLIC_API_URL || - 'https://casera.treytartt.com/api'; + 'https://honeyDue.treytartt.com/api'; -const COOKIE_NAME = 'casera-token'; +const COOKIE_NAME = 'honeydue-token'; export async function GET(_request: NextRequest) { try { diff --git a/src/app/api/proxy/[...path]/route.ts b/src/app/api/proxy/[...path]/route.ts index c9c6bec..9e75636 100644 --- a/src/app/api/proxy/[...path]/route.ts +++ b/src/app/api/proxy/[...path]/route.ts @@ -5,18 +5,18 @@ import { NextRequest, NextResponse } from 'next/server'; // Catch-all proxy route handler // --------------------------------------------------------------------------- // Every authenticated client-side API call goes through this proxy. -// It reads the `casera-token` httpOnly cookie and forwards the request to the +// It reads the `honeydue-token` httpOnly cookie and forwards the request to the // Go API with an Authorization header. // --------------------------------------------------------------------------- const API_BASE_URL = process.env.API_URL || process.env.NEXT_PUBLIC_API_URL || - 'https://casera.treytartt.com/api'; + 'https://honeyDue.treytartt.com/api'; /** * Build the target URL from the catch-all path segments. - * e.g. /api/proxy/tasks/123/ -> https://casera.treytartt.com/api/tasks/123/ + * e.g. /api/proxy/tasks/123/ -> https://honeyDue.treytartt.com/api/tasks/123/ */ function buildTargetUrl(request: NextRequest, pathSegments: string[]): string { const path = `/${pathSegments.join('/')}`; @@ -53,7 +53,7 @@ async function buildHeaders(request: NextRequest): Promise { // Attach auth token from httpOnly cookie const cookieStore = await cookies(); - const token = cookieStore.get('casera-token')?.value; + const token = cookieStore.get('honeydue-token')?.value; if (token) { headers.set('Authorization', `Token ${token}`); } diff --git a/src/app/app/contractors/[id]/page.tsx b/src/app/app/contractors/[id]/page.tsx index d9fbbcb..016267f 100644 --- a/src/app/app/contractors/[id]/page.tsx +++ b/src/app/app/contractors/[id]/page.tsx @@ -14,7 +14,7 @@ import { LoadingSkeleton } from "@/components/shared/loading-skeleton"; import { ErrorBanner } from "@/components/shared/error-banner"; import { ConfirmDialog } from "@/components/shared/confirm-dialog"; import { StarRating } from "@/components/shared/star-rating"; -import { downloadCaseraFile } from "@/components/sharing/casera-file-handler"; +import { downloadHoneyDueFile } from "@/components/sharing/honeydue-file-handler"; import { useContractor, useContractorTasks, @@ -88,7 +88,7 @@ export default function ContractorDetailPage({ size="sm" onClick={() => { const exportData = { - type: "casera_contractor_share", + type: "honeydue_contractor_share", version: 1, contractor: { name: contractor.name, @@ -107,7 +107,7 @@ export default function ContractorDetailPage({ exported_at: new Date().toISOString(), }; const safeName = contractor.name.replace(/[^a-zA-Z0-9_-]/g, "_").toLowerCase(); - downloadCaseraFile(exportData, `${safeName}-contractor`); + downloadHoneyDueFile(exportData, `${safeName}-contractor`); }} > diff --git a/src/app/app/contractors/page.tsx b/src/app/app/contractors/page.tsx index e42f519..99c2325 100644 --- a/src/app/app/contractors/page.tsx +++ b/src/app/app/contractors/page.tsx @@ -11,7 +11,7 @@ import { PageHeader } from "@/components/shared/page-header"; import { LoadingSkeleton } from "@/components/shared/loading-skeleton"; import { ErrorBanner } from "@/components/shared/error-banner"; import { EmptyState } from "@/components/shared/empty-state"; -import { CaseraFileImport } from "@/components/sharing/casera-file-handler"; +import { HoneyDueFileImport } from "@/components/sharing/honeydue-file-handler"; import { ContractorCard } from "@/components/contractors/contractor-card"; import { ContractorFilters } from "@/components/contractors/contractor-filters"; import { useContractors, useToggleFavorite, useCreateContractor } from "@/lib/hooks/use-contractors"; @@ -66,7 +66,7 @@ export default function ContractorsPage() { typeof data === "object" && data !== null && "type" in data && - (data as Record).type === "casera_contractor_share" && + (data as Record).type === "honeydue_contractor_share" && "contractor" in data ) { const contractor = (data as Record).contractor as Record; @@ -97,7 +97,7 @@ export default function ContractorsPage() { }, ); } else { - setImportError("Invalid .casera file. Expected a contractor share file."); + setImportError("Invalid .honeydue file. Expected a contractor share file."); } } @@ -118,7 +118,7 @@ export default function ContractorsPage() { }} > - Import .casera + Import .honeydue @@ -168,16 +168,16 @@ export default function ContractorsPage() { )} - {/* Import .casera dialog */} + {/* Import .honeydue dialog */} Import Contractor - Import a contractor from a .casera file shared with you. + Import a contractor from a .honeydue file shared with you. - + {importError && (

{importError}

)} diff --git a/src/app/app/page.tsx b/src/app/app/page.tsx index b5311a8..260c552 100644 --- a/src/app/app/page.tsx +++ b/src/app/app/page.tsx @@ -281,7 +281,7 @@ export default function DashboardPage() {

- Welcome to Casera{name ? `, ${name}` : ""} + Welcome to honeyDue{name ? `, ${name}` : ""}

The easiest way to keep your home running smoothly. diff --git a/src/app/app/residences/[id]/share/page.tsx b/src/app/app/residences/[id]/share/page.tsx index 1b39324..dcb8083 100644 --- a/src/app/app/residences/[id]/share/page.tsx +++ b/src/app/app/residences/[id]/share/page.tsx @@ -9,7 +9,7 @@ import { LoadingSkeleton } from "@/components/shared/loading-skeleton"; import { ErrorBanner } from "@/components/shared/error-banner"; import { ShareCodeDisplay } from "@/components/sharing/share-code-display"; import { UserManagement } from "@/components/sharing/user-management"; -import { CaseraFileExport } from "@/components/sharing/casera-file-handler"; +import { HoneyDueFileExport } from "@/components/sharing/honeydue-file-handler"; import { useResidence } from "@/lib/hooks/use-residences"; import { useDataProvider } from "@/lib/demo/data-provider-context"; @@ -46,7 +46,7 @@ export default function ResidenceSharePage({ params }: SharePageProps) { // Build the exportable residence data const exportData = { - type: "casera_residence_share", + type: "honeydue_residence_share", version: 1, residence: { name: residence.name, @@ -87,16 +87,16 @@ export default function ResidenceSharePage({ params }: SharePageProps) { )} - {/* Export .casera file */} + {/* Export .honeydue file */} {residence.is_owner && (

-

- Download residence data as a portable .casera file. + Download residence data as a portable .honeydue file.

)} diff --git a/src/app/app/residences/join/page.tsx b/src/app/app/residences/join/page.tsx index 265ffba..ec67155 100644 --- a/src/app/app/residences/join/page.tsx +++ b/src/app/app/residences/join/page.tsx @@ -11,7 +11,7 @@ import { Label } from "@/components/ui/label"; import { Separator } from "@/components/ui/separator"; import { PageHeader } from "@/components/shared/page-header"; import { ErrorBanner } from "@/components/shared/error-banner"; -import { CaseraFileImport } from "@/components/sharing/casera-file-handler"; +import { HoneyDueFileImport } from "@/components/sharing/honeydue-file-handler"; import { useJoinResidence } from "@/lib/hooks/use-sharing"; import { useDataProvider } from "@/lib/demo/data-provider-context"; @@ -61,7 +61,7 @@ export default function JoinResidencePage() { }); } else { setFileError( - "Invalid .casera file. Expected a share package with a code field.", + "Invalid .honeydue file. Expected a share package with a code field.", ); } } @@ -126,13 +126,13 @@ export default function JoinResidencePage() { {/* File import */} - Import .casera File + Import .honeydue File - If you received a .casera share package file, import it here. + If you received a .honeydue share package file, import it here. - + {fileError && (

{fileError}

)} diff --git a/src/app/demo/layout.tsx b/src/app/demo/layout.tsx index c787b2f..2c126fc 100644 --- a/src/app/demo/layout.tsx +++ b/src/app/demo/layout.tsx @@ -1,13 +1,13 @@ import type { Metadata } from "next"; export const metadata: Metadata = { - title: "Try Casera — Free Demo", + title: "Try honeyDue — Free Demo", description: - "Try Casera without an account. Manage tasks, contractors, and documents in a live demo.", + "Try honeyDue without an account. Manage tasks, contractors, and documents in a live demo.", openGraph: { - title: "Try Casera — Free Demo", + title: "Try honeyDue — Free Demo", description: - "Try Casera without an account. Manage tasks, contractors, and documents in a live demo.", + "Try honeyDue without an account. Manage tasks, contractors, and documents in a live demo.", type: "website", }, }; diff --git a/src/app/demo/page.tsx b/src/app/demo/page.tsx index 94cf5c6..340d523 100644 --- a/src/app/demo/page.tsx +++ b/src/app/demo/page.tsx @@ -16,19 +16,19 @@ export default function DemoLandingPage() { Casera - Casera + honeyDue {/* Hero */}

- See Casera in action + See honeyDue in action

Explore the full app with sample data. No account needed — diff --git a/src/app/favicon.ico b/src/app/favicon.ico index 718d6fe..9f92b77 100644 Binary files a/src/app/favicon.ico and b/src/app/favicon.ico differ diff --git a/src/app/layout.tsx b/src/app/layout.tsx index c45b4e1..2268075 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -26,21 +26,21 @@ const geistMono = Geist_Mono({ export const metadata: Metadata = { title: { - default: "Casera — Home Maintenance Made Simple", - template: "%s | Casera", + default: "honeyDue — Home Maintenance Made Simple", + template: "%s | honeyDue", }, description: "Track tasks, organize contractors, store documents. Manage your home maintenance in one place.", openGraph: { - title: "Casera — Home Maintenance Made Simple", + title: "honeyDue — Home Maintenance Made Simple", description: "Track tasks, organize contractors, store documents. Manage your home maintenance in one place.", type: "website", - siteName: "Casera", + siteName: "honeyDue", }, twitter: { card: "summary_large_image", - title: "Casera — Home Maintenance Made Simple", + title: "honeyDue — Home Maintenance Made Simple", description: "Home Maintenance Made Simple", }, }; diff --git a/src/app/onboarding/layout.tsx b/src/app/onboarding/layout.tsx index 091ea50..3baae7d 100644 --- a/src/app/onboarding/layout.tsx +++ b/src/app/onboarding/layout.tsx @@ -41,7 +41,7 @@ export default function OnboardingLayout({ {/* Logo */}

- Casera + honeyDue

diff --git a/src/app/page.tsx b/src/app/page.tsx index 2a3868d..18b40fe 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -89,13 +89,13 @@ export default function HomePage() { Casera - Casera + honeyDue @@ -272,7 +272,7 @@ export default function HomePage() { Everything your home needs, nothing it doesn't.

- Casera brings all your home maintenance into one clear, + honeyDue brings all your home maintenance into one clear, organized space. No bloat, no learning curve.

@@ -406,13 +406,13 @@ export default function HomePage() { Casera - Casera + honeyDue

@@ -485,7 +485,7 @@ export default function HomePage() {

- © {new Date().getFullYear()} Casera. All rights reserved. + © {new Date().getFullYear()} honeyDue. All rights reserved.

Made for homeowners, by homeowners. diff --git a/src/app/subscription/success/page.tsx b/src/app/subscription/success/page.tsx index 51940b0..0072951 100644 --- a/src/app/subscription/success/page.tsx +++ b/src/app/subscription/success/page.tsx @@ -11,7 +11,7 @@ export default function SubscriptionSuccessPage() {

Thank you!

Your Pro subscription is now active. Enjoy unlimited access to all - Casera features. + honeyDue features.

diff --git a/src/components/layout/sidebar.tsx b/src/components/layout/sidebar.tsx index 10c17fe..444d35b 100644 --- a/src/components/layout/sidebar.tsx +++ b/src/components/layout/sidebar.tsx @@ -22,13 +22,13 @@ export function Sidebar() { Casera - Casera + honeyDue diff --git a/src/components/layout/top-bar.tsx b/src/components/layout/top-bar.tsx index 0b301a1..8cb48d1 100644 --- a/src/components/layout/top-bar.tsx +++ b/src/components/layout/top-bar.tsx @@ -49,13 +49,13 @@ export function TopBar() { Casera - Casera + honeyDue diff --git a/src/components/onboarding/welcome-step.tsx b/src/components/onboarding/welcome-step.tsx index f0926ea..05d50f1 100644 --- a/src/components/onboarding/welcome-step.tsx +++ b/src/components/onboarding/welcome-step.tsx @@ -9,8 +9,8 @@ export function WelcomeStep() { const user = useAuthStore((s) => s.user); const greeting = user?.first_name - ? `Welcome to Casera, ${user.first_name}!` - : "Welcome to Casera!"; + ? `Welcome to honeyDue, ${user.first_name}!` + : "Welcome to honeyDue!"; return (
diff --git a/src/components/shared/upgrade-prompt.tsx b/src/components/shared/upgrade-prompt.tsx index 4c85de9..3e7a533 100644 --- a/src/components/shared/upgrade-prompt.tsx +++ b/src/components/shared/upgrade-prompt.tsx @@ -44,7 +44,7 @@ export function UpgradePrompt({ open, onOpenChange, feature, limitInfo }: Upgrad features.

- Subscriptions are managed through the Casera iOS or Android app. + Subscriptions are managed through the honeyDue iOS or Android app.

diff --git a/src/components/sharing/casera-file-handler.tsx b/src/components/sharing/honeydue-file-handler.tsx similarity index 84% rename from src/components/sharing/casera-file-handler.tsx rename to src/components/sharing/honeydue-file-handler.tsx index 469003c..41ec687 100644 --- a/src/components/sharing/casera-file-handler.tsx +++ b/src/components/sharing/honeydue-file-handler.tsx @@ -9,16 +9,16 @@ import { Button } from "@/components/ui/button"; // --------------------------------------------------------------------------- /** - * Generates a `.casera` file from the given data object and triggers a download. + * Generates a `.honeydue` file from the given data object and triggers a download. */ -export function downloadCaseraFile(data: object, filename: string) { +export function downloadHoneyDueFile(data: object, filename: string) { const json = JSON.stringify(data, null, 2); const blob = new Blob([json], { type: "application/json" }); const url = URL.createObjectURL(blob); const anchor = document.createElement("a"); anchor.href = url; - anchor.download = filename.endsWith(".casera") ? filename : `${filename}.casera`; + anchor.download = filename.endsWith(".honeydue") ? filename : `${filename}.honeydue`; document.body.appendChild(anchor); anchor.click(); @@ -31,12 +31,12 @@ export function downloadCaseraFile(data: object, filename: string) { // Import component // --------------------------------------------------------------------------- -interface CaseraFileImportProps { +interface HoneyDueFileImportProps { onImport: (data: unknown) => void; accept?: string; } -export function CaseraFileImport({ onImport, accept = ".casera" }: CaseraFileImportProps) { +export function HoneyDueFileImport({ onImport, accept = ".honeydue" }: HoneyDueFileImportProps) { const inputRef = useRef(null); const [dragActive, setDragActive] = useState(false); const [error, setError] = useState(null); @@ -58,7 +58,7 @@ export function CaseraFileImport({ onImport, accept = ".casera" }: CaseraFileImp const parsed = JSON.parse(text); onImport(parsed); } catch { - setError("Invalid .casera file. Could not parse contents."); + setError("Invalid .honeydue file. Could not parse contents."); setFileName(null); } }; @@ -109,7 +109,7 @@ export function CaseraFileImport({ onImport, accept = ".casera" }: CaseraFileImp

- Drop a .casera file here or click to browse + Drop a .honeydue file here or click to browse

{fileName && (

@@ -136,18 +136,18 @@ export function CaseraFileImport({ onImport, accept = ".casera" }: CaseraFileImp // Export button component (convenience wrapper) // --------------------------------------------------------------------------- -interface CaseraFileExportProps { +interface HoneyDueFileExportProps { data: object; filename: string; label?: string; } -export function CaseraFileExport({ data, filename, label = "Export .casera" }: CaseraFileExportProps) { +export function HoneyDueFileExport({ data, filename, label = "Export .honeydue" }: HoneyDueFileExportProps) { return (