¡Mándalo! · send it.

The fast, offline,
git‑native API client

HTTP, GraphQL and gRPC in one desktop workbench. Your collections are plain TOML files in your git repo — diff them, review them, ship them. No account. No telemetry. No cloud.

macOS · Windows · Linux  —  free & open source

Everything you need. Nothing phoning home.

Offline & no account

Mándalo works entirely on your machine. There is no sign-up, no sync server, and no telemetry — the app makes exactly the requests you tell it to, and nothing else.

Git-native collections

Collections are plain TOML files in your repo. They diff cleanly, merge sanely, and go through the same pull-request review as the code they test.

HTTP, GraphQL & gRPC

One workbench for all three. REST endpoints, GraphQL queries with variables, and gRPC calls from your proto files — side by side in the same collection.

Environments with {{variables}}

Define staging, prod, or anything else, and interpolate {{baseUrl}}, {{token}} and friends anywhere — URLs, headers, bodies.

Import & export

Bring your Postman collections over in one step. Export any collection as a single self-contained file to hand to anyone.

Fast, honestly

A Rust core inside a Tauri 2 shell: instant startup, a tiny footprint, and a UI that never makes you wait for a spinner to send a request.

Collaboration is just git

No workspaces, no seats, no sync conflicts resolved by a server you don't control. Your team already has the perfect collaboration tool — Mándalo simply stores collections where git can see them.

  1. 1

    Edit locally

    Change a request in the app. Mándalo writes the change straight to the TOML file in your working tree.

  2. 2

    Commit or PR

    The diff is small and human-readable. Review API changes the same way you review code.

  3. 3

    Teammates pull

    git pull, and everyone has the updated collection. That's the whole sync protocol.

git diff — collections/payments-api.toml
  [requests.create-charge]
  method = "POST"
- url = "{{baseUrl}}/v1/charges"
+ url = "{{baseUrl}}/v2/charges"
  
  [requests.create-charge.headers]
+ x-api-version = "2026-08-01"
  content-type = "application/json"

¡Mándalo!

Grab the latest release and send your first request in under a minute.