In Development Release Notes
The development release notes are generated by AI and may contain errors.
Version 2026.6
Section titled “Version 2026.6”This release focuses on security hardening across auth and demo views, adds team-scoped Celery tooling, and includes a number of smaller improvements and fixes.
Security hardening
Section titled “Security hardening”A pass over a few endpoints to close off ways they could be misused:
- Logout now requires a
POST. A small JavaScript shim (logout.js) converts logout links into POST submissions so a stray<img src="/accounts/logout/">(or a link prefetcher) can no longer log users out via GET. When JS is disabled, allauth’s confirmation page is used as a fallback. - Email confirmation now requires a
POST. The confirmation page auto-submits the form via JavaScript so real users keep the one-click experience, while email security scanners and prefetchers that don’t run JS won’t silently consume the confirmation token. A spinner is shown while the form submits. - Restricted the
simulate_errorview to superusers. Previously it was publicly accessible. - Documented that the API schema and docs endpoints (
/api/schema/, Swagger, ReDoc) are public by default, with inline guidance on how to restrict them (e.g.permission_classes, gating onDEBUG, or removing them). - Avatar upload validation failures now return a
400instead of a403. - Added a baseline set of pre-commit hooks (YAML check, end-of-file, trailing whitespace, merge-conflict, large-files).
Team-scoped Celery tooling
Section titled “Team-scoped Celery tooling”New helpers to make it easier to write team-aware background tasks and lookups without forgetting to filter by team:
- Added a
@team_taskdecorator (apps/teams/celery.py) for team-scoped Celery tasks. It treats the task’s first argument as ateam_id(positional or keyword), loads the team, and runs the task body inside the team context so the team-scopedobjectsmanager just works. Failing to load the team raisesTeam.DoesNotExistby design rather than silently no-op’ing. - Added a
get_team_object_or_404shortcut (apps/teams/shortcuts.py) that scopesget_object_or_404to the current team context, avoiding accidental cross-team lookups via the unfiltered default manager. - Added tests for both.
Other Changes
Section titled “Other Changes”Added
- Markdown rendering now supports tables, via the markdown
TableExtension. - Added a
pegasus-projectsClaude Code skill (shipped into generated projects) covering the new projects CLI commands.
Changed
- Refactored
get_image_urlmeta-tag handling. Default and page images are now resolved throughstatic()consistently, and absolutehttp(s)URLs are passed through untouched. - Gated the dashboard app behind paid tiers (URLs and app are only included on non-free configurations).
- When a user changes their email to an address they already own, the primary allauth
EmailAddressis now kept in sync (the new-email case was already handled by the confirmation signal). - The admin DB MCP tool now bundles
mcp-alchemyinto the virtualenv so it works in production withoutuvx, and usespsycopg3instead ofpsycopg2. - Marked
package.jsonas private and removed placeholder author/description/homepage fields. - Deployment config now wires through social login secrets, Stripe live-mode, and log levels across the additional deploy targets.
- CI now uses
uv sync --frozento match local development. - Updated AI rules (project Python version, PEP 758
exceptsyntax, multi-line template comments) and theresolve-pegasus-conflictsandupgrade-pegasusskills. - Bumped the CLI versions.
Fixed
- Added
min-w-0to the app content flex item to prevent content overflow. - Narrowed the admin/health-check mypy overrides and tightened a few type annotations.
Upgrading
Section titled “Upgrading”- Logout and email confirmation now require
POST. Pegasus handles this for you via the bundledlogout.jsshim and the auto-submitting confirmation page, but if you have custom logout links or a custom email-confirmation template, make sure they submit via POST (with a CSRF token) rather than relying on GET. - If you have any custom Celery tasks that operate on team-scoped models, consider migrating them to the new
@team_taskdecorator andget_team_object_or_404shortcut.