Build Postman
KINDAreplaces $9/mosaves $108/yrback to the verdict
A file-based API client for one developer: requests as YAML in git, environments with secrets from the shell, a runner with assertions that exits non-zero for CI, chaining a token from one call into the next, history with diffs, and an importer for Postman collections. Bruno is the open-source answer; this is the 500-line version you own.
Before step 1
Everything below is assumed from the first step. Tick each one when you actually have it, not when you plan to.
- installfree
Why Everything in this build runs on it: the server, the scripts, the tests.
Get it Download the LTS installer from nodejs.org, or install with your package manager (brew install node, or nvm install 22). Restart the terminal afterwards. open ↗
Verify
node --version prints v22 or higher - installfree
Why Every step below is a command you type or a file you edit.
Get it VS Code (code.visualstudio.com), Cursor or Zed. Open a folder for the project and use the editor's built-in terminal. open ↗
Verify
You can open a folder and run a command in its terminal - installfree
Why History for your code, and the way most hosts deploy.
Get it Install from git-scm.com or with your package manager, then run git init in the project folder once it exists. open ↗
Verify
git --version prints a version - decidefree
Why If it fits, use it and stop; it is free and file-based. This build is for wanting a version you can read in an afternoon.
Get it usebruno.com, open your collection folder. open ↗
- have readyfree
Why Phase 5 imports it; every phase needs a real API to test against.
Get it Postman > Collection > Export (v2.1). Any public API or your own local server for tests.
- decidefree
Why Requests reference {{env.NAME}}; values come from environment variables.
Get it Export them in your shell profile or a .env you never commit.
Data model
Create these before the first phase that stores anything. Changing a table later is the expensive kind of change.
- requests/<name>.yaml: method, url, headers, query, body, auth (bearer | basic | none), asserts (status, jsonpath equals)
- environments/<name>.yaml: key-value pairs referenced as {name} in requests
- history.sqlite: one row per run with request name, environment, status, latency, response sizeEnvironment variables
These go in a .env file the app reads at startup. The pack's .env.example is this table as a file · copy it, never commit the filled-in version.
| Variable | Needed | Example | Where the value comes from |
|---|---|---|---|
API_HISTORY_DB | optional | ~/.api-cli/history.db | Where runs are recorded. |
API_TOKENsecret | optional | ... | An example secret a request references as {{env.API_TOKEN}}. |
The build, in order
Run one request
YAML in, pretty response out, secrets only from the shell.
requests/<name>.yaml: method, url, headers, query, body, auth, asserts. environments/<name>.yaml: key-value pairs referenced as {{name}}.
terminalmkdir api-cli && cd api-cli && git init && npm init -y && npm pkg set type=module && npm install yaml@2 mkdir -p requests environments && cp .env.example .env
done when · tick each as it passesAssertions
Collections and chaining
History and diff
Import
Share with a teamproduct builder
Only if others use it: publish the CLI and enforce it in CI.
done when · tick each as it passes
That is the whole plan for Postman. What it deliberately does not cover is below · check the gaps before you call it a replacement.
- Team sync, mock servers, monitors, the visual editor: the seat price.
- team workspaces and cloud sync
- the mock server and monitoring products
- the visual editor
- API governance and the public API network
- A local web UI over the same files
- OpenAPI import
Need the files? The project pack on the verdict page hands your agent the whole brief · more dev tools.