cryload - HTTP load testing for CI/CD

August 11, 2026 ยท View on GitHub

cryload logo

cryload - HTTP load testing for CI/CD

Cross-platform, single-binary HTTP load testing CLI. A modern alternative to ab / wrk / hey, written in Crystal.

Stars CI Release Downloads Crystal License


Quick start

curl -sSfL https://raw.githubusercontent.com/sdogruyol/cryload/master/scripts/install.sh | sh
cryload https://example.com -n 1000 -c 50

1000 requests, 50 concurrent connections, JSON/CSV/plain output. That's it.

cryload demo


Why cryload?

Existing tools work fine on your laptop. cryload is built for the one place that matters most: CI/CD pipelines.

ProblemSolution
"Did my deploy break performance?"Set latency thresholds that fail your build
"Where do I put the results?"JSON and CSV output, ready to parse
"Different OS in CI vs local?"Single binary for Linux, macOS, Windows
"Which tool works in all three?"cryload does

If you need a graph on your laptop, use wrk. If you need to fail a pipeline when p99 goes over 200ms, use cryload.


Features

  • โšก Concurrent load with configurable connection count
  • โฑ๏ธ Duration or request count mode
  • ๐Ÿ“Š Latency percentiles: p50, p75, p90, p95, p99, p999 + histogram
  • ๐ŸŽฏ CI thresholds: --max-p99, --max-fail-rate, --fail-on-error
  • ๐Ÿ“ฆ JSON / CSV / quiet output for pipelines
  • ๐Ÿ”’ Rate limiting, warmup, keep-alive, TLS skip
  • ๐ŸŒ Multi-URL, redirects, custom success codes
  • ๐Ÿ–ฅ๏ธ Cross-platform: Linux, macOS, Windows - single binary

Performance

cryload is fast. Written in Crystal and compiled to native code.

TestResults
Localhost (100 conn, 10s)~50,000 req/sec, p99 < 1ms
Local nginx (100 conn, 10s)~12,000 req/sec, p99 < 3ms
Remote API (50 conn, 30s)~2,000 req/sec, p99 < 80ms
Binary size~3 MB (single file, no dependencies)
Memory per 10K requests~15 MB

No JVM, no Node. Just a single binary that starts instantly and uses almost no memory.


Installation

Linux / macOS:

curl -sSfL https://raw.githubusercontent.com/sdogruyol/cryload/master/scripts/install.sh | sh -s

Windows (PowerShell):

iwr -useb https://raw.githubusercontent.com/sdogruyol/cryload/master/scripts/install.ps1 | iex

Option 2: Prebuilt binary

Download from Releases:

chmod +x cryload-linux
./cryload-linux --help

Option 3: Docker

docker run --rm ghcr.io/sdogruyol/cryload https://example.com -n 1000 -c 50

Multi-arch (amd64/arm64) image, ~9 MB. Use --network host on Linux to reach services on the host's localhost. Tags follow the release version without the v prefix: 5.2.1, 5.2, 5, latest.

Option 4: GitHub Action

- uses: sdogruyol/cryload@v5
  with:
    url: http://127.0.0.1:3000/api
    requests: 500
    max_p99: "250"

See docs/github-action.md for all inputs and outputs.

Option 5: Build from source

Requires Crystal >= 1.19.0.

git clone https://github.com/sdogruyol/cryload.git && cd cryload
shards build --release

Usage

cryload <url> [options]
OptionDescription
-n, --numbersNumber of requests
-d, --durationTest duration in seconds
-c, --connectionsConcurrent connections (default: 10)
-m, --methodHTTP method (default: GET)
-b, --bodyRequest body
--body-fileRead body from file
--body-stdinRead body from stdin
-H, --headerRepeatable header (-H "Key: Value")
-a, --basic-authBasic auth (user:password)
--timeoutConnect/read timeout in seconds
-q, --rateRate limit (req/sec)
-L, --follow-redirectsFollow redirects
--output-formattext, json, csv, quiet
--success-statusCustom success codes/ranges
--insecureSkip TLS verification
--warmupWarmup seconds before benchmark
--proxyHTTP(S) proxy
--cookieRepeatable cookie (name=value)
--urls-fileLoad target URLs from file
--random-pathAppend random path per request

Common examples

# 10K requests, 100 concurrent
cryload http://localhost:3000 -n 10000 -c 100

# 30 seconds, 50 connections
cryload http://localhost:3000 -d 30 -c 50

# POST with JSON body
cryload http://localhost:3000/api -n 500 -m POST \
  -H "Content-Type: application/json" \
  -b '{"name":"cry"}' --timeout 5

See docs/examples.md for more.


CI/CD

cryload is built for pipelines. Use --json or --output-format csv for structured output, --output-format quiet for exit-code-only checks.

FlagEffect
--fail-on-errorExit 1 on any HTTP/transport error
--max-fail-rate 5Exit 1 if failure rate > 5%
--max-p99 200Exit 1 if p99 > 200 ms

GitHub Actions example

Use the official action โ€” it installs cryload, runs the benchmark, and exposes the JSON results as step outputs:

- name: Latency SLA
  id: bench
  uses: sdogruyol/cryload@v5
  with:
    url: http://localhost:3000/api
    requests: 500
    max_p99: "250"

- name: Show p99
  if: always()
  run: echo "p99 was ${{ steps.bench.outputs.p99 }} ms"

See docs/github-action.md for all inputs and outputs. Or install the binary directly:

- name: Install cryload
  run: curl -sSfL https://raw.githubusercontent.com/sdogruyol/cryload/master/scripts/install.sh | sh -s

- name: Latency SLA
  run: |
    cryload http://localhost:3000/api -n 500 --max-p99 250 --json > result.json
    jq -e '.latency_ms.p99 <= 250' result.json

How cryload compares

Featurecryloadabheywrk
CI/CD output (JSON/CSV/quiet)โœ…-JSON-
CI threshold exit codesโœ…---
Rate limiting (--rate)โœ…-partial-
Cross-platform binaryโœ…Linuxโœ…Linux

Built with Crystal

cryload is written in Crystal. Ruby-like syntax, compiled speed, single-binary deployment.

Crystal


FAQ

Why not just use ab / hey / wrk?

Those tools are great for local benchmarks. cryload is built for CI/CD. JSON output, threshold exit codes, cross-platform binaries. If you want to fail a pipeline when p99 goes over 200ms, use cryload.

Can I use cryload for DDoS?

No. cryload is designed for testing your own servers and CI pipelines. Do not use it against targets you don't own.

Does cryload support HTTP/2?

Not yet. HTTP/1.1 only for now. HTTP/2 is on the roadmap.

Is there a Docker image?

Yes: docker pull ghcr.io/sdogruyol/cryload. The single binary is still the lightest option, but the image is handy for containerized pipelines (GitLab CI, Kubernetes jobs, etc.).

Why is it written in Crystal?

Crystal compiles to a single native binary with no runtime. It starts instantly, uses minimal memory, and delivers C-like performance with Ruby-like syntax.

Sponsors

If cryload helps your CI pipeline, consider sponsoring. Every dollar helps me keep building open source tools full time.

Sponsor


License

MIT