API Testing for Purists.
Instant startup. 60fps UI. $0 forever.
Documentation • Download • Roadmap • Requests are files • Why Mercury • Contributing
Watch in higher quality (MP4, 32s)
brew install --cask harry-kp/tap/mercuryLaunch from Applications, or run mercury. Universal build — Apple Silicon and Intel.
The first launch says the developer cannot be verified: right-click Mercury in Applications and choose Open. Mercury is unsigned because a Developer ID costs $99/year.
Windows, Linux, or without Homebrew
macOS / Linux
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/Harry-kp/mercury/releases/latest/download/mercury-installer.sh | shWindows (PowerShell)
irm https://github.com/Harry-kp/mercury/releases/latest/download/mercury-installer.ps1 | iexThen run mercury. The installer puts the binary in ~/.cargo/bin — if the shell can't find it, restart your terminal.
On Windows, SmartScreen says "Windows protected your PC": click More info → Run anyway.
On Linux, to get it in your app launcher:
cat > ~/.local/share/applications/mercury.desktop << 'EOF'
[Desktop Entry]
Name=Mercury
Exec=$HOME/.cargo/bin/mercury
Type=Application
Categories=Development;
EOFManual download — every platform, from Releases.
From source — git clone, then cargo build --release.
macOS says Mercury is damaged, or won't open
Right-click in Applications → Open is the normal path. If macOS refuses outright:
xattr -d com.apple.quarantine /Applications/Mercury.appFor the shell installer's binary rather than the app bundle:
xattr -d com.apple.quarantine ~/.cargo/bin/mercuryThe Homebrew cask ships a signed, sealed universal .app. Don't hand-build a Mercury.app around the bare binary — an unsigned bundle is what makes macOS call it damaged instead of merely unverified.
A workspace is just a folder. Subfolders are collections, and every *.json file is one request:
api/
├── .env.dev
├── .env.production
├── users/
│ ├── list-users.json
│ └── create-user.json
└── health.json
{
"method": "POST",
"url": "{{BASE_URL}}/users",
"headers": {
"Authorization": "Bearer {{TOKEN}}",
"Content-Type": "application/json"
},
"body": "{\"name\": \"Ada\"}"
}Grep it, diff it, commit it, edit it in VS Code — Mercury picks up outside edits live. headers and body are optional, and headers are written in sorted order so git diffs stay clean.
Environments are .env files in the workspace root. Pick one from the top-right menu or cycle with ⌘ E; {{NAME}} is substituted into the URL, headers and body when you send. Undefined variables are flagged on the tab that holds them. Production shows in red, staging in amber.
# .env.dev
BASE_URL=http://localhost:3000
TOKEN="dev token"- Native, not Electron. Rust + egui draw directly on the GPU. One ~9 MB binary, no runtime, no splash screen.
- Local only. No account, no cloud, no telemetry. Your secrets stay on your disk.
- Keyboard first.
⌘ Kopens a palette over every request and command,⌘ Ffinds anything in a response,?lists the rest. - No setup tax. Type
localhost:3000/api, pick JSON or Form, hit send. Mercury fills in the scheme, theContent-Typeand the decoding so the first request works. - Light or dark. Follows your system theme, or
⌘ Dpins one. Vector icons and bundled fonts, so it looks the same on every OS.
- Collections — create, rename, duplicate and delete from the sidebar; outside edits sync live and changes auto-save.
- Auth — Basic, Bearer or a custom
Authorizationvalue, always in sync with the Headers tab. - Query params — a table that stays in sync with the URL, both ways.
- cURL — paste a
curl …command into the URL bar to import it;⌘ ⇧ Ccopies the request back out. - Import — Postman v2.1 and Insomnia (JSON or YAML), with their variables, auth and bodies.
- Responses — pretty-printed and highlighted JSON, XML and HTML; headers and cookies;
⌘ Fto search; save images, binaries or large bodies to a file. - History — your last 50 requests from the past 7 days, with full responses. Recent keeps unsaved requests you've sent.
- Cookies — kept for the session, so login flows just work.
⌘ is Ctrl on Windows and Linux. Press ? in the app for this list.
| Shortcut | Action |
|---|---|
⌘ ⏎ |
Send request |
⌘ K |
Command palette |
⌘ N |
New request |
⌘ S |
Save request |
⌘ O |
Open folder |
⌘ L |
Focus URL bar |
⌘ E |
Next environment |
⌘ H |
Toggle history |
⌘ R |
Toggle raw response |
⌘ D |
Toggle light / dark |
⌘ F |
Find in response |
⌘ ⇧ C |
Copy as cURL |
⌘ ⇧ F |
Focus mode |
? |
Keyboard shortcuts |
Esc |
Close find / cancel request / close dialog / clear filter |
Tab moves between controls and Space activates the one you land on, so everything is reachable without a mouse.
There's no settings screen. These are fixed:
| Timeout | 30 seconds |
| Redirects | Followed (up to 10) |
| Largest response downloaded | 10 MB |
| Largest body shown inline | 100 KB (bigger ones offer Save) |
| App data | ~/.mercury/ (session, recent, history). Set MERCURY_HOME to use another folder. |
We deliberately don't build cloud sync, team collaboration, AI assistants, plugins, user accounts or analytics. They aren't missing features; we chose to leave them out.
PRs are welcome. See CONTRIBUTING.md. The repo is set up for Claude Code: CLAUDE.md holds the conventions, and /fix-issue <number> runs the whole fix-to-merge loop.
cargo run # run the app
cargo test # unit tests + a headless UI smoke testMIT. Do whatever you want.
Built with obsessive minimalism.
@Harry-kp
