CI matrix expander
Expand a GitHub Actions matrix into the exact list of jobs it runs. See which include entries changed each job and which combinations exclude removed.
Up to 200,000 characters of YAML in one document, 64 matrix variables, 1,024 values or include and exclude entries each, and 4,096 base combinations. Everything runs on your device in a background worker. Downloads: a JSON report and a CSV list of jobs. Paste a GitHub Actions workflow, one or more jobs, a strategy block or the matrix mapping. A pasted job can keep its job ID line. Up to 200,000 characters. Review the settings before running.
Your result
How to use CI matrix expander
- Paste a workflow file, a job or just the matrix block.
- Enter a job ID if you only want one job, or leave it empty.
- Run the expansion and review each job with its values.
- Download the JSON report or the CSV job list.
Useful next steps
How the expansion works
Happytails.ai follows the matrix rules in the GitHub Docs page "Workflow syntax for GitHub Actions" (docs.github.com, read on 16 October 2026). The tool builds every combination of the matrix variables, with the first variable changing slowest. Exclude entries remove a combination when every key they name matches, so a partial match is enough. Include entries are applied after exclude.
How include entries are applied
An include entry is added to each original combination whose matrix values it does not change. It may replace values that an earlier include entry added. If it fits no original combination, it becomes a new job. Jobs created this way are never extended by later include entries. This matches the fruit and animal example in the GitHub Docs.
Limits and assumptions
GitHub runs at most 256 jobs per matrix, and the report flags any matrix above that. Expressions such as ${{ fromJSON(...) }} cannot be evaluated here, so a matrix that uses them is rejected. Object values are compared exactly. A pasted mapping whose values are all mappings, at least one of them with strategy.matrix, is read as jobs keyed by job ID, so a job copied with its ID line expands as expected. The run order shown is the expansion order; GitHub does not guarantee the order in which jobs start.