Bulk object transfer between S3-compatible stores.

BatchFerry copies, syncs and verifies large object sets between S3-compatible endpoints. It streams objects in parallel, resumes interrupted transfers, and checks integrity with server-side ETags — without staging anything on local disk.

$ batchferry sync s3://archive-eu/datasets s3://cold-store/datasets \
    --workers 8 --verify etag --resume

Quickstart

Static binaries are published for Linux, macOS and FreeBSD. Install from source with Go 1.22+:

$ go install batchferry.org/cmd/batchferry@latest
$ batchferry --version
batchferry 0.9.4 (build 2026-07-11)

Endpoints are declared once and referenced by alias:

$ batchferry remote add archive-eu \
    --endpoint https://s3.eu-central.example.net \
    --region eu-central-1
$ batchferry ls archive-eu/datasets

What it is good at

Resumable batches

Transfer state is journalled per batch, so an interrupted run continues where it stopped instead of restarting.

Parallel streaming

Objects are streamed endpoint to endpoint with a bounded worker pool. Nothing is written to local disk.

Integrity checks

Optional ETag or SHA-256 verification per object, with a machine-readable report at the end of the run.

Dry runs

--dry-run prints the exact object set and byte count a command would move, before it moves anything.

Common flags

FlagDefaultDescription
--workers4Concurrent object transfers.
--part-size16MiBMultipart chunk size for large objects.
--verifyetagIntegrity mode: none, etag or sha256.
--resumeoffReuse the batch journal from a previous run.
--include / --excludeGlob filters applied to object keys.

FAQ

Which storage backends are supported?

Anything that speaks the S3 API, including MinIO, Ceph RGW, Backblaze B2 (S3 endpoint) and Wasabi. Non-S3 backends are out of scope.

Does it need credentials on disk?

No. Credentials may be supplied by environment variables or an external credential helper; the remote definition stores only the endpoint and region.

How large a batch is reasonable?

Runs of a few million objects are routine. The journal is a single append-only file and stays well under a gigabyte at that scale.