Tiger vs Bruno
Tiger and Bruno share the same founding conviction: API collections belong in your Git repository, not in a vendor's cloud. Both are MIT-licensed, fully offline, and require no account. This page lays out where they differ, fairly and without marketing spin, so you can choose the right tool for your team.
What they have in common
Before the differences, the common ground is substantial. Both tools store every request
as a human-readable plain-text file - .tiger for Tiger,
.bru for Bruno - inside a normal folder on disk. That folder is a Git
repository, so requests get versioned, branched, diffed, and reviewed alongside code.
Neither product requires an account, neither phones home with your request data, and
both run natively on macOS and Windows (Tiger also ships first-class Linux builds as of
0.4.0). Both support REST, GraphQL, {{variable}} interpolation, named
environments, OAuth 2.0, pre- and post-request JavaScript, and collection-level
runners.
Tiger can import a Bruno collection folder directly. Collections, environments,
headers, query parameters, bodies, and variable references all carry over. Tiger
stores the imported requests in its own .tiger format afterward.
Side-by-side comparison
| Capability | Tiger 0.4.0 | Bruno |
|---|---|---|
| License | MIT | MIT |
| Collections as plain text in Git | Yes - .tiger files |
Yes - .bru files |
| Account required | Never | Never |
| macOS / Windows / Linux native builds | Yes - all three | Partial - macOS + Windows; Linux via community builds |
| MCP server for AI clients | Yes - tiger-mcp binary ships with the app; exposes list_requests, list_environments, get_request, run_request tools |
No |
| WSDL / SOAP import | Yes - each binding operation becomes a POST with a ready-to-fill SOAP envelope; SOAP 1.1 + 1.2 (added in 0.4.0) | No |
| Client certificates (mTLS) | Yes - PEM pair or PFX/PKCS12, plus custom CA bundle | No |
| Performance / load runs | Yes - configurable N requests with concurrency; reports min, max, avg, p50, p95 | No - requires an external tool such as k6 or wrk |
| Response captures for request chaining | Yes - declarative capture block in the .tiger file; no scripting required |
Scripts - possible via pre/post-request JavaScript; no dedicated capture syntax |
| Collection runner with pass/fail assertions | Yes - live verdicts, stop button, capture chaining across requests | Limited - basic runner; assertion support is less complete |
| Built-in Git UI (commit, push, pull, diff, branch) | Yes - commit, push, pull, diff, branch, checkout, clone, discard, log, sync inside the app | No - Git operations happen outside the app |
| Response search (Cmd/Ctrl+F) | Yes - highlight + match cycling | No |
| HTML and image response preview | Yes - sandboxed HTML frame; inline image preview | No |
| Multipart file upload | Yes - per-row file picker; @file: paths in .tiger |
Yes |
Dynamic variables ({{$uuid}}, {{$timestamp}}, etc.) |
Yes | Partial |
| Pre/post-request JavaScript | Yes | Yes |
| GraphQL with variables pane | Yes | Yes |
| OAuth 2.0 client credentials | Yes | Yes |
| Import: Postman v2.0/2.1, Insomnia v4, OpenAPI 3 / Swagger 2, Bruno, curl, WSDL | All six | Most - Postman, Insomnia, OpenAPI, curl; not WSDL |
| Export: Postman v2.1, OpenAPI 3.0, curl, fetch | All four | Partial |
| Community and ecosystem | Newer - smaller community; active development | Established - launched 2022; tens of thousands of GitHub stars; broad plugin ecosystem |
| CLI runner | No - desktop only | Yes - @usebruno/cli runs collections in CI |
| Documented file format spec | Internal - readable but not formally published | Documented - published .bru spec; third-party tooling built on it |
Where Tiger goes further
Built-in MCP server
Tiger ships a Model Context Protocol server (tiger-mcp) that exposes your
saved requests as tools for any MCP-compatible AI client. Claude Desktop, Cursor, and
others can call list_requests, list_environments,
get_request, and run_request against your collection without
leaving the chat. The server reads your collection from disk; your request data goes
nowhere except to the API you are calling.
Configure it in claude_desktop_config.json like this:
{
"mcpServers": {
"tiger": {
"command": "node",
"args": [
"/path/to/tiger/out/mcp/server.mjs",
"/path/to/your/collection"
]
}
}
}
WSDL / SOAP import (new in 0.4.0)
Point Tiger at a .wsdl file and it parses the binding operations and
generates one POST request per operation. Each request arrives with:
- A ready-to-fill SOAP envelope in the body, pre-populated with the correct element names for that operation.
Content-Type: text/xml; charset=utf-8(SOAP 1.1) orapplication/soap+xml(SOAP 1.2).- The
SOAPActionheader set to the correct URI for SOAP 1.1 operations.
For teams that maintain legacy enterprise services alongside modern REST APIs, this means everything lives in one client rather than keeping a separate SOAP tool.
Client certificates and mTLS
Tiger accepts a custom CA bundle for self-signed or internal PKI certificates, and supports client certificate authentication via either a PEM key/cert pair or a PFX / PKCS12 file. This covers mutual TLS scenarios common in financial services, healthcare, and internal microservice meshes. Bruno does not currently ship this capability.
Performance runs
Select any request, open the Perf tab, set the number of iterations and a concurrency level, and Tiger fires the requests and reports min, max, avg, p50, and p95 latency inline. No external tool, no subscription. Bruno has no equivalent; you would reach for k6 or wrk.
Declarative response captures
Tiger's capture block in the .tiger format lets you pull a
value from any response - status code, a response header, or a JSON path like
body.data[0].id - and write it into an environment variable for the
next request. This is declared in the file, not in a script, so it shows up in diffs
and reviews without requiring anyone to read JavaScript:
capture {
token: body.access_token
userId: body.user.id
}
Bruno can achieve the same result through a post-request script, but there is no dedicated syntax, so the intent is less visible in code review.
Built-in Git UI
Tiger surfaces Git operations - status, diff, commit, push, pull, branch, checkout, clone, discard, log, and sync - inside the app. Team members who do not use a terminal can still participate in version control without a separate GUI client.
Where Bruno goes further
CLI runner for CI
Bruno ships @usebruno/cli, a standalone Node package that runs a
collection from the command line. This makes it straightforward to add API test suites
to a CI pipeline without any desktop app. Tiger is desktop-only; there is no
equivalent CLI runner today.
Community and ecosystem
Bruno launched in 2022 and has tens of thousands of GitHub stars. The ecosystem includes
community-built plugins, integrations, and third-party tooling built on the documented
.bru file format. If you need to find a ready-made solution for an unusual
workflow, the Bruno community is a larger pool to draw from.
JavaScript scripting maturity
Bruno's pre- and post-request scripting, assertions, and test output have had more time to mature and accumulate community examples. Both tools run sandboxed JavaScript, but Bruno's ecosystem of documented patterns for complex scripting scenarios is broader.
Which should you choose?
Choose Tiger if any of these apply:
- You want AI clients (Claude, Cursor) to discover and run requests from your collection via MCP without extra tooling.
- Your team works with SOAP or WSDL-described services alongside REST APIs.
- You need client certificate (mTLS) authentication.
- You want built-in load and latency profiling without wiring up a separate runner.
- You want declarative request chaining that reads clearly in a pull request diff.
- You want Git commits and pushes accessible inside the API client for the whole team, including those who do not use a terminal.
- You are running Linux and want an officially supported first-class build.
- You are migrating from Bruno and want full import support with no data loss.
Choose Bruno if any of these apply:
- You need a CLI runner to execute API test suites in CI without a desktop app.
- You want a tool with years of real-world use and a large public community.
- Your workflow depends on JavaScript scripting with a mature assertion library and abundant community examples.
- Your team already has tooling built around the documented
.bruformat. - Your requests are REST and GraphQL only, with no SOAP or mTLS requirement.
Tiger imports Bruno collections directly. If you want to try Tiger without abandoning your existing collection, open Tiger, choose Import, pick your Bruno folder, and your requests will be ready in seconds.
Frequently asked questions
Does Tiger export back to Bruno's format?
Not currently. Tiger exports to Postman v2.1, OpenAPI 3.0, curl, and JavaScript fetch. If you need to move work back to Bruno, exporting to Postman v2.1 and then importing that into Bruno is the most complete path.
Do both tools support secret variables?
Yes. In Tiger, marking a variable as secret masks its value in the UI so it does not appear in screenshots or screen shares. The value is still stored in the environments file on disk, so how you handle that file in Git (gitignore, secrets manager, etc.) is your responsibility - the same is true in Bruno.
Which tool is better for a team?
Both store collections in Git, which is the most durable basis for team collaboration. Tiger's built-in Git UI lowers the bar for team members who do not use the terminal. Bruno's CLI runner is valuable if your team wants collection tests to run automatically in CI. The right answer depends on which gap matters more to your team.
Is Tiger's MCP server safe to use?
The MCP server reads your collection from disk and sends requests to the URLs defined in your collection, exactly as if you pressed Send yourself. It does not send your collection data to any third party. The AI client sees the request definition and the response; your API credentials stay in your environment files on your machine.