Hono Release Notes
24 release notes curated from 1 source by the Releasebot Team. Last updated: Sep 5, 2026
- Sep 4, 2026
- Date parsed from source:Sep 4, 2026
- First seen by Releasebot:Sep 5, 2026
v4.13.7
Hono fixes a security issue in hono/jsx and hono/jsx/dom/server, restoring proper HTML escaping for plain strings in boundary components and server rendering to prevent XSS exposure.
Security fixes
This release includes a fix for the following security issue:
hono/jsx renders plain strings unescaped in boundary components, leading to XSS
Affects: Suspense, ErrorBoundary, and Context.Provider in hono/jsx, and renderToString() / renderToReadableStream() in hono/jsx/dom/server. Fixes missing HTML escaping for a plain string placed directly as a child or fallback of these components, or as the root value of the server rendering functions, so untrusted strings could be emitted as markup. GHSA-hxh3-vqpv-xpqv
Users who render untrusted strings inside Suspense, ErrorBoundary, or Context.Provider, or pass them directly to hono/jsx/dom/server, are strongly encouraged to upgrade to this version.
Original source - Sep 4, 2026
- Date parsed from source:Sep 4, 2026
- First seen by Releasebot:Sep 5, 2026
v4.13.6
Hono fixes client URL handling, WebSocket normalization, and type support in a maintenance update.
What's Changed
- fix(client): keep a param value of "index" in $url() and $path() in #5297
- fix(client): normalize root WebSocket URLs in #5291
- fix(types): allow symbol keys in Context get and set fallbacks in #5300
- chore: bump editorconfig-checker in #5336
- refactor(on-handler): use forEach for consistent handler iteration in #5326
Full Changelog: v4.13.5...v4.13.6
Original source All of your release notes in one feed
Join Releasebot and get updates from Hono and hundreds of other software products.
- Aug 26, 2026
- Date parsed from source:Aug 26, 2026
- First seen by Releasebot:Aug 26, 2026
v4.13.5
Hono ships security fixes for query parsing, static site generation path handling, and parseBody() memory exhaustion risks, strengthening behavior for apps using cache middleware, proxies, WAFs, and dot-notation body parsing.
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-hjcx
Incomplete fix for CVE-2026-39408: toSSG() still writes files outside the output directory
Affects: toSSG() for Static Site Generation. Fixes a path normalization gap where consecutive parent-directory segments in ssgParams values were not fully collapsed, bypassing the containment check added in 4.12.12. GHSA-gqvv-2mrq-wpjv
Unbounded dot-notation nesting in parseBody() can cause memory exhaustion
Affects: 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-mqfc
Users 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.
Original source - Aug 24, 2026
- Date parsed from source:Aug 24, 2026
- First seen by Releasebot:Aug 24, 2026
v4.13.4
Hono fixes request handling, client serialization, routing, and cookie parsing in a stability-focused release, with better wildcard matching, cleaner query and form behavior, and several performance and abort-safety improvements.
What's Changed
- fix(request): handle params on unmatched requests in #5268
- fix(jsx/dom): execute previous ref cleanup when ref prop changes on re-render in #5264
- fix(reg-exp-router): associate wildcard middleware with matching routes in #5266
- perf(router): share null object creation in #5267
- fix(etag): match If-None-Match tags with optional whitespace before the comma in #5222
- fix(client): skip undefined header and cookie values in #5244
- fix(client): skip an undefined entry inside a query array in #5272
- fix(client): skip an undefined entry inside a form array in #5280
- fix(client): support custom buildSearchParams and filter undefined query in $ws() bin #5256
- fix(accepts): support wildcard media types and specificity ordering in defaultMatch in #5255
- fix(client): omit empty query delimiter in #5283
- fix(request): drop stale content length for cloned FormData in #5282
- fix(request): serialize cached JSON body in cloneRawRequest in #5288
- fix(cookie): allow parsing signed cookies with empty string values in #5246
- fix(utils/stream): do not let abort listeners crash abort() in #5274
Full Changelog: v4.13.3...v4.13.4
Original source - Aug 18, 2026
- Date parsed from source:Aug 18, 2026
- First seen by Releasebot:Aug 18, 2026
v4.13.3
Hono fixes routing, CORS, CSRF, ETag, and client URL handling while adding pretty JSON support for structured +json content types. The release also tightens wildcard matching, improves IPv6 parsing, and updates Context docs with a custom headers example.
What's Changed
- fix(client): prevent URL corruption when replaceUrlParam contains $ replacement tokens in #5227
- fix(etag): copy pending stream bytes in #5239
- fix(etag): avoid skipping headers when filtering 304 response headers in #5234
- fix(cors): append Origin to Vary header on OPTIONS preflight in #5235
- docs(context): add custom headers append option example to Context JSDoc in #5248
- fix(trie-router): match suffix wildcard routes in #5236
- fix(pattern-router/linear-router): prevent prefix overmatch on wildcard routes in #5252
- fix(csrf): exempt OPTIONS request from CSRF validation in #5250
- fix(utils/ipaddr): avoid truncation on embedded IPv4 addresses in expand IPv6 in #5247
- feat(pretty-json): support structured JSON content-types (+json) in #5226
Full Changelog: v4.13.2...v4.13.3
Original source Similar to Hono with recent updates:
- Smokeball release notes144 release notes · Latest Sep 4, 2026
- Cosmolex release notes20 release notes · Latest Jul 30, 2025
- PracticePanther release notes36 release notes · Latest Aug 11, 2026
- Salesforce release notes71 release notes · Latest Sep 1, 2026
- Microsoft release notes820 release notes · Latest Sep 4, 2026
- Zoom release notes210 release notes · Latest Aug 31, 2026
- Aug 13, 2026
- Date parsed from source:Aug 13, 2026
- First seen by Releasebot:Aug 13, 2026
v4.13.2
Hono fixes secure headers, JSX, etag, client, and URL handling while improving CORS performance and adding missing W3C Permissions-Policy directives, delivering a polished maintenance update with better correctness and standards support.
What's Changed
fix(secure-headers): output standard empty parentheses () instead of none for disabled Permissions-Policy directives in #5197
fix(jsx): render async children of document metadata tags instead of [object Promise] in #5204
fix(etag): resolve incorrect incremental hashing for chunked responses in #5199
fix(client): serialize multiple cookies correctly in #5202
fix(etag): stabilize digest across stream chunks in #5205
fix(url): strip trailing question mark correctly for optional params with regex quantifiers in #5209
perf(cors): pre-join static array header options during initialization in #5210
fix(client): send falsy JSON bodies in #5215
feat(secure-headers): add missing W3C Permissions-Policy directives in #5214
Full Changelog: v4.13.1...v4.13.2
Original source - Aug 7, 2026
- Date parsed from source:Aug 7, 2026
- First seen by Releasebot:Aug 7, 2026
v4.13.1
Hono fixes trie-router, stream, and etag behavior in a v4.13.1 patch release.
What's Changed
- fix(trie-router): count every slash a pattern consumes by @Jaybhade in #5189
- fix(utils/stream): re-acquire writer lock when pipe() throws by @Sriharsha-dev369 in #4988
- fix(etag): skip unsafe methods or error responses on non-* case by @na-trium-144 in #5196
New Contributors
- @Jaybhade made their first contribution in #5189
- @Sriharsha-dev369 made their first contribution in #4988
Full Changelog: v4.13.0...v4.13.1
Original source - Aug 3, 2026
- Date parsed from source:Aug 3, 2026
- First seen by Releasebot:Aug 4, 2026
v4.13.0
Hono releases v4.13.0 with faster request handling, up to 1.25x benchmark gains, first-class QUERY method support, a new Method Not Allowed middleware, and router and middleware improvements that make routes fail fast and cache, CORS, ETag, and JSX behavior more capable.
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 Headers allocations, replacing regex tests with indexOf, allocating internal state lazily, and more.
Here is benchmarks/fetch comparing 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=bun 674.40 ns 616.99 ns 1.09x json — GET /user 528.99 ns 422.44 ns 1.25x body — POST /json 1.16 µs 1.00 µs 1.15xThe individual changes:
- perf(context): iterate the header record with for..in #5118
- perf(url): replace regex tests with indexOf #5121
- perf(context): skip Headers creation when there are no headers to merge #5122
- perf(urls): refactor tryDecodeURIComponent #5158
- perf(request): allocate #validatedData lazily #5175
- perf(request): 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. calling caches.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 Modified when If-None-Match matches.
CORS Middleware
The CORS Middleware now includes QUERY in the default Access-Control-Allow-Methods, which is now GET, HEAD, PUT, POST, DELETE, PATCH, QUERY. If you specify allowMethods explicitly, nothing changes for you.
Thanks @usualoma and @Cherry!
Method Not Allowed Middleware
The new Method Not Allowed Middleware returns a 405 Method Not Allowed response with a proper Allow header when the request path matches a registered route but the method does not:
import { methodNotAllowed } from 'hono/method-not-allowed' const app = new Hono() app.use(methodNotAllowed({ app })) app.get('/hello', (c) => c.text('Hello!')) app.post('/hello', (c) => c.text('Posted!')) // PUT /hello -> 405 Method Not Allowed // Allow: GET, HEAD, POSTYou can customize the response with the onMethodNotAllowed option:
app.use( methodNotAllowed({ app, onMethodNotAllowed: (c, methods) => c.json({ error: 'Method Not Allowed' }, 405, { Allow: methods.join(', ') }), }) )Thanks @usualoma!
RegExpRouter throws UnsupportedPathError at registration time
The RegExpRouter now detects unsupported path combinations when routes are registered, instead of at the first matching request. This means misconfigured routes fail fast at startup rather than at runtime. As a bonus, registration plus the first match is roughly 20% faster.
Thanks @usualoma!
Other improvements
hono/utils/headers has been synced with the IANA HTTP Field Name Registry, adding newly registered fields such as Accept-Query. Thanks @akahoshi1421!
The JWT and JWK middleware now accept a realm option for the WWW-Authenticate challenge on 401 responses, and challenge values are properly escaped. Thanks @arhxam!
JSX: useRef and RefObject are now aligned with React 19. Note that this is a type-level change — RefObject is now { current: T }, so type a nullable ref as RefObject<T | null>, and pass useRef(undefined) instead of useRef(). Thanks @ashunar0!
JSX: a function component can now return an array of children without throwing during server-side rendering. Thanks @natsuki-engr!
The Compress Middleware now sets Vary: Accept-Encoding on negotiated responses. Thanks @arhxam!
All changes
- perf(hono-base): avoid rest parameter in fetch by @yusukebe in #5113
- perf(context): iterate the header record with for..in by @yusukebe in #5118
- perf(url/request): replace regex tests with indexOf by @yusukebe in #5121
- perf(context): skip Headers creation when there are no headers to merge by @yusukebe in #5122
- perf(urls): refactor tryDecodeURIComponent by @yusukebe in #5158
- chore(benchmarks): correct src path on Windows, add json and middleware cases by @kibertoad in #5173
- perf(context): drop the throwaway env field initializer by @kibertoad in #5174
- perf(request): allocate #validatedData lazily by @kibertoad in #5175
- perf(request): probe the body cache without allocating by @kibertoad in #5176
- chore(benchmarks): stabilize measurements by forcing mitata batching by @yusukebe in #5183
- perf(hono-base): restore the rest parameter in fetch by @yusukebe in #5184
- perf(context): restore the env field initializer by @yusukebe in #5186
- feat: add first-class QUERY method support by @shellhaki in #5070
- feat(etag): support conditional requests for the QUERY method by @Cherry in #5111
- feat(cors): allow QUERY by default as a first-class method by @usualoma in #5115
- feat(cache): add first-class support for QUERY requests by @usualoma in #5119
- feat(jsx): add React-compatible overloads to useRef by @ashunar0 in #5063
- feat(middleware): add method-not-allowed middleware by @usualoma in #5132
- feat(jwt,jwk): add a configurable WWW-Authenticate realm by @arhxam in #5141
- feat(utils/headers): sync HTTP field types with the IANA registry by @akahoshi1421 in #5153
- fix(jsx): allow a function component to return an array by @natsuki-engr in #5179
- feat(reg-exp-router): throw UnsupportedPathError during route registration by @usualoma in #5171
- fix(compress): set Vary: Accept-Encoding on negotiated responses by @arhxam in #5137
Full Changelog: v4.12.34...v4.13.0
Thank you to all contributors!
Original source - Aug 3, 2026
- Date parsed from source:Aug 3, 2026
- First seen by Releasebot:Aug 3, 2026
v4.12.34
Hono ships security fixes for JSX server-side rendering, CORS, language middleware, and proxy handling, closing data disclosure, ReDoS, and algorithmic complexity DoS issues while strengthening request and response header safety.
Security fixes
This release includes fixes for the following security issues:
memo() retains SSR output across requests, leading to cross-user data disclosure
Affects: hono/jsx (server-side rendering). Fixes memo() reusing a retained render result across requests when props compare equal, where a component reading request-scoped values from ambient context — useContext(), useRequestContext(), or getContext() — could serve HTML rendered for another user's request, disclosing account data or request-scoped secrets such as CSRF tokens. GHSA-f23p-vx2j-j53r
ReDoS in CORS middleware via Access-Control-Request-Headers
Affects: hono/cors. Fixes a whitespace-tolerant regular expression with quadratic backtracking used to parse the Access-Control-Request-Headers preflight header when allowHeaders is 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-2239
Algorithmic 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, or Accept-Language header — could cause excessive CPU consumption and block the event loop. GHSA-54fx-42gc-7vw4
Proxy Helper does not remove response headers listed in the Connection header
Affects: hono/proxy. Fixes proxy() forwarding response headers that the origin's Connection header 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-m7r9
Users who use hono/jsx for server-side rendering, hono/cors, hono/language, or hono/proxy are strongly encouraged to upgrade to this version.
Original source - Jul 31, 2026
- Date parsed from source:Jul 31, 2026
- First seen by Releasebot:Aug 1, 2026
v4.12.33
Hono fixes Cookie parsing, JSX useSyncExternalStore handling, and updates node server with global fetch support.
What's Changed
- fix(cookie): relax name validation when parsing Cookie header in #5164
- chore: bump @hono/node-server in #5167
- fix(jsx): handle useSyncExternalStore subscription and snapshot changes in #5166
- chore: remove undici in favor of global fetch in #5168
Full Changelog: v4.12.32...v4.12.33
Original source - Jul 24, 2026
- Date parsed from source:Jul 24, 2026
- First seen by Releasebot:Jul 24, 2026
v4.12.32
Hono ships fixes for AWS Lambda, SSE, secure headers, and request parsing in v4.12.32.
What's Changed
- ci: enable reports for type & bundle size check in #5148
- fix(aws-lambda): add jwt and lambda authorizer types for API Gateway v2 in #5142
- fix(sse): emit empty id field to reset Last-Event-ID in #5138
- test(cloudflare-workers): add coverage for onClose, onError, send, and close in Cloudflare Workers websocket adapter in #5145
- fix: use Object.create(null) when parsing query, headers, and params in #5161
- fix(secure-headers): keep CSP callbacks scoped to their header in #5147
Full Changelog: v4.12.31...v4.12.32
Original source - Jul 18, 2026
- Date parsed from source:Jul 18, 2026
- First seen by Releasebot:Jul 19, 2026
v4.12.31
Hono fixes response helper header matching, improves body parsing and multipart request handling, and tightens SSE retry behavior. The release also adds an app.fetch() overhead benchmark and includes test and refactor cleanup.
What's Changed
- test(context): assert case-insensitive header names in response helpers by @yusukebe in #5116
- chore(benchmark): add app.fetch() overhead benchmark by @yusukebe in #5117
- refactor(aws-lambada): remove FIXME in @ts-expect-error by @yusukebe in #5130
- fix(utils/body): reuse cached formData in parseBody() by @yusukebe in #5131
- fix(request): fix multipart boundary mismatch in cloneRawRequest by @yusukebe in #5133
- fix(sse): emit retry feild when retry is 0 by @yusukebe in #5135
- test(validator): fix misspelled identifier in transform type test by @yusukebe in #5136
Full Changelog: v4.12.30...v4.12.31
Original source - Jul 13, 2026
- Date parsed from source:Jul 13, 2026
- First seen by Releasebot:Jul 13, 2026
v4.12.30
Hono fixes cache, compression, client, and method-override behavior while updating benchmarks and TypeScript prep.
What's Changed
- chore(benchmark/routers): bump deps in #5107
- chore(benchmark): remove not used benchmarks in #5108
- chore: update to ts6 in prep for ts7 in #5104
- fix(cache): deduplicate Cache-Control directives case-insensitively in #5025
- fix(compress): do not compress 206 Partial Content responses in #5020
- fix(client): replaceUrlParam should not match a param that prefixes another in #5096
- fix(method-override): set duplex when forwarding a stream body in query mode in #5110
Full Changelog: v4.12.29...v4.12.30
Original source - Jul 10, 2026
- Date parsed from source:Jul 10, 2026
- First seen by Releasebot:Jul 10, 2026
v4.12.29
Hono ships bug fixes across client headers, lambda-edge, aws-lambda, trie-router, etag, and types, plus test and docs updates, improving request handling, binary responses, and compatibility.
What's Changed
- fix(client): merge function headers with per-request headers by @yusukebe in #5092
- chore: fix no-op tsc in test script by @yusukebe in #5093
- fix(lambda-edge): resolve the handler with the value passed to the callback by @yusukebe in #5094
- docs(language): add JSDoc @example to languageDetector by @codebybilal18 in #5081
- test(workerd): add compatibilityDate by @yusukebe in #5100
- fix(lambda-edge): base64 encode content-encoded response bodies by @yusukebe in #5099
- fix(aws-lambda): treat any non-identity content-encoding as binary by @yusukebe in #5101
- fix(types): strip extra properties from array types in JSONParsed by @Arman-Luthra in #5103
- fix(trie-router): match empty wildcard remainder after regexp param by @usualoma in #5102
- fix(etag): treat If-None-Match: * as a match by @yusukebe in #5084
New Contributors
- @codebybilal18 made their first contribution in #5081
- @Arman-Luthra made their first contribution in #5103
Full Changelog: v4.12.28...v4.12.29
Original source - Jul 6, 2026
- Date parsed from source:Jul 6, 2026
- First seen by Releasebot:Jul 7, 2026
v4.12.28
Hono ships a maintenance update with fixes for static file serving, body and validator content type matching, Bun WebSocket protocol reporting, and AWS Lambda V2 event detection, plus documentation and build cleanup.
What's Changed
fix(serve-static): treat empty string content as found by @yusukebe in #5062
docs(MIGRATION): fix req.raw.headers reference (property, not method) by @EduardF1 in #5047
chore: don't publish *.tsbuildinfo by @yusukebe in #5066
fix(utils/body,validator): normalize Content-Type media type for case-insensitive matching by @yusukebe in #5067
fix: avoid circular dependency between body.ts and request.ts by @usualoma in #5071
fix(bun): report the requested subprotocol on WSContext.protocol by @greymoth-jp in #5059
chore: bump devDependencies by @yusukebe in #5085
fix(aws-lambda): detect V2 events by request context, not rawPath alone by @VihaanAgarwal in #5033
docs(context-storage): fix JSDoc by @yusukebe in #5086
New Contributors
@EduardF1 made their first contribution in #5047
@greymoth-jp made their first contribution in #5059
@VihaanAgarwal made their first contribution in #5033
Full Changelog: v4.12.27...v4.12.28
Original source
Curated by the Releasebot team
Releasebot is an aggregator of official release notes from hundreds of software vendors and thousands of sources.
Our editorial process involves the manual review and audit of release notes procured with the help of automated systems.