Repository navigation
Calendar invites for board meetings (both chapters) - #98
Merged
Merged
Conversation
Admins schedule meetings on the Meetings tab: title, date, start and end, location or Zoom link, notes, weekly with an end date, and who to invite (whole board, one team, or picked members). The form shows who has no email on file, asks "Send invites to N people?" and can send a test invite to an address prefilled with the chapter's organizer. Invites go through Brevo's SMTP relay with nodemailer so the .ics arrives as text/calendar; method=REQUEST (or CANCEL) and Gmail, Apple Mail and Outlook show Yes / Maybe / No. Each meeting keeps one UID; edits resend with SEQUENCE+1 (removed invitees get a cancellation, added ones the invite), and cancelling one date of a series sends CANCEL with RECURRENCE-ID. The .ics has a VTIMEZONE for America/Los_Angeles, an RRULE for weekly meetings and each invitee as an ATTENDEE with RSVP=TRUE. Upcoming meetings show on the Meetings tab and on My page; past dates with nothing logged offer the log form, prefilled. New variables: BREVO_SMTP_LOGIN, BREVO_SMTP_KEY, BOARD_INVITE_FROM. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QzNDQSmhjgKE63rwUnwcMq
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
PR 2 of 2, on top of #97 (merged).
What changes
Schedule a meeting (admins only, Meetings tab, both chapters)
The invites
icalEventmakes atext/calendar; method=REQUESTpart (orCANCEL) plus aninvite.icsattachment. Everything else still uses the Brevo API.METHOD:REQUESTorCANCEL.<chapter>-<uuid>@getvindicated.org, stored with SEQUENCE in the newboard_scheduledtable.VTIMEZONEfor America/Los_Angeles.RRULE:FREQ=WEEKLY;BYDAY=…;UNTIL=…, with UNTIL in UTC.EXDATElists dates that were cancelled.ATTENDEEwithRSVP=TRUE.lib/board/chapter-server.ts.METHOD:CANCELwithRECURRENCE-ID. Cancelling the whole meeting sendsMETHOD:CANCELand deletes it.docs/vindicated-invite-preview.html:BOARD_INVITE_FROM, named "VINdicated at UCLA" or "VINdicated at Berkeley", with reply-to set to the organizer.Railway variables to set
BREVO_SMTP_LOGIN: Brevo → SMTP & API → SMTP, the login shown there.BREVO_SMTP_KEY: an SMTP key generated on that same page.BOARD_INVITE_FROM: e.g.board@getvindicated.org.Until all three are set, scheduling returns a clear "Invites aren't set up yet" message. The rest of the board works as before.
Tested locally
These were run against local Postgres, with
BOARD_INVITE_OUTBOXwriting each email to a file instead of sending it. The .eml files were checked with Python'semailparser and theicalendarlibrary.text/plain,text/html,text/calendar; method=REQUEST|CANCEL, and theinvite.icsattachment.RRULE:FREQ=WEEKLY;UNTIL=20261123T075959Z;BYDAY=SU, which is Nov 22 23:59:59 Pacific.METHOD:CANCEL,RECURRENCE-ID2026-11-22 18:30 −08:00 (standard time handled).METHOD:CANCEL, and the row was deleted.tsc,lintandbuildpass.To check after deploy (can't be done from here)
/board/ucla→ Meetings → Schedule a meeting, use Send me a test invite to your Gmail. It should show Yes / Maybe / No.Generated by Claude Code