React Native quickstart
By the end of this page you will have a React Native app with an end-to-end encrypted document store, powered by native Rust-based Automerge and native crypto — no WebAssembly, no JavaScript crypto overhead.
Prerequisites
- Expo SDK 52+ with a development build (not Expo Go)
- Node.js 20+
- iOS 13+ or Android 6.0+ (API level 23+)
MindooDB uses native modules (Rust Automerge via JSI, native crypto via NitroModules)
that require a compiled binary. Expo Go cannot load native modules, so you need
npx expo run:ios or npx expo run:android.
1) Install dependencies
In your existing Expo / React Native project, install MindooDB and the native Automerge backend:
npm install mindoodb react-native-automerge-generated 2) Run the setup helper
This copies required patches (for react-native-quick-crypto and React Native),
installs additional dependencies (native crypto, polyfills, patch-package),
and prints Metro configuration guidance.
npx mindoodb setup-react-native Follow the instructions printed by the helper. For the full list of what gets installed, see the React Native guide.
3) Initialize polyfills & native Automerge
Replace your index.js entry point with the following.
Polyfills must load first; then the native Automerge backend is registered
before any app code runs.
// index.js — FIRST lines, before any other imports
import "./mindoodb-polyfills";
import { UseApi } from "@automerge/automerge/slim";
import { nativeApi } from "react-native-automerge-generated";
UseApi(nativeApi);
import { registerRootComponent } from "expo";
import App from "./App";
registerRootComponent(App);
The mindoodb-polyfills.js file is created by the setup helper in step 2.
It provides TextEncoder, TextDecoder, URL, and crypto polyfills.
4) Add MindooDB code
Create a file (e.g. mindoo-demo.js) with the following.
The key difference from Node.js: you pass a QuickCryptoAdapter
that uses native OpenSSL via react-native-quick-crypto for all
cryptographic operations.
import {
BaseMindooTenantFactory,
InMemoryContentAddressedStoreFactory,
QuickCryptoAdapter,
} from "mindoodb";
import * as quickCrypto from "react-native-quick-crypto";
export async function runMindooDemo() {
// React Native uses native crypto via react-native-quick-crypto
const cryptoAdapter = new QuickCryptoAdapter(quickCrypto);
const storeFactory = new InMemoryContentAddressedStoreFactory();
const factory = new BaseMindooTenantFactory(storeFactory, cryptoAdapter);
// One call creates admin + user keys, KeyBag, and directory
const { tenant, adminUser, appUser, keyBag } =
await factory.createTenant({
tenantId: "my-first-tenant",
adminName: "cn=admin/o=demo",
adminPassword: "admin-password",
userName: "cn=alice/o=demo",
userPassword: "user-password",
});
// Open a database and create a todo document
const db = await tenant.openDB("todos");
const todo = await db.createDocument();
await db.changeDoc(todo, async (d) => {
const data = d.getData();
data.title = "Pay invoices";
data.done = false;
});
// Read it back
const ids = await db.getAllDocumentIds();
const loaded = await db.getDocument(ids[0]);
console.log("Loaded todo:", loaded.getData());
return loaded.getData();
} 5) Build & run
Native modules require a compiled build. Run one of the following:
# iOS
npx expo prebuild --clean
npx expo run:ios
# Android
npx expo prebuild --clean
npx expo run:android
Call runMindooDemo() from your App component (e.g. in a useEffect).
Check the Metro console for:
Loaded todo: { title: 'Pay invoices', done: false } Expo Go can be used for quick prototyping but runs crypto in JavaScript, which is significantly slower. For realistic performance, always use a dev build or production build with native modules.
What's next?
You have a single-user setup. The real power of MindooDB is multi-user collaboration with end-to-end encryption — where the server never sees plaintext.