Encore vs

Encore is a backend framework with built-in infrastructure. Express is a minimal HTTP router. Encore works with any framework, and your existing Express routes can run inside it with infrastructure from code in your own cloud on AWS or GCP, local infrastructure, tracing and type-safe service calls.

Updated November 5, 2026

“What used to take days or weeks of back-and-forth between developers and infra teams is now automated and completed in minutes.”
Josef Sima, Engineering Director at Groupon
3xfaster development speed
90%shorter time to market
See case study
// POWERING DEVELOPMENT AT
GrouponPave BankBookshop.orgCoinbasePalletGradient Labs

How does Encore, a backend framework with built-in infrastructure, compare to Express?

Plain Express plus Terraform and Docker, next to Encore.

EncoreExpress
What it isBackend framework with built-in infrastructureMinimal HTTP router and middleware
Existing Express codeRuns inside a raw endpointNative
Request validationFrom TypeScript typesAdd a library such as zod or joi
InfrastructureInfrastructure from code in your own cloudTerraform, Docker and CI you write
ResourcesPostgres, Pub/Sub, cron, buckets, cache, secretsSeparate services and client libraries
Local developmentencore run starts local infraDocker Compose you maintain
TracingBuilt in, locally and in the cloudAdd OpenTelemetry yourself
Service callsType-safe function callsHTTP clients you keep in sync
EcosystemSmaller, and npm packages such as Express still workVery large middleware ecosystem
What you get to skip

What do you stop maintaining next to your Express app?

With plain Express, most of the time goes into the Terraform, Dockerfiles, Compose files, CI pipelines and tracing setup around the router. Encore sets those up from your application code, in your own AWS or GCP account.

  • Terraform modules
  • IAM policies
  • VPC and subnets
  • Security groups
  • Kubernetes
  • Helm charts
  • CI/CD pipelines
  • Load balancers
  • Secrets per environment
  • Staging environments
  • Tracing setup
  • Database networking

How do you run existing Express code inside Encore?

Install the CLI and add Encore to your project as the migration guide describes. Then mount your Express app behind a raw endpoint with a catch-all path. Every route you already have keeps working, now started with encore run.

Tested with encore.dev 1.58.8, Express 5.3.0 and TypeScript 5.9.3.

brew install encoredev/tap/encore && encore app create
Read the Express migration guide →
import { api, RawRequest, RawResponse } from "encore.dev/api";
import express, { request, response } from "express";

Object.setPrototypeOf(request, RawRequest.prototype);
Object.setPrototypeOf(response, RawResponse.prototype);

const app = express();

app.get("/health", (_req, res) => {
  res.send("ok");
});

// Your existing Express routes keep working behind one raw endpoint.
export const expressApp = api.raw(
  { expose: true, method: "*", path: "/!rest" },
  app,
);
import { api } from "encore.dev/api";
import { SQLDatabase } from "encore.dev/storage/sqldb";

const db = new SQLDatabase("users", { migrations: "./migrations" });

interface User {
  id: number;
  email: string;
}

// Moved out of Express: typed request and response, traced automatically.
export const getUser = api(
  { expose: true, method: "GET", path: "/users/:id" },
  async ({ id }: { id: number }): Promise<User> => {
    const user = await db.queryRow<User>`SELECT id, email FROM users WHERE id = ${id}`;
    if (!user) throw new Error("user not found");
    return user;
  },
);

What do you get when you move a route to an Encore API?

The request is validated against the TypeScript types, the call is traced, and the endpoint shows up in the generated API docs and clients. The database declared in the same file runs locally with encore run and becomes RDS or Cloud SQL in your own cloud when you deploy.

The same works for the rest of what an Express app usually reaches for: cron jobs instead of a node-cron process, buckets instead of hand-wired S3 clients, and secrets set with encore secret set --type prod instead of .env files on a server.

How does tracing compare to plain Express?

With Express, tracing means adding OpenTelemetry, instrumenting your database and HTTP clients, and running a backend to send traces to. Encore traces every API call, database query and Pub/Sub operation, locally and in the cloud. Routes still inside the raw endpoint do not get the full tracing detail.

See the tracing docs →

"It's like a combination of Express and Heroku. You define infrastructure in your code and it's automatically spun up for you. You can go from zero to a deployed service on GCP in an hour."

When should you pick Encore, and when Express?

Pick Encore when your backend needs more than a router: a database, background jobs, queues, file storage, several services that call each other, and environments in your own AWS or GCP account. You keep your Express code while you move over.

Pick plain Express for a small single service where you already have hosting and a deploy pipeline that works, when you rely heavily on Express middleware, or when your team already maintains Terraform and Docker for everything else and only needs an HTTP layer. Express is stable, well known and has a very large middleware ecosystem.

Migrating from Express

Start with a forklift migration: run the whole Express app inside one raw endpoint. Then move routes to Encore APIs one by one.

The guide covers the forklift approach and a feature-by-feature migration for APIs, databases, cron jobs, middleware and auth.

Read the Express migration guide
ExpressEncore
app.get / app.post routesapi() endpoints with typed params
Express middlewareEncore middleware and auth handlers
node-cron processCron job calling an API endpoint
Postgres connection poolSQL database declared in code
.env filesSecrets set with encore secret set

Top rated on G2

See how we stack up in the market.

Read G2 reviews →
G2 User LoveG2 High Performer Summer 2025G2 High Performer Fall 2025G2 High Performer Winter 2026

Frequently asked questions

Common questions about Encore vs Express.

Yes. Mount your Express app behind a raw endpoint with a catch-all path, and your routes keep working while you run them with encore run. You can then move routes to typed Encore APIs one at a time. Until a route is moved, Encore cannot trace it in detail or include it in generated API clients.

Not for the resources Encore covers. Databases, Pub/Sub topics, cron jobs, object storage buckets, caches and secrets are declared in code and provisioned in your own cloud on AWS or GCP when you deploy. If you want to run somewhere else, encore build docker produces an image you can deploy to any container host.

Inside the raw endpoint, yes, because Express is still handling those requests. For routes you move to Encore APIs, you use Encore middleware and auth handlers instead.

Pick plain Express for a small single service where you already have hosting and a deploy pipeline you are happy with, when you depend on a large set of Express middleware, or when you only need an HTTP router and nothing else.

With Express, one service calls another over HTTP with a client you write and keep in sync. With Encore, you import the other service and call its endpoint like a function. The request and response types are checked at compile time, and each call shows up in the trace.

Start building with Encore

Deploy to your own AWS or GCP account, with infrastructure provisioned automatically.