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.
This page works on a phone, though editing a workflow is easier on a desktop. The results are below the editor and the event: jump to the results.
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, the matrix expansion (a port of the matrix builder in GitHub's C# workflow parser, which the MIT-licensed actions/runner repository publishes), and a tracing evaluator that records the value of every sub-expression so a skipped job can tell you which comparison did it. When a job is skipped because of a job upstream, its card follows the needs chain to the job where the skip started and names that job's deciding comparison, which GitHub's own run page does not.
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 public fixtures 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, and every job a recorded matrix created, under the name GitHub gave it.
Limits. What this page cannot fully decide for the jobs in front of you, such as a reusable workflow, a step condition that reads step outputs, a job output or variable it takes as empty, or an environment's protection rules, is listed in a yellow box above the job cards, each item with what the simulation does instead. On this page, changed files are typed by you: GitHub strips the file lists from the push payload it hands to Actions, so nothing can read them from the event. The command line version runs inside your repository and reads them from git instead. Reusable workflows are shown as jobs but not expanded. A matrix is expanded the way GitHub's own parser does it (cross product, exclude, include, job names, fail-fast), and a matrix that comes out empty is shown as what GitHub does with it: no job at all, and failure for the jobs that need it. A matrix read from a job output stays unknown until you type that output, because only the job knows what it writes. max-parallel is shown but changes no outcome, and fail-fast assumes every other combination was still running when one failed. Step conditions are evaluated with the job's context and every previous step assumed successful. A step condition that reads steps.*, env or hashFiles() is marked unknown rather than guessed. 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.