Sync Across Machines
Thrum messages live on a Git branch. That means sync across machines is just Git push and pull — no cloud service, no account, no special infrastructure.
This walkthrough takes you from two separate clones to agents on different machines exchanging messages.
What You Need
- The same git repo cloned on two machines (or two separate paths on one machine for testing)
- A shared remote configured on both (
git remote -vto verify) - Thrum initialized:
thrum initdone on both clones - Thrum daemon running on both (
thrum initstarts it automatically)
Enable Sync
By default, Thrum runs in local_only mode — it doesn't push or pull from the
remote. Turn that off.
In your config file (.thrum/config.yaml in the repo root):
local_only: false
Or set it via environment variable without touching the file:
export THRUM_LOCAL_ONLY=false
Do this on both machines. The daemon picks up the config on next start, or restart it now:
thrum daemon restart
Send on Machine A
Register an agent and send a message:
thrum quickstart --role implementer --module api --intent "Working on API changes"
thrum send "Deploy script updated, ready to test on staging"
Then push the sync branch manually to make it available immediately:
thrum sync force
Without thrum sync force, the daemon syncs automatically every 60 seconds.
Force sync is useful when you want the other machine to see something right now.
Receive on Machine B
On the second machine, pull the latest sync branch and check for messages:
thrum sync force
thrum inbox --unread
The message from Machine A appears. The sync works through the a-sync orphan
branch in your repo — run git log origin/a-sync to see exactly what came in.
Automatic Sync
You don't have to run thrum sync force manually. The daemon runs a sync loop
every 60 seconds when local_only is false.
Check that it's running:
thrum sync status
You'll see the last sync time, whether it succeeded, and which remote it's using. If sync is failing, the error shows up here.
Verify with Git
Thrum sync is transparent. You can inspect it directly:
# See what's on the sync branch
git log --oneline origin/a-sync -10
# See message files
git show origin/a-sync:messages/
Nothing is hidden. The sync branch is just a regular orphan branch in your repo.
Optional: Tailscale for Near-Real-Time Sync
Git-based sync is great for async workflows — messages arrive within 60 seconds. If you need faster propagation (under 20 seconds across machines), Tailscale sync is the answer.
Tailscale connects your machines over an encrypted WireGuard tunnel and lets Thrum daemons push events directly to each other instead of going through Git. With a 15-second sync interval and push notifications, messages typically arrive within seconds.
See Tailscale Sync for setup. It's a .env file and a
pairing step, then sync is automatic.
Troubleshooting
Messages not appearing on the other machine?
- Check sync is enabled:
thrum sync status— look forlocal_only: false - Verify the remote is reachable:
git fetch origin— any errors here will block sync - Confirm the
a-syncbranch exists on the remote:git ls-remote origin a-sync - Check the daemon is running on both sides:
thrum daemon status - Try a manual sync:
thrum sync forceand watch for errors
"local_only mode" in sync status? Set local_only: false in config or via
THRUM_LOCAL_ONLY=false and restart the daemon.
Messages show up on one machine but not the other? Both machines need to be
pushing. Check thrum sync status on both — if one shows a sync error, fix it
there.
Next Steps
- Sync Protocol — architecture detail on how the
a-syncbranch works, JSONL dedup, and conflict-free merging - Tailscale Sync — real-time cross-machine sync without polling
- Configuration — full config reference including
local_only, sync interval, and remote settings