Bring your Worker to native.

Sproutboat compiles a Cloudflare Workers fetch handler with Porffor into one Linux executable.

Install

$ npm i -g sproutboat

Your handler, compiled.

Start with a fetch handler. Build a native Linux executable with the CLI.

See how to build it →
src/index.js
export default {
  fetch(request) {
    const url = new URL(request.url);
    const name = url.searchParams.get("name") || "world";
    return new Response(`Hello, ${name}!\n`);
  },
};
$ sproutboat build --standalone

The same Worker on three runtimes

One Worker-style app, run directly on Node, workerd and a Sproutboat v0.12.0 executable on the same Linux host. Every response is checked.

Node workerd Sproutboat
Footprint
Idle memory (PSS) 67.5 MiB46.2 MiB6.41 MiB
Size on disk, app plus runtime 141 MiB128 MiB3.01 MiB
Speed
Start to first correct response 185 ms39.1 ms13.6 ms
p95 latency, JSON orders 4.57 ms2.89 ms2.78 ms
p95 latency, 10% wait on a 50 ms upstream 54.3 ms53.5 ms56.9 ms
Cost
CPU time per 1,000 requests 2,361 ms1,417 ms1,101 ms

Medians of 3 rounds at a fixed 50 requests/s, run on 2026-09-30. Green marks the lowest value in each row. This is not a maximum-throughput test or a comparison with hosted Cloudflare Workers. Raw samples and method