Sync directories between Sprites using Syncthing over Tailscale.
- Mesh sync - All devices sync with each other, no single point of failure
- Zero-config -
createonce,joinfrom anywhere on your tailnet - Auto-discovery - Devices find each other automatically
- Secure peer-to-peer sync over Tailscale (no public relays)
- Works with systemd or Sprite service managers
Warning
This is experimental software that may corrupt files or directories if sync conflicts occur and is not recommended for critical data without backups. Use at your own risk.
bash <(curl -fsSL https://raw.githubusercontent.com/kylemclaren/spritesync/main/install.sh)spritesync create skills ~/.claude/skillsspritesync join skillsThat's it. All devices with the same group sync in a mesh.
Create a named sync group that any device can join:
# On first Sprite - create the group
spritesync create myproject ~/code/myproject
# On every other Sprite - just join
spritesync join myprojectThe join command:
- Discovers the group on the tailnet
- Connects to ALL existing members
- Starts syncing immediately
For one-off syncs between two specific devices:
spritesync sync ~/projects sprite-bspritesync groups # List sync groups on this device
spritesync status # Show folder sync status
spritesync devices # Discover devices on tailnet
spritesync unsync ~/projects # Stop syncing a directory| Command | Description |
|---|---|
spritesync create <name> <dir> |
Create a named sync group |
spritesync join <name> |
Join an existing sync group |
spritesync groups |
List sync groups on this device |
spritesync sync <dir> <device> |
Direct sync with a specific device |
spritesync unsync <dir> |
Stop syncing a directory |
spritesync status [--json] |
Show folder sync status |
spritesync devices [--json] |
Discover spritesync devices on tailnet |
spritesync info |
Show this device's ID and hostname |
spritesync serve |
Run discovery service (managed by installer) |
┌─────────────┐ ┌─────────────────┐
│ spritesync │─────▶│ Syncthing REST │
│ (Go CLI) │ │ 127.0.0.1:8384 │
└─────────────┘ └─────────────────┘
│ │
▼ ▼
┌─────────────┐ ┌─────────────────┐
│ Discovery │ │ Syncthing P2P │
│ :8385 │ │ :22000 │
└─────────────┘ └─────────────────┘
│ │
└──────────────────────┘
│
▼
┌─────────────┐
│ Tailscale │
│ 100.x.x.x │
└─────────────┘
- Discovery service (port 8385) - Devices advertise sync groups and find each other
- Syncthing handles actual file synchronization
- Tailscale provides the secure network layer
All traffic stays within your Tailscale network. No discovery servers, relays, or external connections.
For multiple Sprites, create a dedicated tailnet using a new GitHub organization:
- Create a new GitHub org (e.g.,
myproject-sprites) - Sign up for Tailscale using that org
- Install spritesync on each Sprite - they'll automatically join the same tailnet
The installer sets up two services:
| Service | Port | Purpose |
|---|---|---|
| syncthing | 22000 | File synchronization (Tailscale IP only) |
| spritesync | 8385 | Device/group discovery (Tailscale IP only) |
sprite-env services get syncthing
sprite-env services get spritesyncsystemctl status syncthing@$USER
systemctl status spritesync@$USERgit clone https://github.com/kylemclaren/spritesync.git
cd spritesync
go build -o spritesync .MIT