Skip to content

Introduction

Nodalite is a small, runtime-agnostic TypeScript API framework. The same App instance runs unmodified on:

  • Node.js (18+) — via @nodalite/adapter-node
  • AWS Lambda — via @nodalite/adapter-lambda
  • Cloudflare Workers — via @nodalite/adapter-edge
  • Bun and Deno — directly, no adapter needed

What makes it different?

FrameworkRuntimesServerless-nativeBuilt-in securityBackground jobsML inference
Express 5Node onlyBolt-onNoneNoneNone
Fastify 5Node onlyBolt-onPluginsNoneNone
NestJSNode onlyPoor cold startsGuards/interceptors@nestjs/scheduleNone
HonoNode/Bun/Deno/Workers/LambdaYesMiddleware ecosystemNoneNone
ElysiaBun-firstBun onlyPluginsNoneNone
NodaliteNode/Bun/Deno/Workers/LambdaYes (first-class)Built inYesYes

Genuinely unmet needs

  1. Background threads alongside your API@nodalite/workers' runDetached() runs a supervised worker_thread (bot, poller, watcher) in the same process, with automatic crash recovery. See Background Threads.

  2. Lightweight ML inference on serverless@nodalite/ml's Model class disk-caches model bytes across cold starts, deduplicates concurrent load requests, and is engine-agnostic so it doesn't force a heavy native dependency on you. See ML Inference.

Everything else — routing, middleware, validation, auth, rate limiting — is a well-executed implementation of table-stakes features, built on the standard Fetch API so the exact same code genuinely runs everywhere.

Design principles

  • Fetch API foundationRequest/Response/Headers/ReadableStream are the only primitives. No runtime-specific shapes.
  • Zero dependencies in core@nodalite/core relies on nothing but the JS runtime. This keeps bundles small and supply-chain risk minimal.
  • Independent versioning — each package ships independently. Adapter fixes don't bump core. ML's heavy native deps stay optional.
  • Honest about limitsrunDetached() can't work on FaaS, and the docs say so explicitly. No marketing over truth.

Released under the MIT License.