SyncLedger
Push a folder to the machine across the room, over your own HTTP server.
Free right now — no account, no card
Preview
1 interface design, then a screenshot of it running. Drag, scroll or use the arrows.
Free while we’re in preview
Get SyncLedger
Push a folder to the machine across the room, over your own HTTP server.
The Mac button is for Apple Silicon. On an older Intel Mac, get this one instead.
One file, both ways. Double-click it for the window. Run the same file from a command prompt with arguments and it behaves as the command-line tool, because the engine is inside it. Nothing else to download and nothing to keep beside it.
Early preview. The window has been built and run, but not yet on a real Windows PC or Mac, so expect rough edges. The engine underneath it is fully tested.
- One file — no installer
- Reaches only what you point it at
- Source code published below
Free while in preview. It isn’t signed yet, so Windows or macOS will ask you to confirm the first time you open it. At launch, SyncLedger is included in every plan along with the rest of the range.
Both halves are this one binary
On the machine that should receive the files:
syncledger serve /srv/incoming `--port` 8080 `--token` SECRET
On yours:
syncledger push ./project `--remote` http://nas.local:8080 `--token` SECRET `--apply`
No third-party server, no cloud account, nothing to install. Both sides of the protocol are written with Go’s net/http, so one copy of this program syncs against another copy of itself.
Only the differences travel
Push fetches the remote’s manifest, hashes every local file with SHA-256, and uploads only what’s new or genuinely different. Files whose remote copy already matches are skipped, so re-running after a good transfer is a fast no-op and an interrupted one resumes where it stopped. Pull is the same thing pointed the other way.
Crash-safe, and logged
Uploads land via a temp file and an atomic rename, so a crash mid-upload never leaves a corrupt file at the real name. Every applied transfer appends a line to the ledger with path, size, hash, direction and timestamp. Dry runs write nothing to it.
Know what you are running
Plain HTTP with a shared secret in the X-Sync-Token header, checked on every request including the manifest. That’s real access control and it is not TLS. Run it on a network you trust. HTTPS, accounts and watch mode are all roadmap.
Reading on the job itself
- How to keep two folders in sync without losing anything Decide first whether one side is authoritative. If it is, mirror one way and think hard before enabling del...
Advanced & technical details Command-line builds, source code, checksums and a recorded session — for developers and IT teams
A working CLI prototype of the network-reliability half of the job: a real authenticated HTTP sync server plus push/pull clients that compare SHA-256 manifests to transfer only new-or-changed files, skip already-matching ones (resumable), and record every transfer to an append-only ledger. Continuous background sync and conflict resolution are still on the roadmap.
Naming status
Working name only — brand verdict **RENAME** (High). Collision: Sync Ledger / SyncLedgers. Rename before launch.
What it draws on
Existing paid software whose best ideas shaped this program: GoodSync, Syncovery, SyncBackPro, ViceVersa Pro.
Command line
There is nothing extra to install. The program you download is the command-line tool as well: give it arguments instead of double-clicking it and it runs as one, with its output on your terminal. The standalone builds below are the same engine on its own, for machines where you would rather not ship a window at all.
syncledger - network sync to/from a remote SyncLedger server (HTTP)
Usage:
syncledger serve <dir> --port 8080 --token SECRET
syncledger push <localdir> --remote http://host:port --token SECRET --ledger ledger.jsonl [--apply]
syncledger pull <localdir> --remote http://host:port --token SECRET --ledger ledger.jsonl [--apply]
syncledger help
Commands:
serve Run an HTTP server exposing <dir> for sync (manifest/file endpoints).
push Upload new/changed local files to the remote server.
pull Download new/changed remote files to the local directory.
Flags:
--port <n> Port for "serve" to listen on (default 8080).
--remote <url> Base URL of a running "syncledger serve" instance.
--token <secret> Shared secret sent as the X-Sync-Token header. Required
on all three commands; requests with a missing or wrong
token are rejected by the server with 401 Unauthorized.
--ledger <path> JSON-lines audit log file to append transfer records to
(push/pull only). Default: ledger.jsonl in <localdir>.
--apply Actually perform the transfer. Without it, push/pull
only print the sync plan (dry run) and change nothing.
Protocol (implemented with net/http, stdlib only):
GET /manifest -> {"files":[{"path","size","sha256"},...]}
GET /file?path=REL -> raw bytes of that file
PUT /file?path=REL -> request body is written as that file's content
Run "syncledger <command> -h" for command-specific help.
Recorded from the shipped binary, not written by hand.
Source
Every file the program is built from:
console.go · console_test.go · guided.go · main.go
SHA-256 checksums · build instructions & scope notes · full build plan