NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev
A high-powered HTTP server extensible framework with dependency injection, routing and much more.
Last release 3 days ago
05 Oct 2026
Release timing varies
gaps range from 1 weeks to 10 months
Nearly every release is documented
notes for 32 of 32 stable releases
Nothing withdrawn
no release was ever pulled
5 years old
32 releases · first in 2021
One column per quarter.
feat: Services, hooked services and @Middleware lookups now work without reflection; annotations are ignored when no reflector is configured instead o
@Middleware lookups now work without reflection; annotations are ignored when no reflector is configured instead of throwing an errror. This enabled support for dart compile exe to be used to build applications without reflection.Controller(expose: ...) to set the mount path without using reflection through @Expose annotationioc(..., injection: InjectionRequest) for dependency injection without using reflectionResponseContext.attachmentDisposition() and Driver.closeServer()[]) in the POST request body no longer causing a 500 errer_http is now nullable and only closed if it was created.res.redirect() now escapes the URL in the HTML fallback page and no longer emits javascript:, vbscript: or data: (XSS)HookedService.afterAllStream() now emits after-events instead of before-events@CookieValue now uses its defaultValue or returns 400, instead of a 500 errorDELETE / on a service now requests "remove all" (id 'null'), subject to allowRemoveAll; services with non-String ids return 405 instead of a 500 error%) no longer crashes the server processreq.hostname over HTTP/2 now comes from the :authority header instead of always being localhostDARTSESSID cookie. Unknown session ids get a new session instead of being adoptedHostnameRouter now passes route parameters (e.g. :id) to the sub-app's handlersHostnameRouter creates each lazily-built app once, even when several requests arrive before creation finishesres.streamFile() with a response encoder (e.g. gzip) no longer sends the uncompressed Content-Length, which crashed the server processwrite() calls are now compressed as one gzip/deflate stream instead of one per writeq=0 in Accept-Encodingcontent-encoding headerresponseFinalizers now run on unbuffered responses, just before headers are sent, so they can set headers, status and cookies. They still run after the handler, with the full body, on buffered responses. Behaviour change: finalizers that read res.buffer should check res.isBufferedDARTSESSID session cookie is now Secure and HttpOnlyhandleRequest/handleRawRequest now completes after the error response is sent when a handler throws an error, instead of never completingno reflector startup message is now logged at info instead of warning as it is not longer a mandatory requirement to use Angel3app.logger, no longer removes the application's own Logger.root listenersres.download() no longer sends the file's server path as the download name, encodes any filename safely (RFC 6266), uses application/octet-stream for unknown types instead of crashing, reads the file asynchronously, and returns 404 for a missing file. res.streamFile() also returns 404 for a missing file instead of an error that revealed its pathstartServer now rethrows the original error (e.g. a SocketException when the port is in use) instead of a generic ArgumentError, and closes the bound server if a startup hook failsres.addStream() (and so res.streamFile()) on a buffered response now writes into the buffer, instead of sending directly and leaving the buffer emptyHEAD requests are now answered by the matching GET route, without a body, when no explicit HEAD route exists (RFC 9110), including in HostnameRouter sub-apps. Behaviour change: such requests previously returned 404 or reached a fallback routereq.accepts() now parses the Accept header instead of matching substrings: application/json no longer matches application/json-patch+json, type wildcards such as text/* are honoured, and types marked q=0 are not acceptedput… and head… now map to PUT and HEAD routes. The verb must be a whole word, so posts() or getter() are now GET /posts and GET /getter, not POST /s and GET /terMapServiceUpdated README with new links to templates
- Require Dart >= 3.13
- Require Dart >= 3.12.0
Updated dependencies to the latest release
lints to 6.0.0lints to 6.0.0Updated dependencies to the latest release
lints to 5.0.0lints to 5.0.0mime to 2.0.0* Require Dart >= 3.3 * Updated lints to 4.0.0
lints to 4.0.0* Updated README
* Updated repository link
* Updated lints to 3.0.0 * Fixed linter warnings
lints to 3.0.0Add addResponseHeader to AngelHttp to add headers to HTTP default response
addResponseHeader to AngelHttp to add headers to HTTP default responseremoveResponseHeader to AngelHttp to remove headers from HTTP default response* Updated broken image on README
* Updated uuid to 4.0.0
uuid to 4.0.0Updated: angel3_container_generator
Fixed issue #83. Allow Http request to return null headers instead of throwing an exception.
Added performance benchmark to README
* Fixed BytesBuilder warnings
BytesBuilder warnings- Require Dart >= 2.17
- Require Dart >= 2.16 - Added ORM MySQL
container to non nullableangel to non nullablelogger to non nullableFixed issue 48. Log not working in development
Fixed res.json() throwing bad state exception
res.json() throwing bad state exceptionUpdated Server: Angel3 response header
Date to response headerServer: Angel3 response headerUpdated package:angel3_container
package:angel3_containerUpdated to package:belatuk_combinator
package:belatuk_combinatorpackage:belatuk_merge_mappackage:lints* Updated README
* Updated README * Fixed NNBD issues
Updated link to Angel3 home page
Angel3 home pageReplaced http_server with belatuk_http_server
http_server with belatuk_http_serverFixed response returning incorrect status code
Fixed "Primitive after parsed param injection" test case
* Updated README
Published all packages with angel3_ prefix
angel3_ prefixYour coding agent can read these notes before it upgrades. Set up the MCP server →