March Update: App Review, Calendar Crash, and Desktop Improvements
From Apple review rejection to Hermes GC crash debugging and a major Desktop UI overhaul. Two days of work.
March Update: App Review, Calendar Crash, and Desktop Improvements
A lot changed in two days.
Apple Review Response
The app was rejected from the App Store. Here’s what we fixed.
Apple Sign-In
When signing in with Apple, the user’s name and email are now set directly on the server during account creation. Previously, the client called separate APIs to set nickname and email after login — but Apple only provides this data on the first sign-in, so handling it server-side is the right approach.
The survey screen also pre-fills the nickname if one already exists from Apple Sign-In.
Account Deletion
Removed the password input from the account deletion flow. Social login users (Apple/Google) may not have a password. Replaced with a simple confirm/cancel dialog.
Account deletion now soft-deletes personal data — the document is preserved but all personal information (name, email, social accounts) is cleared.
Calendar Crash
The most frustrating issue. The app crashed when navigating to the Calendar tab.
Crash reports pointed to the Hermes VM garbage collector. Too many objects were being created simultaneously during calendar mount, overwhelming the GC.
Fixes Applied
-
weekTasksMap array reference stabilization — Reuse previous array references when contents haven’t changed, so WeekCalendarRow’s memo actually works.
-
extraData change — Replaced
extraData={weekTasksMap}(a new Map object every time) withextraData={taskDataVersion}(a number), deferred via InteractionManager. -
FlatList optimization — windowSize 5→3, removeClippedSubviews=true.
-
Deferred holiday fetch — Wrapped in InteractionManager.runAfterInteractions to prevent promise flood during mount.
Since GC crashes are non-deterministic, we can’t be 100% sure these fixes resolve the issue. We also added Sentry for better crash tracking going forward.
Feature Improvements
Notification Navigation
Tapping a notification now navigates to the appropriate tab based on task type:
- Tasks with dates → Calendar tab, scrolled to the relevant date
- Tasks without dates → Tasks tab
Uses dismissTo("/(tabs)") to safely clear the navigation stack without exposing the login screen.
Bucketlist Relocation
Moved the bucketlist from the Tasks tab to the Achiever tab. Removed the showBucketlist preference toggle — the swipe-to-bucket feature is now always available.
Venue Address Input
Venue item creation now uses AddressInput (address search screen) instead of a plain TextInput. Added latitude/longitude parameters to the creation API.
Fixed bugs in the address search screen: stale search results persisting across navigations, and map preview not clearing when address text is deleted.
Daily Routine
Changed weekday order from Mon–Sun to Sun–Sat. Added optimistic update for drag-and-drop in the ALL view. Applied red color to Sun/Sat tabs.
Desktop Overhaul
Preparation Items
Aligned Desktop preparation item UI with mobile:
- Create: Clicking + opens a category-specific modal with proper fields (name, quantity, unit, link, description).
- Browse: Clicking an item opens a browse modal. Each field shows check/cancel buttons when modified. Cmd+Enter saves the focused field.
- Checkbox: Replaced with checked/unchecked SVGs. Optimistic update applied.
- Removed: Inline editing, +Photo button, and delete (x) button from the list view.
Section Settings
- Added section visibility dropdown (Details, Intention, Preparation, Retrospect, Attachments)
- Preparation sub-section settings (Materials, Tools, Venue, Personnel, Qualification)
- Blue dot indicator when a section has content
- All with optimistic update
Other
- Calendar keyboard shortcuts (N: create, G: generate from template, T: go to today)
- Fixed CreateTaskRecordModal crash (handleSubmit initialization order)
- RichDescriptionEditor now supports Cmd+Enter to save
- Tab bar icon bounce animation on selection
Code Cleanup
- Removed all showBucketlist-related dead code (mobile + Desktop)
- Extracted QuantityInput component
- Separated preparation item description translation key from Tactics
Two days of work. A lot of it was possible thanks to Claude Code — though not without some back and forth.