How to use the GitHub Actions Workflow Validator
- Paste a workflow file, open it, or load the sample.
- YAML errors are shown first, with line numbers.
- Then triggers, jobs, steps,
needs, expressions, cron schedules and permissions are checked. - Best-practice checks flag outdated action versions, unpinned third-party actions, missing timeouts and script-injection risks.
Common workflow mistakes this catches
- Unknown events or keys — typos such as
pull-requestinstead ofpull_request, orrun-oninstead ofruns-on. - Broken job graphs —
needspointing at a job that doesn’t exist, or jobs that depend on each other in a cycle. - Steps with both or neither of
usesandrun, andusesreferences without a version (@v4). - Expressions — unbalanced
${{ }}, unknown contexts and references to step outputs that don’t exist. - Invalid cron — schedules must have five fields; the tool explains when they run (in UTC).
- Deprecated commands such as
::set-outputand::save-state, replaced by$GITHUB_OUTPUTand$GITHUB_STATE.
Security checks
Using ${{ github.event.pull_request.title }}, issue bodies or branch names directly inside run: lets anyone who opens a pull request inject shell commands. Pass them through an environment variable instead. The validator also flags pull_request_target combined with checking out PR code, missing permissions (the token then gets broad defaults) and third-party actions pinned to a mutable tag rather than a commit SHA.
Create a new workflow with the GitHub Actions generator, explain schedules with the cron expression generator and check other YAML with the YAML validator.
Tools that pair well with the GitHub Actions Workflow Validator
- Kubernetes YAML Validator — Paste Deployments, Services, Ingresses, ConfigMaps or a whole multi-document file.
- Git Cheat Sheet — Every Git command you use day to day — and the ones you need when something goes wrong — explained in one line.
- .gitignore Generator — Tick your stack — Node, Python, React, Next.js, Docker, macOS, VS Code and 40 more — and get one clean, de-duplicated .gitignore with commented sections, ready to download.
- Git Command Generator — Pick a task like “undo the last commit but keep my changes” or “rename a branch on GitHub”, fill in your branch names and get the exact Git commands — each line explained, risky steps flagged.
Frequently asked questions
Is this the same as actionlint?
Does it validate reusable workflows and composite actions?
on: workflow_call and jobs that call reusable workflows (uses: at job level) are supported. action.yml files for composite actions are not checked yet.Why pin actions to a commit SHA?
@v4 can be moved by the action’s owner — or an attacker who compromises it. A full commit SHA can’t change, so your workflow runs exactly the code you reviewed.