a terminal-based REST/GraphQL/gRPC/WebSocket/SSE client.
Trace and Timeline
Workflow and WebSocket
Profiler
OAuth browser demo
Resterm is a terminal client for working with HTTP, GraphQL, gRPC, WebSocket and SSE. No cloud sync, no signups, no heavy desktop app. If you live on the keyboard - this is your home.
TL;DR why resterm:
- Resterm is keyboard driven.
- Everything lives in plain files (.http/.rest) - no cloud or account - everything stays local.
- Built-in SSH tunnels for HTTP/gRPC/WebSocket/SSE.
- OAuth 2.0 built-in - client credentials, password grant, authorization code + PKCE with automatic browser flow and token refresh.
- Fast iteration loop with explorer + history + diff/compare + captures/workflows.
- Debuggable - timeline tracing, profiler, streaming transcripts and inline scripts/tests.
Up & Running
Deep dive
- OAuth 2.0
- Workflows & scripting
- Compare runs
- Tracing & timeline
- Streaming (WebSocket & SSE)
- OpenAPI import
- Theming & bindings
- SSH Tunnels
- Documentation
- Workspace navigator that filters
.http/.restfiles, supports recursion and keeps request lists in sync as you edit. - Editor with inline syntax highlighting, search (
Ctrl+F), clipboard motions, and inline metadata completions (type@for contextual hints). - Variable scopes with
@global(environment-wide),@var file(document),@var request(per-call), plus compile-time constants (@const), captures, JavaScript hooks, and multi-step workflows with per-step expectations and overrides. - GraphQL helpers (
@graphql,@variables,@query) and gRPC directives (@grpc,@grpc-descriptor, reflection, metadata). - WebSockets and SSE with scripted
@wssteps, automatic transcripts and an interactive console for ad-hoc frames. - OpenAPI importer converts OpenAPI specs into Resterm-ready
.httpcollections from the CLI. - Inline requests and curl import for one-off calls (
Ctrl+Enteron a URL or curl block). - Pretty/Raw/Header/Diff/History/Stream views with optional split panes, pinned comparisons, and live event playback.
- OAuth 2.0 with automatic token management - client credentials, password grant, and authorization code + PKCE. Tokens are cached per environment, refreshed automatically, and injected into requests without manual steps.
- Latency with
@profileto benchmark endpoints and render histograms right inside the TUI. - Tracing and Timeline with
@traceto enable request tracing. - Multi-step workflows compose several named requests (
@workflow+@step) with per-step overrides and expectations. - Multi-environment compare via
@comparedirectives or the global--compareflag. - SSH tunnels route HTTP/gRPC/WebSocket/SSE traffic through bastions with host key verification, keep-alives, retries, and persistent tunnels.
- File Watcher with automatic file change detection: Resterm warns when the current file changes or goes missing on disk and lets you reload from disk (
g Shift+R) or keep your buffer, plus a shortcut for quick workspace rescan (files) (g Shift+O). - Custom theming & bindings if you want to make a resterm more alligned with your taste.
Linux / macOS:
Homebrew:
brew install restermNote
Homebrew installs should be updated with Homebrew (brew upgrade resterm). The built-in resterm --update command is for binaries installed from GitHub releases/install scripts (not via brew).
Shell script:
Important
Pre-built Linux binaries depend on glibc 2.32 or newer. If you run an older distro, build from source on a machine 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 | bashor with wget:
wget -qO- https://raw.githubusercontent.com/unkn0wn-root/resterm/main/install.sh | bashWindows (PowerShell):
iwr -useb https://raw.githubusercontent.com/unkn0wn-root/resterm/main/install.ps1 | iexThese scripts will automatically detect your architecture, download the latest release, and install the binary.
Note
The manual install helper uses curl and jq. Install jq with your package manager (brew install jq, sudo apt install jq, etc.).
# Detect latest tag
LATEST_TAG=$(curl -fsSL https://api.github.com/repos/unkn0wn-root/resterm/releases/latest | jq -r .tag_name)
# Download the matching binary (Darwin/Linux + amd64/arm64)
curl -fL -o resterm "https://github.com/unkn0wn-root/resterm/releases/download/${LATEST_TAG}/resterm_$(uname -s)_$(uname -m)"
# Make it executable and move it onto your PATH
chmod +x resterm
sudo install -m 0755 resterm /usr/local/bin/resterm$latest = Invoke-RestMethod https://api.github.com/repos/unkn0wn-root/resterm/releases/latest
$asset = $latest.assets | Where-Object { $_.name -like 'resterm_Windows_*' } | Select-Object -First 1
Invoke-WebRequest -Uri $asset.browser_download_url -OutFile resterm.exe
# Optionally relocate to a directory on PATH, e.g.:
Move-Item resterm.exe "$env:USERPROFILE\bin\resterm.exe"go install github.com/unkn0wn-root/resterm/cmd/resterm@latestresterm --check-update
resterm --updateThe first command reports whether a newer release is available; the second downloads and installs it (Windows users receive a staged binary to swap on restart).
If you just want to hit an API right now, you don’t need any files.
-
Start Resterm
# In a project directory (no files required) resterm # Or explicitly point to a workspace resterm --workspace path/to/project
-
Type a minimal request
-
Focus the editor pane (use
Tabif needed). -
Press
ioraand type a simple request, for example:GET https://httpbin.org/status/204
-
-
Send it
- Press
Ctrl+Enterto send the request. - The response appears in the response pane on the right.
- Press
-
Move around
Tab/Shift+Tab- cycle focus between sidebar, editor, and response.g+p- jump directly to the response pane.g+i- jump back to the editor.
That’s enough to be productive: open Resterm, type a URL, hit Ctrl+Enter, see the response.
If you work with .http / .rest files, Resterm will discover and use them.
-
Open a directory with request files
-
Create or open a directory that contains
.http/.restfiles (see_examples/in this repo for samples). -
Run:
resterm # or resterm --workspace path/to/project
-
-
Pick and send a request
- Use the sidebar to select a request from your
.http/.restfiles. - Press
Ctrl+Enterto send it. - The response shows up in the right pane.
- Use the sidebar to select a request from your
-
Minimal request file example
### Status check # @name status GET https://httpbin.org/status/204 User-Agent: resterm ### Authenticated echo # @name bearerEcho # @auth bearer {{auth.token}} GET https://httpbin.org/bearer Accept: application/json
A few keys that make Resterm feel “native” quickly:
-
Pane focus & layout
Tab/Shift+Tab- move focus between sidebar, editor, and response.g+r- jump to Requests (sidebar).g+i- jump to Editor.g+p- jump to Response.g+h/g+l- adjust layout:- When the left pane (sidebar) is focused: change sidebar width.
- Otherwise: change editor/response split.
g+v/g+s- toggle response pane between inline and stacked layout.g+1,g+2,g+3+ minimize/restore sidebar, editor, response.g+z/g+Z- zoom the focused pane / clear zoom.
-
Environments & globals
Ctrl+E- switch environments.Ctrl+G- inspect captured globals.
-
Working with responses
Ctrl+V/Ctrl+U- split the response pane for side-by-side comparison.- When response pane is focused:
Ctrl+Shift+Corg y- copy the entire Pretty/Raw/Headers tab to the clipboard (no mouse selection needed).
Tip
If you only remember three shortcuts…
Ctrl+Enter- send requestTab/Shift+Tab- switch panesg+p- jump to response
Drop a curl command into the editor and press Ctrl+Enter anywhere inside to turn it into a structured request. Resterm understands common flags (-X, -H, --data*, --json, --url, --user, --compressed, -F/--form, etc.), merges repeated data segments, and respects multipart uploads.
curl \
--compressed \
--url "https://httpbin.org/post?source=resterm&case=multipart" \
--request POST \
-H "Accept: application/json" \
-H "X-Client: resterm-dev" \
--user resterm:test123 \
-F file=@README.md \
--form-string memo='Testing resterm inline curl
with multiline value' \
--form-string meta='{"env":"test","attempt":1}'If you copied the command from a shell, prefixes like sudo or $ are ignored automatically. Resterm loads the file attachment, preserves multiline form fields, and applies compression/auth headers without extra tweaks.
- Environments: JSON files (
resterm.env.json) are auto-discovered in the request directory, workspace root, or CWD. Dotenv files (.env,.env.*) are opt-in via--env-fileand are single-workspace; prefer JSON when you need multiple environments in one file. - Flags you probebly reach for most:
--workspace,--file,--env,--env-file,--timeout,--insecure,--follow,--proxy,--recursive,--from-openapi,--http-out(see docs for the full list). - Config storage:
$HOME/Library/Application Support/resterm,%APPDATA%\resterm, or$HOME/.config/resterm(override withRESTERM_CONFIG_DIR). Themes and keybindings live under this directory when you customize them.
- OAuth 2.0: Full OAuth support with three grant types - client credentials for service-to-service calls, password grant for legacy systems, and authorization code + PKCE for user login flows. For auth code flows, Resterm opens your system browser, spins up a local callback server on
127.0.0.1, captures the redirect and exchanges the code automatically. Tokens are cached per environment and refreshed when they expire. Docs:docs/resterm.md#oauth-20-directiveand_examples/oauth2.http. - SSH jumps/tunnels: Route HTTP/gRPC/WebSocket/SSE through bastions with
@sshprofiles (persist/keepalive/host-key/retries). Docs:docs/resterm.md#ssh-jumpsand_examples/ssh.http. - Workflows & scripting: Chain requests with
@workflow/@step, pass data between steps, and add lightweight JS hooks. Docs + sample:docs/resterm.md#workflows-multi-step-workflowsand_examples/workflows.http. - Compare runs: Run the same request across environments with
@compareor--compare, then diff responses side by side (g+c). Docs:docs/resterm.md#compare-runs. - Tracing & timeline: Add
@tracewith budgets to capture DNS/connect/TLS/TTFB/transfer timings, visualize overruns, and optionally export spans to OpenTelemetry. Docs:docs/resterm.md#timeline--tracing. - Streaming (WebSocket & SSE): Use
@websocket+@wssteps or@sseto script and record streams. The Stream tab keeps transcripts and an interactive console. Docs:docs/resterm.md#streaming-sse--websocket. - OpenAPI import: Convert an OpenAPI 3 spec into
.httpcollections from the CLI (--from-openapi). Docs:docs/resterm.md#importing-openapi-specs. - Theming & bindings: Optional customization via
themes/*.tomlandbindings.toml/jsonunder the config dir; defaults are ready to use. Docs:docs/resterm.md#theminganddocs/resterm.md#custom-bindings.
The full reference, including request syntax, metadata, directive tables, scripting APIs, transport settings and advanced workflows, lives in docs/resterm.md.




