v0.4.8 — capacity enforcement, branding upload, and admin UX
Pre-release
Pre-release
[0.4.8] - 2026-07-01
Fixed
- Event capacity: pass restore (
status: registered) respects capacity limits; manual create and import share an advisory lock to prevent concurrent over-capacity writes - PATCH reactivation from
cancelledorrevokedtoregisteredenforces capacity the same way as manual create - Event overview
attendee_countexcludes revoked attendees (aligned with capacity enforcement) - Event overview
admitted_countuses the same active scope asattendee_count(excludes revoked/cancelled) - Event capacity counts exclude
cancelledas well asrevokedpasses - CSV import capacity override (
?force=1) recordsforced: trueinattendees_importedaudit metadata - Import overwrite-only commits allowed when
toCreate === 0even if event is already over capacity - Event overview email card surfaces
email_bouncedseparately from failed deliveries - Branding upload validates magic bytes and uses async filesystem I/O
Added
- Admin: logo upload zone in setup wizard (server upload or external HTTPS URL)
- Admin: bounce alert on Communication page with link to delivery log
- Backend:
saveEventUploadhelper for event-scoped branding paths (/uploads/{orgId}/events/{eventId}/…; no HTTP endpoint yet) - Branding save accepts validated
/uploads/…logo paths in addition to HTTPS URLs - Email template render absolutizes
/uploads/…branding assets usingBASE_URL(required for logo in outbound mail) - Admin: revoke and restore pass on attendee detail (PATCH
status, capacity-aware restore) - Admin: CSV import shows
event_fullcapacity banner; superadmin can override with force commit - Admin: TOTP enrollment QR code on Account page
- Admin: device label pre-filled from browser user agent
- Admin: sidebar pin/unpin (desktop), lifecycle nav labels (Passes, Post-event), Administration section
- Event capacity enforcement on manual attendee create and CSV import commit: returns
409 event_fullwhen the limit would be exceeded; instance superadmin may override with?force=1(audited) PATCH /api/admin/events/:eventId/attendees/:idsupportsstatus: registered | revokedwithpass_revoked/pass_restoredattendee action log entries- Local branding upload API:
POST /api/admin/uploads(PNG/JPG/WebP, max 2 MB, superadmin-only) andGET /uploads/*static serve; Docker Compose volume for./uploads - Event overview: separate
email_bouncedcount distinct fromemail_failed(failed + rejected only) - Attendee status
revokedin database (migration) — revoked passes are not admittable at check-in
Deploy
- Container image:
ghcr.io/solarssk/admitto:0.4.8(rolling:0.4) - Migrations apply automatically on container start (with pre-migration backup when pending). No manual
migrate deploy.