git disaster recovery

Back up your whole git org to storage nobody can delete.

gitdr mirrors every repo to WORM-immutable object storage, checks the lock before it writes a single byte, and signs what it stored. One static binary. No agents, no phone-home, your bucket and your keys.

$go install gitdr.io/gitdr/cmd/gitdr@latest
See how it works
one shot, start to signed

A single job that runs the whole chain.

No control plane, no daemon. You point it at a source and a bucket, it does these five things in order and exits non-zero if any of them fail.

01

Enumerate

List every repo in the org over read-only source scopes.

02

Verify WORM

Probe object-lock or retention. No lock, loud warning, or fail closed.

03

Bundle

Full mirror clone plus LFS, packed into one git bundle, SHA-256 streamed.

04

Upload

Create-only put with a retain-until date. Nothing ever overwrites.

05

Sign

An ed25519-signed manifest of the whole run, keys, sizes and checksums.

why it holds up

Built so a bad day, or a bad actor, can't erase the backup.

immutability

WORM, or it tells you loud

Before the first byte, gitdr checks the destination is immutable (S3 object-lock, GCS retention, Azure policy). If it can't confirm, it warns hard and keeps going, or stops cold with --require-worm. WORM is your responsibility, but you'll never be quietly unprotected.

append-only

No delete. By construction.

The storage layer has no delete, remove, or overwrite method anywhere in the codebase. Backups are append-only because the code physically cannot do otherwise. Uploads are create-only, so a collision fails instead of clobbering.

integrity

Everything is signed and checked

Every artifact gets a SHA-256. Every run writes a signed manifest. gitdr verify re-downloads each object and re-checks the signature and every hash, so you find out it's intact before you need it, not after.

trust

Your creds, your bucket, no telemetry

Uses each cloud's default credential chain, so keyless workload identity just works. Secrets come from env only and are redacted everywhere. Zero analytics, zero phone-home. It's a tool you can read end to end.

works with what you already run

Any major object store. Any git host.

If it speaks S3, retention, or immutability policy, gitdr can lock a backup into it. Most have a free tier, so there's no excuse.

destinations
Amazon S3Google Cloud StorageAzure BlobMinIOCloudflare R2Backblaze B2WasabiCeph / RGW
sources
GitHubGitHub EnterpriseGitLabGitLab self-managed

Git history, branches, tags and LFS restore as a true mirror. Issues, PRs and releases are captured as an audit record.

pick your poison

Ship it three ways.

Same static binary underneath. Run it from a shell, a container, or a Kubernetes CronJob on a schedule.

binary

Go or a release download

$ go install gitdr.io/gitdr/cmd/gitdr@latest

Static, Linux amd64 and arm64. Also on the GitHub releases page with checksums and signatures.

container

Hardened image

$ docker run ghcr.io/gitdr-io/gitdr backup --config gitdr.yaml

Wolfi base, non-root, read-only rootfs, no shell. Ships git and git-lfs, signed with cosign.

kubernetes

Helm CronJob

$ helm install gitdr oci://ghcr.io/gitdr-io/charts/gitdr

Runs on a schedule, writes a last-successful-run metric your alerting can watch.