TodoMVC × Interocitor

Up to three clients. One memory mesh.

Add, edit, complete, or delete a task on either side. The middle pane exposes the exact manifest, device, head, and change files written as the clients converge—without a backend. Add a third client, then disconnect any client to watch local work wait for reconnection.

Mesh size

QA a three-client mesh

Spawn another independent client, then disconnect and reconnect any panel.

01 TodoMVC client 1
Starting…

    Double-click a task to edit it.

    02 TodoMVC client 2
    Starting…

      Try changing the same task from this side.

      Local data boundary

      Interocitor is the data layer, not a hosted service.

      Each TodoMVC client owns an independent MemoryLocalStore. A shared in-page filesystem carries their artifacts so you can inspect the exact files while the clients converge. A real application chooses persistence, encryption, and remote transport only when its product needs them.

      The minimal shape

      Illustrative excerpt: stores, key custody, and connection setup are omitted. The linked TypeScript source is the complete runnable demo.

      const schema = {
        tables: {
          todos: {
            fields: {
              id: types.string,
              title: types.string,
              done: types.boolean,
              createdAt: types.index(types.number)
            }
          }
        }
      } satisfies DatabaseSchemaDefinition<DB>;
      
      const todos = db.table("todos");
      
      await todos.put(id, { id, title, done: false, createdAt: Date.now() });
      await db.flush();
      await peer.pull();
      Read the full TodoMVC source →