Detailed release notes

  • @vermeulen.solutions/eventual
  • 0.18.0 (14 Nov 2026 · MIT · EmDash Registry)

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).
  • @vermeulen.solutions/eventual-attendance
  • 0.1.0 (14 Nov 2026 · MIT · npm and EmDash Registry)

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.
  • @vermeulen.solutions/eventual-tickets
  • 0.1.0 (coming soon · commercial licence)

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.
  • @vermeulen.solutions/eventual-capacity
  • 0.1.0 (14 Nov 2026 · MIT · npm)

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.

Browse full technical docs →