Migration guide: Not required.
- To be filled in at release time.
- None.
- None yet.
- None yet.
- To be filled in at release time.
Migration guide: Not required.
Spry 8.5.3 fixes generated Spry Client JSON request bodies so typed data:
payloads are serialized correctly and default to the expected JSON content
type on send.
- None.
- Spry Client: Generated client methods now JSON-encode typed
data:request bodies and automatically addcontent-type: application/json; charset=utf-8when the caller does not provide one, sopost(data: ...)works on native runtimes out of the box by @medz in #196.
- No migration is required for existing Spry applications.
- If you added a manual workaround that passed
body: jsonEncode(data.toJson())with an explicit JSON content type, you can keep it or switch back to the generateddata:parameter.
Migration guide: Not required.
Spry 8.5.2 fixes the analyzer constraint so Spry can once again coexist with current unrouter releases inside Flutter applications while still letting the application-level solver pick a compatible analyzer version.
- None.
- Ecosystem compatibility: Changed Spry's
analyzerconstraint from^9.0.0to^10.0.1so it overlaps withoref/unrouteragain, which restores dependency solving for Flutter applications that use both packages by @medz in #194.
- No migration is required for existing Spry applications.
- Flutter applications depending on both Spry and
unroutershould now resolve again under the current Flutter SDK dependency graph.
Migration guide: Not required.
Spry 8.5.1 fixes Flutter project dependency resolution by aligning Spry's analyzer constraint with the current Flutter SDK dependency graph, and refreshes the docs site with clearer product positioning plus new comparison pages.
- None.
- Flutter compatibility: Aligned Spry's
analyzerconstraint with the Flutter SDK so a minimal Flutter application can depend onsprywithout hitting the SDK-pinnedmetaconflict triggered byanalyzer >=10.0.2by @medz in 534d594. - Documentation and site: Refreshed the README and docs homepage positioning to explain Spry's value proposition more clearly by @medz in 5e493b4.
- Documentation and site: Added dedicated
What is Spryand framework comparison pages to the docs site by @medz in 749682e and fb4fba8. - Documentation and site: Updated the docs site's social preview image by @medz in b3d48d1.
- Documentation and site: Bumped the docs site's Vite dependency to
7.3.2by @dependabot[bot] in #193.
- No migration is required for existing Spry applications.
- Flutter applications that depend on Spry no longer need to work around the
analyzer/metasolver conflict introduced by newer analyzer releases.
Migration guide: Not required.
Spry 8.5.0 introduces the first stable release of Spry Client, adds
handler-local composition through defineHandler(...), and exposes a reusable
Scalar docs handler for OpenAPI reference pages.
This release adds first-party client generation under spry build client,
introduces generated route helpers plus typed params / inputs / queries /
headers / outputs / models, adds a dedicated client runtime surface under
package:spry/client.dart, and aligns build, OpenAPI, and client generation
with a shared stream-driven pipeline.
- None.
- Added first-party Spry Client generation under
spry build client, with generatedSpryClient,*Routes, and route-mirrored client source output by @medz in #182. - Added generated typed client artifacts including
*Params,*Input,*Query,*Headers,*Output, and sharedmodels/*, with route metadata as the base input and OpenAPI metadata as type enhancement by @medz in #182. - Added generated request construction and typed response decoding through the
new client runtime surface in
package:spry/client.dart, built onoxyandhtprimitives by @medz in #182.
- Reworked the builder around a unified stream-based pipeline so scanning, generation, writing, OpenAPI artifacts, and client artifacts all flow through the same build model by @medz in #182.
- Improved build progress reporting to follow real scan and generation events while keeping generated output and final build summaries explicit by @medz in #182.
- Added
defineHandler(...)so a single route handler can attach a small local middleware chain and a dedicated local error handler while preserving Spry's outer middleware and scoped error pipeline by @medz in #183. - Added
servePublicAssettopackage:spry/spry.dartand consolidated the public runtime exports under the main entrypoint, while deprecatingpackage:spry/app.dartahead of 9.0 by @medz in #184. - Added
defineScalarHandler(...)topackage:spry/openapi.dartso applications can serve a Scalar-powered API reference directly, and updated generated OpenAPI docs routes to use the shared handler by @medz in #187.
- Added a dedicated Spry Client guide and a focused
example/client_example/project covering generated client structure, configuration, output layout, typed inputs, queries, headers, outputs, and shared models by @medz in #182. - Updated the docs site tooling to VitePress 2 alpha and refreshed site code block styling by @medz in #185.
- No migration is required for existing applications.
- To generate a typed client package, add a
client: ClientConfig(...)block todefineSpryConfig(...), then rundart run spry build client. - OpenAPI artifact output remains optional. Route-level OpenAPI metadata can
still enhance the generated client even when
openapi.jsonis not emitted. package:spry/app.dartis now deprecated; preferpackage:spry/spry.dartand plan to migrate before 9.0.
Migration guide: Not required.
Spry 8.4.0 adds first-party middleware helpers, an OpenAPI docs UI route, and
new routing configuration options on top of the roux 1.0.1 upgrade.
This release introduces built-in requestId(...), timing(...), and
middleware composition helpers under package:spry/middleware.dart, adds
Scalar() UI support for generated OpenAPI docs, improves spry build /
spry serve terminal output, and exposes caseSensitive plus optional
handler-route LRU caching through both Spry(...) and defineSpryConfig(...).
- None.
- Added first-party
requestId(...)middleware with request/response header propagation anduseRequestId(event)access by @medz in #177. - Added first-party
timing(...)middleware forserver-timingresponse metrics by @medz in #178. - Added first-party middleware composition helpers
every(...),except(...), andsome(...)underpackage:spry/middleware.dartby @medz in #179.
- Upgraded Spry's routing internals to
roux 1.0.1by @medz in #180. - Added
caseSensitiveto bothSpry(...)anddefineSpryConfig(...)so applications can opt into case-insensitive route matching without changing the default behavior by @medz in #180. - Added optional
handlerCacheCapacityto enablerouxLRU caching for handler lookups in both runtime and generated-app configuration by @medz in #180.
- Added
Scalar()UI support so generated OpenAPI output can also expose an interactive docs route duringspry buildandspry serveby @medz in #175. - Improved
spry buildandspry serveterminal output with clearer progress, route/middleware counts, next-step commands, docs links, local/network URLs, and OpenAPI UI hints by @medz in #176.
- Added dedicated middleware documentation for the new first-party helpers and clarified method-scoped middleware / error file naming in the guides by @medz in #177, #178, #179, and #180.
- No migration is required for existing applications.
- To adopt the new middleware helpers, import
package:spry/middleware.dart. - To tune routing behavior, set
caseSensitiveorhandlerCacheCapacityinSpry(...)ordefineSpryConfig(...). - To expose interactive API docs, configure
openapi.ui: Scalar(...)inspry.config.dart.
Migration guide: Not required.
Spry adds first-class OpenAPI 3.1 generation driven by filesystem routes and typed route metadata.
This work introduces document generation from spry.config.dart, typed
OpenAPI builders under package:spry/openapi.dart, analyzer-validated
route-level openapi metadata, lifted route globalComponents, and a focused
example plus documentation for the full authoring flow.
- None.
- Added
openapiconfiguration inspry.config.dart, including document root metadata, output selection, component merge strategy, and root-level webhook declarations by @medz in #171. - Added a public typed OpenAPI authoring surface under
package:spry/openapi.dart, including builders for schemas, parameters, headers, request bodies, responses, security schemes, OAuth flows, callbacks, path items, tags, servers, and document components by @medz in #171. - Added route-level top-level
openapimetadata with analyzer-backed truth source validation, so route docs must resolve to Spry's real OpenAPI types rather than raw maps or local lookalikes by @medz in #171. - Added support for deeply reusable shared spec values, including nested child
and sub-child values such as parameters, request bodies, responses,
callbacks, security requirements, server variables, and
globalComponentsbuckets by @medz in #171. - Added OpenAPI document generation to the build pipeline, including route-path
conversion, method expansion for any-method routes, explicit-method override
rules,
HEADhandling, and lifted routeglobalComponentsby @medz in #171. - Added strict and deep-merge component merge strategies with source-aware conflict diagnostics by @medz in #171.
- Added a dedicated OpenAPI guide covering config, route metadata, reusable spec composition, schemas, request/response modeling, security, callbacks, webhooks, merge behavior, and output rules by @medz in #171.
- Added a standalone
example/openapi/project that generatespublic/openapi.jsonfrom document-level components and route-levelglobalComponentsby @medz in #171. - Aligned the README runtime-target overview with the v8.2 target surface by @medz in eaa9ff7.
- No migration is required. OpenAPI support is additive. To adopt it, add an
openapiblock todefineSpryConfig(...), importpackage:spry/openapi.dart, and start attaching typedopenapimetadata to route files.
Migration guide: https://spry.medz.dev/migration
Spry 8.2.0 reshapes generated output around a clearer target layout and adds new Dart-native deployment targets.
This release renames the Dart runtime target to BuildTarget.vm, moves
generated Dart source into .spry/src/, renames JS runtime entrypoints to
their deploy-facing filenames, adds exe / aot / jit / kernel targets,
and removes the synthetic wildcard-param alias for named catch-all routes.
- Renamed
BuildTarget.darttoBuildTarget.vmby @medz in #170. - Generated Dart source files now live under
.spry/src/instead of the.spry/root, and JS target entrypoints now use deploy-facing filenames such as.spry/node/index.cjsand.spry/cloudflare/index.jsby @medz in #170. - Removed
RouteParams.wildcard/event.params.wildcardfor named catch-all routes. Read the declared param directly, for exampleevent.params.get('slug')by @medz in dab62e9.
- Added Dart-native deployment targets for executable, AOT snapshot, JIT
snapshot, and kernel snapshot output via
BuildTarget.exe,BuildTarget.aot,BuildTarget.jit, andBuildTarget.kernelby @medz in #170. - Reworked generated output layout and deployment documentation across Node, Bun, Deno, Cloudflare, Vercel, and Netlify to match the new target-specific entrypoints by @medz in #170.
- Synced
public/assets into Dart compiled output workspaces so native builds can be deployed directly by @medz in #170.
- Cached parsed request URLs and query params per request to remove duplicate parsing in the main request pipeline by @medz in #167.
- Simplified the static asset serving pipeline and unified public-asset resolution across JS and IO runtimes by @medz in #169.
- Removed generated
_withWildcardParamwrappers and the per-requestEvent/RouteParamsrebuild they performed for named catch-all routes by @medz in dab62e9.
- Rename
BuildTarget.darttoBuildTarget.vminspry.config.dart. - If your tooling reads generated output directly, update paths from
.spry/*.dartto.spry/src/*.dart, and switch JS entrypoints to the new filenames (node/index.cjs,bun/index.js,deno/index.js,cloudflare/index.js). - Replace
event.params.wildcardwithevent.params.get('<name>'), where<name>is the identifier declared in[...name].dart.
Migration guide: Not required.
Spry 8.1.0 expands runtime coverage and adds first-class route-level WebSocket handling without changing the filesystem routing model.
This release adds Deno and Netlify targets, exposes public osrv runtime entrypoints for target-aware integrations, upgrades Spry to osrv 0.6.x, and introduces the new event.ws API for WebSocket upgrades inside normal route handlers.
- None.
- Added a Deno target and deploy documentation by @medz in #164.
- Added a Netlify target, example project, and deploy documentation by @medz in #163.
- Added public
package:spry/osrv.dartruntime entrypoints, including target-specific exports for Dart, Node, Bun, Cloudflare, Deno, Vercel, and Netlify by @medz in #162. - Upgraded Spry to
osrv 0.6.xas part of the Deno runtime work by @medz in #164.
- Added
event.wswith runtime support checks, upgrade-request detection, requested protocol access, andupgrade(...)for route-level WebSocket handling by @medz in #165. - Added WebSocket documentation covering handshake semantics, session boundaries, and runtime support expectations by @medz in #165.
- No migration is required for existing applications. To adopt WebSockets, import
package:spry/websocket.dartand useevent.wsinside a normal route handler. - If you integrate directly with
osrv, prefer the new public exports underpackage:spry/osrv.dartand its target-specific entrypoints.
Migration guide: https://spry.medz.dev/migration
Spry 8.0.0 aligns the framework with the latest upstream HTTP and routing foundations.
This release upgrades Spry to the Fetch-style Request / Response model from ht 0.3.x and osrv 0.4.x, adopts the roux 0.5.x route syntax changes, and expands filesystem routing with more expressive segment patterns.
- Spry now follows the upstream Fetch-style
Request/Responseconstruction model by @medz in #157. - Manual string-path remainder matches must now use
/**instead of/*when constructingSpry,MiddlewareRoute, orErrorRouteby @medz in #155.
If you construct exported Request / Response values directly, migrate to the new init-object form:
Request(uri, method: 'GET')->Request(uri, RequestInit(method: HttpMethod.get))Response(status: 404, headers: ..., body: ...)->Response(body, ResponseInit(status: 404, headers: ...))
- Upgraded to
ht 0.3.1andosrv 0.4.xby @medz in #157. - Re-exported
RequestInitandResponseInitfrompackage:spry/spry.dartandpackage:spry/app.dartby @medz in #157.
- Upgraded to
roux 0.5.xby @medz in #155. - Kept Spry catch-all scopes aligned with the new
**remainder syntax by @medz in #155. - Added richer filesystem route syntax for embedded params, regex params, optional params, repeated params, and single-segment wildcards by @medz in #155.
- Split examples by target runtime and added a
knex_dartexample project by @medz in13fed0d. - Refreshed migration docs and release-facing website copy for the v8 release by @medz in #159.
- Upgraded project dependencies by @medz in #160.
- Replace manual
/*route strings with/**inSpry,MiddlewareRoute, andErrorRoute, then re-run your route matching tests after upgrading toroux0.5.x. - If you construct exported
Request/Responsetypes directly, migrate to the new Fetch-style init objects. For example:Request(uri, method: 'GET')->Request(uri, RequestInit(method: HttpMethod.get))Response(status: 404, headers: ..., body: ...)->Response(body, ResponseInit(status: 404, headers: ...))Response.text(...)/Response.empty(...)->Response(..., ResponseInit(...))
Migration guide: https://spry.medz.dev/migration
- BREAKING: replace the imperative app DSL with the v7 file-based runtime model built around
routes/, scoped_middleware.dart/_error.dart, andspry.config.dart. - feat(cli): add
spry serveandspry buildworkflows for generated runtimes, including watch mode and explicit root support. - feat(runtime): add generated targets for Dart VM, Node.js, Bun, Cloudflare Workers, and Vercel.
- feat(builder): add config loading, route scanning, runtime generation, and public asset syncing for the new build pipeline.
- docs: rewrite the documentation site for Spry v7, including the new getting started, runtime, deploy, and migration guides.
- feat: support middleware operators (
|Pipe middleware,>middleware with handler) - feat: support group routing (
app.group(...)) - docs: add group routes docs
- perf(datr, server): pointless waiting
- perf: avoid creating event id
- refactor: Remove
event.id
- fix: avoid http response status
Migration guide: https://spry.medz.dev/migration
- refactor: remove group router (The
app.group/app.grouped). - refactor: rename
app.stacktoapp.middleware. - refactor: remove
useRequest(), now useevent.request. - refactor: remove
useHeaders(), now useevent.headers/event.request.headers. - refactor: remove
getClientAddress(), now useevent.address. - refactor: remove
useRequestURI(), now useevent.url. - refactor: remove
useParams(), now useevent.params. - refactor: rename factory
Response.text()toResponse.fromString(). - refactor: rename factory
Response.json()toResponse.fromJson(). - refactor: remove all adapter, now is cross-platform.