Last updated: 2026-07-12

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

Migrations

FileWhat It Does
0001_init.sqlFull schema — admin_users, clients, service_requests, appointments, invoices, invoice_items, notes, settings, properties
0002_settings_seed.sqlCastle Checkers seed data — business config, service types, default checklist, and PBKDF2 admin password hash
0003_flight_fields.sqlAdds extended flight columns to appointments: dep_flight, dep_airline, dep_date, dep_time, client_dep_pickup, arr_flight, arr_airline, arr_date, arr_time, client_arr_pickup, title
0004_phone_index.sqlAdds an index on clients.phone for faster lookups
0005_call_back_service.sqlAdds "Call Back" as a built-in service type option
0006_blocked_days.sqlCreates blocked_days table (id, date, reason) for marking dates the admin is unavailable

Database Schema

TablePurposeKey Columns
admin_usersAdmin loginid, name, email, password_hash (PBKDF2)
clientsClient recordsid, full_name, email, phone, address, emergency_contact_name, emergency_contact_phone, status
service_requestsPublic form submissionsid, full_name, email, phone, service_types (JSON), travel_details (JSON), home_care_details (JSON), internal_notes (JSON), status
appointmentsScheduled visitsid, client_id, type, appointment_date, start_time, notes, status, dep_flight, dep_airline, dep_date, dep_time, arr_flight, arr_airline, arr_date, arr_time, client_dep_pickup, client_arr_pickup, title
invoicesBillingid, invoice_number, client_id, subtotal, tax, discount, total, status (Draft/Sent/Paid), issue_date
invoice_itemsLine itemsid, invoice_id, description, quantity, rate, amount
blocked_daysAdmin unavailabilityid, date (YYYY-MM-DD), reason
settingsBusiness configkey, value — business_name, service_types, task_checklist, invoice_footer, primary_color, etc.
notesEntity notesid, entity_type, entity_id, note
propertiesPer-client propertiesid, client_id, address, access_instructions

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 HMAC-signed JWT
GET/POST/PUT/DELETE/api/clients/*JWTClient CRUD
GET/POST/PUT/DELETE/api/requests/*JWTService request management + delete
GET/POST/PUT/DELETE/api/appointments/*JWTAppointment CRUD (full flight field support)
GET/POST/PUT/api/