Releases of hono
410 stable releases, newest first. Release notes are kept for the last 90 days; older ones link to where they were published.
4.13.13
4 October 2026Mount Middleware
app.mount()is now available as the Mount Middleware,hono/mount. It is just a handler, so you register it withapp.all():import { Router as IttyRouter } from 'itty-router' import { Hono } from 'hono' import { mount } from 'hono/mount' const ittyRouter = IttyRouter() ittyRouter.get('/hello', () => new Response('Hello from itty-router')) const app = new Hono() app.all('/itty-router/*', mount(ittyRouter.handle))app.mount()still works in v4 but is deprecated and will be removed in v5. Migrating is a one-line change:4.13.12
30 September 2026What's Changed
build: keep internal types private in bundled d.ts and avoid a self-referencing JSX.IntrinsicElements
etag: correctly match mixed-case header name in retainedHeader option
jsx: add px to numeric gridGap, gridRowGap and gridColumnGap
4.13.11
29 September 2026Security fixes
serveStaticdecodes the request path a second time, leading to bypass of middleware on static pathsAffects:
hono/serve-staticand the adapters built on it (hono/bun,hono/deno,hono/cloudflare-workers,@hono/bun,@hono/deno,@hono/cloudflare-workers). FixesserveStaticdecoding an already-decoded path, where a crafted request could be routed as one path and served as another, skipping middleware mounted on a static prefix. GHSA-5r4p-p66f-jhc7serveStaticnow rejects request paths that still contain%after decoding. To serve files whose names contain a literal%, setallowPercentInPath: true.4.13.10
28 September 2026Adapters are now separate packages
The runtime adapters are now published as their own packages:
@hono/bun,@hono/deno,@hono/cloudflare-workers,@hono/aws-lambda,@hono/lambda-edge,@hono/netlify,@hono/vercel, and@hono/service-worker.@hono/denois also on JSR.hono/<adapter>still works in v4 but is deprecated and will be removed in v5. Migrating is an import change:- import { serveStatic } from 'hono/bun' + import { serveStatic } from '@hono/bun'4.13.9
24 September 2026What's Changed
jsx: replace Suspense and ErrorBoundary content across newlines
accepts: match media types and language tags case-insensitively
linear-router: don't match an empty path segment as a param
4.13.8
15 September 2026What's Changed
jsx/dom: reduce lookup work for large keyed updates
aws-lambda: respect backpressure when streaming the response body
accepts, language: skip accept entries with quality 0 when matching
4.13.7
4 September 2026Security fixes
This release includes a fix for the following security issue:
hono/jsxrenders plain strings unescaped in boundary components, leading to XSSAffects:
Suspense,ErrorBoundary, andContext.Providerinhono/jsx, andrenderToString()/renderToReadableStream()inhono/jsx/dom/server. Fixes missing HTML escaping for a plain string placed directly as a child orfallbackof these components, or as the root value of the server rendering functions, so untrusted strings could be emitted as markup. GHSA-hxh3-vqpv-xpqv4.13.6
4 September 2026What's Changed
client: keep a param value of "index" in $url() and $path()
client: normalize root WebSocket URLs
types: allow symbol keys in Context<any> get and set fallbacks
4.13.5
26 August 2026Security fixes
This release includes fixes for the following security issues:
Query parser reads parameters after the URL fragment, causing cache-key and proxy interpretation differentials
Affects: Cache Middleware and applications behind a proxy, WAF, or logging layer that inspects query strings. Fixes query parsing that did not stop at the URL fragment, so a
?after a#was treated as the start of a query string and the application could read parameters that the other component never saw. GHSA-crvj-82cr-hjcx4.13.4
24 August 2026What's Changed
request: handle params on unmatched requests
jsx/dom: execute previous ref cleanup when ref prop changes on re-render
reg-exp-router: associate wildcard middleware with matching routes
4.13.3
18 August 2026What's Changed
client: prevent URL corruption when replaceUrlParam contains $ replacement tokens
etag: copy pending stream bytes
etag: avoid skipping headers when filtering 304 response headers
4.13.2
13 August 2026What's Changed
secure-headers: output standard empty parentheses () instead of none for disabled Permissions-Policy directives
jsx: render async children of document metadata tags instead of [object Promise]
etag: resolve incorrect incremental hashing for chunked responses
4.13.1
7 August 2026What's Changed
trie-router: count every slash a pattern consumes
utils/stream: re-acquire writer lock when pipe() throws
etag: skip unsafe methods or error responses on non-* case
4.13.0
3 August 2026Hono v4.13.0 is now available!
The highlight of this release is performance: a batch of low-level optimizations makes the core request/response path significantly faster — up to 1.25x on common routes in our benchmark. This release also adds first-class support for the HTTP QUERY method, defined in RFC 10008, a new Method Not Allowed middleware, and more.
Performance improvements
This release includes a series of small optimizations: skipping unnecessary
Headersallocations, replacing regex tests withindexOf, allocating internal state lazily, and more.4.12.34
3 August 2026Security fixes
This release includes fixes for the following security issues:
memo()retains SSR output across requests, leading to cross-user data disclosureAffects:
hono/jsx(server-side rendering). Fixesmemo()reusing a retained render result across requests when props compare equal, where a component reading request-scoped values from ambient context —useContext(),useRequestContext(), orgetContext()— could serve HTML rendered for another user's request, disclosing account data or request-scoped secrets such as CSRF tokens. GHSA-f23p-vx2j-j53r4.12.33
31 July 2026What's Changed
cookie: relax name validation when parsing Cookie header
jsx: handle useSyncExternalStore subscription and snapshot changes
4.12.32
24 July 2026What's Changed
aws-lambda: add jwt and lambda authorizer types for API Gateway v2
sse: emit empty id field to reset Last-Event-ID
use
Object.create(null)when parsing query, headers, and params
4.12.31
18 July 20264.12.30
13 July 20264.12.29
10 July 20264.12.28
6 July 20264.12.27
23 June 20264.12.26
18 June 20264.12.25
9 June 20264.12.24
8 June 20264.12.23
25 May 20264.12.22
22 May 20264.12.21
19 May 20264.12.20
19 May 20264.12.19
16 May 20264.12.18
6 May 20264.12.17
5 May 20264.12.16
30 April 20264.12.15
24 April 20264.12.14
15 April 20264.12.13
15 April 20264.12.12
7 April 20264.12.11
6 April 20264.12.10
2 April 20264.12.9
23 March 20264.12.8
14 March 20264.12.7
10 March 20264.12.6
10 March 20264.12.5
4 March 20264.12.4
3 March 20264.12.3
26 February 20264.12.2
23 February 20264.12.1
21 February 20264.12.0
19 February 20264.11.10
18 February 2026