Overview
The two build-time tools — a lint rule set that catches non-determinism inside a workflow body before it ever runs, and a codegen extension that emits a typed client for the dashboard's REST API.
Neither of these is needed to run a workflow. They exist for the two things the engine cannot check at runtime without it being too late.
- Linting for non-determinism — a workflow body must be deterministic, and
the engine only finds out it wasn't when a replay diverges, often long after the deploy.
@dudousxd/nestjs-durable-eslint-plugincatchesDate.now(),Math.random(),new Date()andcrypto.randomUUID()inside a@Workflowat author time, for both ESLint (flat config) and Biome (GritQL plugin). - Typed dashboard client — the dashboard ships a REST API for listing and
inspecting runs, retrying, cancelling and delivering webhooks. The
nestjsDurableCodegenextension for@dudousxd/nestjs-codegengenerates a fully-typed client and TanStack hooks over it, so a custom console doesn't hand-write fetch calls.
Python
Python is a first-class durable runtime. Implement steps a TypeScript workflow calls, OR author whole workflows in Python that the engine drives — both over the same Redis wire, with the engine owning durable state.
Linting for non-determinism
Catch Date.now(), Math.random(), new Date() and crypto.randomUUID() inside a @Workflow run at author time with @dudousxd/nestjs-durable-eslint-plugin — shipped for both ESLint (flat config) and Biome (GritQL plugin).