1 stable release
Uses new Rust 2024
| new 1.0.0 | May 13, 2026 |
|---|
#558 in Filesystem
68KB
1.5K
SLoC
jackup
A simple, personal backup tool. Backs up source directories into compressed snapshots (.tar.zst) and lets you extract them to any target path when you need them.
Features
- Add source directories with per-source exclude patterns
- Incremental detection — only re-archives sources where files have changed
- Compressed snapshots via zstd (one
.tar.zstper source) - Cross-OS path recovery — handles both Unix and Windows source paths on extraction
- Conflict resolution on extract — newer file wins when two sources share a path
Installation
Build from source:
cargo build --release
Note:
cargo install jackupis not available yet — not published to crates.io.
Usage
Initialize a repository
jackup init
Prompts for a device name and a repository path. Creates:
<repo>/workspace/— manifest files (per-run state)<repo>/snapshots/— compressed backup archives~/.jackup/config.toml— configuration~/.jackup/.jackupignore— global ignore patterns
Source management
jackup add <path> [--name <label>] [--exclude <pattern>] [--follow-symlinks=<bool>]
Registers a source directory. Options:
-n, --name— display name (defaults to folder basename)-e, --exclude— glob pattern to exclude; repeatable--follow-symlinks— follow symlinks (default:false)
jackup remove <source> [--purge] [-y]
Removes a source from config. --purge also deletes its snapshot and manifest. -y skips the confirmation prompt.
jackup enable <source>
jackup disable <source>
Toggles whether a source is included in jackup run.
jackup update <source> [--name <label>] [--exclude <pattern>] [--follow-symlinks=<bool>]
Updates a source's metadata. --exclude (repeatable) replaces the entire exclude list.
Viewing sources and status
jackup list [--verbose] [--sort name|created|updated]
jackup ls # alias
Lists configured sources. --verbose shows all fields including ID, excludes, and timestamps.
jackup info
Shows global configuration (device name, repository path, all sources).
jackup status
Shows backup health for every source: last backed-up time, file count, and archive size on disk. Sources that have never been backed up show (never).
jackup peek <source>
Lists all files inside a source's latest backup (reads from the manifest — no decompression).
Running backups
jackup run [--dry-run] [--force]
Backs up all enabled sources. For each source:
- Compares current files against the manifest (mtime + size)
- If nothing changed, skips the source
- If changed, archives all files into
<repo>/snapshots/<uuid>.tar.zstand updates the manifest
Options:
--dry-run— show what would be backed up without writing--force— skip change detection and always re-archive
Extracting backups
jackup withdraw <target> [--source <name>] [--dry-run]
Extracts backup files to <target>, preserving original path structure:
| Source path | Extracted to |
|---|---|
/user/jack/photos |
<target>/user/jack/photos/... |
C:\game\saves |
<target>/c/game/saves/... |
When multiple sources share an output path, the file with the newer mtime wins.
Options:
-s, --source— extract only one source (name or ID prefix)--dry-run— preview without writing
Verifying backups
jackup verify [--source <name>]
Opens each .tar.zst and checks:
- All files listed in the manifest are present in the archive
- File sizes in the archive match the manifest
Exits with a non-zero status if any source fails. Run this after jackup run on critical backups.
Configuration
Config file: ~/.jackup/config.toml
version = 1
id = "your-uuid"
device = "your-device-name"
repository_path = "/path/to/repo"
[[sources]]
id = "uuid"
path = "/absolute/path"
name = "source name"
enabled = true
follow_symlinks = false
exclude = ["*.tmp", "build/"]
created_at = "2026-03-15T00:00:00Z"
updated_at = "2026-03-15T00:00:00Z"
Ignore file: ~/.jackup/.jackupignore
*.DS_Store
Thumbs.db
node_modules
Patterns without a / match at any depth (e.g. node_modules excludes any directory with that name).
Release Checklist
- Update
README.mdandDEVLOG.md. - Update
CHANGELOG.mdwith version and date. - Bump version in
Cargo.toml. - Run:
cargo fmt && cargo build && cargo test - Commit, tag, and push:
git tag v0.x.x && git push && git push --tags
Roadmap
- Initialize repository
- Add / remove / enable / disable / update source directories
- List sources with sorting and verbose output
- Run backups with incremental change detection
- View backup status and file listings
- Extract backups with cross-OS path mapping
- Verify archive integrity against manifests
- Snapshot history — keep N previous archives per source for rollback
- Restore to original paths (for non-system files)
- Tests
Dependencies
~12–29MB
~386K SLoC