v0.4.7 — overview, locale, requirements runtime, and export hardening
Pre-release
Pre-release
[0.4.7] - 2026-06-30
Security
- Rate-limit admin export endpoints: PII export 5/h, attendees/reports export 10/h per user per route (global across events)
Added
- Bulk Send tickets on the attendees list:
POST .../attendees/bulk-resendwithtargetunsent(default,purpose: initialwith atomic claim) orall(resend, max 500 per request); rate limit 3 requests per 10 minutes per admin; response reports provider-accepted (queued),skipped, andfailedcounts; confirmation modal in admin SPA; audit viamail_bulk_resendin attendee action log - CSV import preview: first 20 valid rows returned as
sampleRowswithattributeFieldLabels; admin Import page shows a scrollable "Data preview" table before commit (dynamic optional columns + event custom attributes) - Requirements v2 (admin): Tabler icon picker on event items (
EventItem.icon); contents metadata (type,required,options); ops-config flagsallow_manual_lookupandauto_advance_on_valid(defaults true) - Check-in runtime: enforces
allow_manual_lookup(403 on lookup API; UI hides manual lookup and blocks short-query lookup);auto_advance_on_validclears scan state after VALID admission;GET /api/checkin/ops-config; item icons on AttendeeCard (Tabler) - Contents metadata runtime: enforce
type/select/boolean/required/optionson attendee create and patch; type-aware admin fields; required markers and formatted values on check-in item detail - CSV import: dynamic event-item attribute columns (
source_fieldslugs) validated and stored incustom_data; template includes configured fields; export-style label headers accepted on re-import - Per-user preferred locale (
User.preferred_locale) with date-format picker on Account page; admin SPA date displays respect the stored locale via module-level locale store - Per-event IANA timezone on events — create/settings/wizard picker, reports/exports/mail preview use event timezone
- Event overview dashboard at
/admin/events/:id/overviewwith admission rate, email delivery stats, event countdown, and dedicatedGET /api/admin/events/:eventId/overviewendpoint
Fixed
- Event settings PATCH:
audit_failed500 uses{ error }shape - Communication template editor: cursor restored after inserting placeholders into subject/body fields
- Event overview: auto-refresh stats every 30s during event
- CSV import: ignore
source_fieldslugs that collide with standard import columns (email,company, etc.); event item contents API and admin form reject those reserved slugs on save - CSV import: validate merged
custom_dataat commit (including overwrite with existing attributes); return 400 when event attribute config has conflicting select options - Settings tabs preserve in-progress panel state (drafts, filters) when switching tabs without eager-loading every panel on first visit
Changed
- Settings: replace mixed SPA/SSR horizontal tabs with four grouped in-app tabs (General, Security, Archiving, Identity); OIDC and Cloudflare Access remain server-rendered manage links
- Admin timestamp display clarity: event operational times use event timezone with abbreviation; admin/system times (audit log, mail deliveries, sessions, archived_at) always show UTC with label
client-ip/ healthz rate-limit helpers importresolveTrustProxyfrom lightweightenv-flagsmodule (avoids flaky CI load of@admitto/authbarrel →@admitto/tickets→ Prisma singleton)- Shared
@admitto/sharedlocale whitelist (SUPPORTED_LOCALE_TAGS) used by API validation and Account picker; invalid DB values sanitized on read - Audit log date filters use UTC calendar-day bounds (aligned with UTC table display)
- Existing events migrated to UTC — update timezone in Event Settings after deploy
- Known limitation: Account page TOTP enrollment still shows an
otpauth://URI string (HTML/mfa/enrollshows QR; SPA QR deferred to v0.5)
Deploy
- Container image:
ghcr.io/solarssk/admitto:0.4.7(rolling:0.4) - Migrations apply automatically on container start (with pre-migration backup when pending). No manual
migrate deploy.