Open source · MIT · Go

Backup files to S3
with tags.

tagbackup uploads, downloads, lists, and deletes files on any S3-compatible bucket — identified and filtered by simple human-readable tags.

bash
# Upload a nightly database dump
$ tagbackup push dump.sql --bucket=dbbackup --tag=nightly,prod
Uploading dump.sql ████████████████████ 100% 3.2 MB
✓ Uploaded 1776831788343-nightly,prod-dump.sql

# Clean up anything older than 30 days
$ tagbackup delete --bucket=dbbackup --tag=nightly+prod --older-than=30d --force
✓ Deleted 4 objects

# On your laptop — pull the latest copy
$ tagbackup pull --bucket=dbbackup --tag=nightly+prod --latest
Downloading dump.sql ████████████████████ 100% 3.2 MB
✓ Saved dump.sql
🏷

Tag-based organisation

Files are stored with tags baked into the key. Filter by tag, combine with AND/OR/NOT expressions, no external index needed.

☁️

Any S3-compatible store

Works with AWS S3, Cloudflare R2, MinIO, Backblaze B2, and any provider that speaks the S3 API.

🔒

No telemetry

All API calls go directly between tagbackup and your bucket. Nothing dials home. Credentials stay on your machine.

⚙️

Scriptable

Non-interactive mode, JSON output, meaningful exit codes — designed to live comfortably inside cron jobs and shell scripts.

🔑

Flexible credentials

Static keys, AWS profiles, IAM roles, or environment variables. Credential resolution order is predictable and documented.

💾

Atomic operations

Downloads write to a temp file and atomically rename on success. An interrupted download never leaves a half-written file.

The classic use case

A cron job on your server dumps a database and pushes it with a tag. Your laptop pulls the latest whenever you need it. 30-day retention enforced automatically.

1
Server dumps database to dump.sql
2
tagbackup push uploads it tagged nightly,prod
3
tagbackup delete --older-than=30d prunes old copies
4
Laptop runs tagbackup pull --latest whenever needed
Download v0.0.4 for your platform →GitHub Releases ↗Installation guide