stampede-load
v0.1.0
Published
π± Angry mob load testing β how many pitchforks can your app handle before it falls?
Maintainers
Readme
π Stampede
βββββββββββββββββββββββββββββββββββββββββββββ
β β
β π P I T C H F O R K β
β β
β Angry Mob Load Testing β
β β
β How many stampedes can your app β
β handle before it falls? β
β β
βββββββββββββββββββββββββββββββββββββββββββββA dead-simple load testing CLI. Point it at a URL, send an angry mob of concurrent requests, and find out where your app breaks.
Quick Start
# Storm β steady load (50 users for 30 seconds)
npx stampede-load storm https://your-app.com
# Siege β ramp to failure
npx stampede-load siege https://your-app.com --max-users 500That's it. No config files. No YAML. No setup.
Install
npm install -g stampede-loadOr just use npx:
npx stampede-load storm https://your-app.comModes
βοΈ Storm β Steady Load
Fixed concurrent users for a set duration. The baseline test.
stampede storm https://your-app.com --users 100 --duration 60sπ° Siege β Ramp to Failure
Gradually increase users until your app breaks (or survives).
stampede siege https://your-app.com \
--min-users 10 --max-users 500 --step 10 --step-duration 5sCLI Reference
Storm Options
| Flag | Default | Description |
|------|---------|-------------|
| -u, --users <n> | 50 | Concurrent users |
| -d, --duration <t> | 30s | Test duration (10s, 5m, 1h) |
| -m, --method <m> | GET | HTTP method |
| -H, --header <h> | β | HTTP header (repeatable) |
| -b, --body <b> | β | Request body |
| -t, --timeout <ms> | 10000 | Request timeout in ms |
| -f, --format <f> | text | Output format: text or json |
| --ci | false | CI mode (exit 1 on failure) |
| --max-error-rate <n> | 5 | Max error rate % for CI mode |
Siege Options
| Flag | Default | Description |
|------|---------|-------------|
| --min-users <n> | 10 | Starting concurrent users |
| --max-users <n> | 200 | Maximum concurrent users |
| --step <n> | 10 | Users added per step |
| --step-duration <t> | 5s | Duration per step |
| -m, --method <m> | GET | HTTP method |
| -H, --header <h> | β | HTTP header (repeatable) |
| -b, --body <b> | β | Request body |
| -t, --timeout <ms> | 10000 | Request timeout in ms |
| -f, --format <f> | text | Output format: text or json |
| --ci | false | CI mode (exit 1 on failure) |
| --max-error-rate <n> | 5 | Max error rate % for CI mode |
Examples
Basic GET load test
stampede storm https://api.example.com/health --users 50 --duration 30sPOST with auth headers
stampede storm https://api.example.com/chat \
--users 20 --duration 30s \
--method POST \
--header "Authorization: Bearer your-token" \
--header "Content-Type: application/json" \
--body '{"message": "test"}'CI pipeline (fail on >5% errors)
stampede storm https://staging.example.com --users 100 --duration 60s --ci --max-error-rate 5JSON output for automation
stampede storm https://api.example.com --users 50 --duration 30s --format jsonFind breaking point
stampede siege https://api.example.com \
--min-users 10 --max-users 1000 --step 25 --step-duration 5sSample Output
Storm
π Stampede v0.1.0 β Storm
Target: https://clawlobby.com/api/health
Users: 50 | Duration: 30s
ββββββββββββββββββββββββββββββββββββββββ 30.0s / 30.0s | 2,847 req | 94.9 req/s
Results:
Total requests: 2,847
Successful (2xx): 2,831 (99.4%)
Rate limited (429): 14 (0.5%) β
Server errors (5xx): 2 (0.1%)
Response times:
Min: 12ms
Median: 42ms
p90: 128ms
p95: 186ms
p99: 412ms
Max: 1,204ms
Throughput: 94.9 req/s
Data: 12.4 MB received
Verdict: β
SURVIVES (99.4% success rate) at 50 concurrent users
Rate limiting active β
β server protects itselfSiege
π Stampede v0.1.0 β Siege
Target: https://clawlobby.com
Ramp: 10 β 500 users | Step: +10 every 5.0s
Step 49/50 | 500 users | 12,847 req | 247.1 req/s
Results:
Total requests: 12,847
Successful (2xx): 12,203 (95.0%)
Rate limited (429): 312 (2.4%) β
Server errors (5xx): 332 (2.6%)
Response times:
Min: 8ms
Median: 67ms
p90: 312ms
p95: 589ms
p99: 2,104ms
Max: 5,012ms
Breaking point: ~250 users (error rate exceeded 50% at step 25)
Ramp: 10 β 500 users over 245.0s (49 steps Γ 5.0s)
Verdict: β οΈ STRESSED (95.0% success rate)
Rate limiting active β
β server protects itselfVerdicts
| Verdict | Condition | Meaning | |---------|-----------|---------| | β SURVIVES | β₯99% success | Your app handles the load | | β οΈ STRESSED | 95β99% success | Degraded but functional | | β OVERWHELMED | <95% success | Your app is broken at this load |
Rate limiting (429) is reported separately β it's a sign your server protects itself, not a failure.
Why Stampede?
| | Stampede | k6 | Artillery | wrk | |---|---|---|---|---| | npx-ready | β | β | β | β | | Zero config | β | β | β | β | | Clear verdict | β | β | β | β | | Rate limit aware | β | β | β | β | | Real-time progress | β | β | β | β | | CI mode | β | β | β | β | | JSON output | β | β | β | β | | Scripting | β (coming) | β | β | β | | Distributed | β (coming) | β | β | β |
Stampede isn't trying to replace k6 or Artillery for complex scenarios. It's for when you want a quick, honest answer: can my app handle this?
Roadmap
- [x] v0.1 β Storm + Siege modes, real-time terminal, verdicts
- [ ] v0.5 β Riot (spike), March (soak), Drain (cost attack), JSON reports
- [ ] v1.0 β AI cost estimation, HTML reports, CI integration, scheduled tests
Requirements
- Node.js β₯ 18 (uses native
fetch)
License
MIT
