The Bits
Infrastructure Company
01

Open sourceRust, TypeScript, Python, Go and Java1.0.0

Fusee: durable execution at the speed of the disk

Fusee is an open-source durable execution engine. You write a long-running process as ordinary async code, with steps, sleeps, signals and child workflows. If the machine dies halfway through, the process carries on from where it stopped.

In a chain of Rust steps on an AWS i8g.2xlarge with local NVMe, the median step took 14 µs. A durable write on the same drive took 12 µs. Fusee is a library, so there’s no orchestrator, database or queue between your code and the disk.

A log drawn in bits. Records are outlined in red when they are appended, turn solid red while one flush writes them all, and turn grey once they are durable. The flushes keep the same length as the load rises and falls; only the number of records in each one changes.
02

A workflow is a function

Every call through ctx is journaled: steps, sleeps, signals, child workflows, even the current time and random numbers. After a crash, the function runs again from the top and the journal hands back what already happened, so finished steps don’t run twice.

A step has a stable key across retries. Pass it to a payment service as an idempotency key to avoid charging twice after a crash.

Quick start
  1. import { Engine, signal, workflow } from "@bitsinfra/fusee";
  2. const review = signal<boolean>("review");
  3. const checkout = workflow("checkout", async (ctx, order: Order) => {
  4. const quote = await ctx.step("quote", () => pricing.quote(order));
  5. const charge = await ctx.step("charge", (s) => payments.charge(quote, { idempotencyKey: s.key, signal: s.signal }), {
  6. retry: { attempts: 5, max: "1m" },
  7. });
  8. await ctx.sleep("cool-off", "10m");
  9. const approved = await ctx.waitFor(review, { timeout: "1d" });
  10. return approved ? charge.id : await ctx.step("refund", () => payments.refund(charge.id));
  11. });
  12. const engine = await Engine.open({ dir: "./data", workflows: [checkout] });
  13. const run = await engine.start(checkout, "order-123", order);
  14. await run.signal(review, true);
  15. console.log(await run.result());

The TypeScript SDK on npm and the Python SDK on PyPI include the Fusee CLI. Rust users can install the CLI with cargo install --locked fusee-cli from crates.io.

npm install @bitsinfra/fusee

03

What a step costs

Recording a step’s result durably is the whole job of a durable execution engine. Published figures put it at about a millisecond to a few hundred milliseconds per step. One flush on a datacenter drive takes about ten microseconds.

Fusee spends a step’s time where it has to: on the disk.

One step, in bits · 1 bit = 10 µs
Temporal Cloud17 ms1,700 bits

Activity completion at p50, Temporal’s benchmark, May 2024

Restate3 ms300 bits

Median per step on a three-node cluster, Restate’s measurements

DBOS1–2 ms100–200 bits

Per step, DBOS’s own figure

Fusee14 µs1.4 bits

Rust local, sequential steps at p50 on an AWS i8g.2xlarge with local NVMe

One flush9.8 µs0.98 of a bit

One fdatasync on an Intel D7-P5520 with power-loss protection, Small Datum, January 2026

Published figures, each measured its own way on its own machines, so they show orders of magnitude, not a ranking. Our benchmark of every engine at matched durability is in the announcement.
04

What it promises

  1. Acknowledged starts, signals and step results survive the failures covered by the selected durability mode.

  2. A recorded step result never changes, and the code after it sees the same value on every run.

  3. A step’s function runs at least once, and again only if the process failed before its result was durable. At services that honor idempotency keys, reuse the step’s key so the effect happens once.

  4. Nothing leaves the process based on state a crash could take back.

These are the journaling semantics of DBOS, Restate and Temporal activities. Fusee doesn’t weaken them anywhere; it changes what they cost.

05

Why it’s fast

  • No distance

    Fusee is a library. Workflows run in your process and the engine writes a log beside them. A step never crosses a network to an orchestrator, waits on a database transaction or sits in a queue.

  • Code runs ahead of the disk

    Appending a record makes it visible at once. Only two things wait for the disk: a step’s function, for the records before it, and anything that leaves the process. Everything in between runs while the write is in flight.

  • One flush in flight

    No timer and no batching window. Each flush takes everything appended since the last one, so an idle engine writes a lone record at once and a busy one carries more records in every write.

  • One log per drive

    Every shard appends to one shared log, written with direct I/O. The drive sees a single stream of writes, never more than two deep, instead of one queue per core.

How each of these works, with interactive figures
06

From one process to three machines

The same engine runs three ways, chosen when you open it.

ModeOutputs wait forSurvives
LocalA flush on this machineA process crash, and power loss on drives that honor flushes
ServerA flush on the server, one round trip awayAny worker’s crash: another worker takes over its shards
ReplicatedA quorum, two of three or three of fiveLosing a minority of the machines

Server mode puts the log in a process of its own and lets many workers share it, over shared memory on one host or TCP across hosts. Shards are leased one at a time, so a worker that hangs loses only its own.

On a cloud, replicated mode is the one we’d run in production. A quorum of local NVMe drives on three machines nearby is faster than one flush on a network volume, and it survives losing a machine.

07

Everything a workflow engine needs

The five SDKs share the same workflow operations. Fusee records their results in the journal and reuses them during replay.

Signals and timers
Durable sleeps, signals with timeouts, and messages between workflows.
Child workflows
With ID and close policies, plus all and race.
Queries
Read a workflow’s state. The answer waits until what it read is durable.
Updates
Validated, accepted once and answered from the journal, with update-with-start.
Retries, timeouts and heartbeats
Backoff per step, timeouts per step and per workflow, heartbeats for long steps.
Async completion
Finish a step later with a token, for approvals and callbacks.
Versions and patches
Runs finish on the code they started with; a patch reaches a sleeping workflow where its code meets it.
Replay testing
Export recent journals and replay new code against them in CI before you deploy.
Schedules
Cron with time zones, overlap rules and backfill, built on durable timers.
Limits
Concurrency and rate limits that never hand out an extra permit, even across crashes.
Read-only steps
Lookups and model calls that run without waiting for the disk.
Encryption
AES-256-GCM payloads, so logs, servers and replicas hold only ciphertext.
Search
Search attributes and filtered listing of runs.
Cancellation
Cancel with compensation, terminate and reset, continue-as-new.
Operations
OpenTelemetry, a web UI over every run and its journal, TLS, and continuous backup to object storage.
Simulation
Run your own workflows under Fusee’s seeded simulator, with skipped time and injected crashes and disk faults.
08

Get started

Fusee is open source under the MIT or Apache 2.0 license, and sends no telemetry. Version 1.0.0 is the first stable release.