iOS And Navigation
Patina 0.9.2 is a broad reliability and readiness release. It tightens the path from onboarding into everyday use, makes the iOS shell feel more native, hardens connected-account and MCP setup flows, and adds a large amount of source-level regression coverage around the features that carry user data between devices and services.
- The iPhone layout now has a native slide-out sidebar with dimming, drag gestures, and tap-to-close behavior, making the phone app feel closer to the desktop navigation model without giving up standard iOS navigation stacks.
- Chat deletion swipe actions are now available from the shared sidebar row code path, so chat cleanup is more consistent across platforms.
- Files and people browsing received testable sorting, filtering, journal preview, and refresh logic so those views can evolve without breaking folder navigation or search behavior.
- Switching away from chat on iOS continues to dismiss the keyboard cleanly, avoiding the floating-keyboard-over-files state.
Connected Accounts And Tools
- Google, MCP OAuth, Slack MCP, blog, RSS, YouTube, X Posts, Granola, Beeper, Calendar, Notes, iMessage, Figma, Mercury, and Slackdone paths now share more defensive input parsing, dedupe logic, and error reporting.
- MCP OAuth is more testable and more explicit about hosted callback polling, authorization URL construction, token exchange, refresh, and Slack proxy behavior.
- Connection state loaded from the shared iCloud file now preserves shared MCP servers and blog feeds instead of accidentally falling back to stale local defaults.
- Re-importing or reconnecting MCP servers, stdio servers, and blog feeds now replaces matching existing entries instead of producing duplicate rows.
- Local setup tools for choosing a Patina folder, opening URLs, wake scheduling, and login-item control now have dedicated test seams, which keeps the agent-facing command surface easier to pin down.
Home, Files, And Daily Context
- Home widgets now have more robust model coverage for weather, clocks, dashboard refresh behavior, configuration parsing, and custom-widget states.
- Weather widgets surface a stable unavailable state while keeping the underlying loading or error message available to accessibility.
- Clock widgets derive their displayed location and timezone from a shared config parser, reducing mismatches between editing and display.
- Journal scanning, grouping, and previews are now split into logic that can be tested directly, including targeted refreshes when only journal files change.
- People search now handles multi-term filtering and deterministic sort ordering through shared logic instead of view-only code.
Onboarding And Settings
- Resetting onboarding now goes through a single reset helper that clears the instructions file, bundled setup skills, and onboarding persistence while preserving user-created skills.
- The Claude Code status row now includes Check again actions for missing-install and signed-out states, so users can refresh status after fixing their local setup.
- Onboarding persistence, default skill seeding, suggested automations, name inference, and setup templates all have stronger regression coverage.
- Settings source coverage now pins the app identity, Sparkle release path, Claude status controls, MCP setup, API key sheets, and connected-service setup sheets.
Backend And Release Plumbing
- Magic-link sign-in contact capture now targets Sender instead of Loops, including group assignment, verified-user fields, create-then-update handling, and skip behavior when Sender is not configured.
- Worker tests now cover stable device auth, JWT refresh, hosted MCP OAuth callback polling, Google OAuth callback storage, token refresh cleanup for revoked accounts, appcast serving, checkout notifications, and subscription upgrade behavior using future-dated fixtures.
- The release and performance scripts have additional guardrails for current packaging and measurement flows.
- The marketing site waitlist and pricing surfaces picked up small Sender-era copy and behavior updates.