jsonr reads plain .http files, fills in variables, keeps secrets out of your shell history, and asserts on the response.
POST @@baseUrl@@https://prod.api.example.com/users Authorization: Bearer @@apiKey@@•••••••••••• { "name": "John Doe", "email": "john.doe@example.com" }
$ → POST https://prod.api.example.com/users Authorization: Bearer *****201 Created · 84 ms · status matches 201{ "id": 1042, "name": "John Doe", "email": "john.doe@example.com" }
One .http file per request. Commit them next to the code, share them with the team.
-e prod swaps base URLs, headers and secrets. Config files merge from your home folder down to the project.
-s 201 checks the status, -t "ok" checks the body. Non-zero exit on mismatch, so CI can run it.
jsonr run script.js gives you a jsonr() function to pass one response into the next request.
An agent can run jsonr against real APIs while the API key stays in a file it never reads.
jsonr-config.json.--debug, is replaced with *****.jsonr create-user.http -e prod contains no credential, so it can sit in a prompt, a script or a chat.jsonr skill --init writes a SKILL.md for Claude Code, Codex and Cursor next to your AGENTS.md, so /jsonr send create-user against prod just works. jsonr skill prints the agent instructions.jsonr create-user.http -e prod~/.secrets/jsonr-prod.json → { "apiKey": "prod_…" }Authorization: Bearer prod_ApiKey123Authorization: Bearer *****curl -fsSL sobanieca.github.io/jsonr/install.sh | bash
A single binary for Linux and macOS (x64 and arm64), no runtime needed. Update it any time with jsonr update. Run jsonr --help to read everything in about five minutes.