Documentation
Rusty Requester is a native, offline API client for building HTTP requests, organizing collections, running data-driven checks, and sharing API examples without leaking secrets by default.
What Rusty Requester Is Good At
Local API work
Build requests, switch environments, keep cookies, inspect responses, and save useful requests into nested collections.
Repeatable checks
Use Collection Runner presets, CSV/JSON data rows, assertions, extractors, and safe reports for smoke and regression flows.
Share without accidents
Copy redacted cURL/snippets by default and scan collection exports locally before writing files.
Install and Update
Rusty Requester ships as a native macOS app and Linux binary. No account, cloud login, or external runtime is required.
One-line install
curl -fsSL https://raw.githubusercontent.com/chud-lori/rusty-requester/main/install.sh | bash
macOS
The installer downloads the universal DMG, copies RustyRequester.app into /Applications or ~/Applications, removes quarantine, and re-registers the app with Launch Services.
Linux
The installer downloads the x86_64 tarball, installs the binary to ~/.local/bin, and creates desktop/icon entries under ~/.local/share. No sudo required.
Install a specific version
curl -fsSL https://raw.githubusercontent.com/chud-lori/rusty-requester/main/install.sh | VERSION=v0.24.0 bash
Update checks
The app reads the public latest.json metadata file first, then falls back to GitHub Releases only if needed. This keeps normal update checks out of GitHub's unauthenticated REST API quota.
Uninstall
curl -fsSL https://raw.githubusercontent.com/chud-lori/rusty-requester/main/install.sh | UNINSTALL=1 bash
Add PURGE=1 to remove saved workspace data as well.
Build from source
git clone https://github.com/chud-lori/rusty-requester
cd rusty-requester
cargo run
cargo test
cargo build --release
First Request
Create or open a tab
Click New Request, use Cmd/Ctrl + N, or open an existing request from the sidebar.
Choose method and URL
Pick GET, POST, PUT, PATCH, DELETE, QUERY, HEAD, or OPTIONS. Enter a full URL or one using environment variables like {{base_url}}/users. Use QUERY for safe, idempotent searches that need a request body.
Add request details
Use the Params, Headers, Cookies, Body, Auth, and Tests tabs to shape the request.
Send and inspect
Click Send or press Cmd/Ctrl + Enter. Inspect status, timing, headers, body, events, and diffs in the response panel.
Save it
Press Cmd/Ctrl + S to save a draft into a collection or folder.
Workspace Model
The app is local-first. Your collections, history, environments, cookies, OAuth state, runner presets, and open tabs are stored on your machine.
Local data
The workspace lives in a local app data file. There is no hosted account, cloud sync, telemetry, or server-side project state.
Tabs vs saved requests
Tabs are your active workspace. Saved requests belong to collections. Draft tabs can exist before they are saved into a folder.
Request Builder
The editor is split into method/URL controls and six request tabs.
| Tab | Use it for | Notes |
|---|---|---|
| Params | Query string key/value rows. | URL and Params sync both ways. Disabled rows are ignored. |
| Headers | Request headers. | Use environment variables for host, tenant, tokens, or content negotiation. |
| Cookies | Explicit cookie rows. | These merge with the per-environment cookie jar when applicable. |
| Body | Raw, form URL encoded, multipart form data, or GraphQL. | Beautify/minify helpers are available for text bodies. |
| Auth | No auth, Bearer, Basic, or OAuth 2.0 PKCE. | Auth output is applied at send time. |
| Tests | Assertions and extractors. | Use these for chained workflows and Collection Runner checks. |
Body Modes
Raw
Send text, JSON, XML, or any other raw body. Pair it with the correct Content-Type header.
x-www-form-urlencoded
Key/value form rows encoded as application/x-www-form-urlencoded.
multipart/form-data
Form-data style text fields for endpoints expecting multipart payloads.
GraphQL
Query and variables editors sent as JSON with query and variables.
Authentication
Bearer token
Injects Authorization: Bearer .... JWT-like tokens can be decoded in the UI for quick header/payload inspection.
Basic auth
Stores username/password locally and sends the correct Basic auth header at request time.
OAuth 2.0 + PKCE
Starts the browser authorization flow, catches the loopback redirect, exchanges the code for a token, and applies the bearer token automatically.
No auth
Use this for public endpoints or when auth is manually represented in headers, cookies, or query params.
Environments
Environments let one request work across local, staging, production, customer tenants, or temporary test stacks.
Variable substitution
Define variables in the environment manager, then reference them as {{name}} in URLs, params, headers, cookies, bodies, and auth fields.
URL: https://{{base_url}}/v1/users/{{user_id}}
Header: Authorization: Bearer {{token}}
Cookie jar
Cookies are scoped per environment. Set-Cookie responses are persisted and replayed for matching domains and paths, similar to browser behavior.
Environment Compare
Use compare when staging works but production does not, or when onboarding a new environment.
- Pick a source and target environment.
- Review added, missing, changed, and unchanged keys.
- Copy a masked summary for teammates.
- Add missing source keys to the target when needed.
Responses
The response panel focuses on inspection and debugging without running response HTML as code.
JSON
Pretty syntax-highlighted JSON with line numbers and fold controls for objects and arrays.
Tree
Collapsible JSON tree with path-oriented navigation and copyable paths.
Preview
Readable HTML/text preview for login pages, challenge pages, error documents, and rendered markup.
Events
Structured Server-Sent Events stream view for LLM APIs and event-stream endpoints.
Diff
Compare the current response with the previous response for the same request.
Raw
Verbatim body output for exact inspection or copying.
Timing and size
Response metadata includes status, elapsed time, and size. Timing breakdowns help separate preparation, waiting, and download time.
Cancel
While a request is running, Send becomes Cancel. Cancelling aborts the task and connection.
Collections
Collections and folders are the main organization model. Use them for services, domains, project areas, environments, or test suites.
Folders
Nest folders for modules such as Auth, Billing, Search, Admin, or Webhooks. Folder overview pages show recursive request counts and descriptions.
Request actions
Rename, duplicate, delete, drag to reorder, save drafts to folders, and open requests in tabs from the sidebar.
Good collection structure
My API
Auth
Login
Refresh token
Users
List users
Create user
Billing
Create checkout session
Fetch invoice
Collection Runner
The runner turns saved requests into repeatable workflows.
Open runner
Use the Request menu or Actions Palette with Cmd/Ctrl + Shift + P.
Choose scope
Run all collections or limit execution to one collection/folder.
Select environment
Choose the active environment. Runner data rows overlay this environment per iteration.
Add data rows
Paste CSV or JSON to run the same flow with multiple users, tenants, IDs, or payload values.
Run and inspect
Watch live rows, select a result for details, then export safe CSV/HTML reports.
CSV data example
username,password,tenant
alice,secret,staging-a
bob,secret2,staging-b
JSON data example
[
{ "username": "alice", "tenant": "staging-a" },
{ "username": "bob", "tenant": "staging-b" }
]
Presets
Save runner presets for smoke tests, QA checks, release verification, or customer-specific flows. Presets remember scope, environment selection, and visible data rows.
Assertions and extractors
Assertions from the Tests tab run during Collection Runner. Extractors can pull response values into runner-scoped state so login, fetch, mutate, and verify flows can chain together.
cURL and Code Snippets
Paste cURL
Paste a cURL command into the import dialog to create a request with method, URL, params, headers, cookies, body, and auth.
curl -X POST https://api.example.com/users \
-H "Authorization: Bearer token" \
-H "Content-Type: application/json" \
-d '{"email":"team@example.com"}'
Generate snippets
Click </> Code near Send to generate cURL, Python requests, JavaScript fetch, or HTTPie snippets.
OpenAPI and Postman Import
Use imports to bootstrap collections from existing API definitions.
Postman Collection v2.1
Import existing Postman collections from JSON. Requests, folders, params, headers, auth, and body fields are converted into Rusty Requester collections.
OpenAPI 3.x
Import JSON or YAML specs. Requests are grouped by operation tags or path roots with parameters, body examples, and descriptions.
OpenAPI refresh
Generated OpenAPI metadata lets the app refresh imported requests from an updated spec while preserving user-edited names, auth values, tests, and extractors where possible. For collection-scoped refresh, open a collection's Collection settings..., choose a local OpenAPI JSON/YAML file, then click Refresh collection from OpenAPI.
Collection Git Sync
Each top-level collection can be linked to its own local folder or Git repository. Open the collection menu, choose Collection settings..., then select a directory. Rusty Requester enables file-backed sync by default: normal app saves rewrite workspace.json, requests/, and environments/, so Git status reflects the current collection without a separate export step. Turn off file-backed sync if you only want manual snapshots, then use Export now. Use a repository root containing .git when you want Refresh changes, Pull from remote, or Commit and push. Private GitHub/GitLab/Bitbucket repos work through your local SSH key or Git credential helper; Rusty Requester does not sign in to Git providers or store Git provider tokens.
workspace.json
requests/
001-my-api-collection-id/
001-login-request-id.rr
001-users-folder-id/
001-list-users-request-id.rr
environments/
001-local-env-local.rrenv
- One readable native block-style
.rrfile per request. - One readable
.rrenvfile per environment. - Stable IDs for round trips.
- Deterministic ordering for cleaner diffs.
- Secret masking by default for safer commits.
- Collection-level mask/allow key patterns for shared headers and env keys.
- Free Git UI: status/diff summary, pull, manual export, commit, and push.
- Collection settings can rename the collection and store an OpenAPI spec path for refresh.
The older Workspace Sync... modal is still available for whole-workspace import/export, but collection settings are the recommended path for team Git review.
Full format reference: GIT_WORKSPACE_FORMAT.md.
Safe Sharing
Rusty Requester assumes API clients routinely hold credentials, so sharing workflows default toward redaction.
Redacted snippets
cURL, Python, JavaScript, and HTTPie snippets mask common auth, cookie, query, and body secret values by default.
Export scanner
Collection exports run a local-only scan for common token/key patterns and sensitive key names before saving.
Safe runner reports
CSV and HTML reports omit response bodies, response headers, cookies, extracted values, and full query strings.
No upload
Redaction and scanning happen locally. Export contents are not sent to a Rusty Requester service.
Backups
Backups protect local work before risky changes such as imports or restore operations.
- Create manual snapshots before large imports or cleanup.
- Automatic snapshots are created before mutating import flows.
- Restoring a backup first saves the current state, so rollback is reversible.
- Backup restore validates workspace JSON and only accepts files from the app backup directory.
Shortcuts
| Shortcut | Action |
|---|---|
| Cmd/Ctrl + Enter | Send current request |
| Cmd/Ctrl + N | New request tab |
| Cmd/Ctrl + S | Save current draft |
| Cmd/Ctrl + W | Close active tab |
| Cmd/Ctrl + D | Duplicate active tab |
| Cmd/Ctrl + K | Focus sidebar search |
| Cmd/Ctrl + P | Open request finder |
| Cmd/Ctrl + Shift + P | Open actions palette |
| F2 | Rename active request |
| Esc | Dismiss modal or cancel rename |
Settings
Timeout
Set request timeout in seconds. A value of 0 disables the timeout.
Response cap
Limit max response body size to avoid accidentally loading huge payloads into the UI.
Proxy
Route requests through a proxy URL when debugging or working inside corporate networks.
TLS verification
Disable only for local/internal APIs with self-signed certs. Keep it enabled for public internet requests.
Theme
Preview Dark, Light, or Postman theme immediately. Save commits the selection; Cancel reverts it.
Update checks
Optionally check static release metadata once per app launch. No account or telemetry is involved.
Troubleshooting
macOS says the app cannot be opened
The app is not notarized. The installer removes quarantine automatically. For manual installs, right-click the app, choose Open, and confirm once.
Variables are not replaced
Check that an environment is selected, the variable name matches exactly, and the value is enabled in the environment manager.
Cookies are missing
Cookies are scoped by environment, domain, path, and expiry. Confirm the active environment and request host/path match the cookie rules.
Runner data is not applied
CSV uses the first row as headers. JSON must be one object or an array of objects. Data row keys become runner-scoped variables.
A secret scan warning appears on example data
The scanner is intentionally conservative. Placeholder values can look token-like. If you know the values are safe, you can continue or export a redacted copy.
Large response feels slow
Lower the max response body setting, use Raw view for exact text, and avoid previewing very large HTML/JSON documents unless needed.
More Links
Feature catalog
docs/FEATURES.md lists the full app feature set.
Architecture
docs/ARCHITECTURE.md explains the internal module structure.
Security
SECURITY.md covers threat model and vulnerability reporting.
Releases
Latest release has macOS and Linux artifacts.