No description
  • Rust 72.1%
  • JavaScript 15.9%
  • Python 10.3%
  • C 1.3%
  • Shell 0.2%
  • Other 0.1%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
rs db1981e2da Remove offline compaction and the retention sweep: no consumer calls it, and live forgetting replaces it
Deleted: compact_filesystem/compact_lmdb (lace-rt, lace-tokio, Python), Lace.compactFilesystem/compactOpfs/compactBrowserLocalStorage, the sans-IO RetentionSweep and its windowed lowering, the in-place move/plan/journal/resume protocol of every backend, the lace_retention_sweep C/WASM exports (ABI 38), and store-compaction.md with Lace-100's compaction section.

Compaction-only machinery goes with it: the native arena-lock rendezvous and hole punching, LMDB's interrupted-compaction open checks and table clearing, localStorage's compacting marker, StoreWork's sweep owner, held_output and the send change's unused store id. Dropping arena-lock from the layout bumps the native filesystem marker to /7 and LMDB to /4; the Python extension API is 73.
2026-10-24 20:43:46 +02:00
.cargo auto 2026-06-23 14:54:32 +02:00
core Remove offline compaction and the retention sweep: no consumer calls it, and live forgetting replaces it 2026-10-24 20:43:46 +02:00
docs Remove offline compaction and the retention sweep: no consumer calls it, and live forgetting replaces it 2026-10-24 20:43:46 +02:00
js/crates/lace-js Remove offline compaction and the retention sweep: no consumer calls it, and live forgetting replaces it 2026-10-24 20:43:46 +02:00
python Remove offline compaction and the retention sweep: no consumer calls it, and live forgetting replaces it 2026-10-24 20:43:46 +02:00
tools Remove unnecessary unsafe, the runtime preludes and ABI.md 2026-10-22 11:00:23 +02:00
.gitattributes Check out files byte-exact on every platform 2026-09-25 16:41:13 +02:00
.gitignore Ignore Windows extension debug symbols; test quib in validation 2026-09-26 10:40:19 +02:00
.gitmodules Complete source and binary notices and gate publication artifacts 2026-09-27 10:26:36 +02:00
AGENTS.md Project synthetic :Type and :Length fields, ILTP 0.11 and plan profile v13 2026-10-14 23:36:53 +02:00
Cargo.lock lace-tokio parity with lace-rt: Lace::portable, configure_io(IoSettings { chunk_bytes, budget_bytes }) with connected setup and staging stores reserving chunk and copy buffers (a running blocking-pool job keeps its carrier's reservation until it settles), codec chunk size from the setting; IoSettings and the budget move to lace-sans-io io_budget with one process-wide IoBudget per runtime; lace-tokio connected transport settlement moves to driver/connected.rs 2026-10-07 05:21:52 +02:00
Cargo.toml Remove unnecessary unsafe, the runtime preludes and ABI.md 2026-10-22 11:00:23 +02:00
LICENSE Prepare Lace for public release 2026-07-14 20:43:17 +02:00
Makefile auto save 2026-08-31 22:19:06 +02:00
open-issues.md open-issues D10: kept local evaluations of stores beyond about 600,000 records 2026-10-22 21:40:37 +02:00
README.md auto save 2026-09-08 22:18:51 +02:00
rust-toolchain.toml rust-toolchain.toml pins Rust 1.98.0 2026-10-05 19:56:41 +02:00
test.py lace-rt treats NotFound from deregister as unregistered and re-registers on NotFound from reregister, because Mio's poll(2) selector (ESP-IDF) drops a source's registration itself after POLLHUP/POLLERR; test.py runs lace-rt's unit tests on that selector 2026-10-07 03:21:50 +02:00
TRADEMARK.md Prepare Lace for public release 2026-07-14 20:43:17 +02:00

Lace

Lace is a local-first synchronization library for Rust, Python, and JavaScript. It exchanges immutable, hash-addressed records: arbitrary bytes with optional application-defined fields and cryptographic signatures (Marks).

Selection is a rule over relationships between records, not just a filter on each record. For example:

Share group content with a peer only if a membership record signed by a trusted key names that peer as a member of that group, and the content's timestamp is after the member's joining timestamp.

Authority, membership, scope, and timestamp comparisons compose in one policy. New evidence can change what qualifies without changing the policy. Applications define field meanings, trusted keys, and timestamp conventions.

How it works

Each side contributes a policy. Lace intersects their selections, advertises candidates, requests missing records, validates and stores responses, then repeats until neither side requests more. Supporting records can themselves be selected for transfer; receiving membership evidence can unlock content in a later round. Open sessions repeat as stores advance.

Peer-authored rules inspect only whole-record facts exposed by local policy. Exposure permits inspection, not necessarily transfer. Changing selection does not delete or recall records already received.

Using Lace

Create records, open a store-backed Lace, and select records with Interlang (compiled to Datalog) or Datalog directly. Use policy-backed get, list, store, and observation APIs, or interlace local stores and connected peers. Applications supply established byte transports and any required channel confidentiality; Lace supplies synchronization.

Experimental; no compatibility guarantees.