Skip to main content

Configuration Reference

Complete guide to every XDiscordUltimate setting in config.yml. XDiscordUltimate uses YAML for configuration.
Configuration location: plugins/XDiscordUltimate/config.ymlThe file is generated automatically on first startup with sensible defaults. Edit it, then run /xdiscord reload — no restart required for most settings.

Quick Start

1

Generate the config

Start your server once. XDiscordUltimate drops a default config.yml into plugins/XDiscordUltimate/.
2

Set the minimum required values

At minimum, fill in discord.bot-token and discord.guild-id. Nothing works without them.
3

Enable the modules you want

Each feature lives under features.<module> and toggles with enabled: true|false.
4

Reload

Run /xdiscord reload (permission xdiscord.admin) to apply changes without restarting.
Enable debug mode (general.debug: true) to get verbose, per-module log output while you’re tuning things. Turn it back off for production.

Top-level structure

adminIDs: []          # Discord user IDs who receive admin alerts / DMs
general: {}           # Plugin-wide settings
features: {}          # One block per module (19 total)
discord: {}           # Bot token, guild, activity, channels
database: {}          # SQLite | MySQL | PostgreSQL
messages: {}          # Cross-module message formats
advanced: {}          # Thread pool, cache, rate limits
discord-console: {}   # Discord-side console mirror channel

Configuration Categories

adminIDs:
  - "917098673127694428"
Discord user IDs (as strings) treated as plugin administrators. Members of this list receive admin-alert DMs and notifications. Enable Developer Mode in Discord (User Settings → Advanced → Developer Mode), right-click your profile → Copy ID.
general:
  debug: false
  default-language: "en_US"
  language: "en_US"
  check-updates: true
KeyDefaultDescription
debugfalseVerbose per-module logging.
default-languageen_USFallback locale for players without a preference.
languageen_USConsole/default language.
check-updatestrueCheck for new releases on startup.
20 locales ship out of the box: en_US, ar_SA, cs_CZ, de_DE, es_ES, fr_FR, hi_IN, id_ID, it_IT, ja_JP, ko_KR, nl_NL, pl_PL, pt_BR, ru_RU, sv_SE, th_TH, tr_TR, vi_VN, zh_CN.
discord:
  bot-token: "YOUR_BOT_TOKEN"
  guild-id: "YOUR_GUILD_ID"
  guild-name: "Our Discord Server"
  invite-url: ""
  activity:
    type: "PLAYING"
    text: "with %players%/%max% players"
    status: "ONLINE"
  commands:
    use-slash-commands: true
    legacy-prefix: "!"
  text-command-prefix: "!"
  channels:
    welcome: ""
    logs: ""
    chat: ""
    console: ""
    events: ""
    tickets: ""
    moderation: ""
KeyDescription
bot-tokenBot token from the Discord Developer Portal. Required.
guild-idTarget server ID. Required. Slash commands register to this guild.
guild-nameDisplay name used in messages/embeds.
invite-urlReturned by the /discord command.
activity.*Bot presence (type: PLAYING / WATCHING / LISTENING / COMPETING; status: ONLINE / IDLE / DO_NOT_DISTURB).
commands.use-slash-commandsRegister Discord slash commands.
commands.legacy-prefix / text-command-prefixPrefix for legacy text commands.
channels.*Default channel IDs reused across modules.
Placeholders in activity.text: %players% (online), %max% (max slots).
database:
  type: "sqlite"          # sqlite | mysql | postgresql
  sqlite:
    file: "data.db"
  mysql:
    host: "localhost"
    port: 3306
    database: "xdiscord"
    username: "root"
    password: "password"
    ssl: false
Zero-config. Just set type: sqlite and optionally the file name. Great for single servers.
The schema is created automatically on first run. A schema_versions table tracks migrations — future upgrades apply automatically.
Every module is a block under features toggled by enabled. The 19 modules:
KeyModule
chat-bridgeTwo-way chat sync
server-loggingJoin/leave/death/command/advancement logs
verificationDiscord↔Minecraft account linking
server-controlRun allowed commands from Discord
admin-alertsTPS/RAM health alerts
ticketsSupport ticket system
moderationBan sync, chat filter, reports
bot-consoleText-prefixed console in a channel
announcementsCross-platform broadcasts
player-statsStatistics tracking
server-statusAuto-updating status embed
booster-perksDiscord booster rewards
welcome-dmWelcome DM on join/verify
leaderboardTop-players embed
activity-rolesPlaytime-based Discord roles
voice-channelsPlayer-count + dynamic voice channels
economy-bridgeVault economy link (Discord transfers)
server-ip/ip server address module
whitelistDiscord-driven whitelist requests
See the individual feature pages for each module’s full option set.
features:
  verification:
    enabled: true
    one-time-only: false
    kick-after-minutes: 0
    whitelist-mode: false
    verified-role: "Verified"
    verified-group: "verified"
    sync-nickname: true
    code-length: 6
    code-expiry-minutes: 5
    verify-cooldown-seconds: 30
    failed-attempt-cooldown-seconds: 5
    max-verify-attempts: 5
    verify-lockout-seconds: 300
KeyDefaultDescription
one-time-onlyfalseIf true, a code can only be used once across the network.
kick-after-minutes0Kick unverified players after N minutes (0 = off).
whitelist-modefalseRequire verification to play.
verified-roleVerifiedDiscord role granted on link.
verified-groupverifiedLuckPerms group granted on link.
sync-nicknametrueSet the member’s Discord nickname to their IGN.
code-length6Characters in each verification code.
code-expiry-minutes5How long a code stays valid.
verify-cooldown-seconds30Cooldown after a successful verification.
failed-attempt-cooldown-seconds5Cooldown after each failed attempt.
max-verify-attempts5Failed attempts before lockout.
verify-lockout-seconds300Lockout duration once max-verify-attempts is hit.
Codes are generated with java.security.SecureRandom.
features:
  chat-bridge:
    enabled: true
    chat-channel-id: ""
    chat-channel: "minecraft-chat"
    minecraft-to-discord: true
    discord-to-minecraft: true
    filter-bot-messages: true
    skin-provider: "crafthead"
    auto-create-webhook: true
    use-webhook: false
    webhook-url: ""
    minecraft-format: "**%player%**: %message%"
    discord-format: "&7[&9Discord&7] &b%user%&7: &f%message%"
    show-mentions: true
    play-mention-sound: true
    convert-emojis: true
    strip-discord-formatting: false
    show-typing-indicator: true
    show-player-prefix: true
    show-player-suffix: false
    discord-username-format: "%prefix%%player%"
Set use-webhook: true (and auto-create-webhook: true) to post Minecraft chat as the player with their real skin avatar via the skin-provider (crafthead is most reliable and works with offline-mode names).
features:
  tickets:
    enabled: true
    ticket-category: "Support Tickets"
    ticket-panel-channel: "ticket-logs"
    transcript-channel: "ticket-logs"
    support-role: "Support"
    max-open-tickets: 3
    auto-close-hours: 48
    auto-close-warning-enabled: true
    auto-close-warning-minutes: 60
    player-close: true
    save-transcript: true
features:
  moderation:
    enabled: true
    sync-bans: true
    log-channel: "mod-logs"
    auto-moderate: true
    report-cooldown-minutes: 5
    require-verification-for-reports: true
    filter-words:
      - "example"
      - "regex:\\b(somepattern)\\b"
regex: entries are compiled as regular expressions. They’re powerful — always test a pattern before relying on it, and escape carefully.
features:
  server-status:
    enabled: true
    channel-id: ""
    update-interval: 60
    message-id: ""
Leave message-id blank; the module creates the embed on first run and stores the ID so subsequent updates edit the same message in place.
features:
  leaderboard:
    enabled: true
    channel-id: ""
    message-id: ""
    update-interval: 300
    top-players: 10
    default-type: "KILLS"
    custom-thumbnail: ""
features:
  activity-roles:
    enabled: true
    sync-interval: 300
    remove-old-roles: true
    announce-promotion: true
    tiers:
      newcomer:
        display-name: "🌱 Newcomer"
        min-hours: 0
        role-id: ""
        color: "&a"
      regular:
        display-name: "⭐ Regular"
        min-hours: 10
        role-id: ""
        color: "&e"
      veteran:
        display-name: "💎 Veteran"
        min-hours: 50
        role-id: ""
        color: "&b"
      elite:
        display-name: "👑 Elite"
        min-hours: 100
        role-id: ""
        color: "&6"
      legend:
        display-name: "🏆 Legend"
        min-hours: 500
        role-id: ""
        color: "&d"
Set each tier’s role-id to the Discord role it should grant at that playtime threshold.
features:
  voice-channels:
    enabled: true
    enable-status-channel: true
    status-channel-id: ""
    status-channel-format: "📊 Players: %online%/%max%"
    update-interval: 60
    enable-dynamic-channels: true
    category-id: ""
    hub-channel-id: ""
    dynamic-channel-prefix: "🎮 Gaming Room"
    max-dynamic-channels: 10
    user-limit: 0
features:
  economy-bridge:
    enabled: true
    currency-symbol: "$"
    currency-name: "coins"
    top-players: 10
    allow-transfers: true
    min-transfer: 1.0
    max-transfer: 1000000.0
    transfer-tax: 0.0
Requires Vault. Players must be verified before their Discord identity can move balance.
features:
  booster-perks:
    enabled: true
    permission-group: "booster"
    sync-interval: 300
    use-native-detection: true
    booster-role-id: ""
    additional-booster-roles: []
    reward-commands:
      - "give %player% diamond 5"
      - "broadcast &d%player% &fis now boosting the Discord server! &d&lThank you!"
    remove-commands: []
features:
  welcome-dm:
    enabled: true
    first-join-only: true
    verified-only: true
    plain-message: "Welcome, %player%! Your Discord account is linked."
    embed:
      title: "Welcome to %server_name%"
      description: |
        Hey **%player%**, welcome! Your accounts are linked.
      color: "#55FFFF"
      thumbnail: "%player_head%"
      image: ""
      footer: ""
      fields:
        - "Server IP|play.example.com|true"
        - "Website|example.com|true"
        - "Store|store.example.com|true"
        - "Need help?|Use /support in-game|false"
Fields are Title|Value|inline triplets.
features:
  announcements:
    enabled: true
    default-channel: "announcements"
    show-title: true
    send-to-discord: false
    title-stay: 100
    title-fade-in: 10
    title-fade-out: 20
    prefix: "&6[&eAnnouncement&6] &f"
    sound: "ENTITY_EXPERIENCE_ORB_PICKUP"
    discord-color: "#FFD700"
    scheduled: {}
features:
  server-control:
    enabled: true
    allowed-commands:
      restart: true
      stop: true
      kick: true
      tps: true
      list: true
    require-role: true
    control-role: "Server Admin"

  bot-console:
    enabled: true
    command-prefix: "!"
    allow-dm: false
    console-channel: "bot-console"
server-control and bot-console run real server commands from Discord. Gate them behind dedicated roles and only allowlist commands you’re comfortable exposing.
features:
  admin-alerts:
    enabled: true
    tps-threshold: 15.0
    ram-threshold: 90
    check-interval: 30
    dm-alerts: true
    alert-channel: "admin-alerts"
Alerts fire when TPS drops below tps-threshold or RAM usage exceeds ram-threshold%. Recipients are the adminIDs list (DMs) and/or the alert-channel.
features:
  server-ip:
    enabled: true
    api-url: "https://your-tunnel-url.example"
    image-channel: "general"

  whitelist:
    enabled: true
    whitelist-channel: "whitelist"
    support-role: "Support"
    auto-whitelist: true
    dm-on-accept: true
    dm-on-decline: true
messages:
  minecraft-to-discord: "**%player%**: %message%"
  discord-to-minecraft: "&7[&9Discord&7] &b%user%&7: &f%message%"
  join-message: ":arrow_right: **%player%** joined the server!"
  leave-message: ":arrow_left: **%player%** left the server!"
  death-message: ":skull: **%player%** %death_message%"
Per-player localized strings live in plugins/XDiscordUltimate/lang/messages_<locale>.yml (20 locales). Use /language [locale] in-game to switch a player’s preference.
advanced:
  thread-pool-size: 4
  cache:
    user-ttl: 60
    max-size: 1000
  rate-limit:
    commands-per-minute: 10
Tune thread-pool-size for large servers. The token-bucket DiscordRateLimiter honors commands-per-minute to stay under Discord API limits.
discord-console:
  enabled: true
  channel-id: ""
  allowed-roles:
    - "Admin"
    - "Owner"
A separate read/write console mirror channel with role gating. Distinct from the in-Discord bot-console command runner.

Reloading

Most options apply live with /xdiscord reload. A full server restart is only required when changing:
  • discord.bot-token or discord.guild-id
  • database.type (or connection details)
  • Anything loaded once at startup by Libby/runtime dependencies

Next Steps

Features

Dive into each module’s dedicated page for behavior and examples.

Commands

Every command, alias, and permission in one place.

Database

Database backend setup for SQLite, MySQL, and PostgreSQL.

Verification

The account-linking system most other modules depend on.