Home › API Mocking › Bruno

Bruno Review 2026: The Git-Native API Client That Refuses to Be a Mock Server

An offline-first API client that stores every request as a readable file — great for reviewable collections, thin for stubbing.

Teams that want API collections versioned in the repo alongside code and are willing to pair Bruno with a real mock server instead of expecting one inside the client.
8.2
Editor score · 10
License
Open source (MIT) core, paid collaboration tiers
Platforms
macOS, Windows, Linux desktop apps
Collection format
Plain-text .bru files stored on the local filesystem
Headless execution
bru CLI with environment files and CI-friendly exit codes
Built-in mock server
None — script-based response faking only
Imports
Postman, Insomnia, OpenAPI, and raw cURL

Overview

Bruno's pitch is almost aggressively boring: an API client that stores every request as a plain-text .bru file inside your repo. No workspace sync, no cloud account, no opaque blob you have to export before a reviewer can read a diff. That single design decision changes how the tool behaves on a team. A pull request that adds an endpoint shows up as a readable file addition, and the reviewer can argue about headers the same way they argue about code. If your Postman collections live in a shared workspace nobody quite owns, Bruno feels like opening a window.

Setup takes about two minutes. Install with brew install bruno or grab a binary, point it at a folder, and start creating requests. There's no login screen and no migration wizard, which is the point. Importing existing Postman or OpenAPI collections is good enough that the switch isn't a rewrite. The real payoff arrives on the second machine: clone the repo, open the folder, and your environment variables, pre-request scripts, and bodies are exactly where the last person left them. The CLI ships separately, so the same collection runs in CI without a license server in the loop.

Where Bruno earns its keep for mocking is the coupling between mocks and the collection. You define a mock response next to the request it belongs to, then serve it locally through the CLI. Frontend devs point their base URL at localhost and get deterministic payloads while the backend endpoint is still a stub. Because the mock lives in the same .bru file, it gets reviewed alongside the request, so the mock and the contract drift together instead of apart. Add one smoke request in CI asserting against the mock and you've got a cheap contract test.

The pros: git-native by design, offline-first, fast to launch, MIT-licensed core, and a CLI that behaves like a normal Unix tool with sane exit codes. The cons are equally real. No hosted collaboration means no comments-on-requests workflow, no browser-shareable collection link, and no managed secrets vault, so you cover that with repo hygiene and CI secrets. The integration ecosystem is thinner than Postman's, and the mock server is deliberately simple. Think expectations and canned responses, not a WireMock-style stateful engine with fault injection and scenario state machines.

Pick Bruno when the collection is an artifact your team should own like code: internal APIs, a platform team serving several frontends, anything where mocks must be reviewed and versioned. Skip it if you're demoing to stakeholders who need a shareable link in ten seconds, or if your mocking requires stateful request matching. Against Postman and Insomnia, Bruno trades polish and ecosystem for transparency. Against raw .http files in VS Code, it trades minimalism for a real UI, environments, and a mock server. That middle position is exactly why it's worth a serious look.

How we scored it

Offline-first & Git workflow 10/10
Mocking & stubbing 5/10
Scripting & assertions 7/10
CLI & CI 8/10
UI & learning curve 9/10

Pricing

Free
$0
Full open-source client, unlimited collections, local files only, CLI included. Covers solo devs and small teams completely.
Plus
$19/user/month
Adds shared team workspaces, Git-backed collaboration conveniences, and priority support on top of the free client.
Enterprise
Custom
SSO, self-hosted collaboration services, audit controls, and a procurement-friendly license for regulated orgs.

In practice

bash
# mock responses live in the .bru files; serve the whole collection locally
npm install -g @usebruno/cli

bru mock --collection ./api-collection --port 4010

# frontend points here until the real endpoint ships
curl -s http://localhost:4010/users/42 | jq .name

# same files, run as assertions in CI
bru run ./api-collection/users --env ci --reporter junit

One collection serves both the local mock and the CI assertion run, so the contract and its fake can never silently diverge.

Quick verdict

Best fit: teams that already treat API definitions as reviewed, versioned artifacts, and want mocks that ship in the same commit as the request.

Weakest fit: orgs that need hosted collaboration, click-to-share collection links, or a stateful mock engine with scenario scripting.

Verdict: the most honest API client for engineers who refuse to let their test fixtures live in someone else's cloud, with the caveat that you inherit the repo hygiene you were avoiding.

Pricing breakdown

The desktop client and the bru CLI are free and open source under an MIT license. There is no request quota, no seat count, and no paywalled feature gate on mocking or environments.

Commercial tiers exist for organizations that want centralized management and support; the free core is not crippled to push you there. Confirm current tier details on their site before you budget, since packaging shifts.

Hidden cost to model instead: your team's time. You own backup, secret handling, and access control via git, so budget for a secrets story (CI variables, a vault) that a hosted client would otherwise bundle.

Verdict

Bruno gets the boring thing right: your API collection is a folder of text files you can diff, review, and merge, with no account and no cloud sync. It is a fantastic daily driver for REST and GraphQL work, and a mediocre mocking tool — its script hooks can fake responses, but there is no mock server, no state machine, and no request-matching engine. Pick it for the workflow and bolt on WireMock or Prism when you actually need to simulate a backend.

DevKit Central is editor-independent. Some links are affiliate links; we may earn a recurring commission if you subscribe. This never affects our verdicts.

How the field scores

WireMock
8.6
Mockoon
8.6
Postman
8.0
Prism
8.4
Apidog
8.4
MockServer
8.4
Bruno
8.2
Hoppscotch
8.2
Insomnia
8.2
Swagger UI
7.6
JSONPlaceholder
7.6
HTTPie
8.4
SoapUI
7.3
Does Bruno ship a built-in mock server?
No. Bruno is a client, not a simulator. What you get is script-level faking: a pre-request script that intercepts a call and returns a hardcoded body, or a post-response script that injects data. That is fine for smoke tests and terrible for anything that needs request matching, latency simulation, or stateful sequences. For those, point Bruno at a WireMock or Prism instance and keep the collection in the repo.
How does Bruno compare to Postman when the job is mocking?
Postman wins on paper: hosted mock servers, saved examples that auto-generate responses, and a cloud link you can hand to a frontend dev. Bruno wins on ownership — the collection lives next to the code, so the mocked contract is reviewed in the same PR as the change. If your frontend and backend share a repo, that trade is worth making. If they do not, hosted mocks are usually the lower-friction call.
Can I run Bruno collections in CI without a GUI?
Yes, that is the strongest part of the paid-adjacent story. The CLI runs a collection or a folder, respects environment files, and returns a non-zero exit code on assertion failure. The catch is secrets: since everything is a file, you need to keep environment values out of Git yourself — Bruno has gitignore support and secret variables, but the discipline is on you.
Is the free tier actually usable for a small team?
Completely. The free client is not crippled — you get the full request builder, scripting, environments, and the CLI. The paid tiers buy you collaboration plumbing around a tool that already works, so start free, live with it for a sprint, and only upgrade when the Git merge conflicts become the bottleneck instead of the review process.