Paste a GitHub Actions workflow, pick the event, see which jobs run and why. This page runs GitHub's own workflow parser and expression engine in your browser. Nothing is uploaded.
GitHub publishes the pieces of its own Actions language server as MIT-licensed npm packages: @actions/workflow-parser reads your YAML against the real workflow schema and fills in the same defaults the runner does (a job without if: gets success()), and @actions/expressions is the expression engine behind ${'{{'} }}. This page runs both in your browser. The only parts written here are what the packages do not cover: the on: filter matching (branches, tags, paths, activity types), the derivation of the github context for each event, the job-status functions computed from the jobs a job needs, and a tracing evaluator that records the value of every sub-expression so a skipped job can tell you which comparison did it.
The event payload comes from GitHub's published webhook examples; the knobs above patch it (branch, labels, fork, draft, inputs), so every evaluation runs against a realistic github.event. The result is checked against ground truth: a private repository ran the same workflows on real pushes, pull requests, labels, tags, manual dispatches, a release and an issue; each run dumped its own github context, and the test suite requires this simulator to reproduce every job's run-or-skip decision and every trigger decision from those runs.
Limits. Changed files are typed by you: GitHub strips the file lists from the push payload it hands to Actions, so no simulator can read them from the event. Reusable workflows are shown as jobs but not expanded. Matrix expansion is not simulated yet. Step conditions are evaluated with the job's context and every previous step assumed successful. hashFiles() in a step returns an empty string here. Secrets are never available in if:, on GitHub or here.
MIT · source, fixtures and tests · built with actions/languageservices packages · no analytics, no server, no key.