Skip to content
Latchkey

GitHub Actions Expression Evaluator (Free)

Paste an expression and a context, get the exact evaluated value and type. No guessing whether your if: condition will fire.

GitHub Actions expressions have their own rules: == is case-insensitive, && and || return the operand (not a boolean), and operator precedence trips up almost everyone. This evaluator runs a real recursive-descent parser over the expression and computes the result against your context, so you can verify an if: condition before you push.

What it evaluates correctly

  • Operator precedence: ! (tightest), then comparisons, then &&, then ||.
  • Case-insensitive == / != with loose number/string coercion, exactly like GitHub.
  • && and || return the operand value, not a boolean - so ${{ env.X || 'default' }} works.
  • Built-in functions: contains, startsWith, endsWith, format, join, toJSON, fromJSON, success()/failure()/always()/cancelled(), and hashFiles.
  • Property access (github.event.ref), index access (matrix[0]), and grouped sub-expressions.

Why a tool beats asking an AI

Ask an AI to evaluate ${{ 1 < 2 && 3 > 4 }} or ${{ 'A' == 'a' }} and it frequently gets it wrong: it forgets that == is case-insensitive in GitHub Actions, mis-ranks operator precedence (binding && tighter than a comparison, or || looser than it should be), and assumes &&/|| return booleans instead of the operand value. This tool runs a deterministic parser and evaluator, so the answer is the answer GitHub computes - not a plausible-sounding guess.

Common uses

  • Verify a job/step if: condition before pushing a workflow.
  • Check that fromJSON + contains does what you expect on a matrix value.
  • Confirm a format() template renders the string you want.

Related guides

Run this faster and cheaper on Latchkey managed runners. Start free →