Scheduler
The Scheduler lets staff queue a Discord embed message to post automatically to a chosen channel at a future date and time, instead of someone needing to be online to send it manually. It's built for planned announcements - events, maintenance windows, and the like - that need to go out on schedule. This is an admin-only tool; there is no player-facing surface.
📸 Screenshot: The scheduler dashboard showing a list of pending scheduled messages alongside available Discord channels
For Staff​
The Scheduler lives at Dashboard → Scheduler (requires zander.web.scheduler, and rides on the Discord feature flag).
📸 Screenshot: The create scheduled message form with channel selector, date/time picker, and embed preview
Scheduling a Message​
| Field | Description |
|---|---|
| Channel | Target text or announcement channel, pulled live from the Discord guild |
| Scheduled For | Date/time the message should post (adjusted for your browser's timezone) - must be in the future |
| Embed Title | Title of the Discord embed |
| Embed Description | Body text of the embed |
| Embed Color | Accent color of the embed |
Pending scheduled messages can be deleted before they go out. The same dashboard page also surfaces the existing Announcements list for context, though announcement management itself is a separate module.
Delivery​
You don't need to have the dashboard open for a message to go out - delivery happens automatically in the background. Every minute, Zander checks whether any scheduled messages are due, sends them to Discord through the bot (with a footer crediting the staff member who created it), and marks each one as sent or failed. This keeps running around the clock, but it can only actually post messages while the Discord bot itself is online and connected.
Feature Toggle​
Scheduler has no dedicated feature flag - it rides on the Discord integration flag:
"discord": false
Both the dashboard page and its underlying API are gated on features.discord.
Behind the scenes, the actions that create or delete a scheduled message don't check permissions on their own - right now they're only protected because the dashboard page that calls them already requires zander.web.scheduler. In practice this means access is safe as long as staff only reach the scheduler through the dashboard, but it's flagged as a gap worth closing so the underlying action is checked directly too, not just the page in front of it.