Events
Zander's event system gives your team a structured way to plan, review, and publish community events - from casual game nights to tournaments - with optional Discord sync, template-driven scheduling, and a clear approval workflow.
📸 Screenshot: The public events page showing upcoming event cards with titles, dates, and host names
For Players​
Community events are listed publicly at /events - the next 6 upcoming published events, plus a paginated (12/page) list of all published events past and future, newest first. Each event shows:
- Event title and description
- Start and end time
- Host(s), with avatars
- Location - a Discord voice channel, a Minecraft server, or free text
- Tags and external links
- A link to add the event to your calendar
Each event also has its own page with full details. Players only ever see events that staff have finished reviewing and made public - anything still being drafted, waiting for approval, or marked private stays invisible on the public site. Players can't submit their own events; only staff can create them, through the dashboard.
Check the events page regularly for upcoming community activities. Events are published once they have been reviewed and approved by staff.
For Staff​
Staff manage events through Dashboard → Events.
Event Lifecycle​
Every event moves through a defined set of stages before it is published:
| Stage | Description |
|---|---|
| Draft | Created but not yet ready for review - visible only to staff |
| Pending Review | Submitted for approval - awaiting sign-off from a reviewer |
| Approved | Approved and ready to publish |
| Published | Live and visible to the public at /events |
| Cancelled | Cancelled after publication - remains visible with a cancelled status |
| Archived | Closed out after completion |
| Rejected | Sent back to the creator with a note; returns to Draft |
Approving an event immediately makes it public and lines up any announcements for it. If you need to change an event that's already public, use Update Published - it keeps the event live while applying your changes, and makes sure Discord and the website pick up the update.
📸 Screenshot: The event dashboard list view showing events at various lifecycle stages
Creating an Event​
- Go to Dashboard → Events → Create.
- Fill in the Details tab: title, event type, visibility, start/end date-time, timezone, description, location (Discord voice channel / Minecraft server + IP / other free text), tags, an optional "From Template" selector, and a featured toggle.
- Fill in Branding (banner image + logo/thumbnail), Hosts (linked accounts or Discord users, each with a role), Actions (in-game commands to run via the bridge executor on publish/update/cancel), and Announcements (see below).
- Save as a draft, then click Submit for Review when ready.
Required fields to create a draft: title, startAt, endAt.
Draft or rejected events can be edited by their creator (with edit permission) or any reviewer. Once an event is pending review, approved, or published, only reviewers can edit it.
Approving Events​
The review queue is at Dashboard → Events → Review and requires zander.web.events.review.
| Action | Description |
|---|---|
| Approve | Approves the event and immediately publishes it, scheduling its announcements |
| Reject | Sends the event back to Draft with an optional note for the creator |
| Revert to Draft | Reviewers can also manually send an event back to Draft |
📸 Screenshot: The review queue showing pending events with approve/reject actions
Cancelling, Archiving, and Duplicating​
| Action | When to Use |
|---|---|
| Cancel | The event is no longer happening. An optional reason can be recorded; any pending announcements are cancelled too. |
| Archive | The event has concluded. Removes it from the active events feed. |
| Duplicate | Clones any event into a new draft - useful for recurring events that aren't yet templated. |
Event Templates​
Templates let you set up a recurring event once - say, a weekly game night - and have Zander automatically create a new draft event for it on schedule, so you don't have to rebuild it from scratch each time.
Dashboard → Events → Templates (requires zander.web.events to view, .edit to create/edit).
Creating a Template​
- Create a new template with a title.
- Define the event structure (description, hosts, actions, announcements).
- Set a day-of-week-based recurrence schedule.
Auto-Generation​
Every hour, Zander checks your templates in the background and:
- Checks for active templates whose next-generate time has passed.
- Creates a new draft event from the template.
- Updates the template's next generation timestamp.
- Cleans up any stale template-generated drafts that were never published and whose scheduled time has already passed.
📸 Screenshot: The event templates page showing active recurring templates with their schedules
All auto-generated drafts still go through the normal review and approval workflow before being published.
Discord Sync and Announcements​
Events can optionally sync to Discord in two ways, configured per-event on the Actions tab:
- Discord message - posts (and updates/cancels) a channel announcement message.
- Discord Guild Scheduled Event - creates a native Discord scheduled event tied to the event.
Separately, an event can have announcements attached - reminders sent to Discord or shown in-game (server list, chat tips, website banner, popup) before, during, or after the event. You choose when each one goes out (e.g. "1 hour before start") and write its message once.
Zander checks every minute in the background for announcements that are due and sends them. The target Discord channel is configured in config.json:
"events": {
"discordChannelId": "CHANNEL_ID"
}
Permissions​
| Permission | Description |
|---|---|
zander.web.events | View the dashboard calendar/list/detail (read-only) |
zander.web.events.edit | Create events, edit draft/rejected events, create/edit templates |
zander.web.events.review | Review queue access, approve/reject/publish, edit approved/published/pending events (implies edit) |
Feature Toggle​
"events": false
Disabling this hides the /events page and returns feature-disabled responses from all events API endpoints.