README.md
</picture>
https://github.com/loro-dev/loro/assets/18425020/fe246c47-a120-44b3-91d4-1e7232a5b4ac
<h4 align="center"> β¨ Loro 1.0 is out! Read the <a href="https://loro.dev/blog/v1.0">announcement</a>. </h4>Loro is a CRDTs(Conflict-free Replicated Data Types) library that makes building local-first and collaborative apps easier. You can now use it in Rust, JS (via WASM), and Swift.
Features Provided by CRDTs
Supported CRDT Algorithms
Advanced Features in Loro
https://github.com/user-attachments/assets/68e0017a-4987-4f71-b2cf-4ed28a210987
In this example, we demonstrate importing an entire Loro codebase into a Loro-powered version controller, preserving the complete Git DAG history while enabling fast version switching.
import { expect, test } from "vitest";
import { LoroDoc, LoroList } from "loro-crdt";
test("sync example", () => {
// Sync two docs with two rounds of exchanges
// Initialize document A
const docA = new LoroDoc();
const listA: LoroList = docA.getList("list");
listA.insert(0, "A");
listA.insert(1, "B");
listA.insert(2, "C");
// Export all updates from docA
const bytes: Uint8Array = docA.export({ mode: "update" });
// Simulate sending `bytes` across the network to another peer, B
const docB = new LoroDoc();
// Peer B imports the updates from A
docB.import(bytes);
// B's state matches A's state
expect(docB.toJSON()).toStrictEqual({
list: ["A", "B", "C"],
});
// Get the current version of docB
const version = docB.oplogVersion();
// Simulate editing at B: delete item 'B'
const listB: LoroList = docB.getList("list");
listB.delete(1, 1);
// Export the updates from B since the last sync point
const bytesB: Uint8Array = docB.export({ mode: "update", from: version });
// Simulate sending `bytesB` back across the network to A
// A imports the updates from B
docA.import(bytesB);
// A has the same state as B
expect(docA.toJSON()).toStrictEqual({
list: ["A", "C"],
});
});
You can use the Loro Inspector to inspect the state and history of a Loro document.
https://github.com/user-attachments/assets/ceeb7450-80ce-42f2-aef4-2e08fa2d1f1b
You can find bindings for other programming languages in loro-ffi.
Loro draws inspiration from the innovative work of the following projects and individuals: