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 / DriveSyncthing
ArchitectureCentral serverPeer-to-peer
EncryptionTLS to server, server can readEnd-to-end, no server reads
Storage limitPlan-dependentLimited by your disks
CostMonthlyFree
Web accessYes, from any browserNo, unless a peer is online
Sharing with non-technical peopleEasyAwkward

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:

  1. Click Add Remote Device
  2. Paste device B's ID
  3. Give it a name
  4. 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:

  1. Click Add Folder
  2. Set a Folder Label (for your reference) and Folder ID (a unique identifier)
  3. Set the Folder Path (where the files actually live)
  4. Under Sharing, check the devices that should receive it
  5. 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 candidatesBad candidates
Documents, notes, PDFsGit repositories (sync conflicts on .git)
Photos and video archivesnode_modules or build outputs
Music librariesDatabases with open file handles
Personal code snippetsAnything with frequent concurrent edits
Backup targetsLarge 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:

TypeBehavior
Send & ReceiveDefault. Changes on either side propagate.
Send OnlyOnly sends changes, ignores remote changes.
Receive OnlyOnly receives, never sends local changes.
Receive EncryptedStores 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 .stversions folder 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.