A local-first database for people and agents.

For when a central database is the wrong place.

Everyone works on their own copy, under their own keys. The relay in the middle can't read a thing.

NoCentralDB does not exist yet. This page shows what it is designed to do; the design is open in the RFCs.

On a member

  1. tasksWrite the READMEopen · priority 1
  2. tasksWrite the READMEstatus → in_progress
  3. peopleAda ••••••personal field
  4. messagesDraft is up for reviewagent · planner

On the relay

  1. 312 B9f3ac01e77b2d54a0c6e1f8b3d92a7e4c5b0f61d28a3
  2. 188 B9f3ac01e77b2d54a0c6e1f8b3d92a7e4c5b0f61d28a3
  3. 264 B9f3ac01e77b2d54a0c6e1f8b3d92a7e4c5b0f61d28a3
  4. 240 B9f3ac01e77b2d54a0c6e1f8b3d92a7e4c5b0f61d28a3

Two members, one space, and a relay that carries only bytes.

Here the real SDK will run in three frames, with the relay in your browser. Until it exists, this is a simulation of what you will see.

A Setup
  1. Open the database
  2. Create the space “team chat”
  3. Add B and C as writer
B Memberconnected
C Memberconnected
R relay log

    Network gone? Your writes are stored locally and sync when the relay is back.

    Five calls, once the SDK ships.

    No keys in your code: the SDK is designed to create, store and rotate them.

    npm install @nocentraldb/sdk

    Rust: cargo add nocentraldb

    Describe the model once. ncdb model build turns it into model.lock.json.

    import { nc } from "@nocentraldb/sdk";
    
    export const model = nc.model({
      messages: nc.collection(
        {
          text: nc.string(),
          author: nc.link("people"),
          sentAt: nc.int(),
        },
        { indexes: { bySentAt: nc.index(["sentAt"]) } },
      ),
    });

    When a central database is exactly right.

    If your app needs queries on the server, analytics across all users' data, or one global truth at write time, such as unique names, use a central database. And know these limits before you build on NoCentralDB:

    The relay sees metadata.
    Which key is in which space, when and how much each key writes, and who reads from where. It can withhold changes.
    Removing a member keeps their copy.
    The space key rotates, so they get no new changes. What they already received stays on their device.
    Shredding has edges.
    It does not reach devices that never come back online, a modified client, exports, screenshots or unmarked free text.
    v1 is not post-quantum.
    Ciphertext recorded today could be read by a future quantum computer.