Every homelab blog writes "here are the three good backup tools" and then links to their docs. Nobody actually tests them on the same data with a stopwatch. So I did.
The dataset: 500 GB, mixed content — photos, documents, a Postgres dump, a Jellyfin config directory, some videos, a Home Assistant snapshot. Representative of what a household homelab actually backs up. The target: a TrueNAS Scale dataset over SMB for the first pass, Backblaze B2 for the second. The rig: as documented here.
The three tools, in one line each
- Borg — battle-tested, single-host, dedupe via content-defined chunking. Runs over SSH. Ecosystem: Borgmatic for scheduling.
- Restic — Go-based, multi-repository, natively supports cloud backends (S3, B2, Azure). Go binary, no dependencies.
- Kopia — Go-based, block-level dedupe, GUI + CLI + server mode. Youngest of the three (2019); most opinionated.
The benchmark
| Metric | Borg 1.4 | Restic 0.18 | Kopia 0.20 |
|---|---|---|---|
| First backup (500 GB → NAS) | 1h 52m | 2h 18m | 1h 34m |
| Second backup (2% churn) | 4m 22s | 6m 12s | 3m 48s |
| Second backup (full re-scan) | 22m 10s | 18m 40s | 14m 05s |
| Dedupe ratio (after 7 daily backups) | 1:3.8 | 1:3.2 | 1:4.1 |
| Restore single file (1 MB doc) | 4.2s | 3.1s | 2.4s |
| Restore full (500 GB) | 1h 26m | 1h 41m | 1h 19m |
| Encryption | AES-CTR | AES-CTR + Poly1305 | AES-GCM |
| Repository format stability | Excellent | Excellent | Good (still evolving) |
| Single-binary? | No (Python) | Yes | Yes |
| Native B2 support? | Via rclone | Yes | Yes |
| GUI available? | No | No (third-party) | Yes |
What the numbers are telling me
Kopia is fastest. Meaningfully so on full backup, modestly so on incremental. Its block-level dedupe is sharper than Borg's content-defined chunking on mixed data — that 1:4.1 ratio is visible on disk. If raw speed is your priority, this is it.
Restic is most boring. Not fastest, not slowest, never surprises me. The native B2 integration means I don't need an rclone sidecar. The single Go binary is easy to drop on anything. This is what I actually run for my laptop (where "just works" is the feature).
Borg is the repository I trust. I've had a Borg repo on a NAS since 2019 and I've never had a corruption scare. The format has not changed in a breaking way. On the main host with big datasets (photos, videos), this is what I use.
What I actually run, three tools deep
- Borg + Borgmatic for the NAS-local backup of the Proxmox host's ZFS datasets. Nightly. Retention: 7 daily + 4 weekly + 6 monthly.
- Restic on my laptop and my partner's laptop, pushing to Backblaze B2 every hour over Tailscale.
- Kopia for a specific folder of Figma + design files that dedupe extremely well and that I want to restore individual file-versions from. The GUI makes this painless.
Yes, running three is probably overkill. I tried consolidating on one tool for a month and got frustrated each time — the strengths are real, and the costs of running three are tiny (each command takes 30 seconds to type).
The offsite layer: Backblaze B2
All three tools can push to B2. My math: 1 TB of compressed, deduped backup data at B2's $6/TB/month means the full offsite bill is about $6/month. Egress is free up to 3× storage, which for restore-once-a-year math is effectively free. My laptop's Restic repo costs me $1.80/month.
# Restic to B2 in anger
export B2_ACCOUNT_ID="..."
export B2_ACCOUNT_KEY="..."
export RESTIC_PASSWORD_FILE="$HOME/.config/restic/password"
export RESTIC_REPOSITORY="b2:my-bucket:theo-laptop"
restic init
restic backup ~/Documents ~/Desktop ~/Pictures \
--exclude-caches --exclude='*.iso' --exclude='Library/Caches'
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 12 --prune
restic check --read-data-subset=5%
The check command with a random data-subset verifies integrity without re-downloading the full repo. I run it weekly via a systemd timer.
The test I should have done sooner
Before I standardized on this three-tool setup I had a single-tool strategy for five years. The test I should have run then is the same one everyone should run now: a restore drill. Pick a random file from your backup, delete the local copy, restore from the backup, compare checksums. Do it every quarter.
I have done six of these in the last two years. Five succeeded. The one that failed (a Borg archive on a TrueNAS pool that had silently gone into degraded mode) taught me more than any benchmark.
Back up your data. Test the backup. Test it again.
More on the storage layer: the whole stack is catalogued in The self-hosting stack I actually use in 2026.
# issues (0)
$ no issues filed yet. be the first — the form is below.