Compiler-hidden suspension over readiness-driven I/O; bounded task workers for general work.
JavaScript callbacks and promises execute around the event loop with a worker pool for selected operations.
Commercial product comparison · Updated 2026-07-26
Grayworth recommendation
Choose Gray when a backend needs the immediacy developers like in Node.js without making the application carry the event loop's continuation discipline. Gray's tested qualifying ceiling reached 60k/s on both published routes, versus 12k/s plaintext and 20k/s JSON for Node.js in the same fixture.1
01 / At a glance
Compiler-hidden suspension over readiness-driven I/O; bounded task workers for general work.
JavaScript callbacks and promises execute around the event loop with a worker pool for selected operations.
Typed or typeless Gray with classes, structs, collections, BigInt, modules, and native server APIs.
JavaScript or TypeScript with an exceptionally broad package ecosystem.
Live, Adaptive, and Static modes in one runtime/toolchain.
Node process plus framework, package tree, and deployment supervisor.
Grayworth owns the complete server product, release, and support path.
Node applications combine the runtime with selected frameworks, packages, and process tooling.
02 / Under pressure
Gray qualified through 60k requests/s on plaintext and JSON. Node.js qualified through 12k/s on plaintext and 20k/s on JSON under the same threshold.
| Fixture | Gray | Node.js |
|---|---|---|
| Plaintext | 60k/s · p99 85.76 ms | 12k/s · p99 10.04 ms |
| JSON | 60k/s · p99 81.15 ms | 20k/s · p99 72.13 ms |
| 20k plaintext | 99.5% delivery · p99 2.25 ms | 99.5% delivery · p99 123.8 ms |
| 45k JSON | 99.5% delivery · p99 5.90 ms | 50.0% delivery · overloaded |
1 Same-host qualification. Full environment, threshold, and scope appear in Claims & details below.
Node's event loop is the reason it can serve many I/O-bound clients with a small number of threads. The design becomes fragile when a callback or worker task performs too much variable-duration work. Node's own guidance emphasizes that a blocked event loop cannot give other clients a turn.
Gray also uses a readiness reactor, but its public server contract is built around normal-looking handlers. A PostgreSQL call can suspend the handler, release the reactor, and resume from the exact continuation when the socket is ready. That design aims to keep the event-loop discipline in the compiler and runtime rather than in every route.
At 20k requested plaintext requests per second, Node delivered 99.5% but corrected p99 reached 123.8 ms, just beyond the qualification condition. Gray delivered 99.5% with p99 2.25 ms. On JSON, Node still qualified at 20k/s with p99 72.13 ms.
At 30k/s Node no longer delivered 95% of either route, while Gray remained inside the condition. This is evidence about the exact minimal servers in the published image. Express, Fastify, cluster mode, worker topology, payload complexity, and application dependencies would create different curves.
Move the Node routes where CPU time, database waits, tail latency, or worker pressure already has a cost. Gray can own authentication, request handling, data access, and deployment as one server product instead of another JavaScript process stack.
A production move should improve the whole route: response behavior, cold start, p50/p99/p99.9, memory, cancellation, deployment, and operating cost.
Decision guide
Migration
Preserve the HTTP contract first; translate one handler, not the whole application.
Map I/O to Gray's cooperative native calls and let the handler continuation suspend automatically.
Use Gray Bytes for arbitrary binary data and String only for valid UTF-8.
Compare one Gray worker with the exact Node topology before scaling either side.
Questions
On Grayworth's published server tests, yes. Gray qualified at 60k/s on plaintext and JSON; Node.js qualified at 12k/s and 20k/s respectively.¹
Yes. Gray owns readiness, suspension, cancellation, and resumption inside the runtime, so handlers stay direct while the server continues serving other connections.
Yes when the backend's required packages and integrations are available through Gray or a service boundary. Start with the routes where performance and operating simplicity create the largest return.
Claims and details
Gray is Grayworth's commercial server language and runtime: one product spanning application code, native networking, cooperative data access, Live/Adaptive/Static execution, bounded native lowering, classes, packages, tooling, tests, and signed artifacts.
Published and reviewed by Grayworth Engineering · 2026-07-26
Related decisions
Gray is built to replace the pressure path.