Summary
Migrate IronLog's local persistence from @react-native-async-storage/async-storage to react-native-mmkv (https://github.com/mrousavy/react-native-mmkv) so client-side reads and writes use the faster native key-value store.
Current AsyncStorage usage is concentrated in client/lib/storage.ts, client/lib/write-queue.ts, and client/lib/supabase.ts, with docs still describing AsyncStorage-backed caching. The migration should preserve the app's offline-first behavior: active workout writes must remain durable before remote sync attempts, queued remote writes must survive restarts, and Supabase auth persistence must continue to work through the storage interface it expects.
Acceptance Criteria
Summary
Migrate IronLog's local persistence from
@react-native-async-storage/async-storagetoreact-native-mmkv(https://github.com/mrousavy/react-native-mmkv) so client-side reads and writes use the faster native key-value store.Current AsyncStorage usage is concentrated in
client/lib/storage.ts,client/lib/write-queue.ts, andclient/lib/supabase.ts, with docs still describing AsyncStorage-backed caching. The migration should preserve the app's offline-first behavior: active workout writes must remain durable before remote sync attempts, queued remote writes must survive restarts, and Supabase auth persistence must continue to work through the storage interface it expects.Acceptance Criteria
react-native-mmkvor an MMKV-backed adapter?@react-native-async-storage/async-storageis no longer presented as the local persistence layer?