actwhy
GitHub Actions trigger explainer

Know which GitHub Actions workflows will fire — and exactly why the others won't — before you push.

Paste your GitHub Actions YAML, simulate a push or pull request, and get an instant, honest verdict for every workflow — down to the exact filter or if: condition that stops it. Runs entirely in your browser.

npx actwhy
Star on GitHub

Playground: simulate GitHub Actions triggers in your browser

# workflows
Simulated event
One path per line. Leave blank = files unknown → actwhy returns UNKNOWN for any paths filter instead of guessing.
Advanced — commit message
Used by conditions like contains(github.event.head_commit.message, '[skip ci]').
# verdict re-evaluated live

Why didn't my GitHub Actions workflow run?

The loop

Kill the push-debug-push loop

Stop committing “fix trigger 🙏”, pushing, waiting for the runner, and finding nothing ran. Whether it's a paths filter that isn't matching, a branches pattern, or an if: condition — actwhy answers before you push, in milliseconds, offline.

The rule

Three-valued honesty

When it can't know — the changed files aren't specified, a matrix is dynamic — it says UNKNOWN, not maybe. actwhy never guesses.

The engine

GitHub's own parser

Built on @actions/workflow-parser and @actions/expressions — the same MIT-licensed libraries GitHub uses to read your YAML and evaluate ${{ }}.

How it compares to act and actionlint

act
Runs your workflows locally in Docker to actually execute the jobs.
executes
actwhy
Explains the trigger decision instantly — which workflows fire, and the exact reason the rest don't.
explains
actionlint
Lints workflow syntax and catches static mistakes in your YAML.
lints

Complementary tools — actwhy answers the one question the others don't: will it even trigger?

Install the CLI

npx actwhy
npm i -g actwhy

Point it at a repo and it reads .github/workflows directly — zero configuration. Same engine as this page.