Resterm
An API-as-code workbench for the terminal.
Resterm is your API as code, stored in plain-text .http and .rest files that you can diff, review and track in version control. Edit and send requests in the terminal, or run them from scripts and CI. Request files support workflows, assertions, mock servers, tracing and profiling. No accounts, cloud sync or telemetry.
Quick links: Screenshots, Quick Start, Request files, Installation, Documentation.
Screenshot tour
See the UI in action (click to expand)
Workflows
Trace and Timeline
Profiler
Explain
RestermScript
Light Theme
OAuth browser demo (old UI design)
Why Resterm
- HTTP, GraphQL, gRPC, WebSocket and SSE support.
- Automation in request files: conditions (
@when,@if/@elif/@else,@for-each), multi-step workflows (@workflow/@step), captures, variables and assertions (@capture,@var,@assert). - RestermScript, a small expression language built for Resterm, with JavaScript hooks when you want them.
- Vim-style controls with shortcut hints, searchable offline help,
Shift+khelp under the cursor,/search and commands like:w,:q,:helpand:docs. - Auth and tunneling: OAuth 2.0 (client credentials, password, authorization code with PKCE), auth through existing CLIs, SSH tunnels and Kubernetes port-forwards.
- CLI runner:
resterm runfor scripted runs and CI, with JSON and JUnit output. - Mock servers declared next to the requests they mimic, with matching rules, sequences, call verification and hot reload.
- Timeline tracing, profiling and compare runs across environments.
- Streaming transcripts and an interactive console for WebSocket and SSE.
- No AI integration, ever.
Quick Start
Install Resterm (see Installation for scripts, Windows and manual installs).
brew install restermCreate a workspace.
mkdir my-api && cd my-api resterm initresterm initgives you a small project that works without an internet connection. The generatedrequests.httpincludes local mock scenarios and a few requests that build on each other. They cover assertions, bearer auth, JSON matching,json-rules, and@for-each.Open Resterm and send your first request.
restermPress
Ctrl+Enterin the editor to send the highlighted request.
No files yet? Just run resterm, type a URL and press Ctrl+Enter. A pasted curl command works too.
Request files
Resterm request files use standard HTTP syntax plus # @ directives for configuration and automation:
# @setting base-url https://api.example.com/v1/
### Create users
// Send this request once for each name in the list.
# @for-each ["david", "tom"] as name
# @when env.mode == "development"
# @assert response.statusCode == 201
POST users
Content-Type: application/json
{"name":"{{= name }}"}
Settings before the first request apply to the whole file. ### separates requests, and directives can repeat, limit or validate a request. More examples: _examples/.
CLI
Use resterm run to execute .http / .rest files from scripts or CI without opening the TUI.
resterm run --request CreateUser requests.http
The generated project talks to a local mock server. Start it in another terminal first:
resterm mock requests.http
In the TUI, press g Shift+m in normal mode to start the workspace mock server. Repeat to stop it.
The CLI documentation covers selectors, output formats and more examples.
Keyboard cheat sheet
These are the default bindings. + means hold keys together (Alt+v). A space means press them in sequence (g v: press g, release it, then press v). Letters are lowercase, and Shift is written explicitly when required (g Shift+z). Symbols such as ? and : mean type that character using your keyboard layout.
In the editor, i enters insert mode and Esc returns to normal mode. If completion is open, the first Esc dismisses it. Use normal mode for g sequences, Alt+v / Alt+h, ?, Shift+k, : and pane switching. Insert mode preserves character input, including text produced with Alt, and uses Tab for completion or indentation. Ctrl+Enter still sends requests in insert mode.
- Pane focus and layout
Tab/Shift+Tab: move between sidebar, editor and response.g r,g i,g p: jump to requests, editor normal mode or response.g h/g l: shrink or grow the sidebar when it is focused. Otherwise, move the editor/response divider left or right in the side-by-side layout.g j/g k: move the editor/response divider down or up when stacked, or collapse and expand branches when the navigator is focused.g v/g s: place the response beside or below the editor.g 1,g 2,g 3: minimize or restore sidebar, editor or response.g z: toggle zoom for the focused editor or response pane.g Shift+z: clear zoom.
- Environments and globals
Ctrl+e: switch environments.Ctrl+g: inspect captured globals.
- Help and commands
?: open the searchable offline help index.Shift+k(editor normal mode): open help for the directive, template or keyword under the cursor.:help/:man: open an embedded topic;:docsopens the version-matched full manual.Ctrl+o: open the file/workspace popup. Type to filter, scroll withUp/Down, and useTabto descend into directories.:: open the command line. UseUp/Downto select suggestions,Tabto complete one, orEnterto accept and run a selection. Path arguments such as:mock start --sourceand:editbrowse the filesystem in the same popup.g e: open the current file, or the file selected in the navigator, in your external editor.
- Requests and responses
Ctrl+Enter: send the active request, including from editor insert mode.Alt+v/Alt+h: split responses side by side or stack them for comparison. Repeat the same shortcut to close the split.Ctrl+Shift+corg y(response focused): copy the whole Pretty, Raw or Headers tab.g x: show the Explain preview for the active request without sending it.
[!TIP] If you only remember three shortcuts:
Ctrl+Entersends the requestTab/Shift+Tabswitches panesg pjumps to the response
Installation
Linux / macOS (Homebrew)
brew install resterm
[!NOTE] Homebrew installs should be updated with Homebrew (
brew upgrade resterm). The built-inresterm --updatecommand is for binaries installed from GitHub releases or install scripts.
Linux / macOS (Shell script)
[!IMPORTANT] Pre-built Linux binaries depend on glibc 2.32 or newer. On an older distro, build from source with a newer glibc toolchain or upgrade glibc before using the release archives.
curl -fsSL https://raw.githubusercontent.com/unkn0wn-root/resterm/main/install.sh | bash
or with wget:
wget -qO- https://raw.githubusercontent.com/unkn0wn-root/resterm/main/install.sh | bash
Windows (PowerShell)
iwr -useb https://raw.githubusercontent.com/unkn0wn-root/resterm/main/install.ps1 | iex
The scripts detect your architecture, download the latest release and install the binary.
Manual installation
[!NOTE] The manual install helper uses `cu