NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #1119 most downloaded on PyPI
Production-ready community-driven modern Stripe-like API versioning in FastAPI
Last release 9 days ago
09 Sep 2026
Ships fairly regularly
a new release about every 4 weeks
Nearly every release is documented
notes for 59 of the last 60 stable releases
2 versions withdrawn
withdrawn after publishing
3 years old
142 releases · first in 2023
Nothing published for this version
Add support for newer fastapi by @zmievsa in https://github.com/zmievsa/cadwyn/pull/224
Full Changelog: https://github.com/zmievsa/cadwyn/compare/3.15.8...3.15.9
Fix invalid serialization and parsing by @zmievsa in https://github.com/zmievsa/cadwyn/pull/201
Full Changelog: https://github.com/zmievsa/cadwyn/compare/3.15.7...3.15.8
One column per month.
Fix dependency overrides not working in old versions by @zmievsa in https://github.com/zmievsa/cadwyn/pull/195
Full Changelog: https://github.com/zmievsa/cadwyn/compare/3.15.6...3.15.7
__hash__ and __eq__ as the original dependenciesFix dependencies from svcs not resolving on route generation by @zmievsa in https://github.com/zmievsa/cadwyn/pull/193
Full Changelog: https://github.com/zmievsa/cadwyn/compare/3.15.5...3.15.6
HeadVersion and Version into cadwyn.__init__ so now they are directly importable from cadwynVersionBundleFix dependency overrides for versioned routes by @zmievsa in https://github.com/zmievsa/cadwyn/pull/190
Full Changelog: https://github.com/zmievsa/cadwyn/compare/3.15.4...3.15.5
Get rid of enrich_swagger by @zmievsa in https://github.com/zmievsa/cadwyn/pull/188
Full Changelog: https://github.com/zmievsa/cadwyn/compare/3.15.3...3.15.4
Cadwyn.enrich_swagger is now completely unnecessary: OpenAPI is now generated at runtime. It also now does not do anything, is deprecated, and will be removed in a future versionCadwyn.enrich_swaggerPopulated Cadwyn.router.routes with both - versioned and unversioned routes by @m0n0x41d in https://github.com/zmievsa/cadwyn/pull/187
Cadwyn.router.routes with both - versioned and unversioned routes by @m0n0x41d in https://github.com/zmievsa/cadwyn/pull/187Full Changelog: https://github.com/zmievsa/cadwyn/compare/3.15.2...3.15.3
Cadwyn.router.routes now includes all existing routers within the application instead of just unversioned routesNothing published for this version
Nothing published for this version
Full Changelog: https://github.com/zmievsa/cadwyn/compare/3.15.1...3.15.2
Full Changelog: https://github.com/zmievsa/cadwyn/compare/3.15.1...3.15.2
Full Changelog: https://github.com/zmievsa/cadwyn/compare/3.15.0...3.15.1
Full Changelog: https://github.com/zmievsa/cadwyn/compare/3.15.0...3.15.1
Add a "how to build a versioning framework" section to docs by @zmievsa in https://github.com/zmievsa/cadwyn/pull/89
Full Changelog: https://github.com/zmievsa/cadwyn/compare/3.14.0...3.15.0
Bump idna from 3.6 to 3.7 by @dependabot in https://github.com/zmievsa/cadwyn/pull/169
Full Changelog: https://github.com/zmievsa/cadwyn/compare/3.13.0...3.14.0
Add converter validation by @zmievsa in https://github.com/zmievsa/cadwyn/pull/166
Full Changelog: https://github.com/zmievsa/cadwyn/compare/3.12.1...3.13.0
Fix wrong response content length by @zmievsa in https://github.com/zmievsa/cadwyn/pull/167
Full Changelog: https://github.com/zmievsa/cadwyn/compare/3.12.0...3.12.1
fastapi.Response subclasses with non-null bodies and 500 response causing the response to not get returnedfastapi.Response subclasses had invalid content length if migration affected itFull Changelog: https://github.com/zmievsa/cadwyn/compare/3.11.1...3.12.0
Full Changelog: https://github.com/zmievsa/cadwyn/compare/3.11.1...3.12.0
Full Changelog: https://github.com/zmievsa/cadwyn/compare/3.11.0...3.11.1
Full Changelog: https://github.com/zmievsa/cadwyn/compare/3.11.0...3.11.1
Full Changelog: https://github.com/zmievsa/cadwyn/compare/3.10.1...3.11.0
Full Changelog: https://github.com/zmievsa/cadwyn/compare/3.10.1...3.11.0
VersionBundle.api_version_var, thus making it easy for someone to extend header routing and set their own rules for how the default version is chosenfix: Previous version introduced a minor breaking change: if any old users depended on the pure generate_versioned_routers interface, their call would…
generate_versioned_routers interface, their call would be broken. Even though the users would be able to fix it easily, we can't just break existing contracts so 3.10.0 was yanked and 3.10.1 fixes the issue.Full Changelog: https://github.com/zmievsa/cadwyn/compare/3.10.0...3.10.1
generate_versioned_routers interface, their work would receive a minor yet simple breaking change.Rename latest to head and switch our internal representation approach to HEAD versioning by @zmievsa in https://github.com/zmievsa/cadwyn/pull/161
Full Changelog: https://github.com/zmievsa/cadwyn/compare/3.9.1...3.10.0
Yanked due to a minor breaking change that we fixed in 3.10.1.
latest, we introduced a new HEAD version -- the only one the user maintains by hand. All requests get migrated to HEAD and latest schemas are generated from HEAD. cadwyn.structure.HeadVersion was added to give us the ability to have migrations between HEAD and latest, thus eliminating the need for InternalRepresentationOf because all the used schemas are now the internal representationslatest is now named head because it no longer represents the newest version. Instead, it is the the internally used version and the version that is used for generating all other versions.latest anymore. Instead, it is generated like all the restInternalRepresentationOf and the concept of internal schemas in favor of HeadVersion migrationsImprove documentation structure and fix a broken link in docs by @zmievsa in https://github.com/zmievsa/cadwyn/pull/159
Full Changelog: https://github.com/zmievsa/cadwyn/compare/3.9.0...3.9.1
Full Changelog: https://github.com/zmievsa/cadwyn/compare/3.8.0...3.9.0
Full Changelog: https://github.com/zmievsa/cadwyn/compare/3.8.0...3.9.0
doc: fix index.md 'approach' link by @villekr in https://github.com/zmievsa/cadwyn/pull/155
Full Changelog: https://github.com/zmievsa/cadwyn/compare/3.7.1...3.8.0
convert_request_to_next_version_for and convert_response_to_next_version_for to be able to migrate multiple types of schemas using the same converterh11._util.LocalProtocolError when raising HTTPException(status_code=500)Full Changelog: https://github.com/zmievsa/cadwyn/compare/3.7.0...3.7.1
Full Changelog: https://github.com/zmievsa/cadwyn/compare/3.7.0...3.7.1
cadwyn generate-code-for-versioned-packages and added cadwyn codegen instead. It doesn't require template_package argument anymore and does not have the ignore_coverage_for_latest_aliases argument as we plan to remove this feature in the future. So it only requires version_bundle.Full Changelog: https://github.com/zmievsa/cadwyn/compare/3.6.6...3.7.0
Full Changelog: https://github.com/zmievsa/cadwyn/compare/3.6.6...3.7.0
cadwyn generate-code-for-versioned-packages and added cadwyn codegen instead. It doesn't require template_package argument anymore and does not have the ignore_coverage_for_latest_aliases argument as we plan to remove this feature in the future. So it only requires version_bundle.Add markdownlint to pre-commit by @kruvasyan in https://github.com/zmievsa/cadwyn/pull/150
Full Changelog: https://github.com/zmievsa/cadwyn/compare/3.6.5...3.6.6
isinstance checks for it which it used to enrich swagger with functionality. But when the dependencies were wrapped into our function wrappers, these checks stopped passing, thus breaking this functionality in swagger. Now we ignore all dependencies that FastAPI creates. This also introduces a hard-to-solve bug: if FastAPI's class-based security dependency was subclassed and then __call__ was overridden with new dependencies that are versioned -- we will not migrate them from version to version. I hope this is an extremely rare use case though. In fact, such use case breaks Liskov Substitution Principle and doesn't make much sense because security classes already include request parameter which means that no extra dependencies or parameters are necessary.When a class-based dependency was used, its dependant was incorrectly generated, causing all affected endpoints to completely stop functioning
Nothing published for this version
A rare pydantic 2 bug that caused BaseModel annotations to be corrupted when new fields were added to the schema
BaseModel annotations to be corrupted when new fields were added to the schemaRemoved exception when creating cadwyn.Cadwyn without latest_schemas_package as it was a minor breaking change
cadwyn.Cadwyn without latest_schemas_package as it was a minor breaking changeNothing published for this version
Deprecated cadwyn.main and use cadwyn.applications instead
cadwyn.VersionBundle.migrate_response_body that allows us to migrate response bodies outside of routing and FastAPIlatest_schemas_package argument to cadwyn.VersionBundle to support the migration abovecadwyn.exceptions.CadwynLatestRequestValidationError) whenever a request migration caused our payload to be incompatible with latest request schemascadwyn.main and use cadwyn.applications insteadlatest_schemas_package argument in cadwyn.CadwynNothing published for this version
Previously, Cadwyn did not set the default status code for ResponseInfo
convert_response_to_previous_version_for(..., migrate_http_errors=True)Nothing published for this version
Request and response converters were not applied when path params were present
RouterPathParamsModifiedError is now raised if endpoint(...).had(path=...) has different path params than the original route
RouterPathParamsModifiedError is now raised if endpoint(...).had(path=...) has different path params than the original routeFix import aliases in nested __init__.py files generating incorrectly for latest version
__init__.py files generating incorrectly for latest versionIf the endpoint specified a single non-pydantic (list/dict) body parameter, Cadwyn failed to serialize the body
schema(...).validator(...).existed and schema(...).validator(...).didnt_exist instructions for simplistic manipulation of validators
schema(...).validator(...).existed and schema(...).validator(...).didnt_exist instructions for simplistic manipulation of validatorsschema(...).field(...).didnt_have for unsetting field attributestyping.Annotated in schemasconvert_request_to_next_version_for or convert_response_to_previous_version_for, the text of the error suggested the wrong argument count and namesNothing published for this version
Added backwards compatibility for FastAPI < 0.106.0
Guaranteed that it is impossible to release cadwyn with the wrong pydantic dependency
Downgrade required version of verselect for backwards compatibility
Removed lazy migrations as they were producing incorrect results when there were no migrations but when there were schema changes
If a user used a FastAPI/Starlette StreamingResponse or FileResponse, we still tried to access its body attribute which caused an AttributeError
StreamingResponse or FileResponse, we still tried to access its body attribute which caused an AttributeErrorSponsors section to README and docs, along with Monite as our main and only current sponsor ✨
Nothing published for this version
Switched to better-ast-comments because ast-comments had no license listed on pypi (even though its actual license was MIT) which caused some dependen
better-ast-comments because ast-comments had no license listed on pypi (even though its actual license was MIT) which caused some dependency checking tools to report it as unlicensedMigrate from black to ruff-format
Previously we did not pass dependency_overrides_provider, response_model_exclude_unset response_model_exclude_defaults, and response_model_exclude_non
dependency_overrides_provider, response_model_exclude_unset response_model_exclude_defaults, and response_model_exclude_none to fastapi which could cause erroneous behaviour during serialization in rare cases.module(...).had(import_=...) construct for adding imports in older versions
module(...).had(import_=...) construct for adding imports in older versionsIf a user returned a FastAPI/Starlette Response with an empty body, we still tried to serialize it which caused an invalid response body
Response with an empty body, we still tried to serialize it which caused an invalid response bodyNothing published for this version
Expanded reference section to docs
latest_schemas_module was renamed to latest_schemas_package everywhereapi_version_var in VersionBundle is now an optional argument instead of a required onecadwyn.internal_body_representation_of because it is now done using an annotationNothing published for this version
schema(...).field(...).had(ge=...) for union fields previously raised an AttributeError on code generation
schema(...).field(...).had(ge=...) for union fields previously raised an AttributeError on code generationField ASTs not preserving the original structure when constrained fields were changed
The bug where fields from parent schemas also appeared in child schemas
Your coding agent can read these notes before it upgrades. Set up the MCP server →