Bandura · API testing IDE
v1.0.0-rc.8 is out now on Windows and Linux, and the app's update check offers newer releases as they ship. Signed macOS, and v1.0.0 final, in August 2026.
Build API tests as a graph. Ship them as YAML.
Design a flow on the canvas and review it as plain YAML in your own Git repo: the graph
and the code are the same .aether file. Everything runs locally, works
offline, and the same engine runs headless in CI.
On a Mac? This list gets you the signed build first.
- Works fully offline
Edit, run, import, debug. No network, no account, no sign-in wall.
- Plain text, in your Git repo
.aetherYAML you can diff, review, and blame. No export step, no lock-in. - No account, no telemetry
Tests, tokens, and run history stay local; the only two destinations the app reaches on its own behalf are the AI provider you choose and GitHub, for a switchable once-a-day update check. The complete list.
- Licence verified offline
A signed key, checked in-app. No activation server that can switch you off.
Import and build
Not an export. Not a sync. Two renderings of one file.
Postman Flows hides the code. Bruno has no graph. Here both views are the same
.aether YAML, so there is nothing to keep in sync.
- id: login
type: request
config:
method: POST
url: ${{ variables.baseUrl }}/auth/login
body: |
{ "email": "${{ env.DEMO_EMAIL }}", "password": "${{ env.DEMO_PASSWORD }}" }
capture:
accessToken: response.body.token # every later node can read this
next: get_product Plain YAML with embedded JavaScript: diffable, and readable by any AI assistant.
Run and inspect
Watch it run. Then ask any node what actually happened.
A run lights the graph node by node. Click any node for its resolved request and response: not the template, the real thing that went over the wire.
Unresolved references get a ⚠ before the run, not a silent
undefined three nodes deep.
Commit and share
Sharing a test suite is git clone.
No workspace invite, no export. A Bandura project is a folder of plain-text files, so it was already in your repo. Your teammate clones it and runs.
-
git clone … && open the folderRecognized from
bandura.json. Nothing to convert. -
fill in the two env vars it asks forThe manifest declares variable names, never values. Secrets stay in a git-ignored
.envor the OS keychain. -
▶ RunUnder a minute from clone to a green graph.
Review API tests like code, because they are code
- id: create_order
type: request
config:
method: POST
- url: ${{ variables.baseUrl }}/order
+ url: ${{ variables.baseUrl }}/orders
capture:
+ orderId: response.body.id A test change in a pull request: reviewable, blameable, revertable. Try that with a database-backed collection. More on Git-native API testing →
Automate in CI
The same engine runs everywhere the work happens.
The desktop app, the CLI, and the MCP server share one execution engine. What passes on your machine passes in CI: same code, same file.
On npm now
# Installs a self-contained native binary. No runtime to load.
npm install -g @bandura/cli
bandura --version
# ...or run without installing
npx @bandura/cli run A native binary per platform: macOS, Linux (glibc & musl), Windows. No account, no backend, and macOS can run the CLI today, ahead of the signed desktop build. Read the CLI reference →
Exit 0 on green, non-zero on any failure: the CI contract. Reporters: pretty, JSON, JUnit XML, GitHub annotations. Run a file, a glob, or a named collection.
# .github/workflows/api-tests.yml (generated by "Export to CI/CD")
- run: npx @bandura/cli run "flows/**/*.aether" --reporter github
env:
BASE_URL: ${{ secrets.STAGING_URL }}
That block runs today: @bandura/cli is on npm and the in-app
"Export to CI/CD" writes the file for you. A composite
bandura-io/run@v1 Action shortens it to three lines and publishes at
launch; until it is on the Marketplace we print the version that works. Secrets arrive
as environment variables. The full setup:
API tests in CI →
Ask the AI
The AI can run entirely on your own hardware.
Three providers: Anthropic and Google Gemini natively, and OpenAI-compatible, meaning any
/chat/completions endpoint with a base URL you set. That one setting covers
OpenAI, Groq, OpenRouter, Together, Ollama, and LM Studio. Point it at
http://localhost:11434/v1 and no prompt, no request payload, and no response
body leaves your machine. There's a Test connection button, so that's
something you verify rather than something you take on faith. Setup walkthrough:
API testing with a local LLM →
Every AI surface, one setting
Chat, the agentic tool loop, flow generation, and the ai-action node all
use the provider you configured. There is no second, hard-wired vendor underneath.
A local model needs no key
Ollama and LM Studio take no API key at all. If your policy forbids sending request and response bodies to a third-party model, this is the setting that makes the tool usable instead of banned.
Headless matches the desktop
The CLI and the MCP server read the same choice from the environment,
BANDURA_AI_PROVIDER, BANDURA_AI_BASE_URL,
BANDURA_AI_MODEL, so CI runs against the model you actually picked.
Your agent can run the whole loop
The MCP server exposes your workspace to Claude Code, Claude Desktop, or Cursor: an agent runs a flow, reads the failing node's request and response, edits the YAML, re-runs. It runs where your files are, as a local stdio process, not a vendor cloud relay, so your flows, tokens, and responses never transit anyone's servers. Details: the MCP server →
Windows or Linux? It is live.
v1.0.0-rc.8 is on the download page now. The signed macOS build and v1.0.0 final land in August; leave an address and you get those the day they do.
The rest of the workbench
The parts you only miss when they are gone.
Building the flow
Data-driven runs
Attach a CSV or JSON dataset and the flow runs once per row, that row in scope as
data, each row an independent test case.
Typing never blanks the canvas
Half-written YAML doesn't parse, which is normal rather than broken. The last graph that parsed stays on screen, dimmed and marked stale, with editing paused until the file is valid again.
Talking to real APIs
Auth you declare, not assemble
An auth block on a node or the whole flow: basic, bearer, API key,
OAuth2, AWS SigV4. OAuth2 fetches the token once per run and refreshes it before it
expires, so ten requests make one token call. SigV4 signs the request that actually
ships, and re-signs on every retry.
Cookies just work
Set-Cookie is captured and replayed by domain, path and expiry, so
log-in-then-use-the-session is two nodes with no Cookie header
anywhere. An explicit header still wins, and one flag opts a request out.
Watching it run
Step through it like code
Set a breakpoint on a node, run, and the flow stops there with every captured
variable in scope. Step to the next node, run just one, or resume. Breakpoints live
in the app, never in the .aether file, so debugging state never lands
in a diff.
Run history
Every execution persisted locally in SQLite: durations, per-node results, what changed between runs. It never leaves your machine.
Fitting your setup
- Copy any request as code
-
cURL, JavaScript
fetch, Node axios, Python requests, Go, HTTPie. Generated from the request that actually went out, variables already substituted, so what you paste is what ran. - Plays well with other editors
-
Edit in VS Code or pull from Git and Bandura notices: clean files reload silently, dirty ones ask. It's your file, not the app's.
From the current build
Screenshots of the app as it is today.
Captured from the real desktop app, the same build the end-to-end suite runs against. No mockups, no repaints.
Graph editor
Model the scenario the way you'd whiteboard it.
Login, capture the token, spend it downstream. The graph is the test. Every node in it is still real, editable code underneath.
Execution
Runs you can watch, then interrogate.
Nodes light up as they pass or fail, and any one of them will show you the exact request and response it produced.
Step-through debugging
Pause mid-flow and see exactly what happens next.
Set a breakpoint and run: execution halts before that node fires, with the variables panel showing what the next call is about to spend. Breakpoints live in your editor, never in the .aether file.
- Node types
- 10
- Protocols in one engine
- 5
- Import formats
- 6
- CLI reporters
- 4
- MCP tools for agents
- 14
- Places the same engine runs
- 3
request · grpc · websocket · assertion · condition · loop · parallel · ai-action · subflow · script
REST, GraphQL, gRPC, WebSocket, Server-Sent Events
Postman, OpenAPI/Swagger, Insomnia, Bruno, HAR, curl
pretty, JSON, JUnit XML, GitHub annotations
read, run, lint, search, import, export, drift-detect, create and edit flows, replay runs, schema introspection
desktop app, headless CLI, MCP server: one binary's behaviour, not three ports
Side by side
What actually differs, and where the others win.
The differences that decide a switch. Everything else, the good tools all do well.
| Bandura | Postman | Bruno | Insomnia | |
|---|---|---|---|---|
| Plain-text, Git-native format | ✓ YAML in your repo | ✗ cloud workspace | ✓ .bru files | partial, via Git sync |
| Graph and code over one file | ✓ | Flows, no code view | ✗ code only | ✗ code only |
| Works offline, no account | ✓ | ✗ account + sync | ✓ | account gates most features |
| AI pricing model | BYO model, no credits or metering | credit economy | n/a | BYO LLM |
| Runs AI on a local model | ✓ Ollama / LM Studio, no key, nothing leaves the machine | ✗ vendor cloud | n/a | n/a |
| Self-healing against OpenAPI drift | ✓ deterministic, offline | ✗ | ✗ | ✗ |
| What it costs | One-time licence per seat, priced at launch | $9–$49 per user/mo | $6–$11 per user/mo | $12–$45 per user/mo |
When Postman is still the right call: protocols we don't speak yet (MQTT, SOAP), a hosted team workspace, or a monitoring cloud. Full matrix and switching guide: Bandura vs Postman. Pricing from our July 2026 review; corrections to [email protected].
Deeper comparisons: vs Postman · vs Insomnia · vs Bruno · Postman vs Bruno · the offline case
Import has a review step. You see the detected format, every flow it found with its node count and the calls it makes, the environment variables it picked up, checkboxes to take only the ones you want, and the folder they'll land in. Nothing touches disk until you press Import. (A HAR capture is a recording of one session, so it becomes a single chained flow, not one flow per request.)
Shipping in the open
What's shipped, what's next.
A release cadence is a fact you can check, so here it is: the last five builds, each dated from its release tag. Everything that isn't shipped says so.
- 15 August 2026 v1.0.0-rc.8 Twenty things the editor could not do, most of them about reading a project rather than writing one: moving around it, seeing what a reference points at, and what git thinks you have changed. Release notes
- 9 August 2026 v1.0.0-rc.7 Correctness and speed, plus two changes to how your stored credentials are protected that are worth reading even if you skip the rest. Release notes
- 8 August 2026 v1.0.0-rc.6 A hardening release: security fixes, a production build that is compiled rather than shipped in readable form, and a considerably smaller install. Release notes
- 8 August 2026 v1.0.0-rc.5 The AI assistant became a harness rather than a text box: conversations that survive a restart, a context budget that summarizes instead of forgetting, local workspace search, and tools that let it check this build's schema instead of recalling one. Release notes
- 7 August 2026 v1.0.0-rc.4 The app now tells you when a new version is out, Settings became a page that saves on your say-so, and the graph canvas can be driven entirely from the keyboard. Release notes
Shipped
- Desktop IDE: graph + code over
.aether, ten node types, step-through debugging - REST, GraphQL, gRPC, WebSocket, SSE on one engine; declared auth and an automatic cookie jar
- Import from Postman, OpenAPI/Swagger, Insomnia, Bruno, HAR and curl; self-healing against OpenAPI drift
- Headless CLI, MCP server for agents, AI on your own model including a local one
- The full list
Next
- Signed installers, shortly after v1.0
- Official GitHub Action on the Marketplace, at v1.0 launch
- More protocols (MQTT, SOAP), ordered by early-user demand
Later
- Scheduled monitors & remote execution
- Web app
- Team workspaces (hosted collaboration)
Pricing
The whole app is free to download. One payment, if you use it at work.
Not a trial, not a community edition, not a feature-gated tier. It is the same binary either way. At work: thirty days to evaluate, then one payment. The thirty days start the first time you open the app and are counted on your machine; nothing is reported anywhere, and nothing switches off when they end.
Download
$0
- The complete desktop IDE, unlimited flows
- All importers, CLI, MCP server
- AI on your own model, or a local one with no key needed
- No account, no telemetry, works offline
Free indefinitely for personal work, learning, and open source. See the downloads →
Licence for commercial use
One-time per seat · priced at launch · 30 days to decide
- Licensed for work: one seat per person, on paper for procurement
- Every release built in the next 12 months
- A perpetual fallback: the version you have runs unchanged for good; renewal optional
- Betas before they're public, and support answered by the engineer
- Verified offline: no server exists that could switch it off
We enforce this by asking, with a dismissible note once a day at most, never by locking. Launch offer: seats bought on or before 2026-10-31 get an 18-month update window.
Download and start your 30 daysGet the launch-day buying link
Thirty days to change your mind, no reason required. See the refund policy.
Still deciding? What happens after 12 months · Why not just use Bruno
Buying for a team? Seats, invoices and POs · what your security review gets
Hosted · later
post-1.0
- Web access, remote & scheduled runs
- Hosted AI (flat, no credits)
- Team workspaces, shared history
A subscription, because it genuinely runs on servers we pay for. Nothing that runs on your machine moves here.
Three years, one seat, at each tool's cheapest paid tier
| Tool | Cheapest paid tier | 36 months |
|---|---|---|
| Bandura | One payment, then an optional yearly renewal if you want newer builds | One payment, priced at launch |
| Postman | $9 per user, per month | $324 |
| Bruno | $6 per user, per month | $216 |
| Insomnia | $12 per user, per month | $432 |
Never renewing is a supported choice, not a lapse: skip every renewal and the three-year figure is the first payment alone, and the build you have keeps running. The subscription rows have no such floor, which is the actual difference between the two shapes. Figures are per seat at list price from our July 2026 review; corrections to [email protected].
- Local functionality is free, forever. Editing and running local flows will never move behind a paywall.
- No AI credit economy. Your model, hosted or local, unmetered at our layer.
- No forced account, even after you buy. Verification is offline, so there is no server that can be switched off to disable software you paid for.
- Nothing is ever switched off. The 30 days are how long we stay quiet, not how long the app works. We say perpetual rather than "lifetime" because there is a real boundary, and we'd rather tell you where it is.
Buying opens at the v1.0 launch. Until then there's nothing to pay for. Join the early-access list below for the launch-day link first. Full refund within 30 days, no reason required. See the refund policy.
Why "Bandura"
Named after an instrument you play with both hands.
The bandura is a Ukrainian string instrument: a lute's fretted neck and a zither's open
strings over one soundboard. Two ways of playing, every string tied to the same board:
the graph and the code are two hands, and the .aether file is the soundboard
underneath.
Questions, answered straight
FAQ
Including the three most people don't ask out loud: why pay when Bruno is free, what
happens to your tests if Bandura stops shipping, and whether it's just a wrapper around
curl.
Getting it
Can I download Bandura today?
Yes, on Windows and Linux: an early-access release candidate is on the download page now. The macOS build ships as soon as it is signed and notarized, and the early-access list gets that link first. The CLI, which runs the same engine, is already public on npm as @bandura/cli.
What platforms does it run on?
macOS (Apple Silicon and Intel), Windows, and Linux (AppImage and .deb), each built natively. Windows and Linux are downloadable today. The Windows build is unsigned until a certificate lands, so expect a one-time SmartScreen warning there; SmartScreen is a Windows thing, so Linux installs run without one. macOS ships only signed and notarized; we won't ask you to bypass Gatekeeper.
Is Bandura open source?
Not today, but there is no lock-in by design. .aether is documented plain YAML, readable by any tool. Your tests live in your Git history, never in our database.
What happens to my tests if you stop building Bandura?
They keep working, and that is a design constraint rather than a promise. Your flows are plain YAML in your own repository, in a format documented in full, so they are readable and editable with no Bandura installed at all. The runner is a published npm package you already hold a copy of. And the licence is verified offline against a key compiled into the app, so there is no server whose shutdown could disable software you paid for. Nothing you own routes through us, which means there is no version of us disappearing that takes your work with it.
Price and licence
Is Bandura free?
The download is the complete app, with nothing locked, timed, or degraded, and it is free indefinitely for personal, learning, and open-source work. Commercial use is what a licence is for: 30 days to evaluate, then a one-time per-seat licence, priced when checkout opens at launch. If you use it free and want to back the work anyway, there is a Patreon on the download page. It gets you nothing extra, which is the point: nothing is held back from the free build to make an ask work.
What happens after the 30 days if I don't buy a licence?
Nothing is disabled, degraded, or made read-only. Not at day 31, not ever. You get a dismissible note, at most once a day. That is the entire enforcement mechanism, and a test exists purely to prove an unlicensed install still runs flows.
When do the 30 days start, and who counts them?
They start the first time you open the app, and your own machine counts them: the date is stored locally and reported nowhere. There is no account, no activation call, and nothing that resets or expires if you reinstall or work offline.
Is the licence a subscription, and what happens when the 12 months run out?
Not a subscription: one payment, nothing auto-renews, no card on file. It covers every release built in the following 12 months, major versions included. After that, the version you have keeps working unchanged. The boundary is on new builds, never on software you already run. Renewal is optional. Verification is offline against a key compiled into the app, so it survives us. We say perpetual rather than 'lifetime' because there is a real boundary and we would rather tell you where it is.
What do I actually get for the licence?
Commercial use, every release built in the following 12 months, early access to new builds before they go public, and priority support answered by the engineer who wrote the code rather than a first-line queue.
Can I buy several seats for my team, and do you invoice?
Yes to both. A seat is per person rather than per machine, so one licence covers your laptop and your desktop, and you buy as many as you have people. Paddle is the merchant of record, which means the receipt is a proper VAT invoice with your company name and tax number on it, and a purchase order works too: mail [email protected] with the seat count and you get an invoice back. There is no volume tier and no seat-count enforcement, because there is nothing that phones home to count with.
Our security team has to approve new tools. What do you have for them?
A page written for exactly that, at /security: the complete list of what crosses the network and when, where flows, credentials and run history are stored, how the desktop app is sandboxed, and the compliance claims we deliberately do not make. It also carries the answers most vendor questionnaires ask, in the order they ask them. Short version: no account, no telemetry, nothing of yours reaches us, and there is no SOC 2 report, which we say outright rather than imply away.
Why pay for Bandura when Bruno is free and open source?
If what you need is a fast, git-native request client, Bruno is genuinely good and you should use it. We are not going to pretend otherwise. Bandura is a different shape: flows rather than requests, with branching, loops, parallel fan-out, subflows and assertions as first-class node types, a visual graph over the same file you edit as code, step-through debugging, gRPC and WebSocket and SSE in one engine, self-healing against OpenAPI drift, and an MCP server so an agent can run your suite. If none of that is worth a licence to you, then it isn't, and Bruno is the better buy at zero. We would rather you reached that conclusion here than after paying.
How it works
What is an .aether file?
One flow, as plain YAML with embedded JavaScript: an ordered, branching set of nodes. Routing lives on each node, so there is no separate graph state to drift out of sync.
Isn't this just a wrapper around curl?
No. Nothing shells out. Requests run inside a sandboxed execution engine with its own scheduler, so a flow can branch on a response, loop over a dataset, fan out in parallel, call another flow, hold a WebSocket open, collect an SSE stream, and carry captured variables between nodes with per-run isolation. The same engine binary runs in the desktop app, the CLI, and the MCP server, which is why a run in CI behaves identically to the one you just watched on the canvas.
Does it support GraphQL, gRPC, WebSocket, or SSE?
All four are shipped. GraphQL and SSE ride the request node as optional blocks; gRPC (unary and server-streaming, via .proto or reflection) and WebSocket are their own node types. All run identically in the desktop app, the CLI, and the MCP server.
Can I run one flow against many rows of test data?
Attach a CSV or JSON dataset and the flow runs once per row, that row in scope as `data`. Each row is an independent test case, and a captured value never leaks into the next.
What does a failed run actually tell me?
Which node failed and why: an assertion's expected value against the actual one, the HTTP status, or the unwrapped transport cause, so a DNS or TLS fault reads as itself rather than as a generic `fetch failed`. Each one carries a jump to the matching log line. Repeated identical notifications collapse into one row with a count instead of stacking up.
How do I run API tests in CI?
The bandura CLI runs any flow or glob headlessly and exits non-zero on failure. Reporters: pretty, JSON, JUnit XML, and GitHub annotations.
Migrating, privacy and AI
Is Bandura a Postman alternative?
Yes, and it is the most common migration. No account, no cloud sync: your tests are plain-text .aether files in your own Git repository, and one-click Postman Collection v2.1 import is shipped.
Can I import Postman collections, OpenAPI specs, or curl commands?
Yes, all shipped: Postman Collection v2.1, OpenAPI 3.0/3.1 and Swagger 2.0, pasted curl, Bruno, Insomnia v4, HAR captures, and Postman environment files.
Can I see what an import will do before it writes files?
Yes. Import shows a review step first: the detected format, each flow it found with its node count and the requests it makes, the environment variables it picked up, checkboxes to import only the flows you want, an editable destination folder, and a flat option. Nothing is written to disk until you press Import.
Does Bandura work offline?
Fully. Editing, running, importing, drift detection, the CLI: all local, no account, no network. Two things call out, and nothing else does. AI generation and chat reach whichever provider you configure, and if that is a local Ollama or LM Studio, nothing leaves your machine at all. Separately, the app asks our public releases list once a day whether a newer version exists so it can tell you: it sends no identifier, it fails silently when you are offline, and one switch in Settings turns it off. Nothing is fetched or installed unless you press the button that does it.
Where does Bandura store my settings, API keys, and licence key?
Settings live in a hand-editable `settings.json` next to the app's data, following VS Code's model, with a typed schema: theme, a custom hex accent, font, density, line height, per-token colour overrides, and the AI provider block. Comments are allowed, deleting a key restores its default, an invalid value degrades to the default with a warning instead of breaking the app, and writes are atomic so an interrupted save can't corrupt it. API keys are deliberately not in that file. They stay in the OS-encrypted secret store. The licence key is kept separately too, so hand-editing settings can never invalidate it.
What does the AI cost?
Whatever your own provider costs you. No markup, no credits, no metering. Run it on a local model and it costs nothing. Most of the intelligence needs no key at all either: import, drift detection, and self-healing are deterministic and offline.
Can I use a local LLM, Ollama, or an OpenAI-compatible endpoint?
Yes. There are three providers: Anthropic and Google Gemini natively, and OpenAI-compatible, meaning any /chat/completions endpoint, which covers OpenAI, Groq, OpenRouter, Together, Ollama, and LM Studio. Point the base URL at http://localhost:11434/v1 and a local model powers chat, the agentic tool loop, flow generation, and ai-action nodes with no API key at all and no traffic leaving your machine. A Test connection button confirms it before you rely on it, and the CLI and MCP server read the same provider, base URL, and model from the environment.
Can I use Bandura's AI if my company forbids sending API payloads to a third party?
That is what the local-model path is for. With the provider pointed at an Ollama or LM Studio endpoint on your machine, no prompt, request payload, or response body leaves it, and the deterministic half of the intelligence (import, drift detection, self-healing, mock generation) never calls a model at all.
v1.0.0-rc.8 out now. v1.0.0 final in August 2026
Run it against your own API tonight.
On Windows or Linux: download v1.0.0-rc.8 and run your first flow tonight.
On a Mac, or waiting for v1.0.0 final? Leave an address and the links arrive the day they ship. Founding users get credited by name in the release notes, if they want to be. One or two emails, nothing else.
No account, no telemetry. Two destinations on the app's own behalf, your AI provider and GitHub, both listed The roadmap marks what has shipped and what hasn't