A sync protocol for teams
of humans and AI agents.
Keep people and AI agents coordinated on shared documentation, across editors, agent runtimes, and the browser (when using kutlhub). Concurrent edits merge instead of forking into conflict copies. Open source. Self-hostable. Written in Rust.
How it works.
kutl syncs the structured primitives of team coordination through one protocol.
Every participant runs the daemon on their own machine. A shared relay coordinates. Any tool that reads and writes files becomes a participant: editors, scripts, and AI agents.
Humans and agents interact through the same protocol. Agents call MCP tools; humans use the CLI or in-document syntax (decision headings, @mentions). The primitives are identical underneath.
One protocol for structure, knowledge, and coordination.
Spaces
A named sync context. Spaces hold which documents exist and who participates, and every participant who joins the same space sees the same set of documents.
Documents
CRDT-synced text and binary files, stored as ordinary files on your disk. Text documents keep their full edit history; binaries sync whole-file with last-write-wins.
Signals
Protocol-level coordination. Flags, replies, and decisions travel through the same relay as document edits. An agent requesting review and a human recording the outcome write the same primitives.
The moving parts.
The daemon
Watches your local files and translates every text edit into CRDT operations. Any tool that reads and writes files (your editor, an AI agent, a script) becomes a sync participant automatically.
The relay
A lightweight WebSocket server that routes operations between participants. Self-host it on your own infrastructure. It also reconciles, tracks subscriptions, and manages catch-up for clients that fell behind.
The engine
Merging is deterministic. Text edits combine without conflicts and without data loss whatever order they arrive in and whatever the network does, so nobody resolves anything by hand. The text CRDT is diamond-types, which implements the eg-walker algorithm.
The relay coordinates.
Most sync systems treat the server as a dumb pipe. kutl's relay is an active participant in the CRDT protocol, which means it can solve problems that forwarding alone cannot:
Targeted catch-up
Late joiners and returning clients receive exactly the operations they missed.
Stale client eviction
Slow or unresponsive subscribers are evicted gracefully so one bad connection cannot block everyone.
Document lifecycle
Registration, renames, and deletes tracked with a persistent registry. UUID-based identity survives file moves across machines.
Convergent by design
The CRDT approach extends beyond document content to the entire space. Subscriptions, lifecycle state, and coordination are all modeled as convergent structures. Given the same operations in any order, every participant arrives at the same state, by construction.
Central storage is simpler, but it becomes a hard dependency. Every participant running a daemon carries the full document state, so no single server keeps your data locked in. The relay coordinates and routes; shut it down and nothing is lost.
Built to be fast and efficient.
The daemon is already watching the tree, so the cost of a change tracks the change rather than the size of the space. Rewrite one file in a space of 50 and the median time until the other machine holds the bytes is 97.8 ms. Do it in a space of 5,000 and it is 96.6 ms.
The daemon waits up to 200 ms to batch file events before it looks at a change, so kutl's own work sits inside the window it waits on. A relay reached across a network adds its round trip. Every release is timed across a sweep of space sizes, on one machine, with two real daemons and a real relay.
- median
- p95
- 200 ms batch window
Works alongside git.
kutl coexists with git on coding projects. Put kutl content in a kutl/ subfolder: the daemon watches inside, git tracks outside, and kutl surface bridges content into the git tree when you want it there.
Install
brew install kutl-io/tap/kutlQuick start
Your teammate already set up the space; ask them for the relay URL and space name (or an invite URL).
# Replace with what your teammate sent you (a name, owner/slug, or invite URL).
kutl join shared-notes --relay ws://relay.example.com:9100/ws
# Sync in the background and confirm.
kutl daemon start
kutl statusSee the full getting-started guide for the relay's auth and lifecycle, joining additional spaces, and the daemon's background-process options.
Don't want to run a relay?
kutlhub is the hosted product built on kutl. It runs the relay and provides a batteries-included UI in any browser. If you'd rather not run the protocol yourself, kutlhub is the managed path.