Collaborative board × Interocitor
Two local boards. One encrypted mesh.
Maya and Noah can add or move cards against their own local state. Nothing reaches the other board until you sync; then both clients exchange protected row changes and converge.
Maya’s board
Ideas
Doing
Done
Noah’s board
Ideas
Doing
Done
What this proves
Convergence is not workflow policy.
Interocitor moves and merges row changes. The application still owns card permissions, ordering semantics, notifications, deletion policy, and any rule that must reject or serialize a move. This demo deliberately keeps those product rules small.
The minimal shape
Illustrative excerpt: client construction, encrypted key custody, and rendering are omitted. The linked TypeScript source is the complete runnable demo.
const schema = {
tables: {
cards: {
fields: {
id: types.string,
title: types.string,
column: types.string,
rank: types.index(types.number),
updatedBy: types.string
}
}
}
} satisfies DatabaseSchemaDefinition<BoardDB>;
const cards = db.table("cards");
await cards.patch(cardId, { column: "done", updatedBy: deviceName });
await db.flush();
await peer.pull();
Read the full board source →