Syncthing
Syncthing keeps folders in sync across your devices. It runs peer-to-peer, so there is no central server, the devices talk to each other directly, and the files stay on your own machines.
Pairing model
Two devices sync only when both have added each other's Device ID. You can still see a device you haven't added: LAN broadcast and the global discovery servers surface nearby Device IDs, so the Add Device dialog suggests them and the API lists them. Seeing one does nothing on its own. Nothing syncs until both sides add each other. Mutual authorization is what gates access, so a leaked Device ID by itself grants nobody anything.
Folders
Every shared folder carries a Folder ID. It has to match on both devices, or each side treats its copy as a separate folder and they never sync. Three modes: sendreceive (two-way), sendonly, receiveonly.
Topology
- Hub-and-spoke: every device pairs with one always-on hub like a NAS, and the hub relays to the rest. One pairing per device.
- Mesh: every device pairs with every other. Transfers go direct and keep working when the hub is offline, but the pairing count grows with the square of the devices.
- Introducer: flag the hub as an introducer. It shares its device list, and the other devices pair with each other on their own. You still add only the hub by hand.
Conflicts
When two devices edit the same file before they sync, Syncthing keeps both. It renames one copy to <file>.sync-conflict-<date>-<deviceid>.md and leaves you to merge them. No topology prevents this.
Ignore patterns
Put a .stignore file at the folder root, one pattern per line. A pattern with no slash matches that name at any depth, so node_modules and .git skip those folders everywhere they appear. Syncthing already ignores its own .stignore and .stfolder.
Running headless
Run it as a user systemd service with systemctl --user enable --now syncthing, then enable lingering with loginctl enable-linger so it keeps running after you log out. The web UI listens on 127.0.0.1:8384 only, so reach a headless box through an SSH tunnel.