npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, πŸ‘‹, I’m Ryan HefnerΒ  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you πŸ™

Β© 2026 – Pkg Stats / Ryan Hefner

stampede-load

v0.1.0

Published

πŸ”± Angry mob load testing β€” how many pitchforks can your app handle before it falls?

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 500

That's it. No config files. No YAML. No setup.

Install

npm install -g stampede-load

Or just use npx:

npx stampede-load storm https://your-app.com

Modes

β›ˆοΈ 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 5s

CLI 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 30s

POST 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 5

JSON output for automation

stampede storm https://api.example.com --users 50 --duration 30s --format json

Find breaking point

stampede siege https://api.example.com \
  --min-users 10 --max-users 1000 --step 25 --step-duration 5s

Sample 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 itself

Siege

πŸ‚ 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 itself

Verdicts

| 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