A Workflow Engine's Entire Runtime Is One JSON File
A workflow engine that treats JSON as its sole definition format eliminates vendor lock-in at the data layer. Any system that can emit this JSON can drive the engine, and any language that can parse it can run the processes — the five-language demo proves this isn't aspirational.
Every process in jeeflow — from simple approvals to parallel countersign with conditional branches — serializes into a single JSON file. The schema uses only four node types (start, task, decision, end) and five top-level fields. Routing decisions live on edges as expression strings evaluated through a pluggable SPI, not a hardcoded expression language. Ten shared test processes, consumed identically by Java, Go, Python, Node, and PHP engines, demonstrate that the JSON is the contract and the engine is an implementation detail. The pro demo site maps nine business scenarios — leave requests, purchase approvals, reimbursements with six-person parallel countersign — back to exactly four JSON patterns: simple approval, sequential multi-node, conditional branch, and parallel countersign. Version management keeps multiple definitions live simultaneously; in-flight instances stick to their launch version while new instances pick up the latest. The designer is a pure frontend component that produces JSON, decoupled from any backend or engine.
Reducing a workflow engine's entire runtime definition to four node types is a deliberate constraint that shifts complexity from the engine into the expression layer and SPI implementations, where it's easier to test and swap.
The cross-language difference in countersign task creation — batch in Java, sequential in Python/Node — exposes a design principle: the JSON contract defines what must happen, not how the engine achieves it internally.
Version management that pins in-flight instances to their launch version while routing new instances to the latest is a practical answer to a problem many workflow systems over-engineer with migration scripts and state transformation logic.
I want to ask, if from a certain step, it's sent back to the previous step, how does jeeflow draw this?
The flowchart in the process designer only defines the forward flow path (from start to end). Sending back/rejecting does not need to draw reverse lines on the diagram. Sending back is a runtime behavior, not a design-time connection: When handling, the front end provides a 'Send Back' button. After clicking, the engine automatically lists all nodes that have been traversed (jumpAbleTaskNameList), and the approver chooses which step to send back to. The engine jumps back to the target node and regenerates the to-do item. The flowchart's responsibility is to define 'how the process goes'; which step to send back to is decided by the approver at runtime and does not need to be pre-drawn in the designer.