Never open half a transfer
syncroot publishes a file only after all of its chunks have arrived and passed a hash check. Readers see the complete file or nothing yet.
Keep files moving between your laptop, workstation, and remote machines. syncroot connects trusted devices directly, with no central syncroot server or account.
Built for folders changed by people, scripts, and coding agents.
$ syncroot status ~/shared
~/shared in sync 1,284 files
laptop connected up to date
workstation connected up to date
build-box last seen 8m 3 operations behind
# machine-readable state is available with --json· arriving✓ published — complete and hash-verified
You start work on a laptop. A long-running job finishes on a workstation. A coding agent produces a result on a remote machine. Eventually, someone has to move those files—or maintain the scripts and services that do it.
syncroot gives those machines the same working folder over a network you already trust. It is designed for software that reads immediately and cannot stop to resolve a conflict dialog.
syncroot publishes a file only after all of its chunks have arrived and passed a hash check. Readers see the complete file or nothing yet.
Check how far each device has progressed instead of guessing whether a missing file was never written or simply has not arrived.
Filesystem watching picks up normal writes as they happen. Periodic full scans remain a safety check, not the main synchronization loop.
Every operation records its originating device. If two devices write at once, syncroot keeps both versions under predictable names.
Install a package when one is available, or build from source with a recent stable Rust toolchain. A source install also needs the provided user service.
Packages include the systemd user unit. When you build from source, install the binary, copy contrib/systemd/syncroot.service into your user unit directory, and point ExecStart at the installed binary.
$ cargo build --release
$ cargo install --path .Tell syncroot the stable name or address other devices can reach. The invite grants access to this folder, so carry it privately.
$ systemctl --user enable --now syncroot
$ syncroot listen laptop.mesh.example
$ syncroot init ~/shared
$ syncroot invite ~/sharedUse the invite on the second device. If the first device is temporarily offline, syncroot saves the invite and retries in the background.
$ systemctl --user enable --now syncroot
$ syncroot listen desktop.mesh.example
$ syncroot connect ~/shared 'syncroot://laptop.mesh.example:9494/abc123'
$ syncroot statusAn invite can come from any existing device. Roster gossip discovers the rest; devices are not paired one by one.
Give each autonomous writer its own subtree and let results arrive as ordinary files—without adding another storage API. Use write-once names, and check machine-readable status before deciding that an absent result was never written.
Read the agent conventions →~/shared/
├── plan.md # read only
├── inputs/ # read only
└── agents/
├── planner/
│ ├── journal.d/
│ └── out/01J…-plan.md
└── scraper/
├── journal.d/
└── out/01J…-rows.jsonThere are no published performance numbers yet. The benchmark contract defines what to measure and what every result must include, so you can reproduce the numbers when they arrive.
Review the benchmark contract →Every folder member can write anywhere. syncroot does not add application-layer encryption or per-path permissions.
Deletes propagate to every device, so syncroot must not be the only copy of anything important.
A synchronized file cannot claim a task atomically. Use a store with compare-and-swap when work needs exactly one owner.
Roster removal, snapshot join, compaction, garbage collection, symlink sync, and metadata sync are not implemented yet.
Files larger than 20 MiB are temporarily ignored while large-file storage and transfer are redesigned.