Is Bruno request-first? Yes. Bruno is built around composing, organizing, and sending HTTP requests. You create a collection, add requests, write them in its .bru files, run them, and version the whole thing in Git. That model is fast, Git-friendly, and a genuine pleasure when you’re exploring an API that already exists.
But “request-first” and “design-first” answer different questions. Request-first asks: how do I call this endpoint? Design-first asks: what should this endpoint be, before anyone writes code to serve it? The gap between those two questions is exactly where teams building new or shared APIs start to feel friction. This article walks through the Bruno request-first vs design-first trade-off honestly, then shows where an OpenAPI-native, design-first workflow earns its place.
Request-first vs design-first, quickly
The two approaches aren’t competitors so much as different starting points. Here’s the short version.
| Dimension | Request-first (Bruno) | Design-first (OpenAPI-native) |
|---|---|---|
| Starting artifact | A request you can send | A contract (OpenAPI spec) |
| Best for | Exploring and testing existing APIs | Designing new/shared APIs before code |
| Source of truth | The collection of requests | The spec |
| Cross-team review | After endpoints exist | Before a line of server code |
| Visual design surface | None by default | Visual designer + schema editor |
| Drift risk | Collection can lag the real API | Spec stays the single contract |
| Git story | Strong (plain-text .bru) |
Strong when the tool syncs spec to Git |
Neither column is “wrong.” The right choice depends on whether your API already exists or whether you’re defining it now.
Bruno’s request-first model
Bruno does its job well, and it’s worth being precise about what that job is. It stores requests as plain-text .bru files in a folder you own. There’s no mandatory cloud account, no proprietary sync, no background telemetry you have to opt out of. For developers who want their API client to behave like the rest of their codebase, that’s a real advantage, and it’s the core of the Git-native API workflow many teams have adopted.

Where Bruno shines:
- Exploring an existing API. Point it at a running service, fire requests, inspect responses, iterate. The feedback loop is tight.
- Local-first and Git-friendly. Diffs are readable, merges are sane, and your request history lives in the same PR as your code.
- Scripting and testing. Pre- and post-request scripts, assertions, and environment variables cover the day-to-day testing most engineers need.
- No lock-in. The format is open and the files are yours.
If your work is consuming and verifying APIs that already exist, request-first is often the most direct path. We’ve said as much before when comparing it to broader platforms in this Bruno alternative breakdown.
The cost of no design or contract layer
The trade-off shows up the moment the API doesn’t exist yet, or the moment more than one team has to agree on what it should look like.
No visual designer. Request-first tools express endpoints as requests, not as a model of resources, schemas, and responses. There’s no canvas where a product engineer, a backend lead, and a frontend developer can look at the same resource shape and agree on it before anyone writes a handler. Designing in requests means designing in examples, and examples don’t enforce structure.
Contract drift. When the collection is the source of truth, it only reflects what someone has already called. The real API can change, add a field, deprecate a parameter, tighten validation, and the collection quietly falls behind until a test fails. A spec-centric workflow inverts this: the contract is the reference, and the implementation is checked against it.
Harder cross-team review before code. Reviewing a folder of requests tells you how endpoints are being called today. It doesn’t give a reviewer a clean, declarative document to approve before implementation. For teams that gate API changes through design review, the absence of a first-class contract makes that review slower and more ad hoc.
None of this makes Bruno a poor tool. It makes Bruno a request-first tool used outside the job it’s request-first for.
When design-first wins
Design-first pays off in three situations in particular:
- Greenfield APIs. When nothing exists yet, the spec is the design. You define resources, schemas, and error shapes once, then generate server stubs, mocks, and docs from that single contract instead of reverse-engineering them from requests later.
- Multi-team contracts. When a backend team and one or more client teams must agree, the OpenAPI spec is the agreement. Frontend can build against a mock the moment the contract is approved, in parallel with backend implementation, instead of waiting for real endpoints.
- Public APIs. When external developers depend on you, stability and clear documentation are the product. A maintained contract gives you generated reference docs, versioning discipline, and a way to communicate breaking changes deliberately.

The common thread: design-first wins when the API is a shared interface that needs agreement before code, not just a service you’re poking at after it ships.
Apidog design-first plus Spec-First Mode
Apidog is built design-first, and the relevant point here is that you don’t have to give up the OpenAPI-native, Git-friendly experience to get it.

You can work two ways against the same project. Tvisual designer for defining endpoints, request and response schemas, and reusable components without hand-writing YAML, which is what most people picture when they hear “design-first.” And there’s Spec-First Mode, a code editor where you author the OpenAPI document directly, with the spec as the literal source of truth. The two stay in sync, so a backend engineer can live in raw OpenAPI while a product engineer works on the canvas, and they’re editing the same contract.
Spec-First Mode also supports two-way Git sync: the spec lives in your repository as a real file, changes flow in both directions, and your API design travels through the same pull requests and review as your code. That’s the Git-native property Bruno users value, applied to the contract rather than to a collection of requests. The full mechanics are in the Spec-First Mode documentation.

The result is one workflow that covers both questions, design the contract first when you need to, and still test against it like a request-first client when the endpoints are live. For a deeper look at where these models meet, see spec-first vs design-first in Apidog.
Choosing by team maturity
A simple way to decide: match the tool to where your API is in its life, not to a preference.
- Solo or small team, mostly consuming APIs. Request-first is plenty. Bruno’s local-first model gets out of your way, and you don’t carry the overhead of maintaining a formal contract you don’t need.
- Growing team shipping its own APIs. This is the inflection point. Once a second team depends on your endpoints, an informal collection stops scaling and an explicit contract starts saving you review cycles and integration bugs.
- Mature org with public or many internal APIs. Design-first is effectively required. The spec becomes governance, documentation, and onboarding all at once, and an OpenAPI-native tool with Git sync keeps it honest.
The honest read on Bruno request-first vs design-first is that maturity, not taste, usually decides. Teams tend to start request-first and grow into design-first as their APIs become contracts other people rely on.
FAQ
Is Bruno request-first or design-first?
Bruno is request-first. Its core model is composing, organizing, and sending requests stored as plain-text files, which is ideal for exploring and testing APIs that already exist. It doesn’t center on authoring an OpenAPI contract before the API is built.
Can I do design-first work in Bruno?
Not natively in the way a spec-centric tool does it. Bruno focuses on requests rather than on a visual designer or an OpenAPI document as the source of truth. If you need to define and review a contract before code, a design-first, OpenAPI-native tool fits that job better.
Do I have to give up Git-friendliness to go design-first?
No. The Git-native property, plain-text files in your repo, readable diffs, review through PRs, can apply to the spec itself. Apidog’s Spec-First Mode keeps the OpenAPI document in your repository with two-way sync, so design-first doesn’t mean leaving Git behind.



