Hono vs Express: Which One I'd Start a Node API With in 2026
By Aakash Verma · · 4 min read
Express is in my stack and has been for years. It's the framework most Node developers learned on, it has a middleware for everything, and most existing Node backends out there are Express. Hono is the one I get asked about now, mostly by people who've seen it in a Cloudflare Workers tutorial and want to know if they should switch.
Short answer: for a new API that might run anywhere other than a plain Node server, Hono. For an existing Express app, stay on Express 5 and stop worrying. The longer answer is mostly about where your code runs and which middleware you depend on, not speed.
Versions checked on November 5, 2026 on npm: Hono 4.13.16 (published November 1) and Express 5.3.0 (October 9).
What you actually install
Installing each into an empty folder with npm, on Node 24:
express@5.3.0: 65 packages innode_modules(Express plus 64 dependencies, 28 of them direct), 4.4 MB.hono@4.13.16plus@hono/node-server@2.1.6to run it on Node: 2 packages, 4.0 MB, and neither has a single dependency.
The size on disk is about the same, because Hono ships builds and adapters for every runtime in one package. The package count is the difference that matters. Sixty-five packages is 65 things that can show up in npm audit, and Express's tree includes the usual suspects (qs, debug, iconv-lite, path-to-regexp) that have each had their turn in a security advisory. With Hono, there's nothing to audit except Hono.

Weekly downloads, for the "nobody uses it" crowd: Express had about 195 million in the week to November 3, Hono about 102 million. Hono isn't niche anymore.
Where each one runs
This is the real difference. Express is built on Node's http module: req and res are Node objects, and it runs where Node runs. Bun runs it fine too, through its Node compatibility.
Hono is built on the web standard Request and Response. The same app runs on Cloudflare Workers, Deno, Bun, Vercel and AWS Lambda, and on Node through @hono/node-server (which needs Node 20 or later as of 2.x). If there's any chance your API ends up at the edge, on Workers, or split between a Node server and a serverless function, Hono saves you a rewrite later. Express on Workers is a compatibility layer, and I wouldn't put production traffic on it.
If you're on a plain VPS with PM2 or systemd and you'll stay there, this advantage is worth exactly nothing.
The code, side by side
They look closer than people expect:
// Express 5
app.get('/users/:id', async (req, res) => {
const user = await db.user(req.params.id)
if (!user) return res.status(404).json({ error: 'not found' })
res.json(user)
})
// Hono
app.get('/users/:id', async (c) => {
const user = await db.user(c.req.param('id'))
if (!user) return c.json({ error: 'not found' }, 404)
return c.json(user)
})
Hono returns a response instead of calling methods on res. Small change, but it means a handler that forgets to respond is a bug you can see in the code, not a request that hangs until the client times out.
Two Hono features are worth the switch on their own. Validation with @hono/zod-validator types c.req.valid('json') from your schema, so the body is typed without a cast. And the RPC client, hc<AppType>, gives a frontend in the same repo a typed client for your routes without OpenAPI or codegen. For a Vue or React app talking to its own API, that alone is a reason to pick it.
What breaks if you switch an Express app
Your middleware. Anything written against Node's req/res (passport, multer, express-session, and most of the custom auth code in a real app) doesn't run in Hono. Hono has its own versions of the common ones (CORS, JWT, secure headers, body limits, cookies) and the rest you rewrite.
That's why I wouldn't migrate a working Express app. A 40-route API with Passport strategies, file uploads through Multer and session auth is weeks of rewriting for a framework that does the same job. Upgrade it to Express 5 instead.
Express 5 fixed the two things everyone hated
If your mental picture of Express is version 4, it's out of date. Express 5 has been the latest on npm since March 2025, and the migration guide covers it. The changes that matter day to day:
- A rejected promise in an async handler now goes to your error middleware. In Express 4 it was an unhandled rejection, which is why every codebase had an
asyncHandlerwrapper orexpress-async-errors. Delete them. - Route syntax changed with
path-to-regexp8. A bare*no longer works, wildcards need a name (/*splat), and optional params are written{/:id}. This is the one that breaks upgrades, usually in a catch-all route someone added for a SPA years ago. It fails at startup, which is the good kind of failure.
Express 5 needs Node 18 or later.
So which one
New API, TypeScript, any chance of Workers, Bun or serverless: Hono. You get types end to end, no dependency tree, and the option to move runtimes without touching the handlers.
New API that's plain JavaScript on a Node server, and the team knows Express: Express 5 is fine. It's boring, documented to death, and every middleware you'll ever need exists.
Existing Express app: upgrade to 5, don't rewrite. Spend the time on tests.
Speed comes up every time and I'd leave it out of the decision. Yes, Hono wins the hello-world benchmarks. Your API spends its time waiting for Postgres, not routing, and neither framework is going to be the slow part.
If you're deciding this for a real product, or you have an Express 4 app that needs upgrading without downtime, book a free call. I do Node.js backend work on both.
Introductory offer
Free cloud cost optimization. You only pay from what I save.
I cut your AWS, cloud, Supabase or Vercel bill for free and keep half of what I save for 6 months. Save nothing, pay nothing. Code, architecture and infrastructure.