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

ciguard

v0.1.0

Published

Security auditor for GitHub Actions workflows — catch script injection, unpinned actions, and dangerous triggers

Readme

ciguard

Security auditor for GitHub Actions workflows. Point it at a workflow file or a repo and get a risk report: script injection, unpinned third-party actions, pull_request_target footguns, and overly broad permissions.

Why

CI pipelines are production infrastructure with the keys to the kingdom, and most workflow files were written by copying Stack Overflow. Supply-chain attacks through CI are some of the highest-leverage attacks out there, and reviewing every workflow by hand doesn't scale. ciguard automates the first pass so security teams can focus on the actually suspicious stuff.

Install

npm install -g ciguard

Or run from source:

git clone https://github.com/burrejak22/ciguard
cd ciguard
npm install

Usage

# single workflow file
ciguard .github/workflows/ci.yml

# whole repo (walks for *.yml / *.yaml)
ciguard ./my-repo

# machine-readable output
ciguard ./my-repo --json

CI usage

Fail the build when risk hits a threshold:

ciguard .github/workflows --fail-on HIGH

Exit code is 1 when the worst finding across all scanned files is the given band or worse (LOW < MEDIUM < HIGH < CRITICAL).

Example output

ci.yml
[HIGH] risk score: 60/100 ████████████░░░░░░░░

  ▸ +40  TRIGGER_PR_TARGET
     pull_request_target runs in a privileged context and checks out + runs PR code — classic pwn-request setup
  ▸ +35  SCRIPT_INJECTION
     script injection: attacker-controlled context interpolated into run: (job build, step 2)
  ▸ +20  ACTION_UNPINNED
     some-random/action@v1 uses a mutable tag — pin to a sha for supply-chain safety (job build)

What gets checked

  • Script injection — ${{ }} expressions inside run: scripts, weighted by whether the context is attacker-controlled (github.event.issue.title, github.head_ref, ...). Worse under pull_request_target.
  • Unpinned actions — uses: refs on mutable tags or floating branches instead of a commit sha. Third-party actions score higher than actions/*.
  • Dangerous triggers — pull_request_target combined with checking out and running PR code (the pwn-request pattern).
  • Permissions — write-all at the workflow or job level.
  • Secret exfiltration — secrets echoed into logs or shipped to external URLs via curl.
  • Cache poisoning — actions/cache keys built from attacker-controlled data on PR triggers.
  • Credential persistence — actions/checkout keeping the token around while untrusted PR code runs.

Scoring

Same philosophy as the rest of the family: weights are opinionated triage heuristics, not a certification. Totals capped at 100.

| Band | Score | Meaning | |----------|--------|-----------------------------------| | LOW | 0–19 | boring in a good way | | MEDIUM | 20–44 | worth a look | | HIGH | 45–69 | needs justification | | CRITICAL | 70–100 | fix before this runs again |

Limitations

  • Static analysis only. It reads the YAML, it doesn't execute your pipeline.
  • Expression analysis is heuristic — complex nested contexts may be missed, and safe patterns can occasionally get flagged. A HIGH score means "a human should look", not "you've been pwned".

Contributing

Issues and PRs welcome. Keep it dependency-light and keep the CLI fast.