Skip to content

0.1.7 - 2026-05-28

Choose a tag to compare

@github-actions github-actions released this 28 May 17:34

Release Notes

Added

  • --no-private-networks flag (and the HESO_BLOCK_PRIVATE_NETWORKS
    environment variable) opt into SSRF protection. heso resolves each
    target and refuses the request if any resolved IP is loopback,
    RFC1918 private, link-local (including the 169.254.169.254
    cloud-metadata address), unspecified, CGNAT (100.64.0.0/10), IPv6
    unique-local, or an IPv4-mapped form of any of those. The check runs
    on the resolved address, so an inward-pointing hostname is caught as
    well as a literal IP, and a redirect to a literal private IP is
    refused mid-chain. Off by default so localhost stays reachable;
    enable it per call with the flag or process-wide with the env var. A
    blocked request emits {ok: false, error: {code: "private_network_blocked", url}} and exits 1.
  • --js-timeout <duration> on eval-js and eval-dom caps script
    wall-clock time via an interrupt-handler watchdog and returns a
    structured timeout error on expiry. Default: no cap.
  • eval-js / eval-dom serialize a DOM-element result as
    {tag, outerHTML, attrs} instead of an empty object.

Changed

  • --best-effort partial_reason gains three values: bot_challenge
    now also covers Reddit-style "please wait for verification"
    interstitials; non_html_content_type flags a 200 OK carrying a
    non-HTML body (PDF, JSON, octet-stream, images) instead of treating
    an empty extraction as a clean page; and http_<code> reports a
    non-2xx status.
  • eval-js / eval-dom run on a dedicated 8 MB-stack thread, so deep
    recursion trips QuickJS's own guard and returns a structured engine
    error instead of overflowing the OS stack. Serialized eval results
    are capped at 10 MB with a structured error.

Fixed

  • The broken-pipe hook recognizes Windows pipe-closed errors (OS error
    109 / 232) alongside the Unix "Broken pipe" string, so piping a
    verb's output into a reader that closes early (heso ... | head)
    exits cleanly on every platform instead of aborting with a panic.
  • verify --trusted-keys (and HESO_TRUSTED_KEYS) fail closed on an
    empty allowlist: zero entries is an error (exit 1), not a
    trust-anyone wildcard.
  • Argument errors on the eval and read paths (malformed URL, ASCII
    control characters in a URL, unknown --include key, empty search
    query, ref/locator misses) emit a structured {ok: false, error: {code, message}} envelope on stdout alongside the stderr line. URLs
    containing control characters are rejected rather than silently
    rewritten.
  • stamp / run report an actionable error when a plan action carries
    a CLI-only --text / --selector / --aria-label locator instead
    of a stable ref, pointing at heso find / heso read rather than
    a terse "unknown field" message.

Install heso-cli 0.1.7

Install prebuilt binaries via shell script

curl --proto '=https' --tlsv1.2 -LsSf https://github.com/blank3rs/heso/releases/download/v0.1.7/heso-cli-installer.sh | sh

Install prebuilt binaries via powershell script

powershell -ExecutionPolicy Bypass -c "irm https://github.com/blank3rs/heso/releases/download/v0.1.7/heso-cli-installer.ps1 | iex"

Download heso-cli 0.1.7

File Platform Checksum
heso-cli-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
heso-cli-x86_64-apple-darwin.tar.gz Intel macOS checksum
heso-cli-x86_64-pc-windows-msvc.zip x64 Windows checksum
heso-cli-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
heso-cli-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum