Free camera-card → S3 offloader. Hash as you read, upload to your own bucket with S3 integrity checks, seal with an ASC MHL v2.0 manifest.
A successful complete means an intact upload. Re-download is for audits — not for “did offload finish OK?”
offload run --source /Volumes/Untitled --bucket my-archive --name 07192026_CARD1
# … uploads with SHA256/CRC32C integrity …
# Upload-verified + sealed (ASC MHL). Safe to wipe.| Guide | Description |
|---|---|
| Getting started | Install, first offload, day-on-set workflow |
| AWS setup | Bucket, IAM policy, profiles |
| Command reference | Every subcommand and flag |
| Integrity & trust model | What “safe to wipe” means |
| Job history | Local SQLite + portable S3 job JSON |
| Troubleshooting | Common failures and fixes |
Full index: docs/README.md.
DITs and freelancers need a trustworthy card offload without buying Silverstack on day one — and so do hobbyists like Flomenco founder Ryan McKeague. Offload gives you:
- Single-pass hashing — MD5 is computed from the exact bytes streamed to S3
- S3 upload integrity — AWS SDK checksums (SHA256 or CRC32C); S3 rejects corrupted parts
- 11 nines of durability — objects land in Amazon S3, designed for 99.999999999% durability
- ASC MHL v2.0 seal — industry-standard media hash list uploaded next to your media
- Job history — small local SQLite, mirrored as per-job JSON to your bucket for portability
- BYO bucket — uses the standard AWS credential chain (
AWS_PROFILE, env,~/.aws)
This is the free, single-destination tool. For multi-drive catalogs, cross-drive dedup, and deletion safety, see Flomenco.
Download the latest binary for your OS/arch from Releases, unzip, and put offload on your PATH:
# macOS Apple Silicon example
chmod +x offload
sudo mv offload /usr/local/bin/offload
offload --versionRequires Go 1.22+.
go install github.com/Flomenco-Inc/flo-offload-tool/cmd/offload@latest
# binary lands in $(go env GOPATH)/binRuntime needs only the binary and AWS credentials that can read/write your bucket.
# Confirm credentials + bucket access
offload doctor --bucket my-archive
# Offload a mounted card
offload run \
--source /Volumes/Untitled \
--bucket my-archive \
--prefix shoots \
--name 07192026_CARD1
# List past jobs (local)
offload history list
# Pull job records from the bucket onto this machine
offload history sync --bucket my-archive
# Audit a job (HEAD checks; add --deep to re-download)
offload verify <job-id>| Check | When | Meaning |
|---|---|---|
S3 ChecksumAlgorithm |
every upload | parts rejected if corrupted in transit |
Local MD5 via TeeReader |
every upload | recorded in ASC MHL; single-part ETag must match |
HeadObject size |
after each file | object length matches source |
| S3 durability | at rest | designed for 11 nines (99.999999999%) durability |
--deep re-download |
optional audit | paranoia / compliance, not the default success path |
After a successful job:
Upload-verified + sealed (ASC MHL). Safe to wipe.
Details: Integrity & trust model.
- Local SQLite:
~/.flomenco/offload/history.db— one row per job - Per-job JSON:
s3://bucket/_offload/jobs/<id>.json— written on completion offload history syncpulls those JSON objects and upserts locally
No hosted database. Swap machines, sync, keep working. Details: Job history.
s3://my-archive/
shoots/07192026_CARD1/DCIM/100_FUJI/DSCF0001.RAF
_ascmhl/<job-id>/0001_….mhl
_ascmhl/<job-id>/ascmhl_chain.xml
_offload/jobs/<job-id>.json
Keys preserve the card’s relative paths under --prefix / --name. Filename collisions with different bytes get a -<md5[:8]> suffix.
| Command | Purpose |
|---|---|
offload run |
Offload a card to S3 |
offload history list |
List local jobs |
offload history show <id> |
Show one job |
offload history sync |
Pull job JSON from S3 into local DB |
offload doctor |
Verify AWS creds + bucket R/W |
offload verify <id> [--deep] |
Confirm objects; optional re-download |
Full flag list: Command reference.
go test ./...
go build -o offload ./cmd/offloadCross-builds via GoReleaser (see .goreleaser.yaml). Tag a version (v0.1.0) to publish release binaries from CI.
MIT — see LICENSE.