Stampdrill: requests you can read, a runner you can keep
An API client where the requests are files, the runner is open source, and the format is a language rather than a database row
[Almost Ad] This one is about Stampdrill, which I make. stampdrill.com ↗
Every API client I have used stores your work somewhere you cannot see. A database file, a cloud workspace, an export format that only round-trips through the same program. It works fine until the day you want to diff a change, review a colleague’s request in a pull request, or run the same call in CI, and then you are writing a second copy of everything in a different tool.
Stampdrill started from the opposite end. The requests are files. The files are the format. Everything else reads them.
A request is a text file
A .stamp file holds requests the way you would write them on a whiteboard: a method, a URL, headers, a body, and the checks that should pass afterwards.
@base = {{host}}/api
### Log in
POST {{base}}/login
Content-Type: application/json
{ "username": "{{username}}", "password": "{{password}}" }
> assert status == 200
> set token = body.token
That file sits in your repository next to the code it exercises. It diffs. It reviews. It survives the app being uninstalled. Nobody has to export anything to share it.
The same file opens in the Mac app, where you get forms, a response viewer and the usual comforts, and it runs from a terminal with the same results. There is no import step between the two, because there is no second representation.
Dimensions, because environments are never one list
Most tools give you a dropdown of environments, so qa-eu, qa-latam and prod-eu become three copies that drift apart.
In Stampdrill you name the axes instead. Environment is one axis, region is another, tenant might be a third. Variables declare which combinations they apply to, the most specific match wins, and * means any value. You pick a value per axis and the right variables follow.
It is a small idea that removes a whole category of copy and paste.
The parts that are open source
This is the part I want to be specific about, because open source means different things depending on who is saying it.
The Stamp language, the runner, every transport and the stampdrill command line tool are on GitHub under the Mozilla Public License. The language reference, the examples, the editor grammar and the agent skill are MIT.
The Mac app is the commercial piece: $49, for macOS 14 or later.
So the format is not a hostage. You can read exactly what gets sent, build the runner yourself, run your whole suite in CI without buying anything, and keep using your files if I vanish tomorrow. What you pay for is the native interface on top, which is the part that is genuinely nicer to use than a terminal and genuinely expensive to build.
I think that split is the honest one for a tool like this. Charging for a format is renting people their own work.
The command line tool is free, and it is the whole engine
stampdrill is not a cut-down companion. It is the same engine the app uses.
stampdrill check .
stampdrill test . --tags smoke --junit reports/junit.xml
stampdrill load . --json reports/load.json
It runs requests, test plans, load tests and MCP server tests from the same workspace, exits with 1 when a check fails and 2 when a file has errors, masks secrets in its output, and writes JUnit, HTML or JSON reports that CI systems already understand. There are macOS builds and fully static Linux builds for x86_64 and arm64, so the CI image does not need a runtime installed.
That matters for the thing people actually want: the tests they write while developing are the tests that run on every pull request, unchanged.
What the language grew into
It started as a way to write a request. It kept going, because the things you want next are all variations on the same file.
Test plans have steps, loops, conditions, retries and timeouts, and run over a matrix of dimensions and data files in parallel. Load tests declare virtual users, a ramp, a duration and thresholds on percentiles, error rate and throughput. Race tests use concurrently to start actors together and sync to line them up on the same instant, which is how you catch a coupon that can be redeemed ten times.
Sample data comes from a seed, so person(7) is the same person everywhere and the same run produces the same data tomorrow. WebSocket conversations are scripted with send and receive. GraphQL operations go with their variables. MCP servers, the ones people are building for AI assistants now, get tested like anything else, including the calls a server makes back to its client.
None of that needed a new tool. It needed more of one language.
Why plain text keeps winning
There is a pattern here that goes beyond API clients. Formats you can read outlive the programs that made them. A folder of text files can be versioned, searched, diffed, scripted, reviewed and recovered with tools that already exist and are not going anywhere.
Every time I have chosen a proprietary store for convenience, I have paid for it later in migrations.
Stampdrill is my attempt to not do that again, and to make the free part the part that guarantees it.
Comments
Threads live in GitHub Discussions. Nothing from GitHub is requested until you press the button.