Debug HTTP without leaving the shell.
sonde sends, records, replays and diffs API requests as plain files on disk. One static binary. No GUI, no cloud sync, no account — just your prompt.
~/api $ sonde get api.helios.dev/v2/launches --env staging -v dns 4ms · tls 21ms · ttfb 118ms · total 143ms HTTP/2 200 · application/json · 3.2 KB { "count": 3, "results": [ { "id": "lx_9021", "vehicle": "Antares 330", "window_open": "2026-08-11T09:40:00Z" }, … ] } ~/api $ sonde save launches-baseline saved → .sonde/runs/launches-baseline (request + response, 2 files) ~/api $ sonde get api.helios.dev/v2/launches --env staging --diff launches-baseline HTTP/2 200 · 121ms · compared against launches-baseline ~ results[0].window_open "…T09:40:00Z" → "…T11:05:00Z" + results[0].hold_reason "range weather" 2 changes · headers identical ~/api $
# macOS / Linux — one static binary
$ curl -fsSL https://get.sonde.sh | sh
# or via Homebrew
$ brew install sonde-sh/tap/sonde
##Flags
The whole surface fits on one screen; every flag has a config-file twin in .sonde/config.toml.
| flag | arg | default | what it does |
|---|---|---|---|
| -H, --header | key: value | — | Attach a request header. Repeatable; $VARS expand from the environment. |
| --env | name | — | Load host, headers and secrets from .sonde/<name>.toml. |
| --save | name | — | Record request and response as plain text files under .sonde/runs/. |
| --diff | ref | last | Compare the response against a saved run; print a structural diff. |
| --replay | ref | last | Re-send a recorded request byte-for-byte, headers included. |
| -o, --output | mode | auto | auto, json, headers, raw, or silent for scripting. |
| --timeout | dur | 30s | Abort after a duration: 500ms, 10s, 2m. |
| -v, --verbose | off | Print DNS, TLS, redirect and timing phases for each request. |
Full reference: sonde --help · man sonde(1)
##Runs are files
- Plain text, on disk
- Requests and responses land as readable text under
.sonde/. Grep them, commit them, code-review an API change like code. - One binary, anywhere
- No runtime, no plugin directory, no background updater.
Works the same in
~/binor on the far side of an ssh session. - Diff over pretty-print
- The interesting question is rarely “what did it return” — it is “what changed since Tuesday”. One flag answers it.
.sonde/ ├── config.toml ├── staging.toml # --env staging └── runs/ └── launches-baseline/ ├── request.http └── response.json # no database