Work log: Authexis — March 2, 2026
What shipped today
The universal Apple app crossed a major threshold today: it now builds, runs, authenticates, and loads real data on macOS. The session was dominated by two categories of work — a macOS compatibility pass across 30+ views, and a gnarly auth debugging session that turned out to be a simple redirect issue.
The macOS compatibility work replaced every UIKit-only API with cross-platform equivalents via a new PlatformCompat.swift layer. This covers haptic feedback (UINotificationFeedbackGenerator), clipboard (UIPasteboard), system colors (Color(uiColor:)), navigation bar styles, keyboard type modifiers, and toolbar placements. Every view that touched these APIs was updated. The isEligibleForPrediction calls in HandoffManager were guarded with #if !os(macOS). The app sandbox got its network entitlement, OAuth got redirect URL registration in Info.plist, and the login/sign-out flows were wired end to end.
The auth fix was the day’s detective story. After getting the app to build and authenticate successfully, every API call returned 401 “Authentication required.” The JWT token looked suspicious (ES256 algorithm instead of the expected HS256), which sent us down a rabbit hole about Supabase token algorithms. The actual cause was far simpler: authexis.app returns a 307 redirect to www.authexis.app, and Apple’s URLSession strips the Authorization header when following cross-host redirects (standard HTTP security behavior). Changing the base URL to www.authexis.app fixed everything instantly. Additional fixes today: FeedType decoding made resilient to unknown feed types, dashboard wired to AnalyticsDashboardView, and stub views now show proper “Coming soon” placeholders.
Completed
- GH-723 — Use Haiku for article summarization and enrichment
- GH-725 — Add magic link login to sign-in page
- GH-726 — Add password setup to profile settings
- GH-727 — Add Google OAuth sign-in and account linking
- GH-702 — Add search to ideas list page
Release progress
- v1-apple: 53/54 closed (1 remaining: #730 App icon and branding assets)
- v1.5: 0/2 closed
- v1: 296/296 closed (complete)
Carry-over
- GH-729 (iOS login screen): Auth works, data loads, but the content list/detail navigation on macOS is still broken. The HStack approach (list left, detail right) renders but is “differently broken” per Paul. Needs debugging — possibly the HStack needs ScrollView wrapping, or ContentDetailView has rendering issues inside the split layout.
- GH-730 (App icon and branding): Created today, needs design input. Last item in v1-apple.
- Content detail navigation on macOS needs a proper master-detail pattern that works inside SidebarNavigationView’s NavigationStack without nesting NavigationSplitView.
Risks
- The
www.authexis.appredirect fix is a workaround. If Vercel/DNS configuration changes, this could break again. Consider adding the non-www domain to Vercel as the primary, or configuring the redirect to preserve headers.
Flags and watch-outs
- Many sidebar items are stubs (Ideas, Briefings, Scans, Calendar, Integrations, Social/Blog slots, Publish log, Preferences). These show “Coming soon” now instead of blank text, but they’re not implemented.
- The
onChange(of:) { _ in }pattern in ContentListView uses the deprecated iOS 16 API. Works fine but will generate warnings on newer SDKs.
Next session
- Fix content detail on macOS — Debug why the HStack layout in ContentListView is broken. Try wrapping ContentDetailView in a ScrollView, check if the
.id(contentId)reload works, consider if the detail view needs environment objects re-injected. - GH-730 — App icon and branding assets. Get design direction from Paul, then implement.
- Test on iOS — The macOS compat work should be backward-compatible, but the app hasn’t been tested on iPhone/iPad since these changes. Run on simulator to verify.
Why customer tools are organized wrong
This article reveals a fundamental flaw in how customer support tools are designed—organizing by interaction type instead of by customer—and explains why this fragmentation wastes time and obscures the full picture you need to help users effectively.
Infrastructure shapes thought
The tools you build determine what kinds of thinking become possible. On infrastructure, friction, and building deliberately for thought rather than just throughput.
Server-side dashboard architecture: Why moving data fetching off the browser changes everything
How choosing server-side rendering solved security, CORS, and credential management problems I didn't know I had.
The work of being available now
A book on AI, judgment, and staying human at work.
The practice of work in progress
Practical essays on how work actually gets done.
Manual fluency is the prerequisite for agent supervision
You cannot responsibly automate what you cannot do manually. AI agents speed up work for people who already know how to do it. They do not replace the need to learn the work in the first place.
The gun you didn't need
Every organization has loaded weapons lying around that nobody remembers loading. The most dangerous capability in any system is the one you built 'just in case.'
Nobody promotes you to operator
There's a moment in every project where the work stops being about building and starts being about keeping things running. Nobody announces this transition. Nobody gives you new tools for it. And most people keep building long past the point where they should have stopped.