Changelog
Changelog Policy¶
All changes to SpeedPy's public API surface — REST endpoints, serializer fields, scopes, auth behavior, webhook payloads, error shapes, rate limits, MCP schemas, and client examples — must be recorded in this changelog alongside other release notes.
Change Categories¶
Use these labels to classify each entry:
| Category | When to use |
|---|---|
| Breaking | Removing/renaming fields or endpoints, changing types, tightening requirements, removing auth methods |
| Additive | New endpoints, new optional fields, new query parameters, new enum values, new HTTP methods |
| Behavior change | Changed semantics, different error codes, modified rate limits, altered sorting/filtering defaults |
| Deprecation | Marking endpoints or fields for future removal (include sunset date) |
| Security | Auth changes, permission fixes, vulnerability patches affecting integrations |
| Docs-only | OpenAPI description updates, example corrections with no runtime effect |
| Experimental | New features behind feature flags or explicitly marked unstable — no stability guarantee |
Required Fields¶
Each API change entry must include:
- Date or version — when the change ships
- Category — one of the labels above
- Affected surface — endpoints, fields, scopes, webhook events, or schemas involved
- Description — what changed and why
- Migration notes — what consumers need to do (for breaking changes and deprecations)
- Client impact — how generated clients, webhook consumers, or integrations are affected
- Deprecation/sunset window — when the old behavior will be removed (if applicable)
- Links — to related schema changes, API versioning docs, or migration guides
Entry Template¶
### YYYY-MM-DD — `vX.Y.Z`
#### API Changes
- **Breaking:** `GET /api/v1/example/` — Removed the `legacy_field` response field.
Consumers must use `new_field` instead. See [migration guide](./link).
Sunset: 2026-09-01.
- **Additive:** `POST /api/v1/widgets/` — New optional `color` request field.
No action required. Generated clients should regenerate to pick up the new field.
- **Deprecation:** `GET /api/v1/old-endpoint/` — Deprecated in favor of
`/api/v1/new-endpoint/`. Returns `Deprecation: true` and `Sunset` headers.
Will be removed after 2026-12-01. See [API Versioning](api-versioning.md).
- **Behavior change:** `GET /api/v1/items/` — Default sort changed from
`created_at` to `updated_at`. Pass `?ordering=created_at` to preserve old behavior.
- **Security:** `POST /api/v1/auth/token/` — Rate limit tightened from 60/min to
20/min per IP. Clients making bulk token requests may need to add backoff.
- **Additive:** New OAuth scope `teams:billing`. Grants read access to team
billing data via `GET /api/v1/teams/{id}/billing/`. Existing tokens are
unaffected; clients must request the new scope explicitly.
- **Breaking:** `POST /api/v1/widgets/` — Error response shape changed from
`{"detail": "..."}` to `{"errors": [{"field": "...", "message": "..."}]}`.
Clients parsing error responses must update their error-handling logic.
- **Additive:** New webhook event `invoice.finalized`. Fired when an invoice
moves to finalized status. Payload includes `invoice_id`, `team_id`, and
`amount`. No action required for existing webhook consumers.
- **Experimental:** `GET /api/v1/beta/suggestions/` — New endpoint, marked
experimental. May change without notice in future releases.
Codegen-Sensitive Changes¶
Additive changes can break generated API clients if operation IDs or schema shapes change unexpectedly. When adding fields, endpoints, or enum values, note whether clients need to regenerate. Webhook payload changes follow the same policy as REST API response changes.
Experimental Endpoints¶
Endpoints marked experimental carry no stability guarantee. Document them in the changelog when added, but make clear they may change or be removed without a deprecation window.
For versioning rules, deprecation headers, and support windows, see API Versioning & Deprecation.
March 2026¶
Django 6.0¶
SpeedPy has been updated to Django 6.0.3, a major version upgrade from Django 5.2.8.
Django 6.0 brings continued improvements to the ORM, async support, and template engine. Review the Django 6.0 release notes before merging this update into your project, as there may be breaking changes depending on which Django internals you use.
Infrastructure¶
- Node.js updated from 25.6.0 to 25.8.1 in the Docker image
Python Package Updates¶
| Package | Previous | Updated |
|---|---|---|
| Django | 5.2.8 | 6.0.3 |
| django-stubs | 5.2.8 | 6.0.1 |
| gunicorn | 23.0.0 | 25.1.0 |
| django-ses | 4.5.0 | 4.7.2 |
| djangoql | 0.18.1 | 0.19.1 |
| pyjwt[crypto] | 2.10.1 | 2.12.1 |
| djangorestframework | 3.16.1 | 3.17.0 |
| django-otp | 1.6.3 | 1.7.0 |
| django-allauth | 65.13.1 | 65.15.0 |
| django-crispy-forms | 2.5 | 2.6 |
| django-debug-toolbar | 6.1.0 | 6.2.0 |
| django-environ | 0.12.0 | 0.13.0 |
| celery[redis] | 5.6.1 | 5.6.2 |
| whitenoise | 6.11.0 | 6.12.0 |
| psycopg | 3.3.2 | 3.3.3 |
| Pillow | 12.0.0 | 12.1.1 |
| black | 25.12.0 | 26.3.1 |
New: update_pyproject.py script¶
A new update_pyproject.py script is now included in the boilerplate. It automates keeping your Python dependencies up to date by fetching the latest versions from PyPI and rewriting pyproject.toml in place.
How to get this update¶
Pull it into your project via the speedpy Git remote:
See the Updating page for full instructions.