DocumentationΒ§
Wiggle is a durable workflow engine β and the control plane to shard it. You define a business process as pure topology (named steps and how they chain, branch, and rejoin); Wiggle persists every instance as tokens moving over that graph, so a process survives restarts, retries, and worker death and resumes exactly where it left off. Steps are executed by pull-based workers over gRPC β your services, in your processes, in your language.
Where to startΒ§
| If you want to⦠| Read |
|---|---|
| Run something in the next ten minutes | Onboarding & configuration |
| See every DSL operator in runnable code | DSL cookbook |
| Split one flow's steps across many microservices | Queues |
| Understand cells, epochs, and resharding | Sharding & epochs |
| Cut server round-trips for step-heavy flows | Local execution |
| Write workers in Go or Python | Go & Python clients |
| Copy a working shape for a real process | The patterns library |
The mental model in five sentencesΒ§
- A workflow definition is a compiled graph β data the server owns, versioned by the content hash of the graph. There is no workflow code on the server, so there is no replay and no determinism contract.
- A running instance is a set of tokens positioned on that graph (in the spirit of a Petri net), each token a database row. Recovery is reading the rows.
- Handlers are plain methods in your services, matched to steps by name. A method's
signature picks its kind:
booleanreturn = gate,void= effect, anything else = a task whose return replaces the context. - Nothing merges implicitly. Fork branches run on isolated context copies and rejoin only
through an explicit combine step;
forEachmaps elements and hands you the collected results. - Workers pull. They long-poll queues over gRPC with lease-based claims β no inbound connectivity to your services, backpressure by construction, at-least-once execution with exactly-once dispatch.
Running modesΒ§
Start embedded, end sharded β the same workflows run unchanged in all four postures:
| Mode | What it is |
|---|---|
| Embedded | WiggleServer inside your JVM, in-memory store β dev and tests |
| Standalone | one node, gRPC :8080, in-memory or a database |
| Cluster | several nodes sharing one database; a leader runs timers and recovery |
| Cellular | many cells (each its own DB + cluster) behind a Raft coordinator |
The onboarding guide walks through each, including the ops console and the CLI.