Httptap
Rich-powered CLI that breaks each HTTP request into DNS, connect, TLS, wait, and transfer phases with waterfall timelines, compact summaries, or metrics-only output.
Install / Use
/learn @ozeranskii/HttptapREADME
httptap
<table> <tr> <th>Releases</th> <th>CI & Analysis</th> <th>Project Info</th> </tr> <tr> <td> <a href="https://pypi.org/project/httptap/"> <img src="https://img.shields.io/pypi/v/httptap?color=3775A9&label=PyPI&logo=pypi" alt="PyPI" /> </a><br /> <a href="https://pypi.org/project/httptap/"> <img src="https://img.shields.io/pypi/pyversions/httptap?logo=python" alt="Python Versions" /> </a> </td> <td> <a href="https://github.com/ozeranskii/httptap/actions/workflows/ci.yml"> <img src="https://github.com/ozeranskii/httptap/actions/workflows/ci.yml/badge.svg" alt="CI" /> </a><br /> <a href="https://github.com/ozeranskii/httptap/actions/workflows/codeql.yml"> <img src="https://github.com/ozeranskii/httptap/actions/workflows/codeql.yml/badge.svg" alt="CodeQL" /> </a><br /> <a href="https://codecov.io/github/ozeranskii/httptap"> <img src="https://codecov.io/github/ozeranskii/httptap/graph/badge.svg?token=OFOHOI1X5J" alt="Coverage" /> </a><br /> <a href="https://codspeed.io/ozeranskii/httptap?utm_source=badge"> <img src="https://img.shields.io/endpoint?url=https://codspeed.io/badge.json" alt="CodSpeed Badge" /> </a> </td> <td> <a href="https://github.com/astral-sh/uv"> <img src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json" alt="Build Tool" /> </a><br /> <a href="https://github.com/astral-sh/ruff"> <img src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json" alt="Lint" /> </a><br /> <a href="https://github.com/ozeranskii/httptap/blob/main/LICENSE"> <img src="https://img.shields.io/github/license/ozeranskii/httptap?color=2E7D32" alt="License" /> </a> </td> </tr> </table>httptap is a rich-powered CLI that dissects an HTTP request into every meaningful phase-DNS, TCP connect, TLS
handshake, server wait, and body transfer and renders the results as a timeline table, compact summary, or
machine-friendly metrics. It is designed for interactive troubleshooting, regression analysis, and recording of
performance baselines.
Highlights
- Phase-by-phase timing – precise measurements built from httpcore trace hooks (with sane fallbacks when metal-level data is unavailable).
- All HTTP methods – GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS with request body support.
- Request body support – send JSON, XML, or any data inline or from file with automatic Content-Type detection.
- IPv4/IPv6 aware – the resolver and TLS inspector report both the address and its family.
- TLS insights – certificate CN, expiry countdown, cipher suite, and protocol version are captured automatically.
- Multiple output modes – rich waterfall view, compact single-line summaries, or
--metrics-onlyfor scripting. - JSON export – persist full step data (including redirect chains) for later processing.
- Extensible – clean Protocol interfaces for DNS, TLS, timing, visualization, and export so you can plug in custom behavior.
📣 <strong>Exclusive for httptap users:</strong> Save 50% on <a href="https://gitkraken.cello.so/vY8yybnplsZ"><strong>GitKraken Pro</strong></a>. Bundle GitKraken Client, GitLens for VS Code, and powerful CLI tools to accelerate every repo workflow.
Requirements
- Python 3.10-3.15 (CPython)
- macOS, Linux, or Windows (tested on CPython)
- No system dependencies beyond standard networking
- Code must follow the Google Python Style Guide (docstrings, formatting). See Google Python Style Guide
Installation
Using Homebrew (macOS/Linux)
brew install httptap
Using uv
uv pip install httptap
Using pip
pip install httptap
From source
git clone https://github.com/ozeranskii/httptap.git
cd httptap
uv venv
uv pip install .
Shell completions
Homebrew Installation
If you installed httptap via Homebrew, shell completions are automatically available after installation. Just restart your shell:
# Restart your shell or reload configuration
exec $SHELL
Homebrew automatically installs completions to:
- Bash:
$(brew --prefix)/etc/bash_completion.d/ - Zsh:
$(brew --prefix)/share/zsh/site-functions/
Python Package Installation
If you installed httptap via pip or uv, you need to install the optional completion extras:
-
Install the completion extras:
uv pip install "httptap[completion]" # or pip install "httptap[completion]" -
Activate your virtual environment:
source .venv/bin/activate -
Run the global activation script for argument completions:
activate-global-python-argcomplete -
Restart your shell. Completions should now work in both bash and zsh.
Note: The global activation script provides argument completions for bash and zsh only. Other shells are not covered by the script and must be configured separately.
Usage Examples
Once completions are installed, you can use Tab to autocomplete commands and options:
# Complete command options
httptap --<TAB>
# Shows: --follow, --timeout, --no-http2, --ignore-ssl, --cacert, --proxy, --header, --compact, --metrics-only, --json, --version, --help
# Complete after typing partial option
httptap --fol<TAB>
# Completes to: httptap --follow
# Complete multiple options
httptap --follow --time<TAB>
# Completes to: httptap --follow --timeout
Quick Start
Basic GET Request
Run a single request and display a rich waterfall:
httptap https://httpbin.io/get
POST Request with Data
Send JSON data (auto-detects Content-Type):
httptap https://httpbin.io/post --data '{"name": "John", "email": "john@example.com"}'
Note: When --data is provided without --method, httptap automatically switches to POST (similar to curl).
Curl-compatible flags: httptap accepts the most common curl syntax, so you can often replace curl with httptap directly. Aliases include -X/--request for --method, -L/--location for --follow, -m/--max-time for --timeout, -k/--insecure for --ignore-ssl, -x for --proxy, and --http1.1 for --no-http2. (Not every curl option is supported—stick to these shared flags when swapping commands.)
Load data from file:
httptap https://httpbin.io/post --data @payload.json
Explicitly specify method (bypasses auto-POST):
httptap https://httpbin.io/post --method POST --data '{"status": "active"}'
Other HTTP Methods
PUT request:
httptap https://httpbin.io/put --method PUT --data '{"key": "value"}'
PATCH request:
httptap https://httpbin.io/patch --method PATCH --data '{"field": "updated"}'
DELETE request:
httptap https://httpbin.io/delete --method DELETE
Custom Headers
Add custom headers (repeat -H for multiple values):
httptap \
-H "Accept: application/json" \
-H "Authorization: Bearer super-secret" \
https://httpbin.io/bearer
Redirects and JSON Export
Follow redirect chains and dump metrics to JSON:
httptap --follow --json out/report.json https://httpbin.io/redirect/2
Output Modes
Collect compact (single-line) timings suitable for logs:
httptap --compact https://httpbin.io/get
Expose raw metrics for scripts:
httptap --metrics-only https://httpbin.io/get | tee timings.log
Advanced Usage
Programmatic users can inject a custom executor for advanced scenarios. Provide your own RequestExecutor implementation if you need to change how requests are executed (for example, to plug in a different HTTP stack or add tracing).
TLS Certificate Options
Bypass TLS verification when troubleshooting self-signed endpoints:
httptap --ignore-ssl https://self-signed.badssl.com
The flag disables certificate validation and relaxes many handshake constraints so that legacy endpoints (expired/self-signed/hostname mismatches, weak hashes, older TLS versions) still complete. Some algorithms removed from modern OpenSSL builds (for example RC4 or 3DES) may remain unavailable. Use this mode only on trusted networks.
Use a custom CA certificate bundle for internal APIs:
httptap --cacert /path/to/company-ca.pem https://internal-api.company.com
This is useful when testing internal services that use certificates signed by a custom Certificate Authority (CA) that isn't in the system's default trust store. The --cacert option (also available as --ca-bundle) accepts a path to a PEM-formatted CA certificate bundle.
Note: --ignore-ssl and --cacert are mutually exclusive. Use --ignore-ssl to disable all verification, or --cacert to verify with a custom CA bundle.
When --cacert is used, the CLI output marks the connection with TLS CA: custom bundle, and JSON exports include network.tls_custom_ca: true so automation can detect custom trust configuration.
Route traffic through an HTTP/SOCKS proxy (explicit override takes precedence over env vars HTTP_PROXY, HTTPS_PROXY, NO_PROXY):
httptap --proxy socks5h://proxy.local:1080 https://httpbin.io/get
Ignore all proxy environment variables and connect directly:
httptap --proxy "" https://httpbin.io/get
The output and JSON export include the proxy URI and its source so you
can confirm what path was used (e.g., (from arg --proxy),
(from env HTTPS_PROXY), (bypassed by env no_proxy)).
Releasing
Prerequisites
- GitHub Environment
pypimust be configured in repository settings - PyPI Trusted Publishing configured for
ozeranskii/httptap
Steps
- Tr
Related Skills
tmux
350.8kRemote-control tmux sessions for interactive CLIs by sending keystrokes and scraping pane output.
diffs
350.8kUse the diffs tool to produce real, shareable diffs (viewer URL, file artifact, or both) instead of manual edit summaries.
terraform-provider-genesyscloud
Terraform Provider Genesyscloud
blogwatcher
350.8kMonitor blogs and RSS/Atom feeds for updates using the blogwatcher CLI.
