Every "must-know npm packages" list links to abandoned repos or tools you already know.
These 10 are actively maintained, TypeScript-native, and earn their spot in production code — not because they went viral.
TL;DR: These 10 npm packages cut real complexity in production Node.js apps — no hype, no toy demos.
Table of Contents
- zod — runtime validation your TypeScript types can't provide
- tsx — run TypeScript instantly without a build step
- hono — the web framework fast enough for edge
- drizzle-orm — SQL-first ORM that doesn't fight TypeScript
- superjson — serialize what JSON.stringify silently mangles
- effect — structured concurrency for complex async systems
- pino — the logger that won't become your bottleneck
- pompelmi — file upload scanning with zero cloud dependencies
- got — the HTTP client Node.js deserved from the start
- p-queue — concurrency control for async operations
1) zod — runtime validation your TypeScript types can't provide
What it is: A TypeScript-first schema library that validates data at runtime, not just at compile time.
Why it matters in 2026: TypeScript types disappear at runtime. Zod gives you the same guarantees at the API boundary — incoming requests, form submissions, environment variables. It's become the standard because the API is clean and it composes well with frameworks like tRPC.
Best for: API request validation, form parsing, environment variable schemas
colinhacks
/
zod
TypeScript-first schema validation with static type inference
Zod
TypeScript-first schema validation with static type inference
by @colinhacks
Featured sponsor: Jazz
What is Zod?
Zod is a TypeScript-first validation library. Define a schema and parse some data with it. You'll get back a strongly typed, validated result.
import * as z from "zod";
const User = z.object({
name: z.string(),
});
// some untrusted data...
const input = {
/* stuff */
};
// the parsed result is validated and type safe!
const data = User.parse(input);
// so you can use it with confidence :)
console.log(data.name);
Features
- Zero external dependencies
- Works in Node.js and all modern browsers
- Tiny:
2kbcore bundle (gzipped) - Immutable API: methods…
2) tsx — run TypeScript without the setup tax
What it is: A zero-config TypeScript runner using esbuild that executes .ts files directly with npx tsx script.ts.
Why it matters in 2026: Setting up ts-node and waiting for tsc just to run a script kills momentum. tsx eliminates all of that — faster than ts-node, no build step for scripts or migrations.
Best for: Scripts, one-off migrations, CLI tools, prototypes
privatenumber
/
tsx
⚡️ TypeScript Execute | The easiest way to run TypeScript in Node.js
TypeScript Execute (tsx): The easiest way to run TypeScript in Node.js
Documentation | Getting started →
Already a sponsor? Join the discussion in the Development repo!
Sponsors
3) hono — the web framework built for the edge
What it is: A small, fast, multi-runtime framework running on Cloudflare Workers, Deno, Bun, and Node.js with the same API.
Why it matters in 2026: Express was built for a different era. Hono is designed for edge deployments and V8 isolates — and it significantly outperforms Express on Node.js too. First-class TypeScript support is built in, not bolted on.
Best for: Edge functions, Cloudflare Workers, REST APIs, multi-runtime services
Links: | Website
Hono - means flame🔥 in Japanese - is a small, simple, and ultrafast web framework built on Web Standards. It works on any JavaScript runtime: Cloudflare Workers, Fastly Compute, Deno, Bun, Vercel, AWS Lambda, Lambda@Edge, and Node.js.
Fast, but not only fast.
import { Hono } from 'hono'
const app = new Hono()
app.get('/', (c) => c.text('Hono!'))
export default app
Quick Start
npm create hono@latest
Features
-
Ultrafast 🚀 - The router
RegExpRouteris really fast. Not using linear loops. Fast. -
Lightweight 🪶 - The
hono/tinypreset is under 12kB. Hono has zero dependencies and uses only the Web Standard API. - Multi-runtime 🌍 - Works on Cloudflare Workers, Fastly Compute, Deno, Bun, AWS Lambda, Lambda@Edge, or Node.js. The same code runs on all platforms.
- Batteries Included 🔋 - Hono has built-in middleware, custom middleware, and third-party…
When your web framework runs on Node.js, Bun, Deno, and the edge. Source: Giphy
4) drizzle-orm — the ORM that doesn't hide SQL from you
What it is: A TypeScript ORM with a SQL-like query API that generates type-safe queries without abstracting the database.
Why it matters in 2026: ORMs that hide SQL work until queries get complex. Drizzle stays close to SQL, generates types from your schema, and runs cleanly in serverless environments where Prisma's connection model struggles.
Best for: PostgreSQL, MySQL, SQLite, apps with complex queries, serverless environments
Links: | Website
drizzle-team
/
drizzle-orm
ORM
What's Drizzle?
Drizzle is a modern TypeScript ORM developers wanna use in their next project It is lightweight at only ~7.4kb minified+gzipped, and it's tree shakeable with exactly 0 dependencies.
Drizzle supports every PostgreSQL, MySQL and SQLite database, including serverless ones like Turso, Neon, Xata, PlanetScale, Cloudflare D1, FlyIO LiteFS, Vercel Postgres, Supabase and AWS Data API. No bells and whistles, no Rust binaries, no serverless adapters, everything just works out of the box.
Drizzle is serverless-ready by design. It works in every major JavaScript runtime like NodeJS, Bun, Deno, Cloudflare Workers, Supabase functions, any Edge runtime, and even in browsers.
With Drizzle you can be fast out of the box and save time and costs while never introducing any data proxies into your…
5) superjson — serialize what JSON.stringify silently mangles
What it is: A drop-in JSON replacement that handles Date, Map, Set, BigInt, and undefined without silent type coercion.
Why it matters in 2026: Every full-stack app gets burned by JSON.stringify turning Date objects into strings or dropping undefined silently. Superjson extends JSON with type metadata — predictable serialization across every server/client boundary.
Best for: tRPC, Next.js, full-stack apps with complex data types
flightcontrolhq
/
superjson
Safely serialize JavaScript expressions to a superset of JSON, which includes Dates, BigInts, and more.
Safely serialize JavaScript expressions to a superset of JSON, which includes Dates, BigInts, and more
Key features
- 🍱 Reliable serialization and deserialization
- 🔐 Type safety with autocompletion
- 🐾 Negligible runtime footprint
- 💫 Framework agnostic
- 🛠 Perfect fix for Next.js's serialisation limitations in
getServerSidePropsandgetInitialProps
Backstory
At Blitz, we have struggled with the limitations of JSON. We often find ourselves working with Date, Map, Set or BigInt, but JSON.stringify doesn't support any of them without going through the hassle of converting manually!
Superjson solves these issues by providing a thin wrapper over JSON.stringify and JSON.parse.
Sponsors
Superjson logo by NUMI:
Getting started
Install the library with your package manager of choice, e.g.:
yarn add superjson
Basic Usage
The easiest way to use Superjson is with its stringify and parse functions. If you know how to use JSON.stringify, you already know Superjson!
Easily stringify…
6) effect — structured concurrency for when async/await breaks down
What it is: A TypeScript library for reliable applications using typed effects, structured concurrency, and composable error handling.
Why it matters in 2026: Retries, timeouts, cancellation, and dependency injection all become ad hoc bolted-on solutions with async/await. Effect provides a principled model for these problems. The learning curve is real and the payoff matches it.
Best for: Complex backend services, data pipelines, apps with sophisticated retry/timeout/cancellation needs
Links: | Website
Effect Monorepo
An ecosystem of tools to build robust applications in TypeScript
Introduction
Welcome to Effect, a powerful TypeScript framework that provides a fully-fledged functional effect system with a rich standard library.
Effect consists of several packages that work together to help build robust TypeScript applications. The core package, effect, serves as the foundation of the framework, offering primitives for managing side effects, ensuring type safety, and supporting concurrency.
Monorepo Structure
The Effect monorepo is organized into multiple packages, each extending the core functionality. Below is an overview of the packages included:
| Package | Description | |
|---|---|---|
effect |
Core package | README |
@effect/ai |
AI utilities | README |
@effect/ai-openai |
OpenAI utilities | README |
@effect/ai-anthropic |
Anthropic utilities | README |
@effect/ai-amazon-bedrock |
Effect modules for working with Amazon Bedrock AI apis | README |
@effect/ai-google |
Effect modules for working with Google AI apis | README |
@effect/cli |
CLI utilities | README |
@effect/cluster |
Distributed computing tools | README |
@effect/experimental |
Experimental features and APIs | README |
@effect/opentelemetry |
OpenTelemetry integration |
7) pino — the logger that won't slow your server down
What it is: An extremely fast, JSON-native Node.js logger that uses worker threads for async serialization.
Why it matters in 2026: Synchronous logging blocks the event loop — at high request rates it becomes a measurable bottleneck. Pino moves serialization off the main thread, giving you structured JSON output compatible with Loki/Datadog/CloudWatch at negligible latency cost.
Best for: Production Node.js services, high-traffic APIs, apps sending logs to aggregation systems
Links: | Website
pino
Very low overhead JavaScript logger.
Documentation
- Benchmarks ⇗
- API ⇗
- Browser API ⇗
- Redaction ⇗
- Child Loggers ⇗
- Transports ⇗
- Diagnostics ⇗
- Web Frameworks ⇗
- Pretty Printing ⇗
- Asynchronous Logging ⇗
- Ecosystem ⇗
- Help ⇗
- Long Term Support Policy ⇗
Runtimes
Node.js
Pino is built to run on Node.js.
Bare
Pino works on Bare with the pino-bare compatability module.
Pear
Pino works on Pear, which is built on Bare, with the pino-bare compatibility module.
Install
Using NPM:
$ npm install pino
Using YARN:
$ yarn add pino
If you would like to install pino v6, refer to https://github.com/pinojs/pino/tree/v6.x.
Usage
const logger = require('pino')()
logger.info('hello world')
const child = logger.child({ a: 'property' })
child.info('hello child!')
This produces:
{"level":30,"time":1531171074631,"msg":"hello world","pid":657,"hostname":"Davids-MBP-3.fritz.box"}
{"level":30,"time":1531171082399,"msg":"hello child!","pid":657,"hostname":"Davids-MBP-3.fritz.box","a":"property"}
For using Pino with…
Watching your synchronous logger block the event loop at 10k req/s. Source: Giphy
8) pompelmi — file upload scanning that stays on your server
What it is: A minimal Node.js wrapper around ClamAV that scans any uploaded file and returns a typed verdict — Clean, Malicious, or ScanError. Zero runtime dependencies, no cloud, no daemon required.
Why it matters in 2026: File uploads are one of the most consistently overlooked attack surfaces in web applications. Most teams skip scanning or bolt on an expensive third-party API. pompelmi solves this locally — no data leaving your server, no subscription fee.
Best for: Express, Fastify, NestJS, Next.js, SvelteKit, any Node.js app that accepts user file uploads
Links: | Website
pompelmi
/
pompelmi
Minimal Node.js wrapper around ClamAV — scan any file and get Clean, Malicious, or ScanError. Handles installation and database updates automatically.
pompelmi
ClamAV for humans
A minimal Node.js wrapper around ClamAV that scans any file and returns a typed Verdict Symbol: Verdict.Clean, Verdict.Malicious, or Verdict.ScanError. No daemons. No cloud. No native bindings. Zero runtime dependencies.
Table of contents
- Quickstart
- How it works
- API
- Docker / remote scanning
- Examples
- Internal utilities
- Supported platforms
- Installing ClamAV manually
- Testing
- Contributing
- Security
- License
Quickstart
npm install pompelmi
const { scan, Verdict } = require('pompelmi');
const result = await scan('/path/to/file.zip');
if (result === Verdict.Malicious) {
throw new Error('File rejected: malware detected');
}
How it works
- Validate — pompelmi checks that the argument is a string and that the file exists before spawning anything.
-
Scan — pompelmi spawns
clamscan --no-summary <filePath>as a child process and reads the exit code. - Map — the exit…
9) got — the HTTP client Node.js always needed
What it is: A feature-rich HTTP client for Node.js with hooks, retries, pagination, and streams built in.
Why it matters in 2026: Built-in fetch is fine for simple requests. Got is for production HTTP — configurable retries, timeout handling, automatic JSON parsing, caching plugins. It handles the edge cases that matter under real outbound traffic loads.
Best for: API clients, web scrapers, microservice communication, significant outbound HTTP workloads
sindresorhus
/
got
🌐 Human-friendly and powerful HTTP request library for Node.js
Sindre's open source work is supported by the community.
Special thanks to
Human-friendly and powerful HTTP request library for Node.js
See how Got compares to other HTTP libraries
You probably want Ky instead, by the same people. It's smaller, works in the browser too, and is more stable since it's built on Fetch. Or fetch-extras for simple needs.
Support questions should be asked here.
Install
npm install got
Warning: This package is native ESM and no longer provides a CommonJS export. If your project uses CommonJS, you will have to convert to ESM. Please don't open issues for questions regarding CommonJS / ESM.
Got v11 is no longer maintained and we will not accept any backport requests.
Take a peek
A quick start guide is available.
JSON mode
Got has a dedicated option for handling JSON payload.
Furthermore, the…
10) p-queue — concurrency control for async operations
What it is: A promise queue with configurable concurrency, priority support, and rate limiting for throttling async workloads.
Why it matters in 2026: Unconstrained parallelism causes incidents. Fire 500 database queries at once with Promise.all and you'll saturate your connection pool fast. p-queue gives you exact concurrency control with priority ordering and interval-based rate limiting.
Best for: Bulk API calls, image processing pipelines, database batch operations, any async workload needing throttling
sindresorhus
/
p-queue
Promise queue with concurrency control
p-queue
Promise queue with concurrency control
Useful for rate-limiting async (or sync) operations. For example, when interacting with a REST API or when doing CPU/memory intensive tasks.
For servers, you probably want a Redis-backed job queue instead.
Note that the project is feature complete. We are happy to review pull requests, but we don't plan any further development. We are also not answering email support questions.
Sindre's open source work is supported by the community
Special thanks to
Install
npm install p-queue
Warning: This package is native ESM and no longer provides a CommonJS export. If your project uses CommonJS, you'll have to convert to ESM. Please don't open issues for questions regarding CommonJS / ESM.
Usage
Here we run only one promise at a time. For example, set concurrency…
Final thoughts
These 10 packages are fast, typed, and solve problems you only recognize from production experience. Which ones are already in your stack?









Top comments (0)