Loading...
Loading...
Fast synchronous key-value storage for React Native via react-native-mmkv (Nitro-backed). Covers creating and configuring MMKV instances, reading/writing all value types (string, number, boolean, buffer), React hooks for reactive UI, value-change listeners, encryption, AsyncStorage migration, and state-management integrations (zustand, redux-persist, jotai, react-query). Also covers storage limits, multi-process mode, and the V4 upgrade from the class-based API.
npx skill4agent add margelo/react-native-skills react-native-mmkvreact-native-mmkvreferences/*.mdreact-native-mmkvawaitstorage.getString('key')new MMKV()createMMKV().delete().remove()react-native-nitro-modulesV4 requires React Native 0.75+ with New Architecture / TurboModules enabled.
references/| User is asking about… | Read |
|---|---|
Creating an MMKV instance, configuration options ( | |
Getting/setting values, all data types (string, number, boolean, buffer, objects via JSON), key management ( | |
React hooks ( | |
Listening for value changes outside of React, | |
Encryption ( | |
| Migrating from AsyncStorage, data transfer pattern, completion flag | |
zustand persist middleware, redux-persist, jotai | |
V4 upgrade, breaking changes from V3, | |
| Storage size limits, memory warnings, when to use a database instead | |
references/create-instance.mdnpm install react-native-mmkv react-native-nitro-modules
cd ios && pod installnpx expo install react-native-mmkv react-native-nitro-modules
npx expo prebuildimport { createMMKV, existsMMKV, deleteMMKV } from 'react-native-mmkv'
const storage = createMMKV({ id: 'my-store' })
// Properties (read-only)
storage.id // string
storage.length // number of keys
storage.size // total file size in bytes
storage.byteSize // byte size
storage.isReadOnly // boolean
storage.isEncrypted // boolean
// Write
storage.set('key', 'string' | 42 | true | arrayBuffer)
// Read
storage.getString('key') // string | undefined
storage.getNumber('key') // number | undefined
storage.getBoolean('key') // boolean | undefined
storage.getBuffer('key') // ArrayBuffer | undefined
// Keys
storage.contains('key') // boolean
storage.getAllKeys() // string[]
storage.remove('key') // boolean (NOTE: was .delete() in V3)
storage.clearAll() // void
// Encryption
storage.encrypt('password')
storage.encrypt('password', 'AES-256')
storage.decrypt()
storage.recrypt('newPassword' | undefined)
// Maintenance
storage.trim() // free unused space
storage.importAllFrom(otherStorage) // returns count imported
// Listeners
const sub = storage.addOnValueChangedListener((key) => { ... })
sub.remove()
// Static helpers
existsMMKV('my-store') // boolean
deleteMMKV('my-store') // booleancreateMMKV()StateStoragestorage.setstorage.getStringstorage.remove| File | Description |
|---|---|
| create-instance.md | |
| crud-operations.md | Set/get all types, key management, objects, buffers |
| hooks.md | All React hooks for reactive MMKV usage |
| listeners.md | |
| encryption.md | Encrypt/decrypt instances, AES options |
| migrate-from-async-storage.md | Full migration pattern from AsyncStorage |
| state-management.md | zustand, redux-persist, jotai, react-query, MobX |
| upgrade-v4.md | V3 → V4 breaking changes and migration |
| limits-and-gotchas.md | Storage limits, multi-process, logging, common pitfalls |
| Problem | Reference | Action |
|---|---|---|
| Don't know where to start | create-instance.md | Create instance with |
| Need reactive UI updates | hooks.md | Use |
| Encrypting sensitive data | encryption.md | Call |
| App uses AsyncStorage, want to switch | migrate-from-async-storage.md | Batch migrate then swap calls |
| Zustand/Redux/Jotai persistence | state-management.md | Wire adapter for your state lib |
| Upgrading from V3 to V4 | upgrade-v4.md | |
| Storage growing too large | limits-and-gotchas.md | Trim or move to SQLite |
| Multi-process data sharing | limits-and-gotchas.md | Set |