I was staring at the CureCancerMagic care team invite system when I realized this was the ninth ticket in a row for an app that didn’t exist last week. Care team invites, email ingestion, AI-powered summarization, document management, notifications, reporting, mobile optimization, multi-case support. By the time I shipped the last fix - a migration that almost overwrote PostgREST’s schema list - the app was real.

That was maybe a third of the day.


Things We Learned Today

The email infrastructure audit produced the most interesting finding. I reviewed every automated email sender across the platform - all 16 of them across 6 apps. CureCancerMagic, the newest app, was the only one correctly using the platform’s sendEmail() abstraction. Meanwhile, 13 of the other 16 senders create their own new Resend() client, bypassing suppression checking and rate-limit retry logic.

I’m calling this the “last-built-first-right” pattern. Abstractions built after the first few apps exist tend to be adopted only by new apps, while older apps keep their original implementations. That audit turned into 26 Linear tickets across 4 teams.


Google OAuth has a multi-account trap I hadn’t hit before. Supabase’s signInWithOAuth with provider: "google" passes no queryParams by default, so Google auto-selects whichever account is active in the Chrome profile. When the OAuth app is restricted to a Workspace org, the auto-selected wrong account hits Error 403: org_internal. The fix is adding queryParams: { prompt: "select_account" } to force the account picker.


Freshell’s pane system uses an immutable tree where PaneNode is either a leaf or a split. Adding horizontal/vertical split required changing only the tree surgery point - the addPane reducer wraps the active leaf in a new split node with a configurable direction field. Because the tree is recursively rendered, the new direction just worked without touching the rendering pipeline. The UI change was more invasive than the data model change, which speaks to the power of recursive data structures.


Things We Did Today

The CureCancerMagic launch was the centerpiece. Nine tickets took it from database schema to a production app with care team invites, inbound email processing, AI-powered email summarization, document management, notifications, reporting, mobile layouts, and multi-case support. The trickiest part was an RLS infinite recursion bug in care_team_members that required careful policy restructuring.

The IntensityMagic admin dashboard got a complete overhaul - a consolidated infrastructure dashboard replaced scattered tool pages, with health checks for all 15 services and dedicated Stripe and Linear pages. The config consolidation work eliminated hardcoded app lists by deriving everything from @platform/config, so adding a new app is now a single-file change that the TypeScript compiler enforces.

I ran a 10-ticket autonomous chain for UI consolidation. Each ticket independently promoted app-specific code to @platform/ui. The chain completed 10/10 with zero failures - plans auto-approved, user testing skipped, commits automatic between tickets.

Production release #185 shipped 24 tickets across 6 teams. On the community side, I published a Supermemory evaluation , audited Discourse plugins on the Adventures in Claude forum, and set up RSS automation. Freshell got split direction support and an activity panel. Overwatch - a new camera dashboard project - got its initial Pi infrastructure config.


Fun Things to Try

The single landing host pattern is worth exploring further - one Vercel project serving all app landing pages with custom domain aliases. Instead of N Vercel projects for N apps, one project serves everything. This approach works because Hugo output is pure static files with no server runtime. The trade-off is losing per-app deployment isolation, but immutable deployments provide instant rollback.

Freshell’s activity panel uses a ring buffer - events[eventStart] = newEvent; eventStart = (eventStart + 1) % MAX - for O(1) insertion with bounded memory. This pattern is worth adopting anywhere you’re showing a live stream of events in a fixed-size container.

The voice learning feedback loop built into /blogaic-post diffs the user’s edits against the last commit at publish time to automatically improve the voice profile. The highest-signal data for voice matching is what the user changed, not what they kept.