Install • Quick Start • Examples • Configuration • Templating
Sarin is designed for efficient HTTP load testing with minimal resource consumption. It prioritizes simplicity and features like templating add zero overhead when unused.
| ✅ Supported | ❌ Not Supported |
|---|---|
| High-performance with low memory footprint | Web UI or complex TUI |
| Dynamic requests via 340+ template functions | Detailed response body analysis |
| Request scripting with Lua and JavaScript | Distributed load testing |
| Multiple proxy protocols (HTTP, HTTPS, SOCKS5, SOCKS5H) |
HTTP/2, HTTP/3, WebSocket, gRPC |
| Captcha solving (2Captcha, Anti-Captcha, CapSolver) |
Plugins / extensions ecosystem |
Docker
docker run --rm -it aykhans/sarin:latest --versionWith a local config file:
docker run --rm -it -v /path/to/config.yaml:/config.yaml aykhans/sarin -f /config.yamlWith a remote config file:
docker run --rm -it aykhans/sarin -f https://example.com/config.yamlNix
Run directly without installing (requires flakes enabled):
nix run github:aykhans/sarin/release -- -U http://example.com -r 100 -c 10Install into your profile:
nix profile install github:aykhans/sarin/releaseOr add it to your own flake via the overlay:
{
inputs.sarin.url = "github:aykhans/sarin/release";
# In your outputs, apply the overlay to nixpkgs:
# nixpkgs.overlays = [ inputs.sarin.overlays.default ];
# then reference pkgs.sarin
}The release branch tracks the newest stable release cut from main, so nix flake update moves between releases rather than following every commit; pre-releases are excluded. Pin an exact release with github:aykhans/sarin/v1.4.2, or track development with github:aykhans/sarin (the main branch).
Pre-built Binaries
Download the latest binaries from the releases page.
Building from Source
Requires the Go version declared in go.mod.
git clone https://github.com/aykhans/sarin.git && cd sarin
CGO_ENABLED=0 go build \
-ldflags "-X 'go.aykhans.me/sarin/internal/version.Version=dev' \
-X 'go.aykhans.me/sarin/internal/version.GitCommit=$(git rev-parse HEAD)' \
-X 'go.aykhans.me/sarin/internal/version.BuildDate=$(date -u +%Y-%m-%dT%H:%M:%SZ)' \
-X 'go.aykhans.me/sarin/internal/version.GoVersion=$(go version)' \
-s -w" \
-o sarin ./cmd/cli/main.goSend 10,000 GET requests with 50 concurrent connections and a random User-Agent for each request:
sarin -U http://example.com -r 10_000 -c 50 -H "User-Agent: {{ fakeit_UserAgent }}"Run a 5-minute duration-based test:
sarin -U http://example.com -d 5m -c 100Use a YAML config file:
sarin -f config.yamlFor more usage examples, see the Examples Guide.
Sarin supports environment variables, CLI flags, and YAML files. When the same option is specified in multiple sources, the following priority order applies:
CLI Flags (Highest) > YAML > Environment Variables (Lowest)
For detailed documentation on all configuration options (URL, method, timeout, concurrency, headers, cookies, proxy, etc.), see the Configuration Guide.
Sarin supports Go templates in URL paths, methods, bodies, headers, params, cookies, and values. Use the 340+ built-in functions to generate dynamic data for each request.
Example:
sarin -U "http://example.com/users/{{ fakeit_UUID }}" -r 1000 -c 10 \
-V "REQUEST_ID={{ fakeit_UUID }}" \
-H "X-Request-ID: {{ .Values.REQUEST_ID }}" \
-B '{"request_id": "{{ .Values.REQUEST_ID }}"}'For the complete templating guide and functions reference, see the Templating Guide.
This project is licensed under the MIT License. See the LICENSE file for details.
