Remote storage
pond stores data locally by default ($XDG_DATA_HOME/pond). To use an S3-compatible bucket (Hetzner, R2, B2, MinIO, AWS): add credentials, probe, copy, switch. Your local data is never modified - it stays as a backup.
1. Add credentials
pond creds add # set name (default), access key, hidden secretWrites a [creds.<name>] block to config.toml. A scope-less default set matches any URL.
2. Probe (gate)
pond storage check s3+https://nbg1.your-objectstorage.com/my-pondParses, resolves creds, runs a conditional put, reads back, deletes. Exit 0 = usable. See Exit codes.
3. Copy
pond copy --from local --to s3+https://nbg1.your-objectstorage.com/my-pondIdempotent union merge: re-runnable, resumable, never touches the source. Rebuilds destination indexes and verifies every row landed - exit 0 synced, 6 missing rows (re-run; it converges). Large stores: --no-optimize defers the index rebuild.
4. Switch
pond storage use s3+https://nbg1.your-objectstorage.com/my-pondRe-probes, then flips [storage].path. Moves no data. Roll back with pond storage use local.
URL forms
s3+https://host/bucket carries endpoint + bucket in one URL (any S3-compatible store); append /prefix for a subpath. s3://, gs://, az:// use the ambient cloud SDK credential chain when no creds set matches.
No config file
POND_STORAGE_PATH + POND_CREDS_DEFAULT_* is a complete configuration - handy for containers and CI.