Skip to main content
← Blog

March Update: App Review, Calendar Crash, and Desktop Improvements

VauDium ·

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

  1. weekTasksMap array reference stabilization — Reuse previous array references when contents haven’t changed, so WeekCalendarRow’s memo actually works.

  2. extraData change — Replaced extraData={weekTasksMap} (a new Map object every time) with extraData={taskDataVersion} (a number), deferred via InteractionManager.

  3. FlatList optimization — windowSize 5→3, removeClippedSubviews=true.

  4. 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.