v0.5.0  ·  AGPL-3.0  ·  Node.js >= 23

BFS

Your drives will fail. Your data won't.

Split backups across multiple drives so no single drive holds your complete data. Lose a drive? Pull a new one, recover, keep going. It's math, not luck.

npm install -g bfs-vault
GitHub

Why BFS?

🧩

Survive Drive Failures

Your backup is split into N+K pieces using Reed-Solomon erasure coding — the same math that keeps CDs readable despite scratches. Lose up to K drives and still recover everything from any N.

🔐

Your Eyes Only

Optional AES-256-GCM encryption with Argon2id key derivation. Each drive holds one piece — encrypted, incomplete, and useless on its own.

📦

Smaller Backups, Automatically

ZIP/Deflate compression is on by default. BFS detects already-compressed files (photos, videos, archives) and skips them — no wasted CPU, smaller shards.

🌐

Use Whatever Storage You Have

USB drives, external HDDs, NAS, FTP/FTPS servers, network folders — anything that can hold a file. Mix and match across providers. No cloud subscription required. No vendor lock-in.

🗂️

Every Push Is a Snapshot

Each backup creates a new numbered version. Keep the last 7, or 30, or all of them. Verify health, prune old ones, restore from any point.

🕸️

Lost Everything? One Shard Is Enough

Every piece of your backup carries a map to all the others. Find one surviving drive, run bfs recovery — your config, your files, everything comes back.

Quick Start

1 Initialize (one command, mix any storage)
# 2 data shards + 1 parity = 3 providers (mix local disks and FTP/FTPS)
bfs init mybackup --ci --data-shards 2 --parity-shards 1 \
  --provider "local:disk1 --path /mnt/disk1" \
  --provider "local:usb   --path /mnt/usb" \
  --provider "ftp:nas     --config-file ./nas.json"
2 Backup & restore
# Each push creates a new versioned snapshot
bfs push  # backup → new version
bfs pull  # restore latest version
3 Disaster recovery — one shard is enough
# Lost .bfs/? Any one surviving shard rebuilds the config, then `bfs pull`
bfs recovery --provider local --name mybackup \
  --bootstrap "--path /mnt/disk1"

Commands

Command Description
bfs init Initialize vault in current directory
bfs push Backup current directory → new version
bfs pull Restore files from backup
bfs status Show vault health and version info
bfs verify Check shard availability across providers
bfs recovery Rebuild vault config from provider shards
bfs prune Delete old backup versions
bfs versions List all versions with health status