The API client that keeps its requests in your repo.

Satchel is a small, fast desktop app for sending HTTP requests while you build, with collections, environments and scripts kept as plain files you commit next to your code.

Resolves to http://localhost:8080/v2/products

Sample data: a made-up shop API. The window is live HTML from Satchel’s interface, not a screenshot.

Bring the requests you already have.

  1. Paste a cURL

    Copy as cURL from the browser’s devtools, then ⌘V anywhere in Satchel. Paste into a URL field and it replaces that request in place.

    curl 'http://localhost:8080/v2/carts?expand=items' -X POST -H 'Content-Type: application/json' --data-raw '{"items":[{"product":"prd_8Hx2","qty":1}]}'
  2. Import a Postman collection

    Drop a Collection Format v2.1 export on the window. Folders, auth, variables, form data and path variables come across, and a preview names what doesn’t before anything is imported.

  3. Or start from nothing

    ⌘N, a URL, ⌘↵. There’s no account to create first.

Built for the loop you run all day: edit, send, read.

Satchel stays open beside your editor and your terminal. Everything a request depends on is on screen, and nothing opens a dialog between you and the response.

  1. Every {{variable}} shows where it comes from.

    Hover a token in the URL, a header or the body to see its value and the scope it came from: the active environment first, then the collection, then globals. A variable the active environment can’t resolve is flagged before the request goes out.

  2. All your environments in one table.

    Local, Staging and Production side by side with the collection and global values they override. Create, copy, rename and color environments. Mark a variable secret and its values go to your system keychain instead of the shared files.

  3. Read the response the way it’s shaped.

    Pretty, Tree, Table or Raw. Lists of records become a sortable grid with a row inspector. Search keys, values or a path like data[0].name, pop the body out into its own window, or export it as JSON, CSV or the raw text.

  4. Script before the request and after the response.

    Sign a request before it’s sent, keep the token from a login response, or trim a payload down to what the screen needs. Scripts run in a sandbox with no network, files or timers, travel with the request’s file, and log to a Console.

  5. Find the rate limit before your users do.

    Fire N requests a second for T seconds at the resolved URL. Latency is charted, X-RateLimit-Remaining is traced across the run, and the first 429 is marked with the request that tripped it.

  6. The whole loop, from the keyboard.

    ⌘K jumps to any request, switches environment or runs a command.

    ⌘↵
    send
    ⌘E
    next environment
    ⌘1…9
    pick one
    ⌘N
    new request

    Ctrl instead of ⌘ on Windows and Linux.

Your workspace is a folder. Share it through git.

One file per request, in a folder you pick: a repository of its own, or a folder inside your API’s repo. Teammates pull, edit and push it like the rest of the code, on any git host.

~/code/shop/api

              shop-api/
              
            
              ├─ satchel.json
              order of collections and environments, globals
            
              ├─ collections/
              
            
              │  └─ shop-api/
              
            
              │     ├─ collection.json
              collection variables
            
              │     ├─ auth/
              
            
              │     │  └─ login.request.json
              
            
              │     └─ products/
              
            
              │        ├─ folder.json
              
            
              │        ├─ list-products.request.json
              
            
              │        └─ search-products.request.json
              one request per file
            
              ├─ environments/
              
            
              │  ├─ local.json
              
            
              │  └─ production.json
              secrets left empty
            
              └─ .satchel/
              yours alone; git ignores it
            
mainorigin/mainFetchPullPush ↑1

Changes 3

MQUERYSearch productscollections/shop-api/products/search-products.request.json
APOSTCreate chargecollections/payments-sandbox/create-charge.request.json
MProductionenvironments/production.json
Search products with QUERY
Commit & PushCommit 2 files

Nothing is committed or pushed until you click.

  • Secrets stay in your keychain

    Mark a variable secret and its values go to the macOS Keychain, the Windows Credential Manager or the Secret Service on Linux. The shared files keep an empty value.

  • You decide when to sync

    Satchel saves as you edit, like any editor, and never commits, pulls or pushes on its own. It runs your system git, so your SSH keys and credential manager apply.

  • Changes from outside reload

    A pull or a branch switch in the terminal reloads the workspace. A file with conflict markers is listed and left alone until you resolve it.

Everything else in the bag.

Methods
  • GET
  • POST
  • PUT
  • PATCH
  • DELETE
  • QUERY
  • HEAD
  • OPTIONS

QUERY is the IETF draft: safe and idempotent like GET, with a body.

Request
  • Query params synced with the URL both ways
  • /:name path parameters
  • Headers, with the ones Satchel adds shown
Body
  • JSON, with Beautify
  • Form data, with text and file fields
  • x-www-form-urlencoded
Auth
  • Bearer
  • Basic
  • API key, in a header or the query
Response
  • Status, time and size
  • Pretty, Tree, Table and Raw, with search
  • Its own window that follows new responses
  • Export as JSON, CSV or raw
Scripts
  • Pre-request and post-response, in JavaScript
  • sat.env, sat.request, sat.response and a Console
  • QuickJS sandbox: no network, files or timers, 1 s per run
Import
  • Postman Collection v2.1 and environment files
  • cURL, pasted anywhere
Workspace
  • A folder of JSON files, one per request
  • Git status, commit, pull and push
  • Secrets in the system keychain
  • Single-file .json workspaces open and convert
Built with
  • Tauri 2 and Rust, React and TypeScript
  • MIT license

Dark and light themes. This is the light one, on the same request as above.

Download Satchel

Version 1.0.1, free and open source. Release notes

macOS

Universal: Apple silicon and Intel

Your system
Download .dmg8.7 MB

First launch: builds aren’t notarized yet, so macOS blocks the first open. Go to System Settings › Privacy & Security and choose Open Anyway.

Windows

Windows 10 and 11, x64

Your system
Download installer3.4 MB

First launch: the installer isn’t signed yet, so SmartScreen may warn. Choose More info, then Run anyway. A Microsoft Store listing is on its way.

Linux

x86_64: .deb, .rpm or AppImage

Your system
Download .deb5.6 MB
sudo apt install ./Satchel_1.0.1_amd64.deb

Fedora, RHEL or openSUSE: sudo dnf install ./Satchel-1.0.1-1.x86_64.rpm

Older versions are on GitHub Releases. To build from source, follow the README.