sonde · S3 traffic recorder

Your S3 traffic, read.

Run a program through sonde and read its object-storage traffic as operations, with what stands out. Then replay it on another store.

macOS / Linux / WindowsApache-2.0Nov 9, 2026S3-compatible

A sonde session of a SlateDB program: 172 requests in 34 operations, three findings with the requests fixing them would save, and the operations list with each one’s requests and time.
sonde’s desktop app, from its README; the session is its built-in demo.

Run it, watch its requests.

Type a command; its terminal and its S3 requests appear side by side. Your real keys never reach it.

The Run screen: a shell command’s output on the left, and its four GetObject requests to the demo store listed beside it with time and size.

What a change did.

Compare two runs: requests, waiting, cost and findings, before and after.

Comparing two runs of the same program: 172 requests down to 4, waiting down 97%, request cost down 99%, and all three findings gone.

Where the time went.

Waiting by kind of request, requests in flight, and what the run cost.

A session’s Time tab: time spent waiting, requests in flight, the request cost, and a bar for each kind of request showing where the time went. A session’s Time tab: time spent waiting, requests in flight, the request cost, and a bar for each kind of request showing where the time went.

Requests, read as what they did.

Operations, not requests

Multipart uploads, retries, listings, and SlateDB, Iceberg and Delta Lake steps.

Findings with a fix

Hot keys, HEAD before GET, orphaned files: what fixing each saves.

A budget in CI

sonde check fails a job when a run goes past its budget or baseline.

Replay on another store

Re-enact a session on another endpoint and compare every answer.

Production logs too

S3 access logs, CloudTrail and HAR files, read the same way.

Your buckets

Browse 100,000+ objects; find incomplete uploads and what they cost.

Nov 9, 2026

What’s new in v12.0.0.

  • Fixes for slow requests, lost races and orphaned files
  • A CloudTrail file, which has no request times, shows no latency charts, waiting figures or latency findings

Get started

The terminal binary for Linux and macOS; the desktop app is on Releases, or brew install --cask hxddh/sonde/sonde-app.

  1. Install the terminal binary

    curl -fsSL https://raw.githubusercontent.com/hxddh/sonde/main/install.sh | sh

Where your data goes.

  • Credentials are resolved in Rust; the recorded program gets throwaway keys and a local endpoint, and sonde signs with the real ones.
  • Requests go only to your S3 endpoints, and STS for an assumed role; no telemetry, and updates only when you ask.
  • Sessions and logs stay in sonde’s data folder, with signatures, tokens and keys redacted as each record is made.
  • Read-only until you turn that off; anything destructive needs a dry run and a typed confirmation, and goes to the audit log.

FAQ

Do I need to change my code?

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.

Which stores does it work with?

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.

What does replay do to the other store?

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.

Can I try it without an account?

Yes: sonde demo runs on a built-in store, and the app starts on the same demo endpoint.

sonde