- Rust 72.1%
- JavaScript 15.9%
- Python 10.3%
- C 1.3%
- Shell 0.2%
- Other 0.1%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
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. |
||
| .cargo | ||
| core | ||
| docs | ||
| js/crates/lace-js | ||
| python | ||
| tools | ||
| .gitattributes | ||
| .gitignore | ||
| .gitmodules | ||
| AGENTS.md | ||
| Cargo.lock | ||
| Cargo.toml | ||
| LICENSE | ||
| Makefile | ||
| open-issues.md | ||
| README.md | ||
| rust-toolchain.toml | ||
| test.py | ||
| TRADEMARK.md | ||
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.
- Shared API semantics
- Rust: standalone synchronous · Tokio
- Python · JavaScript
- Executable scenarios: membership, approvals, delegation, key rotation, and time-bounded access
- Protocol specifications · Implementation architecture
Experimental; no compatibility guarantees.