A terminal UI HTTP client. Browse and send HTTP requests from your terminal without leaving the keyboard.
Supports .http, .bru (Bruno), .graphql, .postman_collection.json (Postman), and OpenAPI/Swagger spec files.
- Sidebar file browser — navigate collections as a directory tree
- Tabs for params, headers, vars, body, auth, info, scripts, options
- Multiple body types: raw, JSON, form-urlencoded, multipart
- Auth: Basic, Bearer, API Key, OAuth2 client credentials
- Syntax-highlighted JSON responses, with streaming for SSE/chunked endpoints
- Environment variable support via
.env, Brunoenvironments/*.bru, and*.postman_environment.json - Post-response variable extraction (chain requests from extracted tokens, IDs, etc.)
- Fuzzy search across every request in your collections
- Request history with one-key replay
- Import / export
curlcommands - Save edited requests back to disk; save responses to file
- Cycle HTTP methods without touching the mouse
- Works on macOS, Linux, and Windows
brew tap bgunnarsson/binman
brew install binmanDownload the latest release for your platform from the releases page:
| Platform | File |
|---|---|
| macOS (Apple Silicon) | binman-darwin-arm64 |
| macOS (Intel) | binman-darwin-amd64 |
| Linux (x86_64) | binman-linux-amd64 |
| Linux (ARM64) | binman-linux-arm64 |
Then make it executable and move it to your PATH:
chmod +x binman-darwin-arm64
mv binman-darwin-arm64 /usr/local/bin/binmanDownload binman-windows-amd64.exe from the releases page, rename it to binman.exe, and place it somewhere on your PATH.
Requires Go 1.22+.
git clone https://github.com/bgunnarsson/binman.git
cd binman
go build -o binman ./cmd/binmanbinman reads ~/.config/binman/config on startup. On systems with $XDG_CONFIG_HOME set, it uses $XDG_CONFIG_HOME/binman/config instead.
Create the file:
mkdir -p ~/.config/binman~/.config/binman/config
# Path to the directory containing your HTTP request files (required)
HTTP_FILES = /path/to/your/collections
# Default per-request timeout. Omit or set to 0 for no timeout
# (useful for streaming endpoints). Accepts any Go duration string.
TIMEOUT = 30s
# Optional client certificate for mTLS. Both must be set to take effect.
CLIENT_CERT = /path/to/client.crt
CLIENT_KEY = /path/to/client.key
HTTP_FILES is required. binman will refuse to start without it.
Point HTTP_FILES at any directory. binman will recurse into subdirectories and display all supported files in the sidebar.
Plain text, one request per file:
POST https://api.example.com/users
Content-Type: application/json
Authorization: Bearer {{TOKEN}}
{
"name": "Jane"
}The first line is METHOD URL. Headers follow until a blank line. Everything after the blank line is the body.
Bruno's block-based format:
get {
url: https://api.example.com/users
}
headers {
Authorization: Bearer {{TOKEN}}
}
collection.bru and folder.bru files are picked up automatically for shared variables.
Plain GraphQL operation files. binman wraps the query in a JSON body and sets Content-Type: application/json automatically.
Drop a Postman collection export into your collection directory. binman will expand it in the sidebar as a tree of folders and requests.
Drop an OpenAPI 3.x or Swagger 2.x spec (YAML or JSON) into your collection directory. binman detects it by content and expands it in the sidebar grouped by tag:
▶ openapi.yaml
▼ Pets
GET /pets
POST /pets
GET /pets/{id}
▼ Orders
GET /orders
Selecting an operation loads the URL and method. A Content-Type: application/json header is added automatically when the operation defines a JSON request body. Path parameters like {id} can be filled in manually or via environment variables.
Both .yaml/.yml and .json spec files are supported.
Place a .env file anywhere in your collection tree to define variables. binman walks up from the request file's directory to the root, so a single .env at the top of your collections folder applies to all requests within it:
collections/
.env ← applies to everything below
cms/
delivery/
get.http ← picks up collections/.env
A more specific .env in a subdirectory takes precedence over one higher up. Use .env.* files for multiple environments:
.env → labeled "default"
.env.staging → labeled "staging"
.env.production → labeled "production"
Bruno environments/*.bru files and Postman *.postman_environment.json files are also discovered automatically and appear in the same dropdown.
Switch between environments using the dropdown in the URL bar. Press Ctrl-E to edit the selected env file in-place.
# .env
BASE_URL = https://api.example.com
TOKEN = my-secret-tokenUse {{VAR_NAME}} anywhere in the URL, headers, or body:
GET {{BASE_URL}}/users
Authorization: Bearer {{TOKEN}}Lowest to highest:
- Collection vars (Postman
variable[], Brunocollection.bru/folder.bru) - Selected env source (
.env, Bruno env, Postman env) - Request-level vars (e.g. Bruno
vars:pre-request) - Vars extracted from previous responses (see Scripts)
- Manual overrides from the Vars tab
The Scripts tab on the request panel accepts simple extraction rules. After a response comes back, matching values are stored and become available to later requests as {{name}}:
token = json .access_token
id = json .user.id
csrf = header X-CSRF-Token
- Import: paste a
curl ...command into the URL bar and pressEnter. binman parses the method, URL, headers, and body into the request panel. - Export: press
Ctrl-Yto render the current request as acurlone-liner in the response area, ready to select-and-copy.
| Key | Action |
|---|---|
Ctrl-J |
Send request |
Ctrl-C |
Cancel in-flight request, otherwise quit |
Ctrl-Q |
Quit |
Ctrl-T |
Cycle HTTP method |
Ctrl-S |
Save request to source file (or response, if focused) |
Ctrl-Y |
Copy current request as curl |
Ctrl-F |
Fuzzy-search every request in the collection |
Ctrl-H |
Open history; Enter to replay |
Ctrl-E |
Edit the selected env file |
Tab |
Cycle focus through panels |
[ / ] |
Previous / next tab in the focused panel |
Escape |
Focus sidebar |
Enter |
Open file / expand directory |
Focus cycles: Sidebar → URL bar → Send button → Request panel → Response panel → Sidebar.