Fast, minimal, built in Rust. Local or remote browsers. Tab pooling. Parallel execution.
cargo install hxn
$ hxn -u https://example.com -b $(which brave)
info: Bump dir hxnshots, created successfully
+----------+--------------------+
| URL | https://example.com |
| Title | Example Domain |
| Status | 200 OK |
| Saved as | httpsexamplecom.png |
| Time | 360ms |
+----------+--------------------+
info: Screenshots taken and saved in directory hxnshots
Connect to an already-running Chrome instance on another machine via CDP. No need to launch a browser locally.
Reuse browser tabs across URLs instead of creating and destroying them. Pages reset between screenshots automatically.
Run multiple tabs in parallel with configurable concurrency. Default 4, scale up to whatever your machine handles.
Single URL, file of URLs, or pipe from stdin. Works with any tool that outputs URLs.
PNG, JPEG, WebP. Full page screenshots. NDJSON metadata output for automation and AI agents.
Linux, macOS, Windows, Termux. Single binary, no runtime dependencies beyond a Chromium browser.
$ hxn -b $(which brave) -u https://example.com
$ hxn -b $(which brave) -f urls.txt
$ cat urls.txt | hxn -b $(which brave) --stdin
$ chromium --headless --remote-debugging-port=9222 --no-sandbox
# expose the port if Chrome only binds to localhost
$ socat TCP-LISTEN:9223,fork,reuseaddr,bind=0.0.0.0 TCP:127.0.0.1:9222 &
$ hxn --remote-host 192.168.1.42:9223 -f urls.txt
$ hxn --remote-url ws://192.168.1.42:9223/devtools/browser/<uuid> -u https://example.com
$ hxn -b $(which brave) -f urls.txt --tabs 8
$ hxn -b $(which brave) -f urls.txt --pool-size 16
$ hxn -b $(which brave) -f urls.txt --ports 8080,8081
$ hxn -b $(which brave) -f urls.txt --json
$ hxn -b $(which brave) -f urls.txt --silent
$ hxn -b $(which brave) -u https://example.com --screenshot-type jpeg
$ hxn -b $(which brave) -u https://example.com --fullpage
$ hxn -b $(which brave) -u https://example.com --proxy socks5://127.0.0.1:9050
$ hxn -b $(which brave) -f urls.txt --user-agent "random"
$ hxn -b $(which brave) -u https://example.com \
--javascript "document.querySelector('.banner')?.remove()"
$ hxn -b $(which brave) -f urls.txt -x 1920 -y 1080 --timeout 200 --delay 5
vs gowitness, measured with hyperfine on GitHub Actions
| Benchmark | hxn | gowitness | |
|---|---|---|---|
| Single URL | 360ms | 3.99s | 11x faster |
| 5 URLs, 4 tabs | 1.81s | 26.29s | 14x faster |
| 5 URLs, 8 tabs | 1.70s | 14.67s | 8x faster |
cargo install hxn
cargo binstall hxn
nix profile install nixpkgs#haylxon
Download from releases