Operations, not requests
Multipart uploads, retries, listings, and SlateDB, Iceberg and Delta Lake steps.
sonde · S3 traffic recorder
Run a program through sonde and read its object-storage traffic as operations, with what stands out. Then replay it on another store.
Type a command; its terminal and its S3 requests appear side by side. Your real keys never reach it.
Compare two runs: requests, waiting, cost and findings, before and after.
Waiting by kind of request, requests in flight, and what the run cost.
Multipart uploads, retries, listings, and SlateDB, Iceberg and Delta Lake steps.
Hot keys, HEAD before GET, orphaned files: what fixing each saves.
sonde check fails a job when a run goes past its budget or baseline.
Re-enact a session on another endpoint and compare every answer.
S3 access logs, CloudTrail and HAR files, read the same way.
Browse 100,000+ objects; find incomplete uploads and what they cost.
Nov 9, 2026
The terminal binary for Linux and macOS; the desktop app is on Releases, or brew install --cask hxddh/sonde/sonde-app.
Install the terminal binary
curl -fsSL https://raw.githubusercontent.com/hxddh/sonde/main/install.sh | sh Usually not. sonde run points the program at a local endpoint with AWS_ENDPOINT_URL and throwaway keys, and re-signs each request with your real credentials. It is checked with boto3, the AWS SDKs for JavaScript v3, Go v2 and Java v2, and object_store; a client that ignores these variables needs the endpoint set by hand.
Any S3-compatible endpoint: AWS, Cloudflare R2, MinIO, Ceph RGW, Aliyun OSS, Tigris, Backblaze B2, Wasabi and Google Cloud Storage’s XML API among them. Its 40 compatibility probes show where a store differs, as one matrix across endpoints.
It writes the same requests under a fresh replay-<time>/ prefix, so nothing that already exists is touched; bucket-level changes are skipped. It asks first and deletes what it wrote afterwards unless you pass --keep.
Yes: sonde demo runs on a built-in store, and the app starts on the same demo endpoint.
sonde