Two computers do not share ~/.savestate. This walk-through uses two temp HOME directories, /tmp/savestate-two-machines/machine-a and /tmp/savestate-two-machines/machine-b, each with its own project. Machine A is the desk. Machine B is the laptop.
The commands were npx --no-install @savestate/cli, linked to the SaveState CLI built from this repository at version 0.9.0, so these transcripts come from this repository. After you install the package, the same subcommands are npx @savestate/cli. The passphrase desk-to-laptop-demo exists only for this temp project.
For the adapter, see Claude Code. Snapshots are a SaveState Archive, encrypted with AES-256-GCM before they are stored. savestate cloud push is the remote move, and it requires a Pro or Team login. This session had no API key, so the move that worked was a copy of the local .saf.enc file.
Snapshot on the desk
Commands in this section ran in /tmp/savestate-two-machines/machine-a/project. CLAUDE.md was:
# Ferry
The laptop handoff token is ferry-token-9.
Keep the billing note from the desk machine.
Restore this file on the second machine before the next deploy.
$ export HOME=/tmp/savestate-two-machines/machine-a
$ export SAVESTATE_PASSPHRASE='desk-to-laptop-demo'
$ npx --no-install @savestate/cli --version
0.9.0
$ npx --no-install @savestate/cli init
⚡ SaveState — Time Machine for AI
- Initializing SaveState...
✔ Created .savestate/ directory
- Detecting platform...
✔ Detected platform: Claude Code
Your snapshots will be encrypted with a passphrase.
You can also set SAVESTATE_PASSPHRASE env var.
✓ SaveState initialized!
Next steps:
savestate snapshot Capture your first snapshot
savestate config Configure storage & adapters
savestate adapters See available platform adapters
Init writes an absolute storage path from HOME:
$ grep path .savestate/config.json
"path": "/tmp/savestate-two-machines/machine-a/.savestate",
$ npx --no-install @savestate/cli snapshot --label desk
- Extracting state via Claude Code adapter...
✔ Full snapshot created!
ID: ss-2026-10-18T21-36-23-7w2fps
Adapter: Claude Code
Type: full
Label: desk
Files: 10 files in archive
Archive: 1.3 KB
Encrypted: 1.4 KB
Storage: local
Status: ✓ Encrypted & stored
Restore with: savestate restore ss-2026-10-18T21-36-23-7w2fps
$ npx --no-install @savestate/cli list
📋 Snapshots
Storage: local
ID Date Adapter Label Size
───────────────────────────────────────────────────────────────────────────────────
ss-2026-10-18T21-36-23-7w2fps Oct 18, 2026, 21:36 claude-code desk 1.4 KB
1 snapshot
The encrypted file is in the home directory, not in the project:
$ ls -l /tmp/savestate-two-machines/machine-a/.savestate
total 4
-rw-r--r-- 1 ubuntu ubuntu 1405 Oct 18 21:36 ss-2026-10-18T21-36-23-7w2fps.saf.enc
That archive is ss-2026-10-18T21-36-23-7w2fps. Ten files, 1405 bytes, encrypted, stored under machine A's home.
Init the laptop on its own home
Machine B's project started as a different file, LAPTOP FILE BEFORE RESTORE. Commands ran in /tmp/savestate-two-machines/machine-b/project with HOME set to /tmp/savestate-two-machines/machine-b. The passphrase stayed desk-to-laptop-demo. Init again so this project's config points at machine B.
$ npx --no-install @savestate/cli init
⚡ SaveState — Time Machine for AI
- Initializing SaveState...
✔ Created .savestate/ directory
- Detecting platform...
✔ Detected platform: Claude Code
Your snapshots will be encrypted with a passphrase.
You can also set SAVESTATE_PASSPHRASE env var.
✓ SaveState initialized!
Next steps:
savestate snapshot Capture your first snapshot
savestate config Configure storage & adapters
savestate adapters See available platform adapters
$ grep path .savestate/config.json
"path": "/tmp/savestate-two-machines/machine-b/.savestate",
Copying machine A's project directory would keep machine A's absolute path. On a second computer that path is not the snapshot. Init on the laptop writes the laptop's home instead.
Cloud push does not run without a login
cloud push is how a Pro or Team account sends the local snapshot to SaveState cloud, where the other machine can pull it. This CLI was not logged in. The command ran back on machine A, where the snapshot exists. It exits 1 and uploads nothing.
$ npx --no-install @savestate/cli cloud push
- Verifying subscription...
✖ Subscription required
Not logged in. Run `savestate login` first.
Pro cloud storage is the remote path. It is not required for this move. The ciphertext is already a file on the desk.
The index is not the archive
list, restore with no id, and search read .savestate/index.json in the project. The ciphertext is ss-2026-10-18T21-36-23-7w2fps.saf.enc in the storage path. Init does not create $HOME/.savestate. That directory appears when a snapshot is written. Copying the archive into a missing directory fails:
$ cp -v /tmp/savestate-two-machines/machine-a/.savestate/ss-2026-10-18T21-36-23-7w2fps.saf.enc /tmp/savestate-two-machines/machine-b/.savestate/
cp: cannot create regular file '/tmp/savestate-two-machines/machine-b/.savestate/': Not a directory
'/tmp/savestate-two-machines/machine-a/.savestate/ss-2026-10-18T21-36-23-7w2fps.saf.enc' -> '/tmp/savestate-two-machines/machine-b/.savestate/'
The index copy succeeds. list then prints a snapshot the laptop cannot open:
$ cp -v /tmp/savestate-two-machines/machine-a/project/.savestate/index.json /tmp/savestate-two-machines/machine-b/project/.savestate/index.json
'/tmp/savestate-two-machines/machine-a/project/.savestate/index.json' -> '/tmp/savestate-two-machines/machine-b/project/.savestate/index.json'
$ npx --no-install @savestate/cli list
📋 Snapshots
Storage: local
ID Date Adapter Label Size
───────────────────────────────────────────────────────────────────────────────────
ss-2026-10-18T21-36-23-7w2fps Oct 18, 2026, 21:36 claude-code desk 1.4 KB
1 snapshot
restore exits 1. The index names a file that is not in machine B's storage.
$ npx --no-install @savestate/cli restore
🔄 Restoring from snapshot: latest
- Retrieving and decrypting snapshot...
✗ Restore failed
Snapshot not found in storage: ss-2026-10-18T21-36-23-7w2fps.saf.enc
Looked in storage backend: local
$ npx --no-install @savestate/cli search ferry-token-9
🔍 Searching: "ferry-token-9"
- Searching across snapshots...
No matches found.
$ cat CLAUDE.md.bak
cat: CLAUDE.md.bak: No such file or directory
$ cat CLAUDE.md
LAPTOP FILE BEFORE RESTORE
Create the directory, then copy the ciphertext
$ ls -ld /tmp/savestate-two-machines/machine-b/.savestate
ls: cannot access '/tmp/savestate-two-machines/machine-b/.savestate': No such file or directory
$ mkdir -p /tmp/savestate-two-machines/machine-b/.savestate
$ cp -v /tmp/savestate-two-machines/machine-a/.savestate/ss-2026-10-18T21-36-23-7w2fps.saf.enc /tmp/savestate-two-machines/machine-b/.savestate/
'/tmp/savestate-two-machines/machine-a/.savestate/ss-2026-10-18T21-36-23-7w2fps.saf.enc' -> '/tmp/savestate-two-machines/machine-b/.savestate/ss-2026-10-18T21-36-23-7w2fps.saf.enc'
$ ls -l /tmp/savestate-two-machines/machine-b/.savestate
total 4
-rw-r--r-- 1 ubuntu ubuntu 1405 Oct 18 21:36 ss-2026-10-18T21-36-23-7w2fps.saf.enc
restore with no id selects the newest snapshot in the index. The passphrase is still desk-to-laptop-demo.
$ npx --no-install @savestate/cli restore
🔄 Restoring from snapshot: latest
- Retrieving and decrypting snapshot...
✔ Restore complete!
Snapshot: ss-2026-10-18T21-36-23-7w2fps
Timestamp: 2026-10-18T21:36:23.166Z
Platform: claude-code
Adapter: claude-code
Label: desk
Identity: ✓ restored
Memory: 0 entries restored
Conversations: 0 indexed
✓ Your AI state has been restored.
Existing files were backed up with .bak extension.
$ cat CLAUDE.md.bak
LAPTOP FILE BEFORE RESTORE
$ cat CLAUDE.md
# Ferry
The laptop handoff token is ferry-token-9.
Keep the billing note from the desk machine.
Restore this file on the second machine before the next deploy.
Search on the laptop finds the handoff token
$ npx --no-install @savestate/cli search ferry-token-9
🔍 Searching: "ferry-token-9"
- Searching across snapshots...
1 result:
ss-2026-10-18T 2026-10-18 identity (91%)
--- CLAUDE.md ---
# Ferry
The laptop handoff token is ferry-token-9.
Keep the billing note from the desk machine.
Restore this …
identity/personality.md
One hit, in identity/personality.md, score 91%. The token ferry-token-9 was encrypted on machine A and decrypted on machine B. Same passphrase, same snapshot id, different home directory.
Pro is $9/mo.
Cloud storage so the next machine can pull the snapshot instead of copying the file. Card today. No waitlist.
Subscribe to Pro, $9/moAfter you pay, your API key is emailed. Then savestate login.