Luca Maraschi · CEO, Platformatic→ next · ← back · f fullscreen · p presenter
Cold open · Who is talking
Luca Maraschi, Platformatic
Me
Co-founder and CEO of Platformatic. Three companies founded and exited before this one.
Twenty years running engineering, the Canadian chapter at mobileLIVE and Telus Digital. Based in Vancouver.
I work on the runtime layer where durable execution, agents and self-hosted infrastructure meet.
Platformatic
Node.js infrastructure, co-founded with Matteo Collina.
Watt: an application server that runs Node.js services as worker threads with in-memory routing.
ICC: the control plane that runs them on Kubernetes: deployments, scaling, upgrade safety.
Core maintainers of Fastify, Undici and Pino, the libraries under both products.
Papers, with Matteo Collina
2309.06238A risk index for breaking changes across a microservice graph, computed from OpenTelemetry traces (2023)
2604.19705Predictive autoscaling for Node.js on Kubernetes
2607.13617A telemetry-driven model for quantifying upgrade risk in durable workflow execution (WUR)
2609.17645State Without a Landlord: peer-to-peer replication of durable workflow state. The last section of this talk.
Cold open · Minimum viable product
A production agent is a long-running program that calls a nondeterministic function in a loop
Cold open · How it usually gets built
Ad hoc durability
CheckpointsSerialize "where we are" into a database at hand-picked points. Every point is a guess.
Retry wrappersDecorators around tool calls. Idempotency is the tool author's problem.
State in a tableA status column that the code and the table disagree about after a crash.
Resume logicA second code path that nobody tests, executed only on the worst day.
Each piece is reasonable. Together they have no invariant.
There is no statement of the form "after any crash, the system is in state S" that you can check. You cannot replay a checkpoint. You cannot prove a retry was safe. You cannot tell a truncated history from a complete one.
Season 01
S01 · E01
Middle-Out
One ordinary async function. A compiler splits it from the middle out into a deterministic orchestrator and a set of steps, and an append-only journal makes the whole thing recoverable.
S01 · Middle-Out · Enter Workflow SDK
Workflow SDK: durable execution as a library, not a platform
What it is
Vercel's open-source durable execution SDK for TypeScript. github.com/vercel/workflow
Two directives, "use workflow" and "use step", on ordinary async functions.
Next.js, Express, Fastify, Hono, Nitro, SvelteKit, Astro, Nest. A Python SDK in beta.
Where it is
GA in April 2026 with 200K+ weekly downloads and 75+ beta releases behind it.
v5 stable in October: workflow@5.2.3 on 20 Oct, up to 5x faster than v4 with no API change.
Same family as AI SDK and Chat SDK.
The World
The runtime talks to one interface for storage, queue and streams.
Even Vercel's own backend is one World among several.
Where we stand
We do not own the SDK. We run it self-hosted: PlatformaticWorld on Watt and Kubernetes, ICC for deployment safety.
And we contribute upstream: build hooks (#3163), diagnostics_channel tracing (#3463).
Every slide from here is about this runtime.
S01 · Middle-Out · The claim
A workflow is an ordinary async function. The compiler does the rest.
export async function triageAgent(issue) {
"use workflow"; // orchestratorlet plan = await callModel({ issue });
while (!plan.done) {
const out = await runTool(plan.tool);
plan = await callModel({ issue, out });
}
const hook = createHook({ token: issue.id });
await notifyReviewer(hook.token); // suspendsfor await (const d of hook) {
return d.approved ? await apply(plan) : plan;
}
}
async function callModel(input) {
"use step"; // side effectsreturn llm.generate(input);
}
"use workflow"The orchestrator. Plain control flow: loops, try/catch, Promise.all. No I/O.
"use step"The only place a side effect may happen. LLM calls, tools, writes.
hooks, sleepSuspension points. The run becomes a journal plus a queue message.
No framework objectNo ctx.step(...), no DSL. The language is the workflow engine.
S01 · Middle-Out · Mechanism 1 of 3
The compiler splits one function into an orchestrator and addressable steps
S01 · Middle-Out · Mechanism 2 of 3
The journal is the run. Recovery is replay, not reconstruction.
S01 · Middle-Out · What the one choice buys
Five properties agents need, for free
Suspension is freeA run waiting three days is a journal row plus a delayed queue message. No process, no connection, no spinner.
Recovery is replayAny invocation can be killed at any instant. The next one recomputes from the log prefix. There is no resume code path.
Retry at the step boundaryIdempotency is a property of the step id and input, not of the tool author's discipline.
Version skew is explicitA run is pinned to the deployment that created it. Deliveries that reach the wrong deployment are re-routed, then fail with DEPLOYMENT_MISMATCH.
The journal is the traceSpans are projected from events, deterministically, instead of sampled from a process that may not survive.
S01 · Middle-Out · Suspension, measured in compute
Waiting three days costs zero compute
S01 · Middle-Out · Mechanism 3 of 3
Determinism is enforced, not requested
Not available inside the orchestrator
Time, randomnessDate.now, Math.random resolve from the journal. Atomics.waitAsync is not exposed: wall-clock timing cannot replay.
GC observationWeakRef, FinalizationRegistry and async WebAssembly compilation are removed from the sandbox.
Cryptocrypto.subtle.digest computes synchronously via node:crypto: identical bytes, deterministic timing under replay.
How
node:vm sandboxHost intrinsics captured at boot; serializing a workflow value never executes workflow code.
QuickJS in WASMOpt-in engine (WORKFLOW_VM=quickjs): same full replay, runs where node:vm does not, and enables VM memory snapshots so a 25K-event run stops replaying from zero.
The runtime talks to exactly one interface: the World
S01 · Middle-Out · Self-hosted
The same runtime on Watt and Kubernetes, with ICC as the control plane
S01 · Middle-Out · Cross-deployment steps
A step can execute as an isolated workflow in another deployment and still belong to one run
S01 · Middle-Out · Observability
The journal is the trace
Season 02
S02 · E01
Tabs versus Spaces
Four systems from three teams landed on the same invariant in 2026: commit the intent before the effect, recover from what was committed. Same invariant, four contracts. Then, on 1 October, one of them changed the equation for the other two.
S02 · Tabs versus Spaces · Earendil Pi Durable · Pi 1.0, 1 Oct 2026
Every tool call is a task whose intent is committed before it executes
S02 · Tabs versus Spaces · Three weeks in October
1 October changed the equation: the harness became a third party
Before October: each platform owned its harness (Project Think, eve, fx) and the durability model under it. After October: the harness is a third party. The platform competes on the storage, queue and compute contract underneath it.
Durability stopped being a feature of the harness and became the product of the platform.
S02 · Tabs versus Spaces · Side by side
Same invariant, four different contracts
Workflow SDK
Cloudflare Workflows
Cloudflare fibers
Pi Durable
unit of durability
event in an append-only, slot-numbered log
step.do return, keyed by step name, in the Engine DO
step name as cache key; steps "should ideally be idempotent"
yours, between stashes
replay:"safe", memos, requestId
determinism
enforced by the sandbox
required by the rules page
not required
not required; model calls re-sent
where it runs
any World, any host
Cloudflare
Cloudflare
any JS runtime; one process owns storage
who owns the journal
the World
the Engine Durable Object
the Durable Object
the storage backend
Season 03
S03 · E01
The New Internet
The World became the spec. In 4.x it was an adapter the SDK happened to use. In 5, the SDK is one client of a published protocol, and it checks the version of the thing it is talking to.
workflow@5.2.3 · @workflow/world@5.0.5 · world-vercel@5.2.3 · world-postgres@5.0.5 · world-local@5.1.2 · released 20 Oct 2026
S03 · The New Internet · What changed in the contract
Spec versions, slot-numbered events, a runtime that checks
S03 · The New Internet · The inversion
Workflow SDK is now a client of the World
S03 · The New Internet · The uncomfortable question
If the journal is the agent, who owns the journal?
Outro · Take with you
Build the agent as a workflow. Treat the World as the contract.
The invariantSide effects only in steps, results only in an append-only log, recovery as a pure function of that log.
The convergenceCloudflare Workflows, fibers and Pi Durable commit intent before effect too. The difference is whether recovery replays or decides, and whether determinism is enforced or requested.
The inversionThree weeks after Pi Durable, both platforms host it. The World is a versioned protocol with a conformance suite; the SDK is one client. Build against the spec.
The open problemA run with no host. Signatures prove order, not effects. Come break it.
useworkflow.dev · workflow-sdk.dev/worlds · platformatic.devarXiv 2609.17645 (State Without a Landlord) · arXiv 2607.13617 (upgrade risk in durable execution)Luca Maraschi · @lucamaraschi · luca@platformatic.dev
End credits · Platformatic · Vancouver · October 2026
thank you.
Making the world a better place through append-only, slot-numbered event logs.