Stack
| Layer | Technology |
| Frontend | React 18 + TypeScript (Vite 5) — served by Cloudflare Pages |
| Backend API | Cloudflare Worker (TypeScript) |
| Database | Cloudflare D1 (SQLite) — caretaker_db |
| Auth | PBKDF2-SHA256 password hash in D1, HMAC-signed JWT tokens |
| Email | Not yet wired — planned via Resend |
Repo & Local Path
Database Schema
| Table | Purpose | Key Columns |
| admin_users | Admin login | id, email, password_hash (PBKDF2) |
| clients | Client records | id, name, email, phone, service_address, notes |
| service_requests | Public form submissions | id, name, email, phone, service_types (JSON), flight_number, notes, status |
| appointments | Scheduled visits | id, client_id, date, time, service_type, duration, status, notes |
| invoices | Billing | id, invoice_number, client_id, amount_cents, status, issue_date |
| invoice_items | Line items | id, invoice_id, description, quantity, unit_price_cents |
| notes | Internal notes | id, entity_type, entity_id, content |
| settings | Business config | key, value — business_name, service_types, task_checklist, invoice_footer, etc. |
Key API Routes
| Method | Route | Auth | Purpose |
| GET | /api/config | None | Public — returns settings JSON for public site |
| POST | /api/requests | None | Public — submit service request from wizard |
| POST | /api/auth/login | None | Admin login — returns JWT |
| GET/POST/PUT/DELETE | /api/clients/* | JWT | Client CRUD |
| GET/POST/PUT/DELETE | /api/requests/* | JWT | Service request management |
| GET/POST/PUT/DELETE | /api/appointments/* | JWT | Appointment CRUD |
| GET/POST/PUT/DELETE | /api/invoices/* | JWT | Invoice CRUD + line items |
| GET/PUT | /api/settings | JWT | Read + update business settings |
| POST | /api/auth/change-password | JWT | Admin password change |
File Structure
caretaker-portal/
src/
App.tsx ← Root — token check → PublicSite or AdminApp
api.ts ← All fetch() calls
index.css ← Mobile-first CSS
main.tsx ← Vite entry
context/AppContext.tsx ← Global state + config load
components/
PublicSite.tsx ← Config-driven public site
ServiceRequestWizard.tsx ← Multi-step request form
AdminApp.tsx ← Sidebar + hamburger shell
admin/ ← Dashboard, Requests, Clients, Appointments, Calendar, Invoices, Reports, Settings
worker/index.ts ← Worker API (all routes)
migrations/
0001_init.sql ← Full schema
0002_settings_seed.sql ← Castle Checkers defaults + password hash
wrangler.toml ← castlecheckers env configured