How it works

natural-language task ──▶ planner (LLM, 1 call) ──▶ JSON action plan
                                                        │
       trajectory cache ◀── cheap verification ◀── deterministic executor
             │
             └──▶ subsequent runs: zero LLM, ~1s, $0

The expensive part — figuring out the browser actions — happens a single time and is turned into cached, verifiable data.

  • Plans are data, not code — schema-validated JSON; no generated scripts, no conditionals.
  • Cheap verification — DOM/URL postconditions after every action. A failed verification invalidates the cached plan and triggers an automatic re-plan.
  • Site map — every execution feeds a graph of pages and transitions; windup scan seeds that graph straight from your source code before the first run, so the planner uses your app’s real selectors instead of guessing.
  • Fragments — proven action blocks (e.g. login) that the planner composes via { "type": "use" } instead of regenerating.
  • Zero hardcoded site knowledge — the engine knows frameworks and the web, never your site. All site knowledge arrives as input (scenarios, config, manifest) or is discovered at runtime.

Why Windup

Hand-written scripts are cheap to run but expensive to maintain. Per-run AI agents are easy to write but slow and non-deterministic. Windup takes the good half of each.

Hand-written scriptsAI agent per runWindup
Authoringcode + selectors by handplain languageplain language
Run cost$0LLM on every runLLM on first run only
Run speedfastslow (model in the loop)~1s replay
Determinismhighlow — improvises each timehigh — same plan every replay
App changedyou fix the scriptmay silently do something elseverification fails → auto re-plan

For the deeper mechanics — module boundaries, data formats, cost and security posture — see Architecture & spec.