The method dropdown supports: GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS. Select the method before entering the URL.
The URL field receives keyboard focus automatically when Hook starts, so you can begin typing immediately.
Type the full URL including the scheme (http:// or https://). The URL
field supports template expansion: any {{varname}} token is
replaced with the value from the active environment before sending.
Example:
{{base_url}}/api/users/{{user_id}}
If no environment is active or the variable is not defined, the token is left as-is.
The Params tab shows a key-value table of query parameters. Each row has a key field, a value field, and an enabled checkbox. Disabled parameters are excluded from the request.
Parameters are appended to the URL as
?key=value&key2=value2. Values support
{{varname}} expansion.
The Headers tab shows a key-value table of request headers. Each row has a name, a value, and an enabled checkbox. Disabled headers are not sent.
Header values support {{varname}} expansion.
The Body tab has a type selector with six options:
none: no request body is sent.
raw: a plain text body. The Content-Type is not set automatically.
JSON: a JSON body. Content-Type is set to
application/json.
form: form-urlencoded body. Content-Type is set
to application/x-www-form-urlencoded.
multipart: multipart/form-data body for file
uploads. Enter one key=value pair per line. Use @filepath
for file parts:
name=My Document
description=A test file
file=@/path/to/upload.txtGraphQL: a GraphQL query body. Three separate fields appear:
The query, variables, and operation name are serialized into a JSON
body with keys query, variables, and
operationName. Content-Type is set to
application/json.
Body content supports {{varname}} expansion.
The Auth tab controls authentication. Six types are available:
Authorization: Bearer <token> header. One field:
Token.Authorization: Basic <base64> header. Two fields:
Username, Password.Auth field values support {{varname}} expansion.
The Settings tab contains both per-request and program-wide settings. Per-request defaults are persisted across restarts in hook.conf.
direct:// to bypass.(none) if unset. Stored in the request JSON as
tls_client_cert / tls_client_key. If both
per-request and global are unset, no client certificate is sent. Use
Clear to wipe a value imported from a template or collection.Hook includes a User-Agent preset system for quickly switching between browser identities.
Presets are JSON files stored in the user-agents/
directory:
{
"name": "Chrome Windows",
"user_agent": "Mozilla/5.0 (Windows NT 10.0; ...) Chrome/131.0.0.0"
}
There are two ways to select a User-Agent:
Selecting a preset sets the User-Agent header on the active request and saves it as the default in hook.conf. The last-used preset is restored on startup.
Click the Send button or press Enter while the URL field has focus to execute the request. The sequence is:
While a request is in flight, the Send button changes to Cancel. Click it to abort the request – this works with either backend (the native engine’s socket is interrupted; the curl subprocess is killed). The activity log records the cancellation, the status bar shows “Cancelled”, and the button returns to Send. The Timeout (ms) setting also aborts a request automatically once the deadline is reached, on both backends.
After a request completes, the response panel shows:
Hook detects the body format from the Content-Type
response header (falling back to sniffing the content) and shows a
Pretty checkbox with the detected kind (JSON, XML,
HTML, JS, YAML) next to the tab buttons when the Body tab is active.
With Pretty checked (the default), the body is shown reformatted and syntax-highlighted:
<br> and raw
<script>/<style> content are
handled).return, typeof, case, …) are
recognized and copied verbatim, so structural characters inside them
never break a line. It is a readability aid, not a full beautifier.Unchecking Pretty shows the raw body exactly as received. The checkbox is disabled when there is nothing to prettify (plain text bodies). Bodies larger than 4 MB are never reformatted. The pretty view is read-only; select text with the mouse and copy it with Ctrl+C.
The response panel includes a search bar below the tab buttons. To search within the currently active tab (Body, Headers, or Log):
Search is case-insensitive. The matching text is highlighted and the view scrolls to center the match. On the Body tab the search runs in whichever view is visible (pretty or raw). When Next/Prev wraps around past the end or beginning, the statusbar shows a wrap indicator.
The Log tab in the response panel shows a timestamped log:
[23:53:33] >> GET https://api.example.com/users
[23:53:33] [auth] applying bearer authentication
[23:53:34] << 200 OK (163 ms, 78.1 KB)
[23:53:34] [script] post-request script executed
Events logged: request send (>>), response received (<<), errors, auth application, script function output (log, get_status, get_header), retry attempts, full curl commands, and network-level errors (DNS resolution failures, TLS handshake errors).
The log is in-memory only, cleared on app restart.
Hook has a built-in cookie jar that automatically manages cookies across requests, similar to how a browser works.
Enable it in the request Settings tab by checking “Enable cookie jar”. You can also set it in hook.conf:
"cookie_jar_enabled": 1,
"cookie_jar_path": "cookies.txt"
When the cookie jar is enabled:
Set-Cookie headers and stores the cookies in the jar.
Each cookie records its name, value, domain, path, Secure flag, HttpOnly
flag, and expiry time.Cookie header automatically..example.com is sent to
api.example.com and www.example.com but not to
other.com.The cookie jar is saved to disk in Netscape cookie format (the same
format used by curl and browsers). The file path is configured by
cookie_jar_path in hook.conf (default:
cookies.txt).
The jar is loaded at startup and saved on exit. Session cookies (no expiry) are included in the saved file.
Hook includes an SSE viewer for streaming event endpoints. SSE is a one-way protocol where the server pushes events to the client over a long-lived HTTP connection.
https://sse.dev/test).The SSE viewer runs in a background thread. You can continue using Hook for other requests while the SSE connection is active.
Both HTTP and HTTPS endpoints are supported. The URL scheme determines whether TLS is used.
Hook includes a WebSocket client for interactive bidirectional communication with WebSocket endpoints.
wss://echo.websocket.org/). Both ws://
and wss:// (TLS) schemes are supported.>> prefix.<< prefix.The WS toolbar button turns green while connected.
Messages are shown with direction indicators:
>> Hello server
<< {"status":"ok","echo":"Hello server"}
>> ping
<< pong
The receive loop runs in a background thread, so incoming messages appear automatically without blocking the GUI.
Every request can be exported as a curl command. The curl command reflects all settings:
--insecure when TLS verify is off.--cacert <path> when a custom CA file is
set.--cert / --key for client certificates.-L --max-redirs for redirect following.--compressed for compression.--digest --user for digest authentication.-A for User-Agent.-x <proxy> when a proxy is configured.-F for multipart form fields.