mrkeyoor.com_
Tue 29 Sept 15:39 UTC
Dev Toolsevaluationupdated 29 Sept 2026

hey review

Hey is a small command-line program that sends repeated HTTP requests to one URL and reports latency, throughput, status codes, and timing details. It solves the quick-check problem: you can put a fixed endpoint under concurrent load without writing a scenario or standing up a controller.

Verdict

Our Hey run installed 9 packages in 5 seconds and passed all 4 tests, so it is an unusually low-friction way to pressure one HTTP endpoint. Use it for a quick local comparison with fixed requests and controlled settings. Choose a scenario tool when requests must vary, span several URLs, or come from more than one generator.

We ran it

Lab card: what happened when we ran heyScreenshot of hey (github.com/rakyll/hey)
Install✓ · 5s9 packages
Build✓ · 31s
Tests✓ · 12s4 passed · 0 failed of 4 (go test)
Repo17 files~1,293 lines of source · 0.1 MB · 1 CI workflows · Dockerfile

Answers from our run

Does hey build from source?

Dependencies installed in 5 seconds (9 packages), and the build succeeded in 31 seconds. We cloned commit 5626f79 into a clean Debian container with 3 CPUs and no project-specific setup.

Do hey's tests pass?

Yes: 4 of 4 passed when we ran the project's own test command (go test). Some failures need services or credentials a bare container does not have.

Who should not use hey?

Teams testing user journeys or several URLs: open issue 192 asks for multiple-URL support, while the CLI accepts one target URL.

What are the alternatives to hey?

k6, wrk, Locust. Our Hey run installed 9 packages in 5 seconds and passed all 4 tests, so it is an unusually low-friction way to pressure one HTTP endpoint.

Setup5/55-second install, 31-second build, and 4 passing tests
Docs3/5Flags and examples are clear; result interpretation is thin
Community4/520,402 stars, recent issue activity, and open maintenance PRs
Maturity4/5Small stable scope, with active requests for missing controls

Who it’s for

Developers who want a fast, disposable load check for one HTTP endpoint.
Operators comparing a change before and after deployment on the same machine and network.
Go users who prefer a single-purpose CLI with HTTP/2, proxy, authentication, and rate controls.
Teams that will treat the result as a local diagnostic, not a production capacity certificate.

Who it’s NOT for

Teams testing user journeys or several URLs: open issue 192 asks for multiple-URL support, while the CLI accepts one target URL.
Workloads that need a fresh token, query value, or idempotency key on each request: issue 329 says per-request variability is unavailable.
ARM64 users who expect an official download: the README lists amd64 binaries, and issue 202 still requests an ARM64 release.
TLS test environments that rely on an insecure-certificate switch: issue 335 reports that the option is absent.
Engineers who need a distributed generator or browser behavior: Hey exposes local CPU workers and raw HTTP controls, not clustered execution or scripted browser flows.

Setup reality

Our fresh Debian sandbox installed commit 5626f79 in 5 seconds, adding 9 packages. The build succeeded in 31 seconds, and all 4 Go tests passed in 12 seconds. The checkout held 17 files, about 1,293 source lines, and occupied 0.1 MB.

The README also offers amd64 binaries for Linux, macOS, and Windows, plus Homebrew on macOS. Running a basic GET needs no account, service, configuration file, or secret; authenticated targets require the same headers or basic credentials you would send with another client.

Hey generates load from one machine against one URL. Its -q limit applies per worker, the default is 50 concurrent workers, and duration mode ignores the request-count setting. Those details must be fixed between comparison runs.

Hey is built for one repeatable HTTP question

Hey earns its place when the question is narrow: what happens if this machine sends the same request to this URL many times? The CLI accepts a target, request count or duration, concurrency, method, headers, body, timeout, proxy, and basic authentication. It then prints totals, requests per second, latency distribution, timing breakdowns, and status-code counts. There is little ceremony between installing it and putting pressure on an endpoint.

The defaults make that intent plain. With no tuning, Hey sends 200 requests through 50 concurrent workers. Duration mode replaces the request count, while -q limits queries per second for each worker rather than for the whole run. HTTP/2 is available behind a flag. These controls are enough for a before-and-after check of an API handler, proxy rule, cache change, or local service.

A 17-file checkout keeps the tool easy to inspect

commit 5626f79 contained 17 files, about 1,293 lines of source, and used 0.1 MB in our checkout. That compact scope is useful in a load generator because there are fewer hidden layers between the flags you set and the requests leaving the process. The repository also includes one CI workflow and a Dockerfile, even though its tests sit beside the Go code rather than in a separate tests directory.

Distribution is less even than the source. The README links prebuilt amd64 binaries for Linux, macOS, and Windows, and gives Homebrew users a one-line installation. It does not list an official ARM64 binary. Open issue 202 asks for one and says building from source was the workaround. On modern ARM laptops or small ARM servers, that turns a binary download into a Go build.

What happened when we ran it

Our sandbox installed Hey at commit 5626f79 in 5 seconds and added 9 packages. The build completed in 31 seconds. go test then finished in 12 seconds with 4 passed and 0 failed. We used an unprivileged Debian container with 3 CPUs, 8 GB of RAM, and no secrets. Nothing in that run required a database, account, or external service.

Those results establish that the code installs, builds, and clears its small test suite in the stated environment. They do not establish a requests-per-second number for Hey or for any target. We did not run a benchmark workload, and quoting throughput without the target, network path, connection settings, response size, and machine would be misleading. Our run measured setup health, not server capacity.

Fixed requests are the boundary, not a minor omission

Hey can repeat headers and send a body from the command line or a file, but each worker is still executing the request shape you supplied. Open issue 192 asks for several URLs and randomized query parameters. Issue 329 asks for a different idempotency header on each request. Both are common needs once a test moves beyond warming a cache or hammering one deterministic handler.

That limitation changes what you can learn. A fixed URL may keep returning the same cached object, while real users spread reads across records and submit distinct writes. If tokens expire, carts accumulate state, or one response supplies data for the next request, Hey cannot express the journey. Locust or k6 is a better fit there because the workload itself becomes code. Hey remains the quicker instrument when variation would only add noise.

Local output needs local discipline

A single Hey process measures from one generator. The -cpus option changes how many local CPU cores it uses, but the README describes no clustered controller or worker fleet. That makes results sensitive to the load machine, its network, open-file limits, DNS behavior, connection reuse, compression, and whether keep-alive is disabled. Repeatable comparisons require the same generator and the same flags.

The report is dense enough to be useful, yet the README does not explain every field. Open issue 310 asks what the summary, histogram, percentile distribution, and connection timing lines mean. An experienced performance engineer will recognize them. A team new to load testing may read average latency as the answer and miss tail latency, non-200 responses, or generator saturation. Write down the command and inspect the whole report.

January's release did not close the feature backlog

GitHub showed 20,402 stars and 188 combined issues and pull requests when checked on September 29, 2026. Release v0.1.5 and the last repository push both landed on January 10, 2026. More recent activity includes open pull requests for a timing-field correction and a shared-client data race, plus active requests for per-request variation and insecure HTTPS support. That is maintenance activity, though not a fast release cadence.

Hey should stay in the toolbox for one-off endpoint pressure and controlled regression checks. Its 5-second install and 4 passing tests make trying it cheaper than debating it. Keep the conclusion as small as the tool: a clean Hey result says something about that request, from that machine, under those flags. It does not certify a user journey or the capacity of a distributed production system.

Alternatives

ProjectWhat it isPick it when
k6 gh↗A scriptable load-testing tool with scenarios, checks, thresholds, and several execution modes.pick this instead when a test needs several steps, dynamic data, pass or fail thresholds, or distributed execution.
wrkA compact HTTP benchmarking tool with a multithreaded core and Lua scripting.pick this instead when very high local request pressure and Lua request scripting matter more than Hey's simple output.
LocustA Python load-testing framework for modeled users, multi-step behavior, and distributed workers.pick this instead when the workload must behave like users moving through an application rather than repeat one request.

What people are saying

  1. [github-trending] rakyll/hey
  2. [github-trending] basecamp/hey-cli

Sources

  1. Hey README
  2. Hey v0.1.5 release
  3. Multiple URL support request
  4. ARM64 release request
  5. Per-request variability request
  6. Insecure HTTPS option request

More dev tools reviews

Kaku · kordoc · wechat-miniapp-radar · omarchy-workspace-layout · fermats-last-theorem · yjs · the whole board →