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.18.0 executable on the same Linux host. Every response is checked.

Node workerd Sproutboat
Footprint
Idle memory (PSS) 52.3 MiB46.5 MiB7.44 MiB
Size on disk, app plus runtime 141 MiB128 MiB4.60 MiB
Speed
Start to first correct response 248 ms53.6 ms12.0 ms
p95 latency, JSON orders 5.51 ms5.29 ms2.58 ms
p95 latency, 10% wait on a 50 ms upstream 55.2 ms53.6 ms56.8 ms
Cost
CPU time per 1,000 requests 2,585 ms1,654 ms1,159 ms

Medians of 3 rounds at a fixed 50 requests/s, run on 2026-10-20. 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