The Miranda Marathon

March 19th was one of those days where you look up and realize you've built an entire platform. The Miranda Foundation project went from a freshly reworked spec to Plans A through D — complete. That's Supabase migration, donor identity system, foundation public sites, and a full donor portal SPA, all in one session.

Plan A was the foundation work: ripping out SQLite and Sanctum, replacing them with Supabase Postgres and Supabase Auth JWT. All 23 migrations ran clean against Supabase. We wrote a SupabaseAuth middleware in both strict and relaxed modes, rewrote the Vue SPA auth store from scratch, and got 105 tests passing. Sanctum is fully gone.

Plan B got interesting — the donor identity model. The core insight is that donors own their identity fields (name, email, preferences) while foundations own the relationship fields (giving history, communication preferences per org). We built a DonorSyncService that handles this hybrid sync, 21 API endpoints total, and wired up Stripe destination charges so donations flow through the platform to connected foundation accounts. The magic link system — where a donor gets a login link in their donation receipt — felt like one of those "obviously right" decisions that took real architectural thought to land on.

Plan C was the foundation site builder, and this is where the design got fun. Three switchable modules — Guided wizard for non-technical users, Composable block editor for more control, Bespoke for full customization — all backed by the same JSON block config underneath. Nine block types with 25 variants, 10 curated color palettes with plan-tiered access. We seeded the Miranda Faith Memorial Foundation as the first tenant with real content.

Plan D scaffolded miranda-gives as a standalone Vue SPA at ~/Developer/miranda-gives/. Fifty-eight files. The dual design system was a deliberate choice: warm and editorial (cream backgrounds, serif type) for public-facing pages, dark and premium (purple, gold accents) for the donor dashboard. Seven persona landing pages under /for/*, a Supabase Realtime live donation feed, and Stripe Elements with dual-theme support.

The Spray Tool Ships Four PRs

While Miranda consumed the architectural brain, The Spray Tool had a production deploy day. Four PRs went to thelawntool.com: campaign email defaults (#209), the AI detection audit log (#212), a toggle sync fix (#213), and per-application pricing in quote emails (#214).

The toggle sync bug was satisfying to finally kill. This thing had resurfaced five times — issues #183, #189, #197, #181, and #208. The root cause was PrimeVue's ToggleSwitch competing with click handlers on parent card divs. Both were responding to the same click, so the toggle would fire, then the card handler would fire, and the state would flicker or revert. The fix was elegant in its bluntness: pointer-events-none on every toggle across three components. The toggles are now purely visual indicators — the parent div owns all click logic. Eleven lines changed, five bugs closed. We added warning comments referencing the history so nobody re-introduces the pattern.

The AI detection audit log (ai_detection_audit_logs table) is immutable by design — it tracks who triggers, accepts, edits, and rejects AI lawn detections. We hardened the public /api/ai-detect/save endpoint with $request->only() to prevent detected_by injection. It's inactive until AI detection is enabled in production, but the tracking infrastructure is ready.

Miranda Faith — The Quiet Fix

Between the big builds, we redesigned the safety exit button on new.miranda.faith. This is a domestic violence resource site, so the "Exit Now" button needs to be functional but inconspicuous — a visitor shouldn't have to explain a bright red button on their screen. We replaced the bg-red-700 styling with a subtle pill (bg-white/40, backdrop-blur-md, text-gray-400) that blends with the cream design system. Then we found a mobile z-index collision where the exit button at z-[200] was overlapping the hamburger menu. Moved it to top-left on mobile, top-right on desktop. Updated all 13 Astro page templates and the equivalent Blade components in the Laravel app.

End of Day

The throughput today was unusual even by our standards. Miranda went from spec to four completed implementation plans with a deployed foundation platform and a scaffolded donor portal. The Spray Tool cleared its backlog of production-ready PRs. And a small but meaningful UX fix made a safety tool less visible to the people who need it to be invisible. Some days the work just flows.