{"id":51193789,"url":"https://github.com/will8ug/httptui","last_synced_at":"2026-06-27T18:02:27.540Z","repository":{"id":350245941,"uuid":"1205984450","full_name":"will8ug/httptui","owner":"will8ug","description":null,"archived":false,"fork":false,"pushed_at":"2026-06-14T22:24:12.000Z","size":1487,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-15T00:15:00.815Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/will8ug.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-09T13:15:31.000Z","updated_at":"2026-06-14T22:24:16.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/will8ug/httptui","commit_stats":null,"previous_names":["will8ug/restclient-cli-nodejs","will8ug/httptui"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/will8ug/httptui","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/will8ug%2Fhttptui","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/will8ug%2Fhttptui/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/will8ug%2Fhttptui/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/will8ug%2Fhttptui/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/will8ug","download_url":"https://codeload.github.com/will8ug/httptui/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/will8ug%2Fhttptui/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34862627,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-27T02:00:06.362Z","response_time":126,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-27T18:02:22.954Z","updated_at":"2026-06-27T18:02:27.532Z","avatar_url":"https://github.com/will8ug.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# httptui\n\nInteractive terminal UI for .http files.\n\n![httptui requests](assets/httptui-requests.png)\n\nhttptui is a fast, keyboard-driven REST client that lives in your terminal. It parses `.http` and `.rest` files, allowing you to browse and execute requests without leaving your workflow.\n\n## Features\n\n- **Multi-Format Support**: Parse `.http`, `.rest`, and Postman collections with auth and multiple body types.\n- **Keyboard-Driven TUI**: Vim keys, split-panel layout, details panel (`d`), fullscreen (`f`), help overlay (`?`).\n- **Environment Management**: Load environment files, register named environments, switch at runtime (`E`).\n- **mTLS \u0026 Client Certificates**: Per-host client certificates (PEM/PFX) with wildcard matching.\n- **Export as .http**: Save requests to `.http` format with variables preserved (`S`).\n\n![httptui shortcuts](assets/httptui-shortcuts.png)\n\n## Requirements\n\n- **Node.js 24 or newer.** httptui declares `engines.node: \"\u003e=24\"`; installing on older Node versions will trigger an `EBADENGINE` warning from npm and is not supported.\n\n## Installation\n\n```bash\nnpm install -g httptui\n```\n\nOr\n\n```bash\n# npm config get prefix\n# npm config set prefix \"$HOME/.local\"\n# npm config delete prefix\n\ncd \u003cproject-folder\u003e\nnpm install\nnpm run build\nnpm link\n\n# npm unlink httptui\n```\n\n## Usage\n\n```bash\nhttptui path/to/api.http\n```\n\nYou can also open a different `.http` file from within the running TUI by pressing `o` and typing the file path. This is useful when working across multiple API definition files without restarting httptui.\n\n### Options\n\n| Flag | Description |\n|------|-------------|\n| `--insecure`, `-k` | Skip TLS certificate verification |\n| `--env`, `-e` | Load an environment file (Postman or simplified format) |\n| `--env-name`, `-E` | Select an environment by name from the config file |\n\n```bash\n# Skip TLS certificate verification\nhttptui --insecure path/to/api.http\nhttptui -k path/to/api.http\n\n# Load an environment file by path\nhttptui collection.json --env dev.postman_environment.json\nhttptui api.http -e staging.json\n\n# Select an environment by name from config\nhttptui api.http --env-name Development\nhttptui api.http -E Staging\n```\n\n## Keyboard Shortcuts\n\n### Navigation\n\n| Key | Action |\n|-----|--------|\n| `↑` / `k` | Previous request / Scroll up |\n| `↓` / `j` | Next request / Scroll down |\n| `←` / `h` | Scroll focused panel left |\n| `→` / `l` | Scroll focused panel right |\n| `g` | Jump to top of focused panel |\n| `G` | Jump to bottom of focused panel |\n| `0` | Jump to horizontal start |\n| `$` | Jump to horizontal end |\n| `Tab` | Switch focus between panels |\n\n### Request\n\n| Key | Action |\n|-----|--------|\n| `Enter` | Send selected request |\n| `R` | Reload file from disk |\n| `o` | Open a different .http file |\n| `E` | Switch environment |\n| `S` | Save as .http file |\n\n### Display\n\n| Key | Action |\n|-----|--------|\n| `v` | Toggle verbose mode (show/hide headers) |\n| `r` | Toggle raw mode (no JSON formatting) |\n| `w` | Toggle text wrapping |\n| `d` | Toggle request details panel |\n| `f` | Toggle fullscreen |\n\n### Search\n\n| Key | Action |\n|-----|--------|\n| `/` | Search response body |\n| `n` | Go to next match |\n| `N` | Go to previous match |\n\n### General\n\n| Key | Action |\n|-----|--------|\n| `?` | Toggle help overlay |\n| `Escape` | Close current overlay / Exit fullscreen |\n| `q` | Quit application |\n\n## .http File Format\n\nhttptui supports a subset of the standard `.http` format used by VS Code REST Client.\n\n### Request Separation\nUse `###` to separate multiple requests in a single file. You can add an optional name after the separator.\n\n```http\n### Get all users\nGET https://api.example.com/users\n```\n\n### Headers and Body\nHeaders follow the request line. A blank line separates headers from the request body.\n\n```http\nPOST https://api.example.com/users\nContent-Type: application/json\n\n{\n  \"name\": \"John Doe\"\n}\n```\n\n### Variables\n\n#### File Variables\nDefine variables at the top of your file using `@name = value`. Reference them with `{{name}}`.\n\n```http\n@hostname = api.example.com\nGET https://{{hostname}}/users\n```\n\n#### System Variables\n- `{{$timestamp}}`: Current Unix timestamp.\n- `{{$guid}}`: Random UUID v4.\n- `{{$randomInt min max}}`: Random integer between min and max.\n\n#### Environment Variables\n- `{{$processEnv VAR_NAME}}`: Read from your shell environment.\n- `{{$dotenv VAR_NAME}}`: Read from a `.env` file in the `.http` file's directory first, then fall back to the current working directory.\n\n#### Environment Files\nLoad environment files with the `--env` / `-e` flag. httptui supports both Postman environment files (`.postman_environment.json`) and a simplified format. Environment variables override file-level and collection-level variables of the same name. This works for both `.http` files and Postman collections.\n\n```bash\nhttptui collection.json --env dev.postman_environment.json\nhttptui api.http -e staging.json\n```\n\n**Simplified format** (compatible with Postman, but without Postman-specific metadata):\n\n```json\n{\n  \"name\": \"Development\",\n  \"values\": [\n    { \"key\": \"baseUrl\", \"value\": \"https://api.dev.com\", \"enabled\": true },\n    { \"key\": \"apiKey\", \"value\": \"dev-secret-key\", \"enabled\": true }\n  ]\n}\n```\n\nThe `enabled` field is optional and defaults to `true`. Disabled variables are skipped. The `type` field is ignored (no secret masking).\n\n## Examples\n\nHere is a basic example showing common request types:\n\n```http\n### Get all users\nGET https://jsonplaceholder.typicode.com/users\n\n### Get user by ID\nGET https://jsonplaceholder.typicode.com/users/1\n\n### Create a new user\nPOST https://jsonplaceholder.typicode.com/users\nContent-Type: application/json\n\n{\n  \"name\": \"John Doe\",\n  \"username\": \"johndoe\",\n  \"email\": \"john@example.com\"\n}\n\n### Update user\nPUT https://jsonplaceholder.typicode.com/users/1\nContent-Type: application/json\n\n{\n  \"name\": \"Jane Doe\",\n  \"username\": \"janedoe\",\n  \"email\": \"jane@example.com\"\n}\n\n### Delete user\nDELETE https://jsonplaceholder.typicode.com/users/1\n```\n\n## TLS Troubleshooting\n\nhttptui loads system CA certificates by default. This means certificates from your OS certificate store (macOS Keychain, Windows Certificate Store, Linux OpenSSL directories) are trusted automatically — the same behavior as browsers and VS Code REST Client.\n\nWhen a TLS error occurs, httptui displays a smart hint suggesting the appropriate fix (e.g., `--insecure` or `NODE_EXTRA_CA_CERTS`).\n\nIf you need to authenticate with a client certificate, see the [Client Certificates](#client-certificates) section for mTLS configuration.\n\n### Common fixes\n\n#### 1. Point to your CA certificate file\n\nIf you have a custom CA certificate not in your OS store (e.g., a self-signed dev cert), use `NODE_EXTRA_CA_CERTS`:\n\n```bash\nNODE_EXTRA_CA_CERTS=/path/to/your-ca.pem httptui api.http\n```\n\nThe file should be PEM-encoded and can contain multiple certificates.\n\n#### 2. Skip certificate verification (not recommended)\n\nAs a last resort, disable TLS verification entirely:\n\n```bash\nhttptui --insecure api.http\nhttptui -k api.http\n```\n\n**Warning**: This disables all certificate checks, making connections vulnerable to man-in-the-middle attacks. Use only for local development or trusted networks.\n\n### OpenSSL 3.5 restrictions (Node.js 24+)\n\nNode.js 24 ships OpenSSL 3.5 with security level 2 by default. This means:\n- **RSA, DSA, and DH keys shorter than 2048 bits are rejected.**\n- **RC4 cipher suites are prohibited.**\n\nIf you connect to a legacy server with weak certificates, you may see new TLS errors that didn't occur on earlier Node.js versions. The fix is to upgrade the server's certificates to use at least 2048-bit RSA keys.\n\n## Configuration\n\nhttptui loads configuration from two sources: a global config file and an optional project-level sidecar file.\n\n### Global Config\n\n- **macOS/Linux**: `~/.config/httptui/config.json`\n- **Windows**: `%APPDATA%\\httptui\\config.json`\n\nPaths starting with `~` expand to your home directory. Relative paths resolve against the global config directory.\n\nYou can override the global config location using the `HTTP_TUI_CONFIG` environment variable:\n\n```bash\nHTTP_TUI_CONFIG=/path/to/custom-config.json httptui api.http\n```\n\n### Project-Level Config\n\nYou can also place a `.httptui.json` file in the same directory as your `.http` file. This is useful for sharing request collections in teams or keeping project-specific certificates alongside your code.\n\n#### Precedence\n\nProject config values override global config values for all top-level keys. For example, if both files define `certificates`, the project's `certificates` completely replace the global ones for that session.\n\n#### Relative Path Resolution\n\n- **Global config**: Relative paths resolve against the global config directory (`~/.config/httptui/`).\n- **Project config**: Relative paths resolve against the directory containing the `.httptui.json` file.\n\n## Environment Configuration\n\nYou can register environment files in your global or project-level config file and reference them by name using the `--env-name` / `-E` flag.\n\n```json\n{\n  \"environments\": [\n    { \"name\": \"Development\", \"file\": \"env/dev.json\" },\n    { \"name\": \"Staging\", \"file\": \"env/staging.json\" }\n  ]\n}\n```\n\nRelative paths are resolved against the config directory. If both global and project configs define `environments`, the project config replaces the global one entirely.\n\n### Runtime Environment Switcher\n\nPress `E` while the TUI is running to open the environment picker.\n\n- The picker lists all environments registered in your configuration files.\n- If you launched httptui with the `--env` flag, that file's name (or basename) is also included in the list.\n- Use `↑`/`↓` or `j`/`k` to navigate the list. Press `g` to jump to the top or `G` to jump to the bottom.\n- The picker shows at most 8 options at a time (including `(none)`); the list scrolls automatically as you move the highlight. On short terminals, fewer rows are shown to fit the screen.\n- Press `Enter` to apply the selected environment or `Esc` to cancel.\n- Selecting the `(none)` option reverts to using only file-level variables.\n- The active environment name is displayed in the status bar.\n\n## Saving as .http\n\nAfter opening a Postman collection (or any file), press `S` to save all requests as a `.http` file. A save overlay appears with a default path — `\u003ccollection-basename\u003e.http` in the same directory as the loaded file. You can type a new path (absolute or relative to the loaded file's directory) and press `Enter` to save, or `Escape` to cancel.\n\nIf the target file already exists, a ` - N` suffix is automatically appended (e.g., `api - 1.http`) without confirmation.\n\nThe saved `.http` file contains all requests with their names, methods, URLs, headers, and bodies. File-level variables are preserved as `@name = value` declarations, and `{{variable}}` placeholders are kept intact for round-trippability.\n\n**Limitations**: Multipart form-data bodies (text fields) are omitted with an inline comment, as the `.http` format has no multipart syntax. GraphQL bodies, file uploads, and Postman scripts are already dropped during import and cannot be recovered. Postman folder structure is preserved as request names (e.g., `### Users / Create User`).\n\n## Client Certificates\n\nConfigure SSL client certificates for mTLS endpoints in either the global config file or a project-level `.httptui.json` file.\n\n```json\n{\n  \"certificates\": {\n    \"api.internal:8443\": {\n      \"cert\": \"~/certs/client.pem\",\n      \"key\": \"~/certs/client.key\"\n    },\n    \"legacy.internal\": {\n      \"pfx\": \"./certs/legacy.p12\",\n      \"passphrase\": \"$LEGACY_PFX_PASSWORD\"\n    },\n    \"*.staging.internal\": {\n      \"cert\": \"/etc/ssl/staging.crt\",\n      \"key\": \"/etc/ssl/staging.key\"\n    },\n    \"vault.internal\": {\n      \"ca\": \"./certs/vault-ca.pem\"\n    }\n  }\n}\n```\n\n### Details\n\n- **Passphrases**: Prefix the value with `$` to reference an environment variable (e.g., `\"$MY_PWD\"`). Plaintext passphrases are supported but discouraged.\n- **CA-only**: Use the `ca` field to trust a specific server without providing client credentials.\n- **Matching Priority**: Exact host:port \u003e exact host \u003e wildcard.\n- **Protocol**: Client certificates only apply to HTTPS requests. HTTP requests ignore this configuration.\n- **Absolute Paths**: Paths starting with `/` are used as-is.\n\n### Project-Level Example\n\nWith a `.httptui.json` at `/project/api/.httptui.json`, the relative path `./certs/client.crt` resolves to `/project/api/certs/client.crt`.\n\n```json\n{\n  \"certificates\": {\n    \"api.corp.local\": {\n      \"cert\": \"./certs/client.crt\",\n      \"key\": \"./certs/client.key\"\n    }\n  }\n}\n```\n\n## Environment Variables\n\n- `{{$processEnv VAR_NAME}}`: Read from your shell environment.\n- `{{$dotenv VAR_NAME}}`: Read from a `.env` file in the `.http` file's directory first, then fall back to the current working directory.\n\n## Tech Stack\n\n- **TypeScript**: Type-safe development.\n- **Ink**: React-based framework for building interactive CLIs.\n- **React**: Component-based UI architecture.\n- **undici**: Modern, high-performance HTTP client for Node.js.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwill8ug%2Fhttptui","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwill8ug%2Fhttptui","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwill8ug%2Fhttptui/lists"}