Releases: qiaeru/claude-code-sync
Releases · qiaeru/claude-code-sync
v1.2.0
Added
- CI also runs on Python 3.14 and macOS, with pip caching; the PyPI classifiers list the supported Python versions.
Changed
- Import verifies all SHA-256 checksums before writing anything, so a corrupted archive can no longer leave a half-restored tree behind; an entry listed in the manifest but missing from the ZIP also aborts the import.
- Exports are written atomically (temporary
.partfile renamed into place, unique per process), so an interrupted or concurrent export never leaves a truncated ZIP behind. - Exports hash and compress each file in a single read, halving export I/O; a file modified mid-export can no longer produce an archive that fails checksum verification on import.
- On Windows, import backups prefix the drive letter (
C/Users/...) so identical paths on different drives cannot collide inside a backup.
Fixed
- Restored files keep their permissions, so hook scripts no longer lose their executable bit on the target machine.
- The overwrite-vs-create decision (and the pre-overwrite backup) is re-checked at write time, so a destination file that appeared or vanished after the preview is still handled safely.
- A failed or backup-free import no longer leaves an empty backup directory behind, and rapid successive imports get distinct backup directories.
- Handing the CLI a file that is not a ZIP, or an archive from a newer format version, prints a clean error instead of a traceback.
- Web UI: pressing Enter in a preview's filter box no longer triggers the export/restore action.
- Web UI: a preview is hidden as soon as the root, scope or archive it was computed from changes, so a stale file selection can no longer be applied to different inputs.
- Web UI: dropping a file outside the dropzone no longer navigates the page away (losing the typed passwords).
- The local server answers a malformed
Content-Lengthheader with a clean HTTP 400 instead of resetting the connection. - Drag-and-dropped archive names are percent-decoded, so files with spaces or accents keep their original name.
- CLI runs no longer create an empty upload temp directory.
- The PyInstaller spec resolves the web UI assets relative to the spec file, so building from outside the repo root no longer produces a binary without the UI.
Security
- Symlinked project directories, project
.claude/directories and global include directories are excluded from the scan, as documented; previously only symlinked subdirectories were excluded, so a symlinked scan root could export files from outside the scanned tree. - The local server rejects DNS-rebinding requests on GET endpoints too (
Hostmust be local), and API responses carryX-Content-Type-Options: nosniffplusCache-Control: no-store.
v1.1.0
Added
scripts/: companion shell and batch helpers —update-repos(fast-forward every Git repo),status-repos(read-only repo status),clean-backups(prune import backups), andbackup-export(unattended encrypted export with retention).- Backups tab in the web UI (and
backupscore module) to list and prune the import backups under~/.claude-code-sync-backups/, with new endpointsGET /api/backupsandPOST /api/backups/prune. - Export retention: an optional Keep newest archives field in the UI and
--keep Non the CLI delete olderclaude-code-sync-*.zipin the output folder after a successful export.POST /api/exportacceptskeepand reportspruned.
Fixed
run.sh/run.batreport a clear error when neitherpython3/pynorpythonis onPATH, andexecthe interpreter so Ctrl-C reaches it directly.
v1.0.0
The first public release of Claude Code Sync — offline, encrypted export/import of your Claude Code configuration across machines. No account, no telemetry, no network calls at runtime.
Highlights
- Encrypted, portable archives. Password-protected WinZip-AES (AES-256) ZIPs you can also open with 7-Zip or any AES-capable tool using the same password.
- Two scopes. Per-project config (
CLAUDE.mdat any depth and the project.claude/) and the global~/.claude/(settings.json,keybindings.json,CLAUDE.md, and theskills/,agents/,commands/,hooks/,plugins/directories). - Web UI and CLI. A local, claude.ai-flavoured UI (light/dark themes, drag-and-drop, native file pickers) plus headless
export/importsubcommands for scripts and cron. - Safe imports. Dry-run preview, SHA-256 integrity verification, and automatic backups before any file is overwritten.
- Hardened. A strict allow-list keeps secrets out of archives; plus path-traversal rejection, size-bounded extraction, and a local-only server that blocks cross-origin / DNS-rebinding requests.
One runtime dependency (pyzipper); the web server is pure standard library. Requires Python 3.11+.