hurl - [h]uman c[url]
hurl is a lightweight TUI for storing and triggering common API requests. It syncs your library via an encrypted private GitHub repo.
Install hurl using one of the methods below, then launch it from your terminal with:
hurlOr explore the built-in demo mode:
hurl demoFor CLI help and metadata:
hurl --help
hurl --versionPrebuilt binaries are intended to be published through GitHub Releases, installer scripts, and Homebrew.
brew install robbiemccorkell/tap/hurlcurl --proto '=https' --tlsv1.2 -LsSf https://github.com/robbiemccorkell/hurl/releases/latest/download/hurl-installer.sh | shpowershell -ExecutionPolicy Bypass -c "irm https://github.com/robbiemccorkell/hurl/releases/latest/download/hurl-installer.ps1 | iex"You can also download the appropriate archive for your platform from the GitHub Releases page.
brew upgrade hurlIf your installed copy supports in-place updates, run:
hurl updateThe release installers also install a standalone updater command:
hurl-updatehurl help
hurl help update
hurl versionhurl demoThis launches an isolated demo library backed by public test APIs. Changes made in demo mode only last for the current session, and GitHub sync is disabled.
- Create requests with an optional title, HTTP method, URL, headers, and JSON request body
- Save requests into a local library
- Browse saved requests and folders in the library pane
- Create folders and move saved items between folders
- Load and submit saved requests
- Launch an isolated demo mode with a built-in sample library and public test APIs
- View status code, response time, response headers, and response body
- Optionally sync the saved request library through a user-owned private GitHub repo with client-side encryption
hurl can sync its saved request library between machines using:
- a user-owned private GitHub repository
- GitHub sign-in through device flow
- a user-supplied sync password for client-side encryption
The sync feature is managed from the full-screen Settings page.
- Press
gto openSettings. - Select
Connect GitHuband complete the GitHub device-flow sign-in in your browser. - Choose the GitHub repo owner and repo name.
- Enter a sync password and confirm it.
- Select
Enable Sync.
After sync is enabled:
hurlruns a best-effort sync on startuphurlsyncs after successful saves- you can run a manual sync from
Settings
- Request data is encrypted locally before upload.
- The remote GitHub repo stores a plaintext
manifest.jsonplus encrypted request files. - Titles, URLs, headers, and request bodies are not stored in plaintext in the sync repo.
- The sync password is stored locally in the OS keychain when available.
When two machines sync against the same repo:
- local-only requests are uploaded
- remote-only requests are imported
- if the same request changed differently on both machines,
hurlkeeps the local version and creates aCONFLICT ...copy for the remote version
Synced deletions are not implemented yet.
ratatuifor layout and renderingcrosstermfor terminal input/outputtui-textareafor request editingreqwest+tokiofor async HTTPserde/serde_jsonfor persistence and JSON formatting
The interface is split into three main panes:
+----------------------+---------------------------------------------+
| Library | Request |
| folders / requests | title / method / url / headers / JSON body |
+----------------------+---------------------------------------------+
| Response |
| status / time / headers / body |
+--------------------------------------------------------------------+
- Run
hurlwith no arguments to launch the TUI. - Run
hurl demoto launch an isolated demo library backed by public test APIs. - Run
hurl --helporhurl helpto see available commands. - Run
hurl --versionorhurl versionto print the version. - Run
hurl updateto update an installer-managed copy when supported.
- Launch the app with
hurl. - Press
nto create a new draft. - Use
Up/Downin the request pane to move between fields. - Press
Enterto edit the selected field. - Press
Escto leave edit mode. - Press
Ctrl+Sto save the request to the library.
If you are currently inside a folder in the Library pane, the new request is saved into that folder.
- Press
Escif you are currently editing. - Press
Tabuntil focus is onLibrary. - Use
Up/Downto highlight a saved request or folder. - Press
Enteron a folder to open it, orEnteron a saved request to load it into the editor. - Press
LeftorBackspaceto move back to the parent folder. - Press
Ctrl+Rto send the loaded request.
The response appears in the bottom-right Response pane.
- Press
Tabuntil focus is onLibrary. - Press
fto create a folder in the current library location. - Use
Enterto open folders andLeftorBackspaceto move back up. - Highlight an existing request or folder and press
xto cut it. - Navigate to the destination folder and press
pto paste it there.
- Press
gto openSettings. - Press
Tabto move between the settings navigation and the settings detail pane. - Use
Up/Downto move through the sync actions and fields. - Press
Enterto activate an action or edit a selected text field. - Press
Escto leave settings edit mode, thenEscagain to closeSettings.
- Press
Escif you are editing a field. - Press
q.
| Key | Action |
|---|---|
Tab / Shift+Tab |
Cycle focus between panes |
Up / Down |
Move through library items, request fields, or response scroll |
Left / Right |
Move between adjacent request fields, navigate up from a folder, or switch response tabs where applicable |
Backspace |
Move to the parent folder in the library pane |
Enter |
Open a folder, load a request, or enter edit mode for the selected request field |
Esc |
Leave edit mode, or close Settings when not editing |
n |
Create a new request draft |
f |
Create a folder in the current library location |
x |
Cut the selected library item for moving |
p |
Paste the cut library item into the current folder |
g |
Open or close Settings |
Ctrl+V |
Paste from clipboard into the active request text field |
Ctrl+S |
Save the current request |
Ctrl+R |
Send the current request |
q |
Quit |
Saved requests are persisted as a JSON file in the OS-appropriate config directory using the directories crate.
Examples:
- macOS: under
~/Library/Application Support/...or~/Library/Preferences/...depending on platform conventions - Linux: under
~/.config/... - Windows: under
%APPDATA%\\...
The main local library file is library.json.
If sync is enabled, hurl also stores local sync metadata in sync.json.
If you want to run hurl from source:
cargo runTo test the sync feature from source, add your GitHub OAuth app's device-flow client ID to src/config.rs.
To run the test suite:
cargo testMIT. See LICENSE.
