No runner. No push. No surprise.

Know the plan
before the push.

Give ghaplan a workflow and a synthetic event. It traces triggers, filters, conditions, matrices, and dependencies—without executing a single step.

Plan a workflow

Local by design. Your workflow never leaves this tab.

A porcelain tray with branching channels and colored stones, evoking a workflow plan
Every branch accounted for.

Live planner

Shape the event. Read the outcome.

Paste YAML or open a local file. Planning happens entirely in your browser.

01

Event

Build the synthetic payload

Works offline after first load

02

Workflow

YAML stays on this device

0 linesYAML

Plan

What will happen

The quiet path to certainty

Static answers, useful reasons.

  1. 1

    Describe the moment

    Choose an event, branch, changed paths, labels, and dispatch inputs.

  2. 2

    Trace the workflow

    Trigger filters, expressions, matrices, and the needs graph are evaluated locally.

  3. 3

    See every decision

    Run, skip, and unknown outcomes include the reason—not just a colored light.

CLI

The same question,
right beside your code.

The typed Rust library and single binary fit scripts, pre-commit hooks, and editors. JSON output is stable for automation.

Read installation notes
$ ghaplan --event pull_request \
    --base main --head feat \
    --paths src/a.ts

RUN  workflow CI
      └─ pull_request matched filters
      ├─ RUN  job lint
      ├─ RUN  job test [3 cells]
      └─ SKIP job release
         └─ if evaluated to false

Honest boundaries

A planner, not a runner.

Understood

Common push, pull request, dispatch, schedule, and merge-group triggers; ordered branch/path filters; core expression functions; matrix include/exclude; needs; env; inputs; referenced secrets and permissions.

Left unknown

Secret values, live concurrency state, hashFiles(), remote reusable workflows, composite-action internals, and runner filesystem state. Unknown is shown explicitly, never guessed.