hono
- 4.13.13 is the latest, published 4 October 2026.
- 52 security advisories, all fixed.
- 4.x: 195 releases since 9 February 2024, 17 in the last 90 days.
Security advisories
Grouped by the version that fixes them, so one upgrade reads as one step.
Fixed in 4.13.11 · 1 advisory
- MODERATEHono: `serveStatic` decodes the request path a second time, leading to bypass of middleware on static pathsGHSA-5r4p-p66f-jhc7
Fixed in 4.13.7 · 1 advisory
- MODERATEhono/jsx renders plain strings unescaped in boundary components, leading to XSSGHSA-hxh3-vqpv-xpqv
Fixed in 4.13.5 · 3 advisories
- MODERATEHono: Query parser reads parameters after the URL fragment, causing cache-key and proxy interpretation differentialsGHSA-crvj-82cr-hjcx
- MODERATEHono: Unbounded dot-notation nesting in `parseBody()` can cause memory exhaustionGHSA-g6gw-c38x-mqfc
- MODERATEHono: Incomplete fix for CVE-2026-39408: `toSSG()` still writes files outside the output directoryGHSA-gqvv-2mrq-wpjv
Fixed in 4.12.34 · 4 advisories
- MODERATEHono: Algorithmic Complexity DoS in Language MiddlewareGHSA-54fx-42gc-7vw4
- MODERATEHono: ReDoS in CORS middleware via Access-Control-Request-HeadersGHSA-8j4g-w8fx-2239
- MODERATEHono: `memo()` retains SSR output across requests, leading to cross-user data disclosureGHSA-f23p-vx2j-j53r
1 more
- LOWHono: Proxy Helper does not remove response headers listed in the `Connection` headerGHSA-79qm-7rj5-m7r9
21 older fixes
Fixed in 4.12.27 · 3 advisories
- MODERATEhono/jsx does not isolate context per request, leading to cross-request data disclosureGHSA-hvrm-45r6-mjfj
- MODERATEHono: Server-Side XSS via JSX Escaping Bypass in cx() UtilityGHSA-w62v-xxxg-mg59
- MODERATEHono: API Gateway v1 adapter can drop a distinct repeated request header value during de-duplicationGHSA-xgm2-5f3f-mvvc
Fixed in 4.12.25 · 5 advisories
- HIGHhono: CORS Middleware reflects any Origin with credentials when `origin` defaults to the wildcardGHSA-88fw-hqm2-52qc
- MODERATEhono: AWS Lambda adapter merges multiple `Set-Cookie` headers into one value, dropping cookies on ALB single-header and LatticeGHSA-j6c9-x7qj-28xf
- MODERATEhono: Body Limit Middleware can be bypassed on AWS Lambda by understating `Content-Length`GHSA-rv63-4mwf-qqc2
2 more
- MODERATEhono: Lambda@Edge adapter keeps only the last value of a repeated request header, dropping the restGHSA-wgpf-jwqj-8h8p
- MODERATEhono: Path traversal in `serve-static` on Windows via encoded backslash (`%5C`)GHSA-wwfh-h76j-fc44
Fixed in 4.12.21 · 4 advisories
- MODERATEHono: app.mount() strips mount prefix using undecoded path, causing incorrect routing for percent-encoded pathsGHSA-2gcr-mfcq-wcc3
- MODERATEHono: Cookie helper does not sanitize sameSite and priority, allowing Set-Cookie injectionGHSA-3hrh-pfw6-9m5x
- MODERATEHono: JWT middleware accepts any Authorization scheme, not only BearerGHSA-f577-qrjj-4474
1 more
- MODERATEHono: IP Restriction bypasses static deny rules for non-canonical IPv6 GHSA-xrhx-7g5j-rcj5
Fixed in 4.12.18 · 3 advisories
- MODERATEHono's Cache Middleware ignores Vary: Authorization / Vary: Cookie leading to cross-user cache leakageGHSA-p77w-8qqv-26rm
- MODERATEHono has CSS Declaration Injection via Style Object Values in JSX SSRGHSA-qp7p-654g-cw7p
- LOWHono has improper validation of NumericDate claims (exp, nbf, iat) in JWT verify()GHSA-hm8q-7f3q-5f36
Fixed in 4.12.16 · 2 advisories
- MODERATEhono/jsx has Unvalidated JSX Tag Names that May Allow HTML InjectionGHSA-69xw-7hcm-h432
- MODERATEHono: bodyLimit() can be bypassed for chunked / unknown-length requestsGHSA-9vqf-7f2p-gf9v
Fixed in 4.12.14 · 1 advisory
- MODERATEhono Improperly Handles JSX Attribute Names Allows HTML Injection in hono/jsx SSRGHSA-458j-xx4x-4375
Fixed in 4.12.12 · 5 advisories
- MODERATEHono missing validation of cookie name on write path in setCookie()GHSA-26pp-8wgv-hjvm
- MODERATEHono: Non-breaking space prefix bypass in cookie name handling in getCookie()GHSA-r5rp-j6wh-rvv4
- MODERATEHono: Middleware bypass via repeated slashes in serveStaticGHSA-wmmm-f939-6g9c
2 more
- MODERATEHono: Path traversal in toSSG() allows writing files outside the output directoryGHSA-xf4j-xp2r-rqqx
- MODERATEHono has incorrect IP matching in ipRestriction() for IPv4-mapped IPv6 addressesGHSA-xpcf-pg52-r92g
Fixed in 4.12.7 · 1 advisory
- MODERATEHono vulnerable to Prototype Pollution possible through __proto__ key allowed in parseBody({ dot: true })GHSA-v8w9-8mx6-g223
Fixed in 4.12.4 · 3 advisories
- HIGHHono vulnerable to arbitrary file access via serveStatic vulnerability GHSA-q5qw-h33p-qvwr
- MODERATEHono Vulnerable to Cookie Attribute Injection via Unsanitized domain and path in setCookie()GHSA-5pq2-9x2x-5p6w
- MODERATEHono Vulnerable to SSE Control Field Injection via CR/LF in writeSSE()GHSA-p6xx-57qc-3wxr
Fixed in 4.12.2 · 1 advisory
- HIGHHono is Vulnerable to Authentication Bypass by IP Spoofing in AWS Lambda ALB conninfoGHSA-xh87-mx6m-69f3
Fixed in 4.11.10 · 1 advisory
- LOWHono added timing comparison hardening in basicAuth and bearerAuthGHSA-gq3j-xvxp-8hrf
Fixed in 4.11.7 · 4 advisories
- MODERATEHono cache middleware ignores "Cache-Control: private" leading to Web Cache DeceptionGHSA-6wqw-2p9w-4vw4
- MODERATEHono vulnerable to XSS through ErrorBoundary component GHSA-9r54-q6cx-xmh5
- MODERATEHono IPv4 address validation bypass in IP Restriction Middleware allows IP spoofingGHSA-r354-f388-2fhh
1 more
- MODERATEHono has an Arbitrary Key Read in Serve static Middleware (Cloudflare Workers Adapter)GHSA-w332-q679-j88p
Fixed in 4.11.4 · 2 advisories
Fixed in 4.10.3 · 1 advisory
- MODERATEHono vulnerable to Vary Header Injection leading to potential CORS BypassGHSA-q7jf-gf43-6x6p
Fixed in 4.10.2 · 1 advisory
- HIGHHono Improper Authorization vulnerabilityGHSA-m732-5p4w-x69g
Fixed in 4.9.7 · 1 advisory
- MODERATEHono has Body Limit Middleware BypassGHSA-92vj-g62v-jqhh
Fixed in 4.9.6 · 1 advisory
- HIGHHono's flaw in URL path parsing could cause path confusionGHSA-9hp6-4448-45g2
Fixed in 4.6.5 · 1 advisory
- MODERATEHono allows bypass of CSRF Middleware by a request without Content-Type header.GHSA-2234-fmw7-43wr
Fixed in 4.5.8 · 1 advisory
- LOWHono CSRF middleware can be bypassed using crafted Content-Type headerGHSA-rpfr-3m35-5vx5
Fixed in 4.2.7 · 1 advisory
- MODERATEHono vulnerable to Restricted Directory Traversal in serveStatic with denoGHSA-3mpf-rcc7-5347
Fixed in 3.11.7 · 1 advisory
- MODERATENamed path parameters can be overridden in TrieRouterGHSA-f6gv-hh8j-q8vq
Releases in the last 90 days
Feed of releases and advisoriesEvery stable release, newest first. Notes are quoted as the maintainers published them.
4.13.13
4 October 2026App.mount() is now available as the Mount Middleware, hono/mount. It is just a handler, so you register it with app.all():
Mount 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:- app.mount('/itty-router', ittyRouter.handle) + app.all('/itty-router/*', mount(ittyRouter.handle))What's Changed
jsx: allow JSXNode function component results
- deprecated
mount: introduce Mount Middleware and deprecate
app.mount
4.13.12
30 September 2026Keep internal types private in bundled d.ts and avoid a self-referencing JSX.IntrinsicElements
What'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
combine: return a Response from a short-circuiting middleware in some()
4.13.11
29 September 2026Affects: hono/serve-static and the adapters built on it (hono/bun, hono/deno, hono/cloudflare-workers, @hono/bun, @hono/deno, @hono/cloudflare-workers). Fixes serveStatic decoding 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-jhc7
Security 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.The same fix ships in
@hono/node-serverv2.1.3.4.13.10
28 September 2026The 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/deno is also on JSR.
Adapters 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'hono/cloudflare-pages is deprecated without a replacement package; Cloudflare recommends Workers with static assets.
What's Changed
types: allow returning a Blob as a response body
adapters: add @hono/bun as a workspace package
adapters: add the seven adapters as workspace packages
adapters/deno: publish to JSR
4.13.9
24 September 2026jsx: replace Suspense and ErrorBoundary content across newlines
What'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
pretty-json: don't break responses with unparseable JSON bodies
jwt: throw JwtTokenInvalid when the signature is not valid base64url
aws-lambda: treat binary +xml archive media types as binary
aws-lambda: preserve empty query parameters
lambda-edge: sync content type detection with aws-lambda
lambda-edge: fail with a descriptive error on a malformed event
4.13.8
15 September 2026jsx/dom: reduce lookup work for large keyed updates
What'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
accept: treat the q parameter name as case-insensitive
accept: clamp a negative q to 0, not 1
request: keep the request media type when reusing a cached body
jsx/dom: optimize matching-head child lookup during reconciliation
4.13.7
4 September 2026This release includes a fix for the following security issue:
Security 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-xpqvUsers who render untrusted strings inside
Suspense,ErrorBoundary, orContext.Provider, or pass them directly tohono/jsx/dom/server, are strongly encouraged to upgrade to this version.4.13.6
4 September 2026client: keep a param value of "index" in $url() and $path()
What'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 2026This release includes fixes for the following security issues:
Security 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-hjcxIncomplete fix for CVE-2026-39408:
toSSG()still writes files outside the output directoryAffects:
toSSG()for Static Site Generation. Fixes a path normalization gap where consecutive parent-directory segments inssgParamsvalues were not fully collapsed, bypassing the containment check added in 4.12.12. GHSA-gqvv-2mrq-wpjvUnbounded dot-notation nesting in
parseBody()can cause memory exhaustionAffects:
parseBody()when dot-notation parsing is enabled. Fixes unbounded expansion of dot-separated field names, where a small request body could allocate a disproportionately large object graph and concurrent requests could exhaust the heap. GHSA-g6gw-c38x-mqfcUsers who use Cache Middleware, deploy behind a proxy or WAF that inspects query strings, use Static Site Generation, or use
parseBody({ dot: true })are strongly encouraged to upgrade to this version.4.13.4
24 August 2026request: handle params on unmatched requests
What'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
router: share null object creation
etag: match If-None-Match tags with optional whitespace before the comma
client: skip undefined header and cookie values
client: skip an undefined entry inside a query array
client: skip an undefined entry inside a form array
client: support custom buildSearchParams and filter undefined query in $ws() bin #5256
accepts: support wildcard media types and specificity ordering in defaultMatch
client: omit empty query delimiter
request: drop stale content length for cloned FormData
request: serialize cached JSON body in cloneRawRequest
cookie: allow parsing signed cookies with empty string values
utils/stream: do not let abort listeners crash abort()
Show 7 earlier releases
4.13.3
18 August 2026client: prevent URL corruption when replaceUrlParam contains $ replacement tokens
What'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
cors: append Origin to Vary header on OPTIONS preflight
trie-router: match suffix wildcard routes
pattern-router/linear-router: prevent prefix overmatch on wildcard routes
csrf: exempt OPTIONS request from CSRF validation
utils/ipaddr: avoid truncation on embedded IPv4 addresses in expand IPv6
pretty-json: support structured JSON content-types (+json)
4.13.2
13 August 2026secure-headers: output standard empty parentheses () instead of none for disabled Permissions-Policy directives
What'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
client: serialize multiple cookies correctly
etag: stabilize digest across stream chunks
url: strip trailing question mark correctly for optional params with regex quantifiers
cors: pre-join static array header options during initialization
client: send falsy JSON bodies
secure-headers: add missing W3C Permissions-Policy directives
4.13.1
7 August 2026trie-router: count every slash a pattern consumes
What'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!
Hono 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.Here is
benchmarks/fetchcomparing v4.12 and v4.13 (ROUNDS=5 ./compare.sh, Bun 1.4.0, Apple Silicon — each measurement runs in a fresh process, and the variant order is reversed every round to avoid warm-up bias):Benchmark v4.12 v4.13 Speedup ping—GET /165.83 ns 163.99 ns 1.01x query—GET /id/1?name=bun674.40 ns 616.99 ns 1.09x json—GET /user528.99 ns 422.44 ns 1.25x body—POST /json1.16 µs 1.00 µs 1.15x The individual changes:
context: iterate the header record with
for..in#5118url: replace regex tests with
indexOf#5121context: skip
Headerscreation when there are no headers to merge #5122urls: refactor
tryDecodeURIComponent#5158request: allocate
#validatedDatalazily #5175request: probe the body cache without allocating #5176
In addition, the RegExpRouter rewrite described below makes route registration plus the first match roughly 20% faster.
Thanks @kibertoad for the contributions!
First-class QUERY method support
The QUERY method — a safe, idempotent method that carries a request body — is now a first-class citizen in Hono. You can define QUERY handlers with
app.query():const app = new Hono() app.query('/search', async (c) => { const conditions = await c.req.json() return c.json(await search(conditions)) })Thanks @shellhaki!
QUERY support across built-in middleware
The built-in middleware has been updated to handle QUERY requests properly:
Cache Middleware
The Cache Middleware now caches QUERY responses. Following RFC 10008 Section 2.7, the cache key incorporates a SHA-256 digest of the request content and its representation metadata, so different query bodies are cached separately:
app.query( '/search', cache({ cacheName: 'search-cache', cacheControl: 'max-age=3600', }) )Note: To support this, the internal cache key format has changed for all methods, including GET. Cached entries are now stored under an internal URL of the form
/.hono/cache?__hono_cache_key=.... If you purge cache entries by URL outside of the middleware (e.g. callingcaches.delete()with the original request URL), you will need to update that logic. Existing cache entries stored with the old format will simply be re-fetched.ETag Middleware
The ETag Middleware now handles conditional requests for QUERY, returning
304 Not ModifiedwhenIf-None-Matchmatches.CORS Middleware
The CORS Middleware now includes QUERY in the default
Access-Control-Allow-Methods, which is nowGET, HEAD, PUT, POST, DELETE, PATCH, QUERY. If you specifyallowMethodsexplicitly, nothing changes for you.Thanks @usualoma and @Cherry!
4.12.34
3 August 2026This release includes fixes for the following security issues:
Security 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-j53rReDoS in CORS middleware via
Access-Control-Request-HeadersAffects:
hono/cors. Fixes a whitespace-tolerant regular expression with quadratic backtracking used to parse theAccess-Control-Request-Headerspreflight header whenallowHeadersis not configured (the default), where a single preflight request carrying a long whitespace run could consume seconds of CPU and stall request processing. GHSA-8j4g-w8fx-2239Algorithmic complexity DoS in Language Middleware
Affects:
hono/language. Fixes quadratic string processing in language-tag normalization, where a crafted language tag with a large number of hyphen-separated subtags — supplied via a query parameter, cookie, orAccept-Languageheader — could cause excessive CPU consumption and block the event loop. GHSA-54fx-42gc-7vw4Proxy Helper does not remove response headers listed in the
ConnectionheaderAffects:
hono/proxy. Fixesproxy()forwarding response headers that the origin'sConnectionheader designates as connection-scoped, where headers intended only for the immediate peer — per RFC 9110 Section 7.6.1 — could be exposed to clients, disclosing connection-scoped or internal metadata. GHSA-79qm-7rj5-m7r9Users who use
hono/jsxfor server-side rendering,hono/cors,hono/language, orhono/proxyare strongly encouraged to upgrade to this version.4.12.33
31 July 2026cookie: relax name validation when parsing Cookie header
What's Changed
cookie: relax name validation when parsing Cookie header
jsx: handle useSyncExternalStore subscription and snapshot changes
4.12.32
24 July 2026aws-lambda: add jwt and lambda authorizer types for API Gateway v2
What'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 paramssecure-headers: keep CSP callbacks scoped to their header
Major versions
- 4.xsince 9 February 2024 · latest 4.13.13 · 195 releases
- 3.xsince 18 February 2023 · latest 3.12.12 · 92 releases
- 2.xsince 16 July 2022 · latest 2.7.8 · 49 releases
- 1.xsince 22 April 2022 · latest 1.6.4 · 29 releases
- 0.xsince 14 December 2021 · latest 0.5.10 · 45 releases
Quality and security signals
What npm and deps.dev say about the latest release. Signals, not a verdict.
Reading npm and deps.dev…
Registry facts last checked 20 October 2026. Releases and advisories last read 20 October 2026.
Know when your own dependencies move
Inlinr tracks your coding time automatically. Switch dependency tracking on for a project and it reads that repository's manifest to show what is behind and what has been deprecated — off by default, one project at a time.