TransitPin CHANGELOG¶
2026-08-15¶
- CHANGED: parent sign-up now creates a real auth2 account (
role=parent+ tenant metadata viaclient_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/fullwrites aregistrationsrow keyed by household id, and the $50 registration invoice is recordedpending(no email at signup). - CHANGED: approval now completes the funnel.
PUT /api/registrations/{id}/approvemarks the registration approved, promotes the household's registration invoice tosent, and emails the parent the $50 fee payment option (REGISTRATION_PAY_URLenv 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/whoamiendpoint (404), so every login silently fell back to ademo-token.get_current_usernow validates againstGET /users/meusingx-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 localuserstable or JWT claims (auth2 tokens are opaque). Seededclient_metadataon 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/rateswas missing the registration fee. It now returnsregistration_fee: 50.00alongside the weekly one-way ($120) and two-way ($175) rates. - FIXED:
route_stopswas empty, so routes rendered no polylines. Backfilled 19 geocoded stops across 4 routes with real Savannah addresses and corrected the denormalizedroutes.stopscounts 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-colormeta 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 tosignin.html(parent login/signup) instead of showing the TransitPin marketing page. Marketing stays only on the brand surface (app.transitpin.com/ apex). - FIX:
signin.htmlstrips 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 tosignin.html(no "find your provider" search on tenant surfaces). Search page preserved asparents/index.html.bak-searchfor 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 -> flagmap is source of truth. - DECISION: operator dashboard "Add Route" -> dropdown "Create with AI" / "Manual route" (option 3, user-confirmed).
- DECISION (default, confirm):
transitpin-it-staffgroup =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 orafternoon-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
PaymentProviderinterface. Square OAuth creds still needed from Village Express. - DOCS: TECHNICAL-SPEC.md, AS-BUILT.md, CUSTOMER-ONBOARDING.md, NDA.md added;
common.pyhelper module extracted (shared auth/tenant/DB deps for feature routers). - FIX: removed
Authentication: auth2.itpropartner.com ยท project internalfooter from ops login page.