Overview
I've used Dropbox, Google Drive, and iCloud Drive at various points, and they all solve the same problem well. What they don't solve is syncing a 200GB folder of photos between three machines without paying a monthly fee, without uploading it to someone else's server, and without hitting a storage quota.
Syncthing does exactly that. It's peer-to-peer, encrypted end-to-end, and free. It took me an afternoon to trust it and a week to configure correctly. This is what I learned.
How it's different from Dropbox
| Dropbox / Drive | Syncthing | |
|---|---|---|
| Architecture | Central server | Peer-to-peer |
| Encryption | TLS to server, server can read | End-to-end, no server reads |
| Storage limit | Plan-dependent | Limited by your disks |
| Cost | Monthly | Free |
| Web access | Yes, from any browser | No, unless a peer is online |
| Sharing with non-technical people | Easy | Awkward |
The last row is the real tradeoff. If you want to share a folder with your accountant, Dropbox wins. If you're syncing between your own devices, Syncthing is strictly better on every dimension.
Installation
Linux:
sudo apt install syncthing
systemctl --user enable --now syncthing@$USER.service
macOS:
brew install syncthing
brew services start syncthing
Windows has an installer, and there's a first-party Android app. iOS is the only major platform without an official client — a limitation of iOS's background restrictions rather than anything Syncthing is doing wrong.
The official downloads page is at syncthing.net/downloads.
The first-run setup
Syncthing starts a web UI on http://localhost:8384. Open it. If you're on a remote machine, forward the port over SSH:
ssh -L 8384:localhost:8384 user@server
Then visit localhost:8384 in your local browser. Never expose the Syncthing web UI to the internet — it has no password by default, and while it binds to localhost only, misconfiguration happens.
Set a GUI password
Actions → Settings → GUI. Set a username and password. This matters less on a laptop and a lot on a server that others can reach.
Connecting two devices
Every device has a Device ID, visible under Actions → Show ID. It's a long base32 string that acts as a public key fingerprint.
On device A:
- Click Add Remote Device
- Paste device B's ID
- Give it a name
- Save
On device B, a notification appears: "Device A wants to connect." Accept it.
The connection is now established, encrypted, and authenticated. No ports need to be opened — Syncthing uses NAT traversal, and falls back to a relay server if direct connection isn't possible.
Sharing a folder
On the device that has the files:
- Click Add Folder
- Set a Folder Label (for your reference) and Folder ID (a unique identifier)
- Set the Folder Path (where the files actually live)
- Under Sharing, check the devices that should receive it
- Save
On the receiving device, a notification appears. Accept it, choose where to store the files locally, and Syncthing starts syncing.
The Folder ID matters more than people realize. It's how devices know they're talking about the same folder. Two folders with the same label but different IDs are different folders.
What to sync and what not to
| Good candidates | Bad candidates |
|---|---|
| Documents, notes, PDFs | Git repositories (sync conflicts on .git) |
| Photos and video archives | node_modules or build outputs |
| Music libraries | Databases with open file handles |
| Personal code snippets | Anything with frequent concurrent edits |
| Backup targets | Large binary files edited on two machines |
The .git case is worth calling out specifically. Syncthing will sync your .git directory along with everything else, and if two machines both have uncommitted changes, the index files can end up in an inconsistent state. Use a remote (GitHub, or a self-hosted Gitea) for code. Use Syncthing for the things Git is bad at.
Sync modes
Each folder can be set to one of several types:
| Type | Behavior |
|---|---|
| Send & Receive | Default. Changes on either side propagate. |
| Send Only | Only sends changes, ignores remote changes. |
| Receive Only | Only receives, never sends local changes. |
| Receive Encrypted | Stores encrypted data, useful for untrusted backup targets. |
The encrypted mode is the interesting one. You can set up a cheap VPS or a friend's machine as a backup target, and it stores everything encrypted with a key it never has. If the machine is compromised, the data is unreadable. This is the pattern people use for offsite backup without trusting the offsite machine.
Versioning: the safety net
Under Folder → Advanced → File Versioning, you can configure Syncthing to keep old versions of files when they're changed or deleted. Three options:
- Trash Can — deleted files go to a
.stversionsfolder instead of disappearing - Simple — keep N versions, older ones pruned automatically
- Staggered — keep more versions of recent files, fewer of old ones
For a sync folder, Simple with 5 versions is a reasonable default. It's not a backup solution — the .stversions folder syncs too if you're not careful — but it protects against accidental deletions.
The gotcha: conflict files
When two devices edit the same file before syncing, Syncthing can't know which version is correct. It keeps both: one at the original name, and one with the name filename.sync-conflict-20260924-123456-ABC123.txt.
This is the right behavior, and it will happen more than you expect if you're syncing between a laptop and a desktop that aren't both always on. The conflict file names are ugly, and cleaning them up is manual.
Mitigations:
- Don't sync files you edit on multiple machines simultaneously. Pick one device as the primary editor for any given file.
- Run the ignore patterns to skip files that are almost always in flux:
// .stignore
.DS_Store
Thumbs.db
*.swp
*.tmp
node_modules
.git
The .stignore file lives at the root of the synced folder and uses glob syntax. Adding it after a folder is already synced doesn't remove the ignored files from other devices — you need to add them and then delete the already-synced copies manually.
Running it on a server
A headless server as a sync peer is the best setup I've found. It's always online, so two laptops can sync through it even when they're not on at the same time.
sudo systemctl enable --now syncthing@myuser.service
Set up the web UI with SSH forwarding, connect the server as a device on every other machine, and give the server a copy of everything important. It becomes a synchronization point without becoming a cloud service.
For anything larger than a few hundred GB, use a real disk rather than the boot volume. Syncthing doesn't care, but you'll want the space and you'll want the I/O headroom.
When it's the wrong tool
- Sharing with non-technical users. The setup ceremony around device IDs is a barrier. Use a hosted service.
- Needing web access to files. No peer online, no files. There's no fallback server.
- Real-time collaboration. It's file sync, not concurrent editing. Use Google Docs or a CRDT-based tool.
- Very large files edited frequently. A 4GB video file that changes daily will sync the full file each time.
For a personal file-sync setup between machines you control, it's the best option I've found. The lack of a monthly fee is nice, but the real value is that the data never leaves machines you own.
