If you've ever worked with GitHub Actions, you probably know the most frustrating part of the CI/CD experience: Complex if: conditions.
You write your workflow, push your code, and wait for the runner. Then, you see the dreaded gray icon: Skipped. GitHub gives absolutely zero explanation about why your condition evaluated to false.
To debug this, I used to do what every sane developer does: pollute my commit history with garbage.
"test ci""trigger build pls""fix condition maybe?""pls work"
I got completely sick of this trial-and-error loop. I wanted a way to test my context payload and expressions locally before pushing anything.
The Solution: "Why Didn't My Job Run?"
Instead of building a backend service to parse these expressions (which would mean paying for servers and sending private CI payloads over the network), I took a different approach.
GitHub publishes the actual parser and expression engine it uses as open-source npm packages: @actions/workflow-parser and @actions/expressions. I bundled those two packages so they run in your browser. No reimplementation, no server.
Then, I built a clean UI around it. The result is a tool that runs 100% locally in your browser.
Here is how it works:
- You paste your workflow file.
- You pick an event: a push to
main, a pull request from a fork, a label, a manual dispatch. - Every job turns green or grey with the reason next to it, down to the value of each sub-expression — evaluated by the same code GitHub runs.
It's checked against real runs: 65 recorded workflow runs, 698 job decisions replayed, all matching.
Since there are no server calls, your private workflow data never leaves your machine. Privacy by design, and zero server costs for me! 😅
Try it out!
I decided to open-source the entire thing. If you are tired of making dummy commits just to test your pipelines, give it a spin.
🌐 Live Simulator: https://barbarkaragul-oss.github.io/why-didnt-my-job-run/
💻 GitHub Repo:
barbarkaragul-oss
/
why-didnt-my-job-run
Paste a GitHub Actions workflow, pick the event, see which jobs run and why. GitHub's own workflow parser and expression engine, running in your browser.
Why didn't my job run?
Paste a GitHub Actions workflow, pick the event, see which jobs run and why.
GitHub's own workflow parser and expression engine, running in your browser. Nothing is uploaded.
Open the simulator · How it works · Verified against real runs · Limits
Every GitHub Actions user has stared at a grey "skipped" job and asked why. The usual answer is a dozen "test ci" commits. This page answers in a second: paste the workflow, choose push to main or a pull_request from a fork with a release label or a workflow_dispatch with deploy: true, and every job turns green or grey with the reason next to it, down to the value of each sub-expression.
if: github.event.pull_request.head.repo.fork == false
→ SKIPPED on pull_request from a fork
github.event.pull_request.head.repo.fork is true → github.event.pull_request.head.repo.fork == false is false
→ RUNS on push (probably not what you meant):
github.event.pull_request.head.repo.fork…(Check out my portfolio for other dev tools I've built: https://barbaros.dev)
I would love to get your feedback on the UI, or on any workflow where the verdict doesn't match what GitHub actually did. If you manage to break the parser, please let me know! Let's stop the "test ci" madness together.

Top comments (1)
Some comments may only be visible to logged-in visitors. Sign in to view all comments.