Eventual RSVP – Core#
Release history from initial sandboxed calendar plugin (0.5.0) through native EmDash collections, opt-in cache metadata (0.15.0), multilingual calendar links (0.17.0) and 21 admin languages (0.18.0).
Note: Core is published on the EmDash Registry; an npm package follows in a later release.
0.18.0 — 2026-11-14
- New name: Eventual RSVP – Core (formerly Eventual). The plugin ID stays
eventual, so sites update in place; admin texts point to the Event settings page.
- Admin in 21 languages, Arabic and Hebrew right to left. English is built in; the other languages are hash-checked language packs from
@vermeulen.solutions/eventual-locales, downloaded on first use. Table buttons and status badges are translated too.
- New permission:
network:request to cdn.jsdelivr.net, only for those language packs. Administrators approve the plugin again when updating.
- Busy months no longer break the public calendar: web addresses are looked up once per language instead of once per event, so a full month stays within the sandbox’s 10 calls.
0.17.0 — 2026-11-07
- Complete UI localization dictionaries for German (
de), Dutch (nl), and Spanish (es) alongside French (fr) and English (en) via normalized resolveLanguage.
- One-click “Add to Calendar” links (
buildCalendarLinks) for Google Calendar, Outlook Web, Office 365, and direct desktop/Apple .ics downloads on PublicEvent and <EventList showCalendarLinks={true} />.
- Single-event hydration query support (
eventId parameter on publicEvents) handling both parent IDs and occurrence IDs.
- Zero new capabilities, schemas, or MCP tools (
EmDash >=1.2.0 <2.0.0).
0.16.0 — 2026-11-02
- Parallelized public feed hydration and asset lookups via
Promise.all, reducing Worker Loader RPC round-trips.
- Added
Cache-Control: public, max-age=3600, must-revalidate to publicEventImage responses.
- Exposed optional
imageMedia (src, width, height, alt) on PublicEvent for direct Astro optimization while preserving imageUrl.
0.15.0 — 2026-11-01 (Registry release)
- Opt-in typed cache dependency and expiry metadata on native public feeds (capped at 15 seconds remaining lifetime, never serving stale data, requiring
EmDash >=1.4.0 <2.0.0).
- Direct runtime SSR dispatch helpers, timezone midnight boundary parsing, and Registry
pluginId option on feed helpers.
0.14.1 — 2026-10-30
- Compatibility verified against EmDash
1.2.0 and 1.4.0 (1.4.0 recommended for nested Block Kit form fixes and Cloudflare plugin mutations).
0.14.0 — 2026-10-14 (breaking)
- Public reads no longer fall back silently to legacy internal plugin storage when native collections are unset; administrators can explicitly enable Show old events saved inside the plugin (
legacyReads) during migration.
0.13.0 – 0.13.4 — 2026-10-07 to 2026-10-11 (breaking modernization)
- Migrated event, venue, and organiser ownership to native EmDash collections (
content:read, content:write, content:publish, rich text, drafts, revisions, translations).
- Added request-scoped RPC accounting (
<= 10 calls), public featured image streaming route, and publicUrls=false feed option.
0.5.0 – 0.11.1
- Earlier milestones: initial MIT sandboxed release (
0.5.0), 15–16 eventual__* MCP tools & dashboard widget (0.6.0), occurrence date overrides & monthly/weekly DST recurrence rules (0.7.0), seven zero-JS visitor views (0.8.0), Block Kit paged tables (0.9.0), stale-form protection (0.10.0), physical/virtual/hybrid events + JSON-LD + CSV/ICS transfer (0.11.0), and Editor-level content:edit_any permissions (0.11.1).
Eventual RSVP – Registrations#
Release notes for Eventual RSVP – Registrations 0.1.0 (released 14 November 2026), MIT-licensed free event registrations, waiting lists, approval queues, door lists, and privacy sweeps.
0.1.0 — 2026-11-14
Registration, approval, and places
- Occurrence-scoped registrations for single and recurring dates sharing capacity, settings, and queues across event translations.
- Zero-overselling seat ledger backed by revision-checked compare-and-set (
eventual-capacity) and idempotent command submissions (commandId).
- Closed by default; accepts registrations only on published, non-ticketed events (
inventory_mode != "tickets").
- Custom per-event questions (required/optional short text, long text, choice, checkbox) validated server-side with French/English error messages.
- Per-event approval mode (
requireApproval, configurable 1–720 hour decision window) holding requested places as pending until approved/declined in Admin or auto-expired by attendance-approvals (*/5 * * * *), with optional organiser notification emails.
- Confirmation screen includes a direct “Manage or cancel this registration” link alongside an inbox notice only when an email is sent/queued (
email: "sent" | "queued").
Waiting list and self-service security
- Strict first-in, first-out waiting list with live queue position display, round-robin cron promotion (
waitlist-maintenance), 2-hour held offer emails, and manual admin “move queue head to end” control.
- URL
#fragment HMAC-signed links (cancel, waitlist/claim) stored by hash only using a KV-generated signing key (no EMDASH_ENCRYPTION_KEY needed), posting only on explicit button confirmation.
- Opt-in Cloudflare Turnstile check (
challenges.cloudflare.com), honeypot/timing validation, and per-IP rate limiting (10 bookings / 10 minutes via keyed ipHash when Turnstile is off).
Admin operations, notifications, and privacy
- Weekly capacity overview table (“When sessions fill up” / “Quand les séances se remplissent”) and heatmap in each event’s local IANA time zone (
formatInZone, UTC fallback).
- Printable HTML and CSV door lists following selected event/date filters (with
Local time / Heure locale column) and mobile door check-in (Check in / Undo).
- Separate Registrations, Door list and Registration settings pages; questions are edited as rows; the pages follow the admin’s language (21 languages, including Arabic and Hebrew right to left), while the plugin sidebar labels stay English.
- Trash protection blocking deletion of events carrying live upcoming registrations.
- Bilingual notifications (confirmations, waiting-list notices, 2-hour claims, approval updates,
attendance-reminders hourly/minute sweep, .ics links, Reply-To override).
- Configurable personal-data retention sweep (
attendance-retention, 30–3650 days, 365 default) and on-request admin erasure preserving anonymised counts as Erased (—).
- WCAG 2.2 AA accessibility (
axe-core checked at 1280×800 and 320×640), --eventual-* light/dark theming tokens, keyboard navigation, email snapshots, and full Playwright organiser/visitor usability verification.
Eventual RSVP – Tickets#
Release notes for Eventual RSVP – Tickets 0.1.0 (coming soon), commercial ticketing with Stripe Checkout, bank transfer invoices, QR tickets, refunds, and offline licensing.
0.1.0 (coming soon)
Ticket types, Stripe Checkout, and pay by invoice
- Up to 20 event-level ticket types (
name, minor-unit integer price incl. zero-decimal currencies such as JPY or Free, optional per-date quota bucket inside overall event capacity, per-order limits 1–50, sales window) and question rows. The event panel, Orders page and setup page follow the admin UI’s language (English or French).
- Atomic seat holds synced with Stripe Checkout Sessions (
31-minute expiry complying with Stripe’s >=30-minute minimum) and idempotent commandId submission.
- Raw-byte HMAC-SHA256
stripe/webhook receiver (stripe-signature), verifying amount_total and currency (AMOUNT_MISMATCH), handling post-expiry late payments (PAID_NO_SEATS auto-refund trigger), and retrying on transient errors (503).
- Free ticket confirmation and pay-by-invoice / bank transfer orders work without
EMDASH_ENCRYPTION_KEY or Stripe secrets; invoice instructions email buyers with payment reference (ord_…) and self-service order link while holding places until marked paid in Admin → Orders.
- Automatic overdue hold sweep (
tickets-hold-sweep) asking Stripe session status before releasing holds.
Buyer order portal, door check-in, refunds, and offline licence
- Self-service
<TicketOrder /> portal accessed via URL #fragment HMAC token, showing large browser-generated QR codes (qrcode-generator), 64-character hex fallback codes, and pre-deadline cancellation rules (releasing places or requesting idempotent Stripe refunds).
<TicketCheckin /> staff door page supporting phone camera link scans, BarcodeDetector scanning, or typed codes; prevents double entry and blocks refunded/unpaid orders.
- Automatic (
tickets-auto-refund every 5 minutes) and manual admin Stripe refunds (charge.refunded reconciliation) plus single-use formula-safe Orders CSV export with Local time.
- Licence activation: paste the licence code from the purchase email into Admin → Tickets → Licence and click Activate; the site fetches its key once from
licences.vermeulen.solutions. Refresh and Deactivate (to move the licence to another site) are on the same page.
- Offline Web Crypto Ed25519 licence key (
evt1.…) verifying hostnames and build updates date (updatesUntil) locally with zero network calls; localhost/preview hosts (localhost, *.workers.dev, *.pages.dev) exempt; existing orders and check-in always continue working.
- Visitor components, transactional emails and the admin in 21 languages (Arabic and Hebrew right to left; admin and email texts as hash-checked language packs from
cdn.jsdelivr.net), retentionDays (30–3650, default 365) erasure preserving bookkeeping figures, WCAG 2.2 AA axe-core audit, --et-* theming verification, and Playwright test coverage.
eventual-capacity#
Release notes for eventual-capacity 0.1.0 (released 14 November 2026), shared MIT-licensed ledger, call-budget, time zone, field pack, and verification utilities.
0.1.0 — 2026-11-14
budget: RpcBudget, BudgetSlice, and logWithin to stay strictly under EmDash’s default 10 host subrequests per request/cron invocation.
ledger & holds: Pooled revision-checked compare-and-set seat ledger (reserveSeats, holdSeats, adjustLedger, freeSeats) with per-tier buckets, FIFO waiting-list positions, and validated IANA time zones.
inventory & field-pack: Mutual exclusivity enforcement (rsvp vs tickets) plus export-capacity-fields.mjs additive blueprint script.
time: formatInZone, zonedParts, validTimeZone, eventTiming (reading Core start/end/all_day/timezone with start_date/end_date fallback).
tokens, secret, validation, questions, ics, reconcile, turnstile, schedules: Purpose-prefixed #fragment HMAC tokens, self-generated KV signing keys, custom question validator (QuestionIssueCode), .ics calendar builder, quiet-period CAS ledger reconciliation, Turnstile check, and progressive cron schedule recovery.
testing: Runtime test-host bridge counter harness (withBudget, expectWithinBudget).
- Bundled into Eventual RSVP – Registrations and Eventual RSVP – Tickets at build time; it is not a plugin and is not published on its own.