>
bruno
Test and debug APIs with Bruno, the open-source API client. Use when a user asks to create API requests, organize collections, write test scripts, use environments and variables, or collaborate on API workflows stored in Git.
#api-client#http#testing#git-friendly#open-source
terminal-skillsv1.0.0
Works with:claude-codeopenai-codexgemini-clicursor
Usage
$
✓ Installed bruno v1.0.0
Getting Started
- Install the skill using the command above
- Open your AI coding agent (Claude Code, Codex, Gemini CLI, or Cursor)
- Reference the skill in your prompt
- The AI will use the skill's capabilities automatically
Example Prompts
- "Review the open pull requests and summarize what needs attention"
- "Generate a changelog from the last 20 commits on the main branch"
Documentation
Overview
You are an expert in Bruno, the open-source API client that stores collections as plain text files in your Git repository. Unlike Postman (cloud-synced, proprietary format), Bruno uses a human-readable format (Bru) that lives alongside your code — versioned, reviewable, and shareable via Git.
Instructions
Collection Structure
api-collection/
├── bruno.json # Collection config
├── environments/
│ ├── dev.bru
│ ├── staging.bru
│ └── production.bru
├── auth/
│ ├── login.bru
│ ├── register.bru
│ └── refresh-token.bru
├── users/
│ ├── list-users.bru
│ ├── get-user.bru
│ ├── create-user.bru
│ └── update-user.bru
└── orders/
├── list-orders.bru
├── create-order.bru
└── process-refund.bru
Bru File Format
bru
# auth/login.bru — Human-readable, Git-diffable
meta {
name: Login
type: http
seq: 1
}
post {
url: {{baseUrl}}/api/auth/login
body: json
auth: none
}
headers {
Content-Type: application/json
}
body:json {
{
"email": "{{testEmail}}",
"password": "{{testPassword}}"
}
}
script:post-response {
// Save token for subsequent requests
if (res.status === 200) {
bru.setVar("authToken", res.body.token);
bru.setVar("userId", res.body.user.id);
}
}
tests {
test("should return 200", () => {
expect(res.status).to.equal(200);
});
test("should return token", () => {
expect(res.body.token).to.be.a("string");
expect(res.body.token.length).to.be.greaterThan(0);
});
test("should return user", () => {
expect(res.body.user.email).to.equal("{{testEmail}}");
});
}
Environments
bru
# environments/dev.bru
vars {
baseUrl: http://localhost:3000
testEmail: test@example.com
testPassword: testpass123
}
vars:secret [
stripeKey,
dbPassword
]
Scripting
javascript
// Pre-request script — runs before sending
const crypto = require("crypto");
const timestamp = Date.now().toString();
const signature = crypto
.createHmac("sha256", bru.getVar("apiSecret"))
.update(timestamp)
.digest("hex");
bru.setVar("timestamp", timestamp);
bru.setVar("signature", signature);
// Post-response script — process responses
if (res.status === 200) {
const users = res.body.data;
bru.setVar("firstUserId", users[0].id);
console.log(`Found ${users.length} users`);
}
// Chain requests — use variables from previous responses
// login.bru sets {{authToken}}
// create-order.bru uses {{authToken}} in auth header
CLI for CI/CD
bash
# Install CLI
npm install -g @usebruno/cli
# Run entire collection
bru run --env dev
# Run specific folder
bru run auth/ --env dev
# Run with custom environment variables
bru run --env production --env-var apiKey=sk_live_xxx
# Output JUnit XML for CI
bru run --env dev --output results.xml --format junit
Installation
bash
# Desktop app (GUI)
# Download from https://www.usebruno.com/downloads
# CLI
npm install -g @usebruno/cli
Examples
Example 1: User asks to set up bruno
User: "Help me set up bruno for my project"
The agent should:
- Check system requirements and prerequisites
- Install or configure bruno
- Set up initial project structure
- Verify the setup works correctly
Example 2: User asks to build a feature with bruno
User: "Create a dashboard using bruno"
The agent should:
- Scaffold the component or configuration
- Connect to the appropriate data source
- Implement the requested feature
- Test and validate the output
Guidelines
- Git-first workflow — Store Bruno collections in your repo next to application code; review API changes in PRs
- Environment files for config — Use environments for base URLs and credentials; secrets marked as
vars:secretare never committed - Test assertions — Write tests in every request; run them in CI to catch API regressions
- Script chaining — Use
bru.setVar()in post-response scripts to pass data between requests (token → subsequent calls) - Folder organization — Mirror your API structure (auth/, users/, orders/); each folder can have its own pre-request scripts
- CI/CD integration — Run
bru run --env stagingafter deployment to verify API contract; fail the pipeline on test failures - No cloud dependency — Unlike Postman, your collections never leave your machine or repo; no sync, no cloud, no account required
- Documentation as requests — Bruno collections serve as living API documentation; new team members run requests to understand the API
Information
- Version
- 1.0.0
- Author
- terminal-skills
- Category
- Development
- License
- Apache-2.0