Storage
Storage for an Expo app, compared: expo-sqlite/kv-store, MMKV, AsyncStorage - Expo Go support and what each option installs.
Hey - here's how storage works in ReadyNative. This category picks the key/value backend that persists theme mode, onboarding, language, and anything your state library writes.
The contract is StorageAdapter in core src/lib/storage-adapter.ts: getItem / setItem /
removeItem, plus optional *Sync methods when the backend can read without awaiting. Callers
only ever import storage from @/lib/storage, so swapping backends with
bun run setup --storage <option> touches exactly one file. Keys are the same readynative:*
strings everywhere, but the data lives in a different backend per option - switching does not
migrate existing values, so users start fresh.
- kv-store - the default (
expo-sqlite/kv-store). Expo Go and sync reads on native, so stores hydrate before first paint. - mmkv - the fastest, memory-mapped and fully synchronous. Needs a dev build.
- async-storage - pick it when a library hard-requires AsyncStorage. Async only.
Options
One option per category - --storage <option> picks it:
bun run setup --storage kv-store| Option | Label | Expo Go | Hint |
|---|---|---|---|
kv-store | expo-sqlite/kv-store (default) | yes | sync + async key/value on SQLite · Expo Go OK |
mmkv | MMKV | no - dev build required | fastest sync key/value (Nitro) · dev build required (no Expo Go) |
async-storage | AsyncStorage | yes | async-only key/value, the community standard · Expo Go OK |