ReadyNative

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
OptionLabelExpo GoHint
kv-storeexpo-sqlite/kv-store (default)yessync + async key/value on SQLite · Expo Go OK
mmkvMMKVno - dev build requiredfastest sync key/value (Nitro) · dev build required (no Expo Go)
async-storageAsyncStorageyesasync-only key/value, the community standard · Expo Go OK

On this page

Get ReadyNative