Install Eventual RSVP – Core, Registrations, and Tickets on EmDash.
Choose between Registry, sandboxed npm, or native npm installation depending on your host, then add the capacity field pack and required Astro visitor routes.
Host runtime & plan
EmDash >=1.2.0 <2.0.0 (1.4.0 recommended). Sandboxed deployment on Cloudflare requires Workers Paid for the LOADER worker_loaders binding, re-exported PluginBridge, and EMDASH_SITE_URL.
Email plugin required
Configure an EmDash email provider plugin for confirmations, 2-hour waitlist offers, reminders, bank invoice emails, and ticket QR links.
Encryption key (cards only)
Only needed for pasted Stripe secret keys in Tickets. Core, Registrations, free tickets, invoices, Turnstile, and offline evt1.… keys work without it.
Three supported ways to install
Eventual RSVP – Core 0.18.0 is on the EmDash Registry (its npm package follows). Eventual RSVP – Registrations 0.1.0 is on the Registry and on npm. Eventual RSVP – Tickets is coming soon.
Open EmDash Admin → Plugins → Registry, inspect the declared capabilities, and install the plugin published by vermeulen.solutions. Note that standalone Astro UI components (.astro) are still imported from the corresponding npm package.
Eventual RSVP – Tickets joins the Registry and npm when it is released.
Recommended setup: runs each plugin in an isolated Worker sandbox bounded to explicit permissions and the 10-call host budget.
// astro.config.mjs
import { defineConfig } from "astro/config";
import emdash from "emdash/astro";
import eventualAttendance from "@vermeulen.solutions/eventual-attendance";
// Eventual RSVP – Core: install it from the EmDash Registry (its npm package follows).
// Eventual RSVP – Tickets: coming soon.
export default defineConfig({
integrations: [
emdash({
// database, storage, email provider…
sandboxed: [eventualAttendance],
sandboxRunner: "@emdash-cms/cloudflare/sandbox", // on Node: "@emdash-cms/sandbox-workerd/sandbox"
}),
],
});On Cloudflare Workers Paid, add the Worker Loader binding in wrangler.jsonc and re-export PluginBridge from your Worker entrypoint:
// wrangler.jsonc
{
"worker_loaders": [{ "binding": "LOADER" }]
}
// src/worker.ts (your main Worker entry)
export { PluginBridge } from "@emdash-cms/cloudflare/worker";If enabling Stripe card checkout in Tickets, create EMDASH_ENCRYPTION_KEY with npx emdash secrets generate and store it via wrangler secret put EMDASH_ENCRYPTION_KEY.
Use only on trusted self-hosted Node environments where you control all code: runs plugins directly in the site process without sandbox isolation.
// astro.config.mjs (Node hosts you trust only)
import { defineConfig } from "astro/config";
import emdash from "emdash/astro";
import eventualAttendance from "@vermeulen.solutions/eventual-attendance";
// Eventual RSVP – Core: install it from the EmDash Registry (its npm package follows).
// Eventual RSVP – Tickets: coming soon.
export default defineConfig({
integrations: [
emdash({
// database, storage, email provider…
plugins: [eventualAttendance],
}),
],
});Capacity field pack and required Astro pages
Core owns events, venues, and organisers. Registrations and Tickets coordinate per-event ownership through three additive schema fields, then render on dedicated visitor and door-staff pages.
Export collections & merge shared capacity fields
Export Core’s native schema (from its public repository, nothing to install), merge the @vermeulen.solutions/eventual-capacity fields, review the JSON diff, and seed or migrate your collections:
git clone --depth 1 https://github.com/Vermeulen-Solutions/eventual-emdash-sandbox eventual-core node eventual-core/scripts/export-native-schema.mjs --locale fr --output eventual-schema.json npx -p @vermeulen.solutions/eventual-capacity eventual-capacity-fields --merge eventual-schema.json --output eventual-schema-with-capacity.jsonImportant handoff contract: recurring Core feed items have id "<contentId>#<recurrenceId>". Always pass eventId={event.id.split("#")[0]} and occurrenceStart={event.start}.
Add event form & /rsvp/manage page (Eventual RSVP – Registrations)
Place <RsvpForm /> on event pages and create the required self-service page at /rsvp/manage (matching Site setup in Registrations settings):
// src/pages/rsvp/manage.astro import RsvpManage from "@vermeulen.solutions/eventual-attendance/astro/RsvpManage.astro"; <RsvpManage locale="en" /> // On an event detail page: import RsvpForm from "@vermeulen.solutions/eventual-attendance/astro/RsvpForm.astro"; <RsvpForm eventId={contentId} occurrenceStart={event.start} locale="en" />Add /tickets/checkout, /tickets/order & /tickets/check (Eventual RSVP – Tickets)
For Eventual RSVP – Tickets, add <TicketCheckout /> on event pages plus return, buyer order, and authenticated staff door-check routes:
// Event page: import TicketCheckout from "@vermeulen.solutions/eventual-tickets/astro/TicketCheckout.astro"; <TicketCheckout eventId={contentId} occurrenceStart={event.start} locale="en" /> // /tickets/checkout -> <TicketCheckoutReturn backHref="/events" locale="en" /> // /tickets/order -> <TicketOrder checkinPath="/tickets/check" locale="en" /> // /tickets/check -> <TicketCheckin locale="en" /> (keep behind authenticated staff access)