Configuration

Environment Variables

Required

VariableDescription
DISCORD_TOKENBot token from the Discord Developer Portal

Bot Settings

VariableDefaultDescription
DEV_GUILD_IDGuild ID for instant dev command sync
DATA_DIR./dataDirectory for the SQLite database
LOG_LEVELINFODEBUG, INFO, WARNING, or ERROR
ENVdevelopmentdevelopment or production
FREE_TIER_MAX_EVENTS5Max active events on free tier
PREMIUM_TIER_MAX_EVENTS999Max active events on premium tier

Stripe / Payments

Only required when running the Stripe webhook server for premium subscriptions.

VariableDescription
STRIPE_SECRET_KEYStripe secret key (sk_live_... or sk_test_...)
STRIPE_WEBHOOK_SECRETStripe webhook signing secret (whsec_...)
STRIPE_PRICE_MONTHLYStripe Price ID for the $5/mo plan
STRIPE_PRICE_YEARLYStripe Price ID for the $50/yr plan
WEB_BASE_URLBase URL for the webhook server
WEB_HOSTBind host for the webhook server (default: 0.0.0.0)
WEB_PORTPort for the webhook server (default: 8080)
STRIPE_SUCCESS_URLRedirect URL after successful Stripe checkout
STRIPE_CANCEL_URLRedirect URL when checkout is cancelled

Server Settings

Run /server_settings as a server admin. The UI has three pages:

Page 1 — Roles & Permissions

FieldDescription
Admin RolesDiscord roles with full bot management access
Organizer RolesDiscord roles that can create and manage events
Attendee RolesDiscord roles that can RSVP to events

Multiple roles can be assigned per level. Members with any matching role get that permission level.

Permission resolution order (highest wins):

  1. Member has a role listed under Admin Roles → ADMIN
  2. Member has a role listed under Organizer Roles → ORGANIZER
  3. Member has a role listed under Attendee Roles → ATTENDEE
  4. Member has Discord’s built-in Administrator permission → ADMIN
  5. Default → ATTENDEE

Additionally, the organizer of a specific event always has organizer-level access to their own event, even without a role assignment.

Page 2 — Bulletin

FieldDescription
Bulletin ChannelChannel where event embeds are posted after creation
Use ThreadsWhen enabled, creates a thread per time slot on each bulletin

Threads help keep slot-specific discussion organized without cluttering the main channel.

Page 3 — Display

FieldDescription
Time FormatServer default: 12-hour (3:00 PM) or 24-hour (15:00)

Members can override this individually with /settings.

User Settings

Each member configures their own preferences with /settings:

SettingDescription
TimezoneIANA timezone string (e.g. America/New_York, Europe/London)
Time FormatPersonal override: 12-hour or 24-hour

The bot requires a timezone to be set before a member can RSVP to an event. If not set, the bot will prompt the member to configure it inline.

Common timezone values

RegionValue
US EasternAmerica/New_York
US CentralAmerica/Chicago
US MountainAmerica/Denver
US PacificAmerica/Los_Angeles
UKEurope/London
Central EuropeEurope/Berlin
JapanAsia/Tokyo
Australia EasternAustralia/Sydney

Any valid IANA timezone is accepted.