Skip to main content

snapback — undo for your machine

snapback run -- <any command>    # cheap snapshot first, then run it
snapback undo                    # didn't like it? put everything back

We hand filesystem access to AI agents, migration scripts, and codemods every day — and the rollback story below "restore the whole VM" is usually nothing. git checkout doesn't cover your SQLite file, your untracked uploads dir, or the Postgres volume your migration just mangled.

snapback is that missing layer: one command to checkpoint the working tree, your databases, and your container volumes — and one command to snap back.

Quickstart

pip install snapback-cli

snapback run -- python migrate.py     # snapshot, then run
snapback undo                         # roll back the tree (and undo is undoable: `snapback redo`)

snapback snap -m "before letting the agent loose"   # manual checkpoint
snapback list                         # what can I go back to?
snapback diff                         # what changed since the last snapshot?
snapback gc --keep 5                  # prune old snapshots

No config needed — by default snapback snapshots the working tree (minus .snapback/ itself). Zero dependencies, Python ≥ 3.11.

Beyond files: databases and volumes

Drop a snapback.toml in the project root to declare extra targets:

[snapshot]
ignore = ["node_modules", "*.log", "app.db"]   # skip in tree snapshots

[[target]]
backend = "sqlite"          # consistent even while the app holds the db open
path = "app.db"             # (uses SQLite's online backup API, not file copy)

[[target]]
backend = "docker-volume"   # tar the named volume via a helper container
volume = "pgdata"

Every snapback run / snap / undo now covers all three: tree + db + volume, atomically bookended around your risky command.

How it works

  • Snapshots live in .snapback/snapshots/<id>/ with a meta.json recording the command, targets, and per-backend payloads.
  • undo restores the newest snapshot — but first it saves the current state as a pre-undo snapshot, so redo gets you back. Undo is never a trap.
  • run passes the wrapped command's exit code through untouched, so it slots into scripts and CI: snapback run -- make deploy-staging.
  • diff [id] shows what changed since a snapshot (A/D/M per path) — check what the agent actually did before deciding whether to undo it.
  • Backends are one file each in snapback/backends/, discovered automatically. snapback backends lists what your install supports.

Storage backends

Backend Status Strategy
copytree ✅ shipped portable file copies; works everywhere, no privileges
sqlite ✅ shipped SQLite online backup API; consistent under live connections
docker-volume ✅ shipped tar via throwaway alpine container
apfs ✅ shipped tmutil localsnapshot on macOS — O(1), copy-on-write; run sudo -v before restore, snapshots auto-purge in ~24 h
btrfs 🙋 help wanted btrfs subvolume snapshot — O(1), copy-on-write
zfs 🙋 help wanted zfs snapshot / zfs rollback
overlayfs 🙋 help wanted run the command in an overlay, commit or discard
postgres 🙋 help wanted pg_dump / restore, or template-database clone
mysql 🙋 help wanted mysqldump / restore
restic 🙋 help wanted dedup'd remote snapshots via restic repo

A backend is one file. It exposes NAME, snapshot(spec, payload_dir, root) -> payload, and restore(spec, payload_dir, root, payload) — see snapback/backends/sqlite_db.py for the shape (60 lines). One backend or one integration per PR; see CONTRIBUTING.md.

Integrations

  • agentboxagentbox run --checkpoint -- python agent.py takes a snapback snapshot right before the sandboxed agent's first mutating effect and records the checkpoint id in agentbox's hash-chained trace; snapback undo reverts the whole run. Tip: set ignore = ["trace.jsonl"] in snapback.toml so rollback never truncates the audit trail.
  • Your agent framework here — a pre-tool-use hook is ~30 lines (snapshot lazily on the first mutating tool call, surface snapback undo on exit); PRs welcome.

What snapback is not

  • Not a backup tool — snapshots are local, short-lived checkpoints, not disaster recovery. gc them freely.
  • Not filesystem magic by default — the portable backend copies files. Switch the tree target to apfs (or a future btrfs/zfs) for O(1) CoW snapshots.
  • Not a sandbox — the command really runs. snapback makes it reversible, not contained.

License

MIT

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

snapback_cli-0.2.0.tar.gz (20.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

snapback_cli-0.2.0-py3-none-any.whl (16.5 kB view details)

Uploaded Python 3

File details

Details for the file snapback_cli-0.2.0.tar.gz.

File metadata

  • Download URL: snapback_cli-0.2.0.tar.gz
  • Upload date:
  • Size: 20.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for snapback_cli-0.2.0.tar.gz
Algorithm Hash digest
SHA256 63c379c62909d78781a9dfecae186801d0ca01e1fe939336304a0b36bf703145
MD5 8a7b7bc0015e14c7ec220253028c6988
BLAKE2b-256 082f7e40d5b4faa6782ed3a24afb6d16030b40b609e4c4eb02eea211ab3be4b7

See more details on using hashes here.

Provenance

The following attestation bundles were made for snapback_cli-0.2.0.tar.gz:

Publisher: release.yml on sophie-nguyenthuthuy/snapback

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file snapback_cli-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: snapback_cli-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 16.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for snapback_cli-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 e59e483c9e7919c04a710873ad46b4c7b147514f584197845ccdb4ee4c1b24fd
MD5 29a279afaa506e9bdaf64a3e03254ad4
BLAKE2b-256 f71b13a4f0cce37be801004f2e013b7f57013839e199d2cd42990d446d23c193

See more details on using hashes here.

Provenance

The following attestation bundles were made for snapback_cli-0.2.0-py3-none-any.whl:

Publisher: release.yml on sophie-nguyenthuthuy/snapback

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.2.0 This release

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page