macOS
Universal: Apple silicon and Intel
First launch: builds aren’t notarized yet, so macOS blocks the first open. Go to System Settings › Privacy & Security and choose Open Anyway.
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.
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}]}'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.
⌘N, a URL, ⌘↵. There’s no account to create first.
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.
{{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.
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.
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.
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.
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.
⌘K jumps to any request, switches environment or runs a command.
Ctrl instead of ⌘ on Windows and Linux.
| Variable | WorkspaceGlobals | CollectionShop API | CollectionPayments Sandbox | Environment · activeLocal | EnvironmentStaging | EnvironmentProduction | |
|---|---|---|---|---|---|---|---|
| apiVersion | |||||||
| baseUrl | |||||||
| clientId | |||||||
| clientSecretsecret | |||||||
| pageSize | |||||||
| payUrl | |||||||
| requestTimeout | |||||||
| stripeKeysecret | |||||||
| tokensecret | |||||||
| userAgent | |||||||
| Key | Value | ||
|---|---|---|---|
| id | name | price | inStock | tags |
|---|---|---|---|---|
| prd_8Hx2 | Canvas Satchel | 189.9 | true | ["bags","canvas"] |
| prd_3Kd9 | Waxed Tote | 145 | false | ["bags"] |
| prd_Q71m | Leather Strap | 49.9 | true | ["accessories"] |
| # | t | Status | Latency | Remaining | Retry-After |
|---|---|---|---|---|---|
| 100 | 5.00s | 429 | 10 ms | 0 | 55 |
| 99 | 4.95s | 429 | 15 ms | 0 | 56 |
| 98 | 4.90s | 429 | 7 ms | 0 | 56 |
| 97 | 4.85s | 429 | 12 ms | 0 | 56 |
| 96 | 4.80s | 429 | 11 ms | 0 | 56 |
| 95 | 4.75s | 429 | 13 ms | 0 | 56 |
| 94 | 4.70s | 429 | 8 ms | 0 | 56 |
| 93 | 4.65s | 429 | 11 ms | 0 | 56 |
| 92 | 4.60s | 429 | 10 ms | 0 | 56 |
| 91 | 4.55s | 429 | 13 ms | 0 | 56 |
| 90 | 4.50s | 429 | 8 ms | 0 | 56 |
| 89 | 4.45s | 429 | 15 ms | 0 | 56 |
| 88 | 4.40s | 429 | 10 ms | 0 | 56 |
| 87 | 4.35s | 429 | 6 ms | 0 | 56 |
| 86 | 4.30s | 429 | 10 ms | 0 | 56 |
| 85 | 4.25s | 429 | 8 ms | 0 | 56 |
| 84 | 4.20s | 429 | 11 ms | 0 | 56 |
| 83 | 4.15s | 429 | 9 ms | 0 | 56 |
| 82 | 4.10s | 429 | 13 ms | 0 | 56 |
| 81 | 4.05s | 429 | 10 ms | 0 | 56 |
| 80 | 4.00s | 429 | 7 ms | 0 | 56 |
| 79 | 3.95s | 429 | 15 ms | 0 | 57 |
| 78 | 3.90s | 429 | 14 ms | 0 | 57 |
| 77 | 3.85s | 429 | 6 ms | 0 | 57 |
| 76 | 3.80s | 429 | 13 ms | 0 | 57 |
| 75 | 3.75s | 429 | 14 ms | 0 | 57 |
| 74 | 3.70s | 429 | 11 ms | 0 | 57 |
| 73 | 3.65s | 429 | 12 ms | 0 | 57 |
| 72 | 3.60s | 429 | 10 ms | 0 | 57 |
| 71 | 3.55s | 429 | 9 ms | 0 | 57 |
| 70 | 3.50s | 429 | 10 ms | 0 | 57 |
| 69 | 3.45s | 429 | 12 ms | 0 | 57 |
| 68 | 3.40s | 429 | 11 ms | 0 | 57 |
| 67 | 3.35s | 429 | 6 ms | 0 | 57 |
| 66 | 3.30s | 429 | 6 ms | 0 | 57 |
| 65 | 3.25s | 429 | 9 ms | 0 | 57 |
| 64 | 3.20s | 429 | 7 ms | 0 | 57 |
| 63 | 3.15s | 429 | 10 ms | 0 | 57 |
| 62 | 3.10s | 429 | 13 ms | 0 | 57 |
| 61 | 3.05s | 429 | 8 ms | 0 | 57 |
| 60 | 3.00s | 200 | 60 ms | 0 | — |
| 59 | 2.95s | 200 | 53 ms | 1 | — |
| 58 | 2.90s | 200 | 62 ms | 2 | — |
| 57 | 2.85s | 200 | 55 ms | 3 | — |
| 56 | 2.80s | 200 | 41 ms | 4 | — |
| 55 | 2.75s | 200 | 42 ms | 5 | — |
| 54 | 2.70s | 200 | 50 ms | 6 | — |
| 53 | 2.65s | 200 | 48 ms | 7 | — |
| 52 | 2.60s | 200 | 55 ms | 8 | — |
| 51 | 2.55s | 200 | 49 ms | 9 | — |
| 50 | 2.50s | 200 | 57 ms | 10 | — |
| 49 | 2.45s | 200 | 48 ms | 11 | — |
| 48 | 2.40s | 200 | 58 ms | 12 | — |
| 47 | 2.35s | 200 | 46 ms | 13 | — |
| 46 | 2.30s | 200 | 64 ms | 14 | — |
| 45 | 2.25s | 200 | 149 ms | 15 | — |
| 44 | 2.20s | 200 | 60 ms | 16 | — |
| 43 | 2.15s | 200 | 147 ms | 17 | — |
| 42 | 2.10s | 200 | 104 ms | 18 | — |
| 41 | 2.05s | 200 | 44 ms | 19 | — |
| 40 | 2.00s | 200 | 47 ms | 20 | — |
| 39 | 1.95s | 200 | 42 ms | 21 | — |
| 38 | 1.90s | 200 | 47 ms | 22 | — |
| 37 | 1.85s | 200 | 57 ms | 23 | — |
| 36 | 1.80s | 200 | 61 ms | 24 | — |
| 35 | 1.75s | 200 | 50 ms | 25 | — |
| 34 | 1.70s | 200 | 47 ms | 26 | — |
| 33 | 1.65s | 200 | 39 ms | 27 | — |
| 32 | 1.60s | 200 | 60 ms | 28 | — |
| 31 | 1.55s | 200 | 39 ms | 29 | — |
| 30 | 1.50s | 200 | 37 ms | 30 | — |
| 29 | 1.45s | 200 | 36 ms | 31 | — |
| 28 | 1.40s | 200 | 60 ms | 32 | — |
| 27 | 1.35s | 200 | 36 ms | 33 | — |
| 26 | 1.30s | 200 | 49 ms | 34 | — |
| 25 | 1.25s | 200 | 58 ms | 35 | — |
| 24 | 1.20s | 200 | 40 ms | 36 | — |
| 23 | 1.15s | 200 | 35 ms | 37 | — |
| 22 | 1.10s | 200 | 36 ms | 38 | — |
| 21 | 1.05s | 200 | 52 ms | 39 | — |
| 20 | 1.00s | 200 | 54 ms | 40 | — |
| 19 | 0.95s | 200 | 41 ms | 41 | — |
| 18 | 0.90s | 200 | 44 ms | 42 | — |
| 17 | 0.85s | 200 | 39 ms | 43 | — |
| 16 | 0.80s | 200 | 41 ms | 44 | — |
| 15 | 0.75s | 200 | 53 ms | 45 | — |
| 14 | 0.70s | 200 | 32 ms | 46 | — |
| 13 | 0.65s | 200 | 54 ms | 47 | — |
| 12 | 0.60s | 200 | 46 ms | 48 | — |
| 11 | 0.55s | 200 | 50 ms | 49 | — |
| 10 | 0.50s | 200 | 102 ms | 50 | — |
| 9 | 0.45s | 200 | 38 ms | 51 | — |
| 8 | 0.40s | 200 | 44 ms | 52 | — |
| 7 | 0.35s | 200 | 36 ms | 53 | — |
| 6 | 0.30s | 200 | 51 ms | 54 | — |
| 5 | 0.25s | 200 | 46 ms | 55 | — |
| 4 | 0.20s | 200 | 43 ms | 56 | — |
| 3 | 0.15s | 200 | 45 ms | 57 | — |
| 2 | 0.10s | 200 | 53 ms | 58 | — |
| 1 | 0.05s | 200 | 54 ms | 59 | — |
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.
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
Changes 3
Nothing is committed or pushed until you click.
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.
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.
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.
QUERY is the IETF draft: safe and idempotent like GET, with a body.
Dark and light themes. This is the light one, on the same request as above.
Version 1.0.1, free and open source. Release notes
Universal: Apple silicon and Intel
First launch: builds aren’t notarized yet, so macOS blocks the first open. Go to System Settings › Privacy & Security and choose Open Anyway.
Windows 10 and 11, x64
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.
x86_64: .deb, .rpm or AppImage
sudo apt install ./Satchel_1.0.1_amd64.debFedora, 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.