Agent-readable docs index: /llms.txt. Full docs in one file: /llms-full.txt. Download /docs.zip to grep all markdown files locally.

Emails & Calendar

OpenSession sends transactional emails at key moments in the event lifecycle. No email service to configure. The Cloudflare send_email binding handles delivery directly from the worker.

Email types

Email kindTriggerContains
Submission confirmationSpeaker submits a talkTalk title, event name, portal link
Decision: acceptedOrganizer notifies from Accept QueueCongratulations, next steps, portal link
Decision: declinedOrganizer notifies from Decline QueueThank you message, event info
Task assignedTalk accepted (auto-created tasks)Task name, due date, portal link
Task reminderApproaching due date (cron)Task name, days remaining, portal link
Schedule inviteSession placed on agendaICS calendar attachment
Schedule updateSession moved on agendaUpdated ICS with bumped sequence
Schedule cancelSession removed from agendaICS cancellation
Draft reminderIncomplete CFP submission approaching closeForm link, days remaining

Reply-to the organizer

Every email is sent from notifications@opensession.dev, but the Reply-To header is set to the event's contact email (the organizer's email by default, editable in Settings). When a speaker hits reply, the message goes directly to the organizer.
┌─────────────────────┐ ┌─────────────────────┐ │ OpenSession sends │ │ Speaker receives │ │ from: notifications│──────────────>│ email with ICS │ │ reply-to: organizer│ │ attachment │ └─────────────────────┘ └──────────┬──────────┘ │ │ Speaker replies v ┌─────────────────────┐ │ Reply goes to │ │ organizer@event.com│ └─────────────────────┘

Calendar invites (ICS)

When a session is placed on the agenda, OpenSession generates an RFC 5545 ICS calendar invite and attaches it to the email. The invite:
  • Uses a stable UID (session-{id}@opensession.dev) so calendar apps recognize updates
  • Includes a SEQUENCE number that increments on every schedule change
  • Sets METHOD:REQUEST for new invites and METHOD:CANCEL for removals
  • Shows the session title, room, and time in the calendar event
Gmail, Outlook, and Apple Calendar display these as native calendar events with accept/decline buttons. Moving a session on the agenda sends an updated invite; removing it sends a cancellation.

The email outbox

Every outgoing email goes through an outbox in the database. This provides:
  • Deduplication: each email has a unique key (e.g. decision:{sessionId}:{speakerId}). Sending the same notification twice is impossible.
  • Retry logic: failed emails are retried automatically by the cron job with a bounded attempt count.
  • Audit trail: the admin Emails page shows every message with status, timestamps, and delivery details.
Email outbox showing sent and queued messages

Automatic reminders

The cron job (runs every 5 minutes) checks for:
ReminderWhen it fires
Task due in 3 days3 days before the task's due date
Task due tomorrow1 day before the task's due date
Task overdueAfter the due date passes
Draft reminder (3 days)3 days before the CFP form closes
Draft reminder (1 day)1 day before the CFP form closes
Each reminder is deduplicated by day in the outbox key, so speakers never receive duplicate reminders on the same day.