Bruno is an open source API client built around a simple idea: your API collections should be plain text files in your repository, not records in someone else's cloud. For developers who already treat everything as code, it fits naturally into an existing workflow. This article explains how Bruno works, why its file based model matters, and how to adopt it.
The core idea: collections as files
Bruno saves each request in the Bru markup language as a .bru file on your filesystem. A collection is simply a folder, described by a bruno.json manifest, containing those request files. Because the files are plain text, they diff cleanly, review well in pull requests, and can be edited in any editor from VS Code to Vim.
This is a deliberate departure from the cloud workspace model used by most API clients. Nothing is hidden inside a proprietary database. What you see in the app is what sits in your folder, and what sits in your folder is what you commit.
Version control is the collaboration model
There is no shared cloud workspace in Bruno, and that is the point. You collaborate through Git, or any other version control system you prefer. This keeps API changes and their request definitions in the same history as the application code.
The practical benefits are real. A new endpoint ships with its request file in the same pull request. A reviewer sees exactly what changed in a request as a diff. Branching a feature branches its API requests with it. Git blame answers who changed a header and when. Your API collection inherits every good habit your team already has around code review and version history.
Offline and private by design
Bruno is offline only. There is no login, no account, and no cloud sync. Request data, keys, and tokens stay on your device. Environments are stored as files you can commit, and secrets can be sourced from a dotenv file so they never end up in a shared, committed collection.
For teams with strict data handling requirements, this is a significant advantage. Sensitive request details never leave your infrastructure, because there is no vendor cloud in the loop at all.
Built for automation
Bruno is not just a desktop app. The Bruno CLI runs collections headlessly with a single bru run command, and it supports JSON, JUnit, and HTML reporters so it fits into whatever pipeline you use. Official Docker images are published on every CLI release, with Alpine and Debian variants, so you can run collections in CI or in a container without installing Node on the host.
A typical CI step runs the collection against a named environment and fails the build if any assertion fails. Because the same collection you use locally is the one that runs in CI, there is no drift between manual testing and automated checks.
Full protocol and scripting support
Despite its lightweight footprint, Bruno is capable. It handles REST, GraphQL, and gRPC requests. It supports JavaScript scripting with pre request and post response hooks, letting you set up data, compute signatures, validate responses, and chain values between requests. Assertions let you check status codes, headers, and body fields directly.
Getting started
Adopting Bruno takes only a few steps. Download it for your operating system, create a new collection, and optionally import an existing Postman or Insomnia collection to see how it maps to the .bru format. Commit the collection folder to your repository, add environment files, and wire the CLI into your pipeline. From there, every request is versioned, reviewable, and automatable.
This guide to the Bruno API testing tool covers a full setup, from the first request to CI integration.
A note on the project
Bruno is MIT licensed with a free and fully functional core client. It was created as a deliberate reaction to API clients that require cloud accounts and store data on vendor servers. There are paid Pro and Ultimate tiers that add in-app Git integration, OpenAPI sync, and enterprise controls, but the open source client covers what most teams need.
Common questions
A few questions come up regularly. Is Bruno free? The core client and CLI are free and open source under the MIT license, with optional paid tiers for larger organizations. Does it work with existing collections? Yes, you can import Postman and Insomnia collections. Can it run in CI without extra setup? Yes, official Docker images let the CLI run collections in a pipeline without installing Node on the host. These answers make it easy to trial Bruno on a single project before adopting it more broadly.
Why it matters
The trend in developer tooling is clear: teams increasingly want their tools to respect version control and data ownership. Bruno is a strong example of that shift applied to API testing. If your codebase already lives in Git and you value privacy, Bruno lets your API collections live there too, with all the review, history, and automation benefits that come with treating them as code.