Syncthing

Peer-to-peer file synchronization across Mac Studio, MacBook, and Proxmox โ€” hub-and-spoke topology with Proxmox as the always-on relay. Installed March 27, 2026.

Overview & Architecture

Syncthing provides real-time, encrypted, peer-to-peer file synchronization without relying on cloud services. It replaces iCloud Drive sync for app configuration files (Typinator, BetterTouchTool, etc.) which proved unreliable โ€” iCloud aggressively evicts files, struggles with frequently-updated small configs, and silently creates conflict copies instead of merging.

Topology: Hub-and-spoke

Node Role IP Syncthing Port Web UI
Proxmox (pve) Hub โ€” always-on relay 192.168.8.221 22000 http://192.168.8.221:8384
Mac Studio Spoke 192.168.8.180 22000 http://127.0.0.1:8384
MacBook Spoke 192.168.8.160 22000 http://127.0.0.1:8384

Both Macs sync exclusively to Proxmox. They do not connect to each other directly. This means changes sync even when one Mac is asleep or powered off โ€” Proxmox holds the canonical copy and relays changes when the other Mac comes online.

Data flow:

Mac Studio  โ†โ†’  Proxmox (always-on hub)  โ†โ†’  MacBook
                     โ†“
              /nvmepool/sync/SyncConfigs
              (canonical copy on ZFS)
Device Configuration

Device IDs:

Device ID Addresses
Proxmox (pve) FXMOTJR-XYM6RAO-NIY7KE6-4RPX2M4-NCMYYSG-KZX577Y-6QYSLHH-WL3HVAD tcp://192.168.8.221:22000
Mac Studio UXJMRP2-N2ZX2B7-KWI6OO2-IT7W5LC-GESRIJC-JV2DGTD-FEND4MO-F46LPAS tcp://192.168.8.180:22000
MacBook VLIWDBL-5VD3VSC-XQTOXYS-EGU3NSB-BCHQOML-ACRYBI3-VFT2SPR-WDNBEAF tcp://192.168.8.160:22000

All devices have autoAcceptFolders: true to simplify adding new shared folders.

Shared Folders
Folder ID Label Purpose Shared With
app-configs App Configs Typinator, BetterTouchTool, and other app configuration sync All three devices

Folder paths per device:

Device Path
Proxmox /nvmepool/sync/SyncConfigs
Mac Studio ~/Sync/SyncConfigs
MacBook ~/Sync/SyncConfigs

All folders use Send & Receive mode โ€” changes on any device propagate to all others via Proxmox.

Installation & Service Details

Proxmox (Debian):

Setting Value
Version 1.29.5
Install method apt install syncthing
Service syncthing@root.service (systemd)
Config location /root/.local/state/syncthing/config.xml
API key RzHyGwQhmkvb9A4burcfWGHThGcoThqM
Web UI http://0.0.0.0:8384 (LAN-accessible)

Start/stop/restart:

systemctl start syncthing@root
systemctl stop syncthing@root
systemctl restart syncthing@root
systemctl status syncthing@root

Mac Studio (macOS):

Setting Value
Version 2.0.15
Install method brew install syncthing
Service Homebrew launchd (homebrew.mxcl.syncthing)
Config location ~/Library/Application Support/Syncthing/config.xml
API key CCuJcwA9wTsfDecNXtymtZwfpQvYWAU7
Web UI http://127.0.0.1:8384 (localhost only)

Start/stop/restart:

brew services start syncthing
brew services stop syncthing
brew services restart syncthing
brew services list | grep syncthing

MacBook (macOS):

Setting Value
Install method brew install syncthing
Service Homebrew launchd (homebrew.mxcl.syncthing)
Web UI http://127.0.0.1:8384 (localhost only)

Same brew services commands as Mac Studio.

Firewall & Network

Syncthing uses three ports. All were opened on Proxmox via UFW:

Port Protocol Purpose UFW Rule
8384 TCP Web UI ufw allow 8384/tcp comment 'Syncthing Web UI'
22000 TCP Sync protocol (file transfer) ufw allow 22000/tcp comment 'Syncthing sync'
21027 UDP Local discovery (LAN device detection) ufw allow 21027/udp comment 'Syncthing discovery'

On the Macs, no firewall changes are needed โ€” macOS will prompt on first run and Syncthing only listens on localhost for the web UI.

Global discovery and relaying are enabled by default but not needed on the LAN. All devices are configured with explicit tcp://IP:22000 addresses for direct LAN connections. Global discovery and relaying serve as fallback if a device connects from outside the home network.

App Configuration Sync Setup

The primary use case is syncing app configs between both Macs, replacing unreliable iCloud sync.

Typinator:

  1. Quit Typinator on both Macs
  2. Open Typinator Preferences โ†’ Advanced โ†’ Data Folder
  3. Point it at ~/Sync/SyncConfigs/Typinator/
  4. Do the same on the other Mac
  5. Relaunch โ€” configs now sync via Syncthing

BetterTouchTool:

  1. Open BTT Preferences โ†’ Sync
  2. Set the sync folder to ~/Sync/SyncConfigs/BTT/
  3. Repeat on the other Mac

Adding new apps:

For apps with a built-in “data folder” or “sync folder” setting, point it at a subfolder inside ~/Sync/SyncConfigs/. For apps without a custom path setting, use a symbolic link:

# Quit the app first, then:
mv ~/Library/Application\ Support/AppName ~/Sync/SyncConfigs/AppName
ln -s ~/Sync/SyncConfigs/AppName ~/Library/Application\ Support/AppName

Note: Sandboxed App Store apps may not follow symlinks. Check that the app works after symlinking before relying on it.

Monitoring

Syncthing is included in the Proxmox health monitoring system. The system-health-check.sh script (runs every 15 minutes, pushes to Gotify) monitors:

  • ZFS pool health for nvmepool (where SyncConfigs lives)
  • Disk space on all pools
  • Proxmox service availability

The Syncthing web UIs on each device also show connection status, sync progress, and any file conflicts.

Gotify alert configuration:

Setting Value
Gotify URL http://192.168.8.100:8070
App name System Alerts
Token ARCkVc0wf001L.e
Troubleshooting

Device shows “Disconnected”:

  1. Check if Syncthing is running on the remote device (brew services list | grep syncthing or systemctl status syncthing@root)
  2. Verify the device address is set to tcp://IP:22000 (not just dynamic)
  3. Check UFW on Proxmox: ufw status | grep -E '22000|21027'
  4. Restart Syncthing: brew services restart syncthing or systemctl restart syncthing@root

Files not syncing:

  1. Check the Syncthing web UI for errors or conflicts
  2. Verify the folder path exists on both devices
  3. Check folder type is “Send & Receive” on all devices
  4. Look for .stignore files that might be filtering content

Conflict files:

Syncthing creates .sync-conflict-YYYYMMDD-HHMMSS files when the same file is modified on multiple devices simultaneously. Resolve by keeping the correct version and deleting the conflict copy.

Reset a device’s Syncthing config:

# Mac (will regenerate on next start)
brew services stop syncthing
rm -rf ~/Library/Application\ Support/Syncthing/
brew services start syncthing

# Proxmox
systemctl stop syncthing@root
rm -rf /root/.local/state/syncthing/
systemctl start syncthing@root

After resetting, you’ll need to re-add devices and shared folders.

Background & Decision Log

Problem: Typinator and BetterTouchTool configuration files were not syncing reliably between Mac Studio and MacBook despite using their built-in iCloud sync. iCloud Drive was identified as the root cause โ€” it aggressively evicts files to free local storage, handles frequently-updated small files poorly, and creates silent conflict copies.

Solution: Syncthing was deployed with Proxmox as the always-on hub. This provides: real-time LAN sync without cloud dependency, no file eviction, proper conflict detection with visible conflict files, and ZFS-backed storage on the hub with automatic snapshots every 15 minutes.

Why not direct Mac-to-Mac sync: Both Macs would need to be powered on simultaneously for sync to occur. With Proxmox as the hub, one Mac can be off โ€” changes queue on Proxmox and sync when the other Mac comes online.

Installed: March 27, 2026.