When to Use Prose
Prose is an in-process workflow orchestration library. It runs inside your existing Node.js process with zero external dependencies. Before adopting it, it’s worth understanding what it does not try to be.
Not a full durable execution engine
Section titled “Not a full durable execution engine”Prose ships opt-in skip-ahead durability — successful steps are checkpointed, and re-invoking execute() with the same runId resumes from the next undone step or replays the saved result. That covers crash recovery for in-process flows without external infrastructure.
It is not a substitute for Temporal, Inngest, or Trigger.dev. Specifically, Prose does not give you:
- Long sleeps that survive process death (
await sleep(7.days)) - An automatic resumer service that re-invokes crashed runs for you
- Distributed worker claim / lease coordination
- Event-history replay or workflow versioning
Reach for a hosted orchestrator when you need durable timers, cross-service coordination, or schedule-driven retries. The new sweet spot for Prose: business logic shape + crash safety in-process, with you bringing the scheduler (cron, queue, next request) when something has to invoke a resume.
Not a full effect system
Section titled “Not a full effect system”Effect-TS is more powerful in every technical dimension — typed errors in the return signature, type-level dependency injection via Layers, fibers, streams, and a massive standard library. If your team can invest in learning its functional programming model, Effect is the more capable choice. Prose trades that power for simplicity: pure async/await, no monads, no new paradigms to learn.
Not a state machine
Section titled “Not a state machine”XState models workflows as finite state machines with explicit states, transitions, and guards — ideal for complex non-linear flows with many possible state transitions. Prose is designed for sequential (or branching) business logic pipelines where a state machine’s verbosity would be overhead.
Not a result type library
Section titled “Not a result type library”Libraries like neverthrow or fp-ts encode errors in return types (Result<T, E>, Either<E, A>). Prose does not — steps throw, and failures are wrapped in FlowExecutionError. If typed error channels are critical to you, Effect or neverthrow are better fits.
Where Prose fits
Section titled “Where Prose fits”Prose is for teams building backend services with multi-step business logic (process an order, onboard a user, handle a payment) who want structured retries, timeouts, transactions, observability, and type-safe state threading — without adopting new infrastructure or a new programming paradigm.
| Need | Tool |
|---|---|
| Hosted durable workflows, durable timers, cross-service orchestration | Temporal, Inngest, Trigger.dev |
| In-process flows with opt-in crash recovery | Prose (with durability) |
| Full effect system with typed errors | Effect-TS |
| State machines with complex transitions | XState |
| In-process business logic pipelines | Prose |