Two ways to start.
One private foundation.
Haven is the ready-to-use workspace that lets your team try the MindooDB platform in a browser today. The MindooDB SDK is the open-source data layer underneath - embed it in your own product or build apps for Haven. Both paths share the same end-to-end encryption, offline-first sync, and signed history.
Open Haven in your browser, install it as a PWA, and start collaborating with your team in minutes - encrypted by default, offline-first, no server setup required.
- Free beta at
haven.mindoodb.com- no credit card. - Install on iPhone, iPad, Android, macOS, Windows, or Linux.
- Use the demo server, run locally, or point it at your own MindooDB server.
Install the SDK in Node.js, the browser, or React Native and ship your first encrypted, offline-first synced document in an afternoon. The same SDK powers Haven and any custom app you build on top of it.
- One SDK, three runtimes, zero plaintext on the wire.
- Same data layer powering Haven and the MindooDB App SDK.
- Building a Haven app instead? Head to Apps & SDK from the Haven menu.
Platform guides
Each guide walks you from install to a working synced document. All three runtimes speak the same protocol and can sync with each other.
Quickstart: tenant, document, sync
One call creates the tenant with admin + user keys, KeyBag, and directory registration. This is the same code on every platform — only the import path changes.
import {
BaseMindooTenantFactory,
InMemoryContentAddressedStoreFactory,
} from "mindoodb";
const storeFactory = new InMemoryContentAddressedStoreFactory();
const factory = new BaseMindooTenantFactory(storeFactory);
// 1) Create tenant — generates admin + user keys, KeyBag, and directory
const { tenant, adminUser, appUser, keyBag } = await factory.createTenant({
tenantId: "acme",
adminName: "cn=admin/o=acme",
adminPassword: "admin-password",
userName: "cn=alice/o=acme",
userPassword: "alice-password",
});
// 2) Create a document
const db = await tenant.openDB("contacts");
const doc = await db.createDocument();
await db.changeDoc(doc, (d) => { d.getData().name = "John Doe"; });
// 3) Publish tenant to server + push encrypted changes
await tenant.publishToServer("https://sync.acme.com", {
registerUsers: [factory.toPublicUserId(appUser)],
});
const remote = await tenant.connectToServer("https://sync.acme.com", "contacts");
await db.pushChangesTo(remote); Want to add a second user? See How It Works for the full multi-user join flow.
How it all connects
Every MindooDB client — whether running on a Node.js backend, a web frontend, or a React Native app — speaks the same encrypted sync protocol. The server stores and relays ciphertext without ever seeing plaintext. Users can work offline and sync seamlessly when connectivity returns.
See the full multi-user walkthrough →