Skip to content

TransitPin CHANGELOG

2026-08-15

  • CHANGED: parent sign-up now creates a real auth2 account (role=parent + tenant metadata via client_metadata) through /api/auth/register (email + password + display name). The signup form (signin.html) gained a password field.
  • CHANGED: real signups now land in the admin approval queue. /api/registrations/full writes a registrations row keyed by household id, and the $50 registration invoice is recorded pending (no email at signup).
  • CHANGED: approval now completes the funnel. PUT /api/registrations/{id}/approve marks the registration approved, promotes the household's registration invoice to sent, and emails the parent the $50 fee payment option (REGISTRATION_PAY_URL env var supplies an optional checkout link; Square/Stripe still disconnected).
  • FIXED: auth2 integration was broken end-to-end. The backend validated tokens against a dead /auth/whoami endpoint (404), so every login silently fell back to a demo- token. get_current_user now validates against GET /users/me using x-hexclave-access-token (+ x-hexclave-access-type: client, x-hexclave-project-id: internal), and real auth2 users authenticate.
  • CHANGED: role and tenant identity now resolve from auth2 client_metadata (role + tenant_id) instead of an empty local users table or JWT claims (auth2 tokens are opaque). Seeded client_metadata on the two existing auth2 admins (g@germainebrown.com, info@itpropartner.com).
  • FIXED: login now POSTs to auth/password/sign-in; wrong credentials return 4xx instead of a silent demo-token fallback (demo fallback fires only when auth2 is unreachable).
  • CHANGED: register proxy now targets auth/password/sign-up. Parent auth2 self sign-up is disabled by default (SIGN_UP_NOT_ENABLED); parent enrollment is local via /api/registrations/full.
  • ADDED: Admin dashboard v2 (admin.html) covering all 11 operator requirements: sortable/filterable route table, add/edit/delete routes, click-through route detail with stops and rider counts, autosave drafts, per-stop rider entry with TomTom geocoding, pin-driver map toggle, full-screen fleet map polling live bus locations, and dashboard stat cards (active riders / pending approvals / routes active / active buses). The "Demo Preview" banner is now "Live Operations".
  • FIXED: /api/billing/rates was missing the registration fee. It now returns registration_fee: 50.00 alongside the weekly one-way ($120) and two-way ($175) rates.
  • FIXED: route_stops was empty, so routes rendered no polylines. Backfilled 19 geocoded stops across 4 routes with real Savannah addresses and corrected the denormalized routes.stops counts to match.
  • FIXED: login was redirecting every user to the admin dashboard. The redirect is now role-aware: parents land on the parent portal, operators/admins on the admin dashboard.
  • FIXED: the marketing pages (about, schools, policies) ignored the tenant subdomain. Added the tenant-slug guard so a tenant subdomain redirects those pages to sign-in.
  • FIXED: the theme-color meta tag was static; it now reflects the applied tenant theme background.
  • CHANGED: operator dashboard stat sub-labels now show real counts ("X riding today", "Y awaiting review") instead of hardcoded text.
  • CHANGED: the route "students" column now counts assigned riders per route instead of the number of stops.
  • CHANGED: frontend files synced to the live deployment (admin, signin, register, parent, marketing, fleet, ops, and parent pages) so the repo is an accurate source of truth.
  • ADDED: full documentation package - ARCHITECTURE, API-REFERENCE (40 endpoints), DATA-MODEL (15 tables), DECISIONS, OPERATOR-GUIDE, OPS-GUIDE, PARENT-GUIDE, DEPLOYMENT, GLOSSARY, ROADMAP.
  • CHANGED: purged the end-to-end test registration so live dashboard stats reflect real data only.

2026-08-14

  • FIX: tenant subdomain landing (<slug>.transitpin.com/) now redirects to signin.html (parent login/signup) instead of showing the TransitPin marketing page. Marketing stays only on the brand surface (app.transitpin.com / apex).
  • FIX: signin.html strips the marketing nav (Schools / Fleet / How it works / About / Start free trial) for tenant subdomains - tenant nav is brand + Sign in only.
  • FIX: /parents/ now redirects to signin.html (no "find your provider" search on tenant surfaces). Search page preserved as parents/index.html.bak-search for reuse on transitpin.com.

  • DECISION: white-label from the onset. Multi-tenant from day one (one codebase + tenant config + tenant-scoped data). White-label features are Enterprise-gated; single tier -> flag map is source of truth.

  • DECISION: operator dashboard "Add Route" -> dropdown "Create with AI" / "Manual route" (option 3, user-confirmed).
  • DECISION (default, confirm): transitpin-it-staff group = g@germainebrown.com + shonuff@germainebrown.com; tenant URL scheme = app.transitpin.com/<slug>/.
  • BUILD wave 1 dispatched: A (multi-tenant foundation), C (parent portal consolidation), D (ops.transitpin.com super-admin). B (operator dashboard v2) queued for wave 2 after A lands.
  • FEATURE wave 2 dispatched (deleg_2216085e): OPS Assume Identity (impersonation + audit log), operator-map TomTom traffic + weather + route conditions, billing engine (households/payers/allocations, Square + Stripe, outstanding report).
  • DECISION: weather = Open-Meteo (keyless, already live in admin.html), NOT NWS. NWS api.weather.gov noted as keyless alternative.
  • DECISION: trip_type maps from transport-need - both -> two-way $175/wk, morning-only or afternoon-only -> one-way $120/wk. Household total = sum of child rate. Billing interval is tenant config (default weekly), not hardcoded.
  • DECISION: split-bill = payers + billing_allocations (percentage/fixed/per_child); each payer invoiced separately (co-parent outside household = a payer with an allocation).
  • DECISION: Square primary (Invoices API, OAuth INVOICES_WRITE + ORDERS_WRITE), Stripe option; both key-gated behind a PaymentProvider interface. Square OAuth creds still needed from Village Express.
  • DOCS: TECHNICAL-SPEC.md, AS-BUILT.md, CUSTOMER-ONBOARDING.md, NDA.md added; common.py helper module extracted (shared auth/tenant/DB deps for feature routers).
  • FIX: removed Authentication: auth2.itpropartner.com ยท project internal footer from ops login page.