Stack

LayerTechnology
FrontendReact 18 + TypeScript (Vite 5) — served by Cloudflare Pages
Backend APICloudflare Worker (TypeScript)
DatabaseCloudflare D1 (SQLite) — caretaker_db
AuthPBKDF2-SHA256 password hash in D1, HMAC-signed JWT tokens
EmailNot yet wired — planned via Resend

Repo & Local Path

ItemValue
GitHubgithub.com/sonantechai/caretaker-portal
Local rootE:\Claude_Projects\sonan-trackers\caretaker-portal-Claude\caretaker-portal\
Wrangler envcastlecheckers

Database Schema

TablePurposeKey Columns
admin_usersAdmin loginid, email, password_hash (PBKDF2)
clientsClient recordsid, name, email, phone, service_address, notes
service_requestsPublic form submissionsid, name, email, phone, service_types (JSON), flight_number, notes, status
appointmentsScheduled visitsid, client_id, date, time, service_type, duration, status, notes
invoicesBillingid, invoice_number, client_id, amount_cents, status, issue_date
invoice_itemsLine itemsid, invoice_id, description, quantity, unit_price_cents
notesInternal notesid, entity_type, entity_id, content
settingsBusiness configkey, value — business_name, service_types, task_checklist, invoice_footer, etc.

Key API Routes

MethodRouteAuthPurpose
GET/api/configNonePublic — returns settings JSON for public site
POST/api/requestsNonePublic — submit service request from wizard
POST/api/auth/loginNoneAdmin login — returns JWT
GET/POST/PUT/DELETE/api/clients/*JWTClient CRUD
GET/POST/PUT/DELETE/api/requests/*JWTService request management
GET/POST/PUT/DELETE/api/appointments/*JWTAppointment CRUD
GET/POST/PUT/DELETE/api/invoices/*JWTInvoice CRUD + line items
GET/PUT/api/settingsJWTRead + update business settings
POST/api/auth/change-passwordJWTAdmin 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