Reset and Uninstall
Cleanly start over with a fresh `~/.syncro/` directory, or fully remove `spl` from the machine. What survives either operation.
Two distinct operations.
- Reset wipes
~/.syncro/(identity, keys, records, token, config) but leaves thesplbinary installed and~/.syncro-data/(your task content) untouched. Use this when you want a clean first-run experience without reinstalling. - Uninstall removes the
splbinary itself. Use this when you're done with Syncropel on this machine.
Automatic backups at ~/.local/share/syncropel/backups/hub.db.bak are written outside ~/.syncro/, so they survive reset but not full disk cleanup. The backup is destructive — every instance start overwrites it. If you care about your records, copy them off-host before running either of the operations on this page.
Clean reset — spl reset
spl reset is the canonical way to wipe ~/.syncro/ back to a fresh state. It refuses to run while the instance is up, prints a plan of what it will touch, prompts for confirmation, and creates a timestamped backup of hub.db before deleting anything.
spl stop # stop the instance first
systemctl --user stop spl-serve.service # if you use a systemd unit (reset will refuse otherwise)
spl reset # interactive: print plan, prompt y/N, back up hub.db, wipe
spl init # regenerate identity and config (no --force needed)
spl serve # start freshWhat spl reset deletes: everything inside ~/.syncro/, then ~/.syncro/ itself. The command lists the directory at reset time and removes every entry that isn't explicitly preserved by a --keep-* flag — that catches accumulated state like vfs.db*, agent/, content/, serve.log, and any old backup files without needing the reset command to know about every possible path.
What spl reset never deletes:
| Path | Why |
|---|---|
~/.syncro-data/ | Task content files (Markdown) + alias mappings — your authored content, separate blast radius from .syncro/ |
~/.local/share/syncropel/backups/ | Automatic hub.db backups, plus the hub.db.pre-reset.<iso8601> snapshot this command creates |
| OS keyring entries | If you have an identity stored in linux-secret-service / macOS Keychain / Windows DPAPI, those entries are not touched. spl init overwrites them on next start, so this is functionally idempotent |
~/.syncro/ itself is also removed when no --keep-* flag is passed — so the next spl init works without --force. With any --keep-* flag set, the home dir is left in place containing only the kept entries, and the next spl init needs --force.
How reset detects a running instance
spl reset refuses if any of these signals are positive:
- PID file at
~/.syncro/run/spl.pidpoints at a live process. - Unix socket at
~/.syncro/run/spl.sockaccepts a connection. - (Default
~/.syncro/home only) TCP127.0.0.1:9100accepts a connection. - (Linux, default home only)
systemctl --user is-active spl-serve.servicereturnsactive.
Signals 3+4 are scoped to the default ~/.syncro/ home so multi-instance setups and tests using SYNCROPEL_HOME=/some/other/path aren't blocked by an unrelated instance. If you use a systemd user unit to keep spl serve running, the command will tell you to stop the unit first — bringing the instance down with just kill isn't enough because the unit will respawn it the moment state is deleted.
Common flags
spl reset --dry-run # print plan + exit. No prompt, no backup, no deletes.
spl reset --json # structured output for scripts and CI gates
spl reset --force # skip the y/N confirmation
spl reset --keep-keys # preserve identity (same DID after `spl init`)
spl reset --keep-config # preserve config.toml (API keys + routing rules survive)
spl reset --keep-secrets # preserve the secrets/ directory
spl reset --wipe-task-data # also delete ~/.syncro-data/ (requires extra confirmation)--dry-run is useful as a CI gate or a "what would this delete" check before you commit:
spl reset --dry-run --json | jq '.plan[] | select(.action == "delete")'Windows
spl stop
spl reset
spl init
spl serveFallback — when spl reset itself can't run
If the spl binary is broken (a corrupt upgrade, a --insecure-localhost instance that refuses to stop, an orphaned PID file confusing the lifecycle), fall back to the manual procedure:
# Linux / macOS
spl stop || pkill -f "spl serve"
rm -rf ~/.syncro
spl init# Windows
spl stop
Remove-Item -Recurse -Force $env:USERPROFILE\.syncro
spl initThe manual rm -rf does NOT auto-back up hub.db first, so if there's anything you want to keep, copy it off-host before running this. The instance-startup backup at ~/.local/share/syncropel/backups/hub.db.bak is your last line of defense after the fact.
After either path, you're back at the start of the onboarding flow. The spl init command prints the next steps — open the local front door at http://127.0.0.1:9100/ or pair Studio at https://syncropel.com/connect?url=http://127.0.0.1:9100.
First boot after reset
The canonical post-reset sequence is two commands:
spl init # generate identity + config
spl serve # start the instance in the background
# Verify
spl status # instance healthy
spl doctor # all greenspl task add "...", spl thread list, spl status, and every other CLI command works immediately — no service account, no bearer token, no --insecure-localhost step. The local CLI authenticates via the Unix socket at ~/.syncro/run/spl.sock (mode 0700 owned by your user); filesystem permissions are the authentication.
You only need to mint a service account when delegating scoped access to a different principal — a browser pair, a paired phone, an MCP client, a remote CLI, or another federating instance. See Service accounts and tokens.
On older instances that don't support Unix-socket trust, the legacy --insecure-localhost + service-account create --bootstrap + token save + restart-secure flow still works — but upgrading (curl get.syncropic.com/spl | sh) skips it.
Full uninstall
Linux
spl stop # graceful instance shutdown
rm ~/.local/bin/spl # remove the binary
rm -rf ~/.syncro # remove state
rm -rf ~/.local/share/syncropel # remove backupsIf you added ~/.local/bin to PATH specifically for spl, clean that line out of your shell rc:
grep -n "/.local/bin" ~/.bashrc ~/.zshrc ~/.config/fish/config.fish 2>/dev/nullEdit by hand to remove.
Windows
spl stop
Remove-Item "$env:LOCALAPPDATA\Programs\spl" -Recurse -Force
Remove-Item $env:USERPROFILE\.syncro -Recurse -Force
Remove-Item "$env:LOCALAPPDATA\syncropel" -Recurse -Force -ErrorAction SilentlyContinueClean the user PATH:
$current = [Environment]::GetEnvironmentVariable('Path','User')
$updated = ($current -split ';' | Where-Object { $_ -notmatch 'spl' }) -join ';'
[Environment]::SetEnvironmentVariable('Path', $updated, 'User')Close and reopen PowerShell for the PATH change to apply.
macOS
spl stop
rm ~/.local/bin/spl
rm -rf ~/.syncro
rm -rf ~/.local/share/syncropelIf you installed the Windows Service wrapper
Uninstall the service before removing the binary — the SCM needs spl.exe to exist for the uninstall call.
# From elevated PowerShell
spl serve --uninstall-service
# then proceed with the uninstall steps aboveSee the Operator runbook for Windows-specific service notes.
If you installed a systemd user unit (Linux)
systemctl --user stop spl-serve.service
systemctl --user disable spl-serve.service
rm ~/.config/systemd/user/spl-serve.service
systemctl --user daemon-reloadWhat survives
What a reset leaves alone
- The
splbinary itself. - Any entries you added to your shell's
PATH. ~/.syncro-data/(task content + alias mappings) — the operator's authored content lives in a separate directory from.syncro/for exactly this reason.spl resetnever touches it unless you pass--wipe-task-dataand confirm the extra prompt. Manualrm -rf ~/.syncrodoesn't touch it either.- Backups at
~/.local/share/syncropel/backups/. The pre-reset snapshothub.db.pre-reset.<iso8601>thatspl resetwrites lands here too, so reset is recoverable. Only full uninstall removes this directory. - OS keyring entries (if you use a keyring backend).
spl initoverwrites the entry on next start.
What an uninstall leaves alone
- System-level
PATHentries set by another tool. - Any data you've copied out of
~/.syncro/to elsewhere on disk.
What neither removes
- Records that were federated to another instance before the reset or uninstall. Those live on the remote peer independently.
- Git repos, source checkouts, or other project state that happens to be adjacent on disk.
Restoring from backup after a reset
If you reset by mistake, the most recent instance startup backup is at:
~/.local/share/syncropel/backups/hub.db.bakRestore:
spl stop
cp ~/.local/share/syncropel/backups/hub.db.bak ~/.syncro/hub.db
spl serveThe identity in config.toml is independent of the records file, so a restored hub.db works with your current DID — as long as you haven't re-initialized to a new keypair in between. If you have, records will still restore but they'll be signed under the old key. See Operator runbook → Recovery for the full procedure.
See also
- Operator runbook → Backup discipline — how the automatic backup works and why off-host copies matter
- First run — what a fresh
spl initcreates - Troubleshooting — when a reset is the right answer (usually it isn't)