Skip to content

Guide ​

lsync uses one shared collection definition for schemas, keys, child paths, and document API contracts on both the server and client.

PackagePurpose
@lsync/definitionsShared collection, child collection, key, and document API contracts.
@lsync/serverDurable Object hosting, storage, indexes, access control, and document API handlers.
@lsync/clientTanStack DB collection types, sync modes, scoped children, and typed document API calls.
@lsync/transportShared MessagePack wire contracts and transport helpers.

Shared definition ​

Keep the shared contract in a module imported by both environments:

ts
import { defineCollections } from "@lsync/definitions";
import { z } from "zod";

export const todoSchema = z.object({
  id: z.string(),
  text: z.string(),
  completed: z.boolean(),
});

export const appCollections = defineCollections()
  .collection("todos", (todos) => todos.schema(todoSchema).key("id"))
  .build();

Server configuration ​

Add server-only configuration as overrides to the shared definition:

ts
import { appCollections } from "./definition";
import { CollectionShardDurableObject, createWorkerHandler, type Env } from "@lsync/server";

const shardOptions = CollectionShardDurableObject.from(appCollections)
  .collection("todos", (todos) => todos.index("completed"))
  .build();

export class CollectionShard extends CollectionShardDurableObject {
  constructor(state: DurableObjectState, env: Env) {
    super(state, env, shardOptions);
  }
}

export default createWorkerHandler();

Client configuration ​

Create typed collection managers from the same definition:

ts
import { appCollections } from "./definition";
import { collectionTypesFrom } from "@lsync/client";

export const { todos } = collectionTypesFrom(appCollections)
  .url("ws://localhost:8787/sync/demo")
  .collection("todos", (todos) => todos.sync("on-demand"))
  .build();

Use sync("on-demand") for filtered subsets and sync("eager") when the full collection should load at startup. The examples cover document APIs, offline intent queues, and access rules.

API reference ​

The API reference lists the public types, classes, and functions exposed by each package.