v2026.10

This is the big release of pending features before the code freeze, so we will be a bit more verbose here than usual. I am extremely pleased to say that with this release, we have achieved feature parity with Version 1 of Midsummer and will now be implementing new features moving forward.

- Tenants / InfrastructureBring-Your-Own Domain support is now available. Tenants can serve their event on their own domain (e.g. register.furrycon.org) with automatic Let's Encrypt TLS provisioning, managed from a new Custom Domains page in Tenant Management. Includes a copy-paste CNAME instruction step and live DNS / SSL verification status.
- Tenants / Infrastructure — A new docs.midsummer.cloud customer documentation site is available with quickstarts for all five modules, an HR / permissions reference, and a deep-linkable error code reference.

- Register — Two new global audit log pages: one for staff edits and forwards of attendee registrations, and the existing merch-adjustment audit table is now reachable from Registration Settings. Together they cover every staff-driven change to a registrant.
- Register — The new Bulk Merch Adjustment tool lets you retroactively add or remove a single merchandise item from every paid registration on a chosen tier in one shot, with a mandatory dry-run preview. The matching change is also written to the tier's included_merch so future registrations stay consistent. Retries are safe — replays of a crashed apply will not double-apply.
- Register — A floating "Ping Management" button in Check-in lets staff send a discreet message to management without leaving the check-in flow. Management gets a unified inbox with conversation threads, polling, and a sound-on-new-message + mute toggle (mirrors the vendor ping pattern).
- Register — Merch Pickup's "Print Receipt" no longer crashes on registrations that have form-configured merch options, and the merch table now correctly displays tier-included item selections (e.g. shirt sizes).
- Register — Reports Center fix: Amount column no longer renders 100× too large, the Level column now resolves correctly, and filtering by Registration Form works.
- Register — Register Metrics's year-over-year historical charts are now tenant + event scoped. Reference data for prior years is served only to the owning tenant/event via a gated API.
- Register — Resilient edit dialog: a single malformed form field now shows a per-field error and the rest of the form keeps rendering instead of throwing halfway through. (Previously, an unknown component type could silently truncate the edit dialog.)
- Register / Merch Pickup — Receipt generation no longer fails on form-sourced merch items that have configured options (e.g. shirt sizes). Tier-included items now display their selected options instead of appearing optionless.
- Register / Reports Center — Amount column divided-by-100 cents fix; Level column uses flat registration_level_name to match the serializer and the rest of the codebase; Registration Form filter returns {uuid,name} to match the levels filter shape and avoid the [object Object] UUID error.
- Register / Check-in edit dialog — Per-field error placeholder with a console.error pinpointing the offending component type, instead of an uncaught throw that aborted the rest of the form.

- Login — Attendees can now return to the page they came from after login via a same-origin ?next= round-trip. Open-redirect and javascript: payloads are rejected.
- Login — Same-origin ?next= validation rejects backslashes, control chars, and non-http(s) schemes (a prior bypass could turn /\evil.com into an open redirect).

- Staff — Added additional gatechecks in HR to allow for non-tenant members to be invited to join staff, even if they do not yet have a Midsummer Account.

- Vendors — Required Tasks are now a configurable, author-driven flow. The vendor ingest form editor gets a new "Required Tasks" tab where you define the task checklist (pay table, register, assistants, sign contract, book hotel, custom link), set per-task markdown descriptions, and define prerequisite locking. Vendor detail renders the configured tasks with built-in completion tracking; owners can self-report simple tasks (book hotel / custom link) without admin intervention.
- Vendors — The vendor ping inbox gets sound-on-new-message and a mute toggle in both the conversation list and chat header.

- Schedule — Hardened the panel-submit drill path so a malformed form-value (e.g. an empty basic-details.value) can no longer 500 a panel proposal submission. The same hardening was applied to the duplicated helpers in register and vendors.
- Schedule / Panel submit — Hardened retrieve_from_data to skip non-dict entries mid-drill instead of raising AttributeError on a string value.

Important Note about Upcoming Feature Freeze

We will be in a feature freeze from July 1st, 2026 to August 15th, 2026. Only bug fixes and at-time changes will be made to Midsummer during that time.

Yuukari

Yuukari

Midsummer Creator