An open-source, cross-platform desktop API client for plain .http / .rest files. Website: crab-ekq.pages.dev
Your requests stay as text files in your repositories. Crab doesn't need an account, a cloud sync or a proprietary collection format. It reads the same files as the JetBrains HTTP Client and the VS Code REST Client, so your team can keep using whatever editor they like.
Status: v0.1, early. macOS is the primary development platform. Windows installers are built by CI but are not tested yet.
- Workspace across repositories. Group folders from any number of repos into named virtual folders. The sidebar lists every
.http/.restfile and the requests inside it. - Editor tabs with
.httpsyntax highlighting, a ▶ marker on every request line, and inline warnings for malformed lines. - Quick open with ⌘P (CtrlP on Windows): fuzzy-search every file and request in the workspace by name, URL or path, or find text inside headers and bodies, and jump straight to it.
- Run the request under the cursor with ⌘Enter (CtrlEnter on Windows) or by clicking ▶. Unsaved edits are what gets sent. Esc cancels a running request.
- Response viewer
- Body: pretty-printed, foldable JSON. Big integers are never rounded. Images render inline.
- Raw, Headers, Timing (total, time to first byte, size).
- Request: exactly what was sent, with every variable resolved.
- Variables:
@name = valuefile variables, nested{{references}}, and the dynamic values{{$guid}},{{$uuid}},{{$timestamp}}and{{$randomInt min max}}. - Environments:
crab.env.json(or JetBrains'http-client.env.json), a private file for secrets, and.env. Pick one in the status bar, give it a colour, and Crab asks before sending changes to red (production) environments. Private values are masked. - History: every request you send is saved with its response. Search past runs (including response bodies) in the History tab or ⌘P, see earlier runs of the request under the cursor, and open any of them read-only.
- Session restore: open tabs, cursor positions, layout and unsaved drafts come back after a restart.
- Files are the source of truth
- Crab writes a file only when you press ⌘S.
- Files changed by another program reload automatically. If you have unsaved edits, Crab asks first.
- Windows line endings (CRLF) and a UTF-8 BOM are preserved.
- Light and dark themes that follow the OS.
- Download the latest
Crab_<version>_universal.dmgfrom Releases. It runs on both Apple Silicon and Intel Macs. - Open the
.dmgand drag Crab to Applications. - Crab isn't signed with an Apple Developer certificate (it's a free, unfunded project), so macOS blocks the first launch with a warning. Allow it once:
-
macOS 15 Sequoia and later: open Crab, dismiss the warning, then go to System Settings → Privacy & Security, scroll down and click Open Anyway next to the Crab message.
-
macOS 14 and earlier: right-click Crab in Applications and choose Open.
-
Or, in Terminal, which works on any version:
xattr -dr com.apple.quarantine /Applications/Crab.app
-
Download the .msi or -setup.exe from Releases. The installers are unsigned, so SmartScreen will ask you to confirm: choose More info → Run anyway. Windows support is still being tested.
- Click + next to Workspace and pick a folder that contains
.httpfiles. - Click a file to open it. Its requests are listed under it in the sidebar.
- Put the cursor inside a request and press ⌘Enter.
To try it, save this as requests.http:
@host = httpbin.org
### Get
GET https://{{host}}/get
Accept: application/json
### Create item
POST https://{{host}}/post
Content-Type: application/json
X-Request-Id: {{$guid}}
{
"name": "crab",
"createdAt": {{$timestamp}}
}
### Upload a body from a file (path relative to this .http file)
POST https://{{host}}/post
Content-Type: application/json
< ./payload.jsonPut a crab.env.json next to your .http files, or in any folder above them inside the workspace folder:
{
"$shared": { "version": "v1" },
"dev": { "host": "localhost:8080" },
"prod": { "host": "api.example.com" }
}Keep secrets in crab.private.env.json, which uses the same shape. Add *.private.env.json to .gitignore.
Crab also reads the JetBrains HTTP Client names, http-client.env.json and http-client.private.env.json, so teammates on IntelliJ or WebStorm can use the same files. The nearest folder with either name wins. If one folder has both names, Crab uses the crab. file and shows a warning in the environment menu. Values from the private file are shown as •••••• in the Request tab, and Reveal secrets shows them.
Choose the environment in the status bar. {{name}} is looked up in this order:
@namefile variables- the private file's environment
- the public file's environment
$shared(private, then public).env
{{$dotenv NAME}} reads .env only.
Environments named like prod, production or live are red by default. You can give any environment a colour in the status bar menu. With a red environment selected, Crab asks before sending a POST, PUT, PATCH or DELETE. You can turn this off in the same menu.
Every request Crab sends is saved locally with its response: the last 1,000 runs, with bodies up to 1 MB each. Runs that never left your machine (a parse error or a missing variable) aren't saved.
- History tab (sidebar): runs grouped by day. The search box matches request names, URLs and response bodies. Click a run to open it read-only in its file.
- History (n) (response panel): earlier runs of the request under the cursor. Latest goes back to the live result.
- ⌘P: type 3 or more characters and matching past runs appear under Past runs.
- Clear history at the bottom of the History tab deletes everything.
Requests are saved masked: values from crab.private.env.json show as ••••••. Responses are saved as received, so a token that a server sends back stays on disk until you clear history.
| Syntax | Meaning |
|---|---|
### or ### Name |
Starts a new request (and optionally names it) |
# @name createItem |
Names the request |
# / // |
Comment |
METHOD URL [HTTP/1.1] |
Request line. The method defaults to GET. A URL without a scheme gets http:// |
?a=1 / &b=2 |
Query string continued on the next lines |
Name: value |
Header |
| blank line, then text | Request body |
< ./file.json |
Body read from a file |
@name = value |
File variable, used as {{name}} |
{{$guid}} {{$uuid}} {{$timestamp}} {{$randomInt 1 10}} |
Dynamic values |
{{$dotenv NAME}} |
A value from .env (see Environments) |
> {% … %}, >> out.json |
JetBrains response handlers. They are skipped and never sent; running them is on the roadmap |
| Action | macOS | Windows |
|---|---|---|
| Run request at cursor | ⌘Enter | CtrlEnter |
| Cancel running request | Esc | Esc |
| Save file | ⌘S | CtrlS |
| Close tab | ⌘W | CtrlW |
Middle-click a tab to close it. The Response: right/bottom button in the status bar moves the response panel.
Crab only stores its own state: your workspace folders, the open-tab session (including drafts) and the request history in history.db. Request files are never copied.
- macOS:
~/Library/Application Support/dev.crabhttp.desktop/ - Windows:
%APPDATA%\dev.crabhttp.desktop\
Requirements:
- Rust (stable), via rustup.
- Node 20 or later, and pnpm 10 (
npm i -g pnpm@10). - macOS: Xcode Command Line Tools (
xcode-select --install). - Windows: the Tauri prerequisites, which are WebView2 and the MSVC build tools.
pnpm install
pnpm tauri dev # run the app with hot reload
pnpm tauri build # build an installer into target/release/bundle/Run the tests:
pnpm build # needed once before any cargo command (Tauri embeds dist/)
pnpm test # frontend unit tests (Vitest)
cargo test --workspace # parser, resolver, executor and file tests
cargo clippy --workspace --all-targets -- -D warningscrates/crab-core/ Pure Rust: .http parser, {{variable}} resolver, HTTP executor, file helpers.
It has no Tauri dependency, so a future CLI and MCP server can reuse it.
src-tauri/ Thin Tauri v2 shell: commands that call crab-core, and a file watcher
src/ React + TypeScript UI: CodeMirror 6 editor, zustand stores, components
docs/ Design spec and implementation plan
Planned next:
- A
crabCLI and an MCP server. - Request chaining, response handler scripts and assertions.
- Import from cURL, Postman and Insomnia.
- WebSocket, SSE and gRPC.
See ROADMAP.md for details.
Issues and pull requests are welcome. See CONTRIBUTING.md and the Code of Conduct. Report security issues privately as described in SECURITY.md. Release steps are in RELEASING.md, and changes are tracked in CHANGELOG.md.
Licensed under either of Apache License 2.0 or MIT license, at your option.
Unless you explicitly state otherwise, any contribution you intentionally submit for inclusion in Crab is dual-licensed as above, without any additional terms or conditions.
Crab bundles third-party open-source software; their licenses are listed in THIRD_PARTY_LICENSES.md, which also ships inside the app.