Updated Nov 4, 202612 min read

The Node Frameworks to know for 2026

Which Node.js framework suits your project best?

The Node.js frameworks to know in 2026 are Express, Fastify, NestJS, and Hono, plus Encore, an open source infrastructure SDK that works with any of them. Express is the default with the largest ecosystem, Fastify adds schema validation and speed, NestJS gives large teams structure, and Hono runs on edge runtimes. Encore adds type-safe APIs, Postgres, cron jobs, and tracing on top, and provisions that infrastructure in your own AWS or GCP account or self-hosted with Docker.

Node.js is a popular choice for teams building web apps and SaaS services, and the range of frameworks keeps growing. This article covers the leading options, with versions current as of November 2026, and when to choose each.

Which Node.js frameworks should you know in 2026?

RankNameLatest versionGitHub starsWhy it is on this list
1Expressv5.3.0~70kThe default, with the largest middleware ecosystem
2Encorev1.58.8~12.7kInfrastructure SDK with type-safe APIs, databases, object storage, and tracing, provisioned in your own cloud; works with any framework
3NestJSv12.3.0~77kModules and dependency injection for large teams
4Fastifyv5.12.8~37kSchema validation and high throughput
5Honov4.13.16~33kSmall, Web Standards based, runs on edge runtimes

Here is how they compare on built-in support for common backend requirements.

FeatureExpress.jsEncoreFastifyNestJSHono
Use caseGeneral purpose APIsDistributed systemsSchema-validated APIsEnterprise applicationsEdge & serverless
Learning CurveLowLowMediumHighLow
Built-in ValidationNoYesYes(JSON Schema)Yes(decorators)Yes
Type-safe Service CallsNoYesNoNoNo
Built-in TracingNoYesNoNoNo
Infrastructure from CodeNoYesNoNoNo
Auto API DocumentationNoYesYes(via plugins)Yes(via plugins)No
Service DiscoveryNoYesNoNoNo

Why is Express.js still the default?

Express.js

Express.js is the most common Node.js web framework, and version 5 is the current major release. It is minimal and flexible, and provides just the core features needed to build web applications and APIs.

Key Features

  • Middleware: Utilizes middleware to respond to HTTP requests, making it incredibly versatile for a variety of web applications.
  • Routing: Offers a robust routing API that allows users to define routes based on HTTP methods and URLs.
  • Templating: Supports template engines to render HTML on the server-side which can then be sent as a response to client requests.

Benefits

  • Simplicity: Very minimal and straightforward, making it easy to learn and use.
  • Flexibility: Allows developers to structure their applications as they see fit, with no opinion on architecture.
  • Mature Ecosystem: Has a large community, comprehensive documentation, and a plethora of middleware.

Limitations

  • Callback Structure: Can lead to callback hell if not carefully managed, although this can be mitigated with modern JavaScript features.
  • Less Standardized: Might require more decisions to be made by the developer, potentially leading to inconsistency in project structure.
  • Few features: While fast, there are few features included which means you will likely need to adopt many different tools to solve for deployment, monitoring, and scaling.

Suitable for

  • Express.js is great for simple projects where you need to have full flexibility.

When to consider Express.js

  • When developing small to medium-sized projects and prototypes.

What does Encore add to a Node.js backend?

Encore adds type-safe APIs, databases, Pub/Sub, cron jobs, and tracing, and deploys them to your own AWS or GCP account. It is an open source infrastructure SDK, also called infrastructure from code, built to make event-driven and distributed systems simpler to build and run locally.

You declare services, APIs, and infrastructure as part of the application code. Encore then parses the code and creates a fully type-safe model of your application's microservices, APIs, and infrastructure requirements. Encore uses this model to automatically run your local environment, deploy to temporary preview environments for testing, and provision infrastructure in your cloud (AWS/GCP).

You do not write infrastructure configuration like Terraform, and you do not maintain Docker Compose files for local development.

Node.js powered by Rust, for improved performance

Encore provides a high-performance distributed systems runtime in Rust, which integrates with the standard Node.js runtime for executing JavaScript code. This ensures 100% compatibility with the Node.js ecosystem.

The Rust runtime does everything from handling incoming requests and making API calls, to querying databases and using Pub/Sub. It even handles all application observability, like distributed tracing, structured logging, and metrics.

This approach gives a large performance boost over Express and other Node.js frameworks (learn more):

Requests/sec

Without validation
With schema validation
121,005
107,018
Encore
v1.38.7
101,611
33,772
Bun (+ Zod)
v1.1.12 / v3.23.8
82,617
35,124
Elysia (+ TypeBox)
v1.1.16 / v0.33.12
71,202
33,150
Hono (+ TypeBox)
v4.6.3 / v0.33.12
62,207
48,397
Fastify (+ Ajv)
v4.27.0 / v8.16.0
15,707
11,878
Express (+ Zod)
v4.19.2 / v3.23.8

Response Latency (P99)

Without validation
With schema validation
2.3 ms
3.6 ms
Encore
v1.38.7
3.7 ms
14.9 ms
Bun (+ Zod)
v1.1.12 (+ v3.23.8)
4.1 ms
5.4 ms
Fastify (+ Ajv)
v4.27.0 / v8.16.0
11.9 ms
18.2 ms
Express (+ Zod)
v4.19.2 / v3.23.8
Lower is better

Encore has zero npm dependencies, which improves security and speeds up builds and application startup.

How it works

  1. Node.js starts up and initializes the Encore Rust runtime, which begins accepting incoming requests, parsing and validating them against the API schema.
  2. The Encore Runtime then passes on the request to your application code, and waits for the response, before sending it back out over the wire.
  3. When your application uses infrastructure resources, like querying databases or publishing PubSub messages, it hands that over to the Rust runtime for faster execution.

This means that the single-threaded Node.js event loop can focus on executing your business logic. Everything else happens in Encore's multi-threaded Rust runtime.

Enhanced type-safety for distributed systems

Normally with TypeScript, the type information is lost at runtime. But Encore is different.

Encore uses static code analysis to parse and analyze the TypeScript types you define, and uses the API schema to automatically validate incoming requests, guaranteeing complete type-safety, even at runtime. This means no more confusing exceptions because a required field is missing.

Code Examples

Defining a service

With Encore you define a service by creating a folder and inside that folder defining an API within a regular TypeScript file. Encore recognizes this as a service, and uses the folder name as the service name. When deploying, Encore will automatically provision the required infrastructure for each service.

On disk it might look like this:

/my-app ├── encore.app // ... and other top-level project files ├── package.json │ ├── hello // hello service (a folder) │   ├── hello.ts // hello service code │   └── hello_test.ts // tests for hello service │ └── world // world service (a folder) └── world.ts // world service code

This means building a microservices architecture is as simple as creating multiple directories within your application.

Defining APIs

Encore lets you easily define type-safe, idiomatic TypeScript API endpoints.

It is simple to accept both the URL path parameters, as well as JSON request body data, HTTP headers, and query strings.

It is done in a way that is fully declarative, enabling Encore to automatically parse and validate the incoming request and ensure it matches the schema, with zero boilerplate.

To define an API, use the api function from the encore.dev/api module to wrap a regular TypeScript async function that receives the request data as input and returns response data. This tells Encore that the function is an API endpoint. Encore will then automatically generate the necessary boilerplate at compile-time.

In the example below, we define the API endpoint ping which accepts POST requests and is exposed as hello.ping (because our service name is hello).

// inside the hello.ts file import { api } from "encore.dev/api" export const ping = api( { method: "POST" }, async (p: PingParams): Promise<PingResponse> => { return { message: `Hello ${p.name}!` }; } );

Creating a Pub/Sub topic

Publishers & Subscribers (Pub/Sub) let you build systems that communicate by broadcasting events asynchronously. This is a great way to decouple services for better reliability and responsiveness.

Encore lets you use Pub/Sub in a cloud-agnostic declarative fashion. At deployment, Encore automatically provisions the required infrastructure.

The core of Pub/Sub is the Topic, a named channel on which you publish events.

Encore makes it very simple to create Topics. For example, here is how you create a topic with events about user signups:

import { Topic } from "encore.dev/pubsub"; export interface SignupEvent { userID: string; } export const signups = new Topic<SignupEvent>("signups", { deliveryGuarantee: "at-least-once", });

To publish an Event, call publish on the topic passing in the event object (which is the type specified in the new Topic<Type> constructor):

const messageID = await signups.publish({userID: id}); // If we get here the event has been successfully published, // and all registered subscribers will receive the event. // The messageID variable contains the unique id of the message, // which is also provided to the subscribers when processing the event.

Key Features

  • No boilerplate: Create APIs and microservices without any overhead.
  • Built-in Distributed Tracing: Easily trace the path and performance of requests.
  • Automating API Documentation & Architecture Diagrams: Automatically keep documentation and diagrams up-to-date.
  • Built-in Secrets Management: Handle sensitive data securely.
  • Cloud Infrastructure Automation: Automatically provision infrastructure in local, preview, and your cloud environment in GCP and AWS.
  • Backend Primitives: Use primitives like microservices, SQL databases, Pub/Sub message queues, and Redis caches all without manual infrastructure configuration.
  • Push to Deploy: Get a Vercel-like workflow for your backend application, and integrate with Vercel for full-stack preview environments.

Benefits

  • Production-Ready: Comes with built-in support for automated deployment to battle-tested services on AWS/GCP.
  • Type-Safety: Offers end-to-end type safety, including infrastructure, reducing runtime errors and bugs.
  • Performance: Encore's Rust-based runtime handles 9x the request throughput of Express.js in our benchmark.
  • Standardization: Provides a uniform way of building microservices and APIs, and provisioning infrastructure, that follows best practices.
  • Built-in Tools: Encore offers built-in distributed tracing, automated API documentation, preview environments, metrics, and more.

Limitations

Suitable for

  • Encore is most suitable for teams looking to develop production-ready applications, deployed using cloud services from AWS/GCP.
  • It suits teams that would rather spend their time on features than on configuring environments.

When to consider Encore

  • When you want to build event-driven systems using scalable infrastructure like Pub/Sub.
  • When you want to build a scalable system deployed to battle-tested infrastructure on AWS/GCP like Kubernetes or Cloud Run.
  • When you want to automate API documentation and Architecture Diagrams, and remove most microservices boilerplate.
  • When you want built-in observability like Distributed Tracing, Metrics, and integrations with tools like Grafana and Datadog.

How do you try Encore?

Install the CLI with brew install encoredev/tap/encore && encore app create:

Install Encore
brew install encoredev/tap/encore &&
encore app create
Copy

When should you use NestJS?

Nest.js

Nest.js brings a structured, Angular-inspired framework to the backend, embracing TypeScript as a first-class citizen. It offers a modular architecture that organizes code into separate modules, designed to make it easier to maintain and develop larger applications.

Key Features

  • WebSockets: Provides out-of-the-box support for WebSockets, enabling real-time communication capabilities.
  • Dependency Injection: Implements dependency injection which allows for more testable and maintainable code.

Benefits

  • Standardization: Provides a uniform way of building services.
  • TypeScript Support: First-class support for TypeScript for application reliability.
  • Scalability: Designed with scalability in mind, making it suitable for large applications.

Limitations

  • Steep Learning Curve: Its specific way of doing things might require an initial investment in time to learn.
  • Potential Overhead: For simpler projects, Nest.js might seem overkill.
  • Opinionated: Its structured approach may not be suitable for those looking for more freedom in design choices.

Suitable for

  • Nest.js is well-suited for teams that are familiar with TypeScript and Angular.

When to consider Nest.js

  • Its opinionated structure is advantageous for large-scale projects where scalability and long-term maintainability are more important than speed and simplicity.

When should you use Fastify?

Fastify positions itself as a high-performance alternative to Express, though recent benchmarks show this advantage has diminished. Modern alternatives like Encore now significantly outperform both Fastify and Express in request throughput.

That said, Fastify's value proposition goes beyond raw speed. It uses JSON Schema for validation, which provides both runtime checking and automatic serialization optimization. The plugin architecture keeps code organized and encapsulated, with each plugin having its own dependencies and lifecycle. Fastify also offers good TypeScript support and helpful error messages.

import Fastify from 'fastify'; const fastify = Fastify({ logger: true }); fastify.get('/users/:id', { schema: { params: { type: 'object', properties: { id: { type: 'string' } } }, response: { 200: { type: 'object', properties: { id: { type: 'string' }, name: { type: 'string' } } } } } }, async (request, reply) => { return { id: request.params.id, name: 'John' }; }); fastify.listen({ port: 3000 });

Key Features

  • JSON Schema validation with automatic serialization
  • Plugin-based architecture for modularity
  • First-class TypeScript support
  • Extensive logging with Pino integration
  • OpenAPI generation from schemas

Benefits

Fastify provides a good balance of performance and features. The JSON Schema validation provides runtime safety and can be used to generate OpenAPI documentation. The plugin system encourages good architectural patterns and makes testing easier.

Limitations

JSON Schema definitions can become verbose, especially for complex objects. The ecosystem is smaller than Express, so you may need to write custom plugins for less common use cases. The mental model for plugins takes some time to internalize.

When to Consider Fastify

Consider Fastify when you appreciate a well-structured plugin architecture, when you want JSON Schema validation with OpenAPI generation, or when you are building a single-service API and are already familiar with the Fastify ecosystem.

When should you use Hono?

Hono is a lightweight framework designed for edge runtimes like Cloudflare Workers, Deno, and Bun. It offers a minimal approach aimed at edge performance.

Strengths:

  • Very fast startup time
  • Works on many runtimes
  • Minimal footprint

Considerations:

  • Designed for edge/serverless, not traditional backends
  • No infrastructure integration
  • Limited ecosystem compared to Node.js
  • Cold starts in serverless environments
const app = new Hono(); app.get('/users/:id', async (c) => { const id = c.req.param('id'); return c.json(await getUserById(id)); });

Verdict: Hono is excellent for edge functions but not designed for full backend development with databases, queues, and microservices.

Which Node.js framework should you pick?

Pick Express for flexibility and the largest ecosystem, NestJS for large teams that want enforced structure, Fastify for schema-validated APIs, and Hono for edge runtimes. Add Encore when the backend needs databases, Pub/Sub, and cron jobs: it is the only option here that provisions production infrastructure in your own AWS or GCP account from the application code.

Install Encore
brew install encoredev/tap/encore &&
encore app create
Copy

Frequently asked questions

What is the best Node.js backend framework?

Express is the established minimal option, NestJS fits large teams wanting enforced structure, Fastify suits schema-validated services, and Hono targets edge runtimes. If you also want the infrastructure handled, add Encore: it is an open source infrastructure SDK where you declare Postgres databases, Pub/Sub topics, and cron jobs as typed objects in your code, and Encore provisions them in your own AWS or GCP account or exports a Docker image. It works with any framework.

What is the most popular Node.js framework?

Express.js is the most widely used Node.js framework. It is a minimal, unopinionated web framework that provides core routing and middleware, and its large ecosystem makes it a common default for building APIs and web apps. Newer frameworks like Fastify, NestJS, and Hono have grown in popularity for specific use cases such as performance, structure, or edge runtimes.

Which Node.js framework works best with AI coding agents?

Frameworks with strong conventions work best with AI coding agents, because the agent has fewer open-ended decisions to get wrong. NestJS gives an agent a clear module and dependency-injection structure to follow, and Fastify's schema-first routes are predictable to generate. Express is hardest to target because it imposes no structure.

Is Fastify faster than Express?

Fastify was designed to be faster than Express and has historically shown higher request throughput, in part due to its JSON Schema based serialization. Recent benchmarks show the gap between the two has narrowed. For most applications, framework overhead is small relative to database and network latency, so architecture and I/O usually matter more than raw framework speed.

Which Node.js framework has built-in TypeScript support?

NestJS, Fastify, and Hono all offer first-class TypeScript support out of the box. NestJS is built around TypeScript and decorators, and Hono infers route types for its RPC client. Express can be used with TypeScript through community type definitions but is written in plain JavaScript and is less type-aware by default.

Deploy to your cloud on AWS and Google Cloud
without managing infrastructure

Encore lets developers and agents define application infrastructure directly in code, then automatically provisions it from local development to production in your AWS or GCP account.

~/orders — claude
Claude Code
Claude Code v2.1.180Opus 5.5~/orders