Introduction

WOML is an open, executable format for durable workflow applications. You describe the workflow with readable, HTML-inspired markup, write real JavaScript where business logic is needed, and run the result through a cross-platform runtime with a durable Rust engine.

If you can read HTML, you can understand the shape of a WOML workflow. You do not need to trace a chain of framework calls or open a visual canvas to discover what starts the automation, what it does, where it branches, or when a human becomes involved.

More than a markup language

WOML is three parts working together:

  • A language expresses triggers, steps, data flow, loops, decisions, concurrent work, approvals, lifecycle hooks, and runtime policies.
  • A durable engine supervises runs, attempts, retries, state, events, workflow calls, recovery, and execution history.
  • An operational runtime validates, runs, inspects, cancels, backs up, and manages automations from the command line.

A .woml file is therefore more than configuration. It is the program, the architecture diagram, the execution policy, and the human-readable documentation for an automation in one source-controlled document.

The central idea is simple: an automation should not have to be abandoned and rewritten as a backend service when it becomes important. It should be able to begin small and grow into durable software without changing its fundamental model.

Why combine markup and JavaScript

Markup and JavaScript have different jobs.

Markup explains what the workflow is. It makes sequencing, concurrency, conditions, approvals, and operational policy visible:

WOML
<steps>
  <step id="prepare">...</step>
  <parallel id="checks">...</parallel>
  <choose id="decision">...</choose>
</steps>

JavaScript explains what an individual step does:

WOML
<step id="calculateTotal" name="Calculate total">
  <script>
    const subtotal = context.payload.items.reduce(
      (sum, item) => sum + item.price * item.quantity,
      0
    );

    return { subtotal, total: subtotal * 1.2 };
  </script>
</step>

You keep familiar language features such as variables, functions, conditions, loops, await, modules, and Fetch. WOML takes responsibility for everything around the script: when it may run, what data it receives, how its result becomes durable, how failure is recorded, and which work may continue afterward.

What you can build

WOML is not limited to connecting two SaaS applications. It can model workflow applications across several domains:

AreaExamples
Business processesCustomer onboarding, order fulfillment, invoice processing, compliance review
AI agentsSupport agents, research systems, content pipelines, human-supervised autonomous operations
Data workflowsImport, validate, transform, classify, iterate over, and store data
Backend automationWebhook processing, scheduled jobs, event-driven services, workflow APIs
Human operationsApproval chains, moderation, escalation, incident response
CommunicationTelegram, Discord, Slack, and WhatsApp-driven workflows
Developer automationDeployment checks, backups, reports, repository and filesystem operations

For an AI system, an LLM call can be one supervised step rather than the entire application. Specialist agents can be child workflows, durable state can preserve knowledge between runs, events can coordinate independent work, and an approval can guard a sensitive action.

How WOML runs

The source passes through clear architectural boundaries:

  1. The Bun and TypeScript frontend parses the .woml document, validates its syntax and references, and lowers it into a language-neutral workflow graph.
  2. Rust validates that compiled model again and becomes the authority for execution, persistence, scheduling, policies, and recovery.
  3. When a script is ready, Rust invokes an isolated Bun worker with bounded input and runtime bindings.
  4. A successful JSON return is recorded before downstream work becomes eligible.
  5. Context, terminal output, inspection, and recovery are derived from durable run history.

This separation matters: the Rust engine does not need to understand markup, {{...}} references, or JavaScript source. It executes the compiled workflow contract.

Who WOML is for

WOML is a strong fit when you want workflows reviewed in Git, real code without hiding the flow, a self-hosted runtime, readable AI-generated automation, or a process that may become concurrent, stateful, long-running, and operationally important.

It may not be the right choice when a drag-and-drop editor is mandatory, arbitrary untrusted tenants must execute code in one hostile shared sandbox, or you need a managed multi-region control plane today.

Continue with Installation, then build and run the Quick Start.