Skip to main content

Configuration

All Zander components share a small set of configuration files. This page is a complete reference for every variable and option across the web platform and each Minecraft plugin.

Web Platform (zander-web)

Environment Variables (.env)

Copy .env.example to .env and populate the following values:

VariableRequiredDescription
PORTNoHTTP port (default: 8080)
siteAddressYesPublic base URL, e.g. https://example.com
TZNoTimezone (default: Australia/Sydney)
sessionCookieSecretYesRandom string, 32+ characters
DATABASE_URLYesMySQL connection string for the main database
LUCKPERMS_URLYesMySQL connection string for the LuckPerms database
QUICKSHOP_URLNoMySQL connection string for QuickShop (shop directory feature)
apiKeyYesAPI key used by Minecraft plugins to authenticate
discordAPIKeyYesDiscord bot token
discordClientIdYesDiscord OAuth2 application client ID
discordClientSecretYesDiscord OAuth2 application client secret
twitchClientIdNoTwitch OAuth2 client ID (Watch feature)
twitchClientSecretNoTwitch OAuth2 client secret (Watch feature)
googleClientIdNoGoogle OAuth2 client ID (YouTube Watch feature)
googleClientSecretNoGoogle OAuth2 client secret (YouTube Watch feature)
youtubeApiKeyNoYouTube Data API v3 key (Watch feature)
VAPID_SUBJECTNoContact email for web push notifications
VAPID_PUBLIC_KEYNoWeb push VAPID public key
VAPID_PRIVATE_KEYNoWeb push VAPID private key

config.json

Copy config.json.example to config.json. Key sections:

{
"debug": false,
"siteConfiguration": {
"siteUrl": "https://example.com",
"siteName": "My Network",
"tagline": "...",
"email": "support@example.com",
"googleTag": "G-XXXXXXXXXX",
"policy": {
"termsOfService": "https://...",
"rules": "https://...",
"privacy": "https://...",
"refund": "https://..."
},
"platforms": {
"webstore": "https://...",
"discord": "https://discord.com/invite/...",
"issueTracker": "https://..."
}
},
"discord": {
"guildId": "YOUR_GUILD_ID",
"supportPanelChannelId": "CHANNEL_ID",
"supportTicketCategoryId": "CATEGORY_ID",
"botChannelId": "CHANNEL_ID",
"webhooks": {
"welcome": "WEBHOOK_URL",
"networkChatLog": "WEBHOOK_URL",
"adminLog": "WEBHOOK_URL",
"staffChannel": "WEBHOOK_URL",
"staffAuditLog": "WEBHOOK_URL",
"staffPunishmentNotifications": "WEBHOOK_URL"
},
"nicknameReportChannelId": "CHANNEL_ID",
"roles": {
"verified": "ROLE_ID",
"muted": "ROLE_ID"
},
"punishments": {
"logChannelId": "CHANNEL_ID",
"appealBaseUrl": "/appeal",
"permissions": {
"can_warn": "zander.discord.punish.warn",
"can_kick": "zander.discord.punish.kick",
"can_ban": "zander.discord.punish.ban",
"can_mute": "zander.discord.punish.mute",
"can_view_history": "zander.discord.punish.history"
},
"requireDmSuccess": false
}
},
"watch": {
"contentChannelId": "CHANNEL_ID",
"contentPingRoleId": null,
"filters": {
"twitch": {
"titleMarkers": ["#cfc", "[cfc]"],
"tags": ["cfc"]
},
"youtube": {
"tags": ["cfc"],
"descriptionMarkers": ["#cfc"]
}
}
},
"events": {
"discordChannelId": "CHANNEL_ID"
},
"staffAuditReport": {
"enabled": true,
"dayOfWeek": "Monday",
"time": "12:00",
"timezone": "Australia/Sydney",
"webhookUrl": "WEBHOOK_URL"
}
}

features.json

This file enables or disables individual platform features. All values are booleans:

KeyDescription
announcementsAnnouncement system
applicationsStaff/player application listings
formsCustom form builder
forumsCommunity forums
supportSupport ticket system
serverServer management
ranksRank system
reportPlayer reporting
shopdirectoryIn-game shop directory (requires QUICKSHOP_URL)
vaultMap/resource vault
bridgeCommand bridge executor
watchCreator content watch page
voteVote tracking and monthly rewards
eventsEvent management
staffAuditReportAutomated staff audit reports
discord.punishmentsDiscord punishment system
discord.events.generalKenobiDiscord join/leave/switch announcements
discord.events.guildMemberBoostServer boost notifications
discord.events.guildMemberVerifyAccount verification events
discord.events.nicknameCheckPeriodic nickname compliance checks
discord.events.unverifiedReminderReminders to unverified members
discord.events.ipAutoDetectIP detection on member join
filter.linkLink/URL filtering
filter.phraseProfanity/phrase filtering
web.loginWeb login
web.registerWeb registration
smDiscord, smTwitter, smYouTube, etc.Social media platform links in the site footer

Minecraft Plugins

zander-addon (plugins/zander-addon/config.yml)

BaseAPIURL: "https://example.com/api"
APIKey: "your-api-key"
features:
policyBook:
enabled: false
slot: 8
socialPaper:
enabled: false
slot: 7

zander-auth (plugins/zander-auth/config.yml)

BaseAPIURL: "https://example.com/api"
APIKey: "your-api-key"
MOTDTopLine: "&e&lMy &2&nMinecraft&r &6&oAUTH Server"

zander-hub (plugins/zander-hub/config.yml)

velocitymultiplier: 3
hub:
world: 'world'
x: 0.5
y: 33.0
z: 0.5
yaw: -180.0
pitch: 0.0
messages:
join: '&7%p% joined.'
leave: '&7%p% left.'
misc:
always_first_join: false
slot_hub_compass: 4
KeyDescription
velocitymultiplierVelocity multiplier applied in the hub world
hub.worldWorld name for the hub spawn
hub.x/y/z/yaw/pitchSpawn coordinates and rotation
messages.join / messages.leaveJoin/leave messages; %p% is replaced with the player name
misc.always_first_joinWhether to always treat every join as a first join
misc.slot_hub_compassInventory slot for the hub compass item

zander-velocity (plugins/zander-velocity/config.yml)

config-version: 1
BaseAPIURL: "https://example.com/api"
APIKey: "your-api-key"
announcementMOTDTopLine: "&e&lMy &2&nMinecraft&r &6&oServer"
announcementTipPrefix: "&7&l[&6&lTIP&7&l]&r "
announcementTipInterval: 10
KeyDescription
announcementMOTDTopLineTop line of the server MOTD
announcementTipPrefixPrefix prepended to rotating tip messages
announcementTipIntervalHow often (in seconds) tips rotate