Skip to content

config.yml Docs — v10

Supported Plugin Versions:

Download v10 config.yml
Download v10 lang.yml

The docs below explain every key in v10.


Top-level keys

webhook

Required. Where logs are sent, unless an individual event overrides it.

webhook:
  url: "https://discord.com/api/webhooks/1234567890/AbCdEf-gH1jK_lMnOpQrStUvWxYz"

Getting the URL: in Discord, right-click the channel → Edit ChannelIntegrationsWebhooksNew WebhookCopy Webhook URL. You need Manage Webhooks in that channel.

Or set it in game without touching the file at all:

/discordlogger webhook https://discord.com/api/webhooks/1234567890/AbCdEf…

That writes it here and reloads. The URL is never echoed back, and command logging redacts it, so running it does not publish the URL to the channel you are moving away from.

If it is empty or malformed, the plugin still starts and still logs to console — it just says so on startup and posts nothing to Discord. It is not a crash, so check the console if messages are not arriving.

Treat the URL like a password. Anyone who has it can post to that channel as your server.


embeds

Whether logs are sent as rich embeds or as plain text lines.

embeds:
  enabled: true
  author: "Server Logs"     # small label at the top of every embed

With enabled: true a death arrives as a coloured embed titled Player Death, with a Cause of Death field and the player’s head as the thumbnail.

With enabled: false the same event is one line of text:

`[14:32:07, 31:07:2026]` - **Player Death**: Lachlan fell from a high place

Plain text is worth choosing if you pipe the channel somewhere else, or find embeds noisy at volume. Everything still gets logged either way — only the presentation changes.

embeds.author is the small label above the title. On a network it is worth setting per server so you can tell them apart:

embeds:
  author: "Survival"        # or "Creative", "Lobby", …

Changed in v10: embeds.colors no longer exists. Each event’s colour now sits under that event, beside its toggle — see log. Upgrading from v9 moves your existing colours across automatically.


format

Visual formatting for timestamps and an optional server label.

  • format.name — Optional short label shown in plain text mode (e.g., proxy name).
    • Appears as ` [YourName]` after the timestamp in non-embed messages.
  • format.time — Timestamp pattern used in both console echo and Discord text (embeds show an ISO timestamp field but still echo to console with this pattern).
    • Default used if invalid: "[HH:mm:ss dd:MM:yyyy]"
    • Must use the Java DateTimeFormatter pattern.
      • HH: Hours, mm: Minutes, ss: Seconds, dd: Day of month, MM: Month, yyyy: Year. (Case-sensitive)

Example:

format:
  name: ""                          # e.g., "SMP-1" (optional)
  time: "[HH:mm:ss dd:MM:yyyy]"     # Java DateTimeFormatter pattern

config-version

Identifies which config format the file uses, so the plugin can upgrade it correctly.

  • Do not change it. Editing the number does not convert anything; it only misleads the upgrader into running the wrong migration, or none.
  • Deleting it is survivable. If it is missing the plugin works the schema out from which keys the file contains, and says so in console. It replaces a comment on the last line, which was too easy to lose to a stray edit or an editor that strips comments.
  • If the number and the file’s actual keys disagree, the keys win — they are what the plugin reads — and the mismatch is logged. The usual cause is an older config pasted over a newer one.

filters

Applied on top of the event toggles: an event that is enabled can still be skipped if it matches a filter. This is how you exclude specific things without turning a whole category off.

There are 14 of them, each independent — use one and leave the rest empty if you like. They fall into three groups: who (players, permission), where (worlds), and what (commands, chat, advancements, teleports, deaths, explosions).

filters.ignored_commands

Commands that are never logged, whoever runs them.

The match is on the command word only, so arguments and any plugin prefix are ignored. A single entry of msg blocks all three of these:

/msg Steve hello
/MSG Steve hello
/essentials:msg Steve hello

Write entries without the leading slash:

filters:
  ignored_commands:
    - login
    - register
    - msg
    - vanish
    - co          # CoreProtect inspect spam

This list ships non-empty, on purpose. Command logging posts the line exactly as typed, so /login hunter2 would publish that password to Discord, and /msg would publish private messages. The defaults cover the usual auth and messaging commands. Removing them is a decision, not a tidy-up.

filters.ignored_worlds

Worlds whose events are never logged.

Use the world’s folder name, which is what the server calls it internally — not a display name from a plugin. On a default server:

World Name to put here
Overworld world
Nether world_nether
The End world_the_end

So to stop logging anything that happens in the Nether:

filters:
  ignored_worlds:
    - world_nether

If your server renames or adds worlds — Multiverse, a custom level-name, minigame worlds — those names will differ. Two ways to find the real one:

  • Look in your server folder. Each world is a directory containing level.dat; the directory name is the world name.
  • In game, type /execute in and let it tab-complete — it lists every loaded world by its actual name.

Matching is case-insensitive, so World_Nether works as well as world_nether.

# A creative plot world, a minigame world, and the End
filters:
  ignored_worlds:
    - creative
    - bedwars_arena
    - world_the_end

filters.ignored_players

Players whose own activity is never logged — their joins, quits, chat, commands and deaths.

Accepts names or UUIDs, mixed freely in the same list. A UUID keeps working after a name change, so prefer it for anything long-lived:

filters:
  ignored_players:
    - AdminAlt                                  # by name
    - ShopBot
    - 069a79f4-44e9-4726-a5be-fca90e38aaf5      # by UUID

Moderation events are not filtered by player. A ban or a kick is a record of staff action, not that player’s own activity, so it is still logged even for an ignored account. Otherwise you could silence a bot and then never see it being banned — which is exactly the entry an audit trail exists for.

filters.exempt_permission

Any player holding this permission is never logged. Empty — the default — disables the check entirely.

Useful when the set of people to exclude changes often, such as staff or anyone currently vanished, because you then manage it in your permissions plugin rather than by editing this file:

filters:
  exempt_permission: "discordlogger.exempt"

Grant it however your permissions plugin does. With LuckPerms:

/lp group staff permission set discordlogger.exempt true

Leave it as "" unless you want this behaviour — a node that something else happens to grant would quietly suppress logging for those players.

filters.ignored_chat_containing

Chat messages containing any of these are skipped. Case-insensitive substring match — not whole words, and not a regular expression:

filters:
  ignored_chat_containing:
    - "[afk]"
    - discord.gg        # invite links

Because it matches inside words, keep entries distinctive: an entry of ass would also skip “password” and “grass”.

filters.only_log_commands

An allow-list. When it has anything in it, only those commands are logged and everything else is skipped:

filters:
  only_log_commands:
    - ban
    - kick
    - op
    - deop

Useful when you want a moderation record rather than a log of everything typed — otherwise you would have to enumerate every command you don’t want.

Leave it empty to log everything except ignored_commands. When both are set, the allow-list decides first and the deny-list still applies inside it, so you can allow a set and then exclude one from it.

filters.minimum_chat_length

Skips chat shorter than this many characters. 0 disables it.

filters:
  minimum_chat_length: 3      # drops "hi", "?", "."

Counts characters, not words, and trims whitespace first.

filters.ignored_advancements

Advancements never logged. Matched on the full key, with a trailing * for a whole tab:

filters:
  ignored_advancements:
    - "minecraft:husbandry/*"              # every farming advancement
    - "minecraft:story/mine_stone"         # just this one

The wildcard matters because advancements are grouped by tab — story/, husbandry/, adventure/, nether/, end/ — so excluding a category is one line rather than twenty.

Vanilla has around 110 non-recipe advancements, and a new player works through dozens in their first session, so this is usually the difference between a usable channel and a flooded one.

filters.log_recipe_advancements

Recipe unlocks and tab roots fire constantly and mean nothing to a reader, so they are skipped. Set true only if you genuinely want them:

filters:
  log_recipe_advancements: false     # default

This was hardcoded before v10 and is now a setting, so a server that wants recipe unlocks can have them.

filters.ignored_teleport_causes

Teleports are the noisiest event on most servers, and most of them are plugin warps rather than anything worth recording.

Three are excluded by default, because Minecraft reports them as teleports when the player has moved a block or two:

filters:
  ignored_teleport_causes:
    - EXIT_BED      # standing up from a bed
    - DISMOUNT      # getting off a horse, boat or minecart
    - SPECTATE      # a spectator jumping to a player

Add more as needed:

filters:
  ignored_teleport_causes:
    - EXIT_BED
    - DISMOUNT
    - SPECTATE
    - PLUGIN          # /warp, /home, /spawn — anything a plugin moved
    - COMMAND         # vanilla /tp
    - ENDER_PEARL

Accepted values: PLUGIN, COMMAND, ENDER_PEARL, CHORUS_FRUIT, NETHER_PORTAL, END_PORTAL, END_GATEWAY, SPECTATE, DISMOUNT, EXIT_BED, CONSUMABLE_EFFECT, UNKNOWN. Case-insensitive.

PLUGIN is the one to reach for first. On a server with Essentials or similar, most teleports are that.

filters.minimum_teleport_distance

Skips teleports shorter than this many blocks. 0 disables it.

filters:
  minimum_teleport_distance: 10

Never applies across worlds — a nether portal is not a short hop, so it is always logged regardless of this setting.

filters.ignored_death_causes

Deaths with these causes are never logged. Same names as the death causes in lang.yml, in upper case:

filters:
  ignored_death_causes:
    - VOID       # a void world, or a parkour course
    - FALL

A minigame arena or a void map can otherwise produce a constant stream of the same death.

filters.ignored_explosion_sources

Explosions from these sources are never logged. Use the entity name for mob and TNT explosions, or the block name for block ones:

filters:
  ignored_explosion_sources:
    - CREEPER
    - PRIMED_TNT
    - BED                # exploding in the Nether
    - RESPAWN_ANCHOR     # exploding in the Overworld

filters.minimum_explosion_blocks

Skips explosions that destroyed fewer than this many blocks. 0 disables it.

filters:
  minimum_explosion_blocks: 5

A creeper going off in the air, or against bedrock, breaks nothing and is rarely worth a message. This keeps the ones that actually damaged a build.



log

Every event is a section with the same three keys, plus sub-options on a few:

Key What it does
enabled Whether to log this event at all.
color The embed’s colour bar, as hex.
webhook Send just this event to a different channel. Empty = the main webhook.url.

The events available:

  • log.player.*join, quit, chat, command, death, advancement, teleport, gamemode
  • log.server.*command, start, stop, explosion
  • log.moderation.*ban, unban, kick, op, deop, whitelist_toggle, whitelist_edit

A minimal example — log joins, don’t log quits:

log:
  player:
    join:
      enabled: true
      color: "#57F287"
      webhook: ""
    quit:
      enabled: false           # this event is never sent
      color: "#ED4245"
      webhook: ""

color

Hex, with or without the leading #. Both of these are the same green:

      color: "#57F287"
      color: "57F287"

An unreadable value falls back to the built-in default rather than failing to load, and color is read whether or not the event is enabled — so turning something off and back on keeps the colour you chose.

webhook — sending one event elsewhere

The common case is a private staff channel for moderation while everything else goes to a public one:

webhook:
  url: "https://discord.com/api/webhooks/111/PUBLIC"    # everything, by default

log:
  moderation:
    ban:
      enabled: true
      color: "#FF0000"
      webhook: "https://discord.com/api/webhooks/222/STAFF"   # …except this
    kick:
      enabled: true
      color: "#FF0000"
      webhook: "https://discord.com/api/webhooks/222/STAFF"   # …and this

Leave it as "" and the event uses the main webhook, which is what almost every server wants. A value that isn’t a valid Discord webhook URL is ignored with a warning in console and that event falls back to the main webhook, rather than silently going nowhere.

Each destination is paced independently, because Discord’s rate limits are per webhook — a busy chat channel will not delay your moderation log.

Sub-options

A few events carry an extra key beside enabled, color and webhook:

Key Default What it does
log.player.death.show_coords false Appends where the player died, as x, y, z in world.
log.player.join.show_platform true Adds a Platform: Bedrock field when the joining player came from Bedrock.
log:
  player:
    death:
      enabled: true
      color: "#ED4245"
      webhook: ""
      show_coords: true        # "Lachlan died … Coords: 128, 71, -344 in world"
    join:
      enabled: true
      color: "#57F287"
      webhook: ""
      show_platform: true

show_coords is off by default on purpose. A death message with coordinates tells everyone who can read the channel exactly where the body — and the inventory it dropped — is. That is useful on a private server and a griefing tool on a public one, so it is opt-in rather than something you discover after the fact.

show_platform only ever flags Bedrock. Nothing can prove a player is Java — with Geyser standalone, Bedrock players authenticate as ordinary Java accounts and are indistinguishable even to Floodgate. So the field appears only when something positively indicates Bedrock, and its absence means “no indication”, not “definitely Java”. On a server without Geyser it never appears at all.

Upgrading from v9: every log.<group>.<event>: true becomes log.<group>.<event>.enabled: true, and each colour moves from embeds.colors.* to its event’s color. The plugin does this automatically on first start and keeps your previous file as config.old.yml.


Event details & behaviors

Player events

  • Join / Quit — Includes player name; color-coded (green/red).
  • Chat — Player chat messages; uses the player color set under embeds.colors.player.chat.
  • Command — Player-initiated commands (excludes commands blocked by other plugins if cancelled).
  • Death — Player death message.
  • Teleport — Logs teleporter & cause when available (e.g., plugin/command/end gateway).
  • Gamemode — Logs previous → new mode, who changed it (self/other/console).

Server events

  • Start / Stop — Separated events with their own colors.
  • Command — Console commands (with actor CONSOLE).
  • Explosion — Logs cause (TNT, creeper, bed, respawn anchor, etc.) and a short list of nearby players.

Moderation events

All moderation logs require the action to succeed:

  • Ban / Tempban / Unban / Kick — Only logs when the ban/kick actually took effect (permission & result checked).
  • Op / Deop — Only logs if permission changed.
  • Whitelist toggle / entries — Toggling whitelist or adding/removing players.

This prevents false-positive logs if a non-op attempts a command that fails.


Colors (defaults recap)

The defaults shipped with v10. Each is set under its own event’s color key:

  • Playerjoin #57F287quit #ED4245chat #5865F2command #FEE75Cdeath #ED4245advancement #2ECC71teleport #3498DBgamemode #9B59B6
  • Servercommand #EB459Estart #43B581stop #ED4245explosion #E74C3C
  • Moderationban/unban/kick/op/deop #FF0000whitelist_toggle #1ABC9Cwhitelist_edit #16A085

lang.yml — every message the plugin sends

lang.yml sits beside config.yml and carries the same config version, so the two are upgraded together. It holds every message shown in game or posted to Discord.

Every message the plugin shows lives in plugins/DiscordLogger/lang.yml. Change the wording, the colours, or the language entirely — no code, no rebuild.

The file is created on first start. Edit it, then:

/discordlogger reload

No restart needed.


The two sections are not interchangeable

This is the one thing worth reading before you edit anything.

Section Where it goes Format
chat In game MiniMessage<green>, <bold>, gradients
discord Your Discord channel Plain text — Discord Markdown works, MiniMessage does not

Discord has never heard of MiniMessage. A <green> tag in the discord section is posted to your channel as the literal characters <green>:

discord:
  player-join: "<green>{player} joined</green>"     # ❌ posts the tags as text
  player-join: "**{player}** joined"                # ✅ Discord bold

Discord’s own Markdown does work there: **bold**, *italic*, `code`, ~~strikethrough~~.


MiniMessage, for the chat section

Colours and formatting are tags that wrap the text they affect.

chat:
  reload-ok: "<green>Reloaded in {ms} ms.</green>"

The common ones:

Tag Effect
<red> <green> <blue> <yellow> <gold> <aqua> <gray> <white> Colour
<#ff8800> Any hex colour
<bold> <italic> <underlined> <strikethrough> Style
<gradient:red:blue> Fade between colours
<click:open_url:'https://…'> Clickable
<hover:show_text:'Tooltip'> Tooltip on hover

Full reference: MiniMessage format.

A tag you spell wrong is not an error. It is shown to the player exactly as typed. If you see <gren> in game, that is your tag, not a bug.

Example — make the reload message loud:

chat:
  reload-ok: "<gradient:#00ff88:#00aaff><bold>Reloaded</bold></gradient> <gray>({ms} ms)</gray>"

Example — remove the prefix entirely:

chat:
  prefix: ""

Placeholders

Placeholders look like {player} and are replaced before the message is sent. Each message accepts its own — they are not interchangeable, because the plugin only has certain values available at each point.

discord:
  player-join: "{player} joined the server"      # {player} is available here

Every placeholder is documented in a comment above its message inside lang.yml.

You can delete a placeholder if you do not want that detail:

player-join: "{player} joined"    # "Steve joined"
player-join: "Someone joined"     # "Someone joined"

A placeholder you spell wrong is left visible, not blanked:

player-join: "{palyer} joined"    # posts: "{palyer} joined the server"

That is deliberate — a mistake you can see is a mistake you can fix, whereas a silently empty sentence looks like a plugin bug.


Worked example: translating to French

chat:
  prefix: "<gold>[DiscordLogger]</gold> "
  reload-ok: "<green>Configuration rechargée ({ms} ms).</green>"
  no-permission: "<red>Vous n'avez pas la permission d'utiliser /{label} {command}</red>"

discord:
  player-join: "{player} a rejoint le serveur"
  player-quit: "{player} a quitté le serveur"
  player-chat: "**{player}** : {message}"
  death:
    description: "{player} est mort"
    cause-field: "Cause de la mort"
    coords-field: "Coordonnées"
    causes:
      fall: "Est tombé de haut"
      lava: "A essayé de nager dans la lave"
      drowning: "S'est noyé"

You only need to translate the lines you care about. Anything you leave out falls back to the English shipped inside the plugin.


Death causes

discord.death.causes has one entry per way Minecraft can kill someone — 33 of them. The keys are Minecraft’s own damage causes, lowercased with hyphens.

discord:
  death:
    causes:
      fall: "Fell from a high place"
      lava: "Tried to swim in lava"
      fly-into-wall: "Flew into a wall"
      kill: "Killed by command"

Do not rename the keys. The plugin looks each one up by that exact name. Change the text on the right, never the key on the left.

Every key has a comment in the file explaining when it fires — fly-into-wall is elytra kinetic damage, dryout is an axolotl out of water, custom is another plugin dealing damage.

If a death ever shows the unknown wording (“Died” by default), that means Minecraft added a damage type the plugin has no wording for — worth reporting.


If you break something

What you did What happens
Deleted a message Falls back to the English inside the jar. Nothing breaks.
Deleted a key entirely You see the key name, e.g. chat.reload-ok. It names exactly what to fix.
Deleted the whole file Written again on the next start.
Broke the YAML The plugin logs the parse error and falls back to English. Check indentation — spaces, never tabs.

Because unedited messages fall back to the shipped English, you can safely delete everything you are not changing and keep a much shorter file.


What is not in here

Console messages. Those stay in English on purpose: a translated error is one nobody can search for, and support threads depend on everyone seeing the same text.

Event names like Player Death — those are the embed titles and are currently set in code.



Full config.yml (v10)

This is the exact file that ships with v10. Download above, or copy the block below.

####################################################################################################################################
#                                                                                                                                  #
#    /$$$$$$$  /$$                                               /$$ /$$                                                           #
#   | $$__  $$|__/                                              | $$| $$                                                           #
#   | $$  \ $$ /$$  /$$$$$$$  /$$$$$$$  /$$$$$$   /$$$$$$   /$$$$$$$| $$        /$$$$$$   /$$$$$$   /$$$$$$   /$$$$$$   /$$$$$$    #
#   | $$  | $$| $$ /$$_____/ /$$_____/ /$$__  $$ /$$__  $$ /$$__  $$| $$       /$$__  $$ /$$__  $$ /$$__  $$ /$$__  $$ /$$__  $$   #
#   | $$  | $$| $$|  $$$$$$ | $$      | $$  \ $$| $$  \__/| $$  | $$| $$      | $$  \ $$| $$  \ $$| $$  \ $$| $$$$$$$$| $$  \__/   #
#   | $$  | $$| $$ \____  $$| $$      | $$  | $$| $$      | $$  | $$| $$      | $$  | $$| $$  | $$| $$  | $$| $$_____/| $$         #
#   | $$$$$$$/| $$ /$$$$$$$/|  $$$$$$$|  $$$$$$/| $$      |  $$$$$$$| $$$$$$$$|  $$$$$$/|  $$$$$$$|  $$$$$$$|  $$$$$$$| $$         #
#   |_______/ |__/|_______/  \_______/ \______/ |__/       \_______/|________/ \______/  \____  $$ \____  $$ \_______/|__/         #
#                                                                                     /$$  \ $$ /$$  \ $$                          #
#                                                                                    |  $$$$$$/|  $$$$$$/                          #
#                                                                                     \______/  \______/                           #
#                                                                                                                                  #
####################################################################################################################################

#######################################################################################
#                                                                                     #
#    _____              __ _         _____                           _                #
#   /  __ \            / _(_)       |  __ \                         | |               #
#   | /  \/ ___  _ __ | |_ _  __ _  | |  \/ ___ _ __   ___ _ __ __ _| |_ ___  _ __    #
#   | |    / _ \| '_ \|  _| |/ _` | | | __ / _ \ '_ \ / _ \ '__/ _` | __/ _ \| '__|   #
#   | \__/\ (_) | | | | | | | (_| | | |_\ \  __/ | | |  __/ | | (_| | || (_) | |      #
#    \____/\___/|_| |_|_| |_|\__, |  \____/\___|_| |_|\___|_|  \__,_|\__\___/|_|      #
#                             __/ |                                                   #
#                            |___/                                                    #
#                                                                                     #
#######################################################################################

# If you don't feel like configuring yourself, try out our config generator, simply select your plugin version and configure easily
# https://discordlogger.godtiergamers.xyz/generator/

#############################
# D O C U M E N T A T I O N #
#############################

# Documentation for this config can be found at https://discordlogger.godtiergamers.xyz/config/v10/

#########################
# D O   N O T   E D I T #
#########################

# Set automatically
config-version: 10

###################
# WEBHOOK OPTIONS #
###################

webhook:
  url: "" # Discord webhook URL goes here, plugin will not function until present

##################
# FORMAT OPTIONS #
##################

format:
  # ONLY USED FOR PLAIN TEXT MESSAGES (EMBEDS DISABLED)
  # Usage (case-sensitive): HH=hours, mm=minutes, ss=seconds, dd=day, MM=month, yyyy=year
  time: "[HH:mm:ss, dd:MM:yyyy]"
  # Only used for plain text, for embeds edit author name
  name: ""
  # Show nicknames (if set) as "Nickname (RealName)" in all player-related logs
  nicknames: true

#################
# EMBED OPTIONS #
#################

embeds:
  enabled: true
  author: "Server Logs" # Can be modified for proxy servers (e.g. Survival, Creative)

###################################################
#  ______ _____ _   _______ ______ _____   _____  #
# |  ____|_   _| | |__   __|  ____|  __ \ / ____| #
# | |__    | | | |    | |  | |__  | |__) | (___   #
# |  __|   | | | |    | |  |  __| |  _  / \___ \  #
# | |     _| |_| |____| |  | |____| | \ \ ____) | #
# |_|    |_____|______|_|  |______|_|  \_\_____/  #
#                                                 #
###################################################

# Filters apply on top of the toggles below: an event that is enabled can still be
# skipped if it matches something here.

filters:
  # Never log these commands, whoever runs them. Matched on the command word, so
  # arguments and a plugin prefix are ignored -- "/essentials:msg hi" matches "msg".
  # The defaults exist because these leak: login commands carry passwords in plain
  # text, and private messages are private.
  ignored_commands:
    - login
    - register
    - changepassword
    - unregister
    - msg
    - tell
    - whisper
    - w
    - r
    - reply

  # An ALLOW-list. When this has anything in it, ONLY these commands are logged and
  # everything else is skipped -- useful if you only care about moderation commands.
  # Leave empty to log everything except ignored_commands above.
  only_log_commands: []

  # Never log anything from these players. Accepts names or UUIDs, mixed freely.
  ignored_players: []

  # Players with this permission are never logged -- useful for staff alts, or a bot
  # account whose activity would drown everything else. Empty disables the check.
  exempt_permission: ""

  # Never log events that happen in these worlds.
  ignored_worlds: []

  # Skip chat messages containing any of these (case-insensitive).
  ignored_chat_containing: []

  # Skip chat shorter than this many characters. 0 disables it.
  # Useful against "hi", "?", "." spam. Counts characters, not words.
  minimum_chat_length: 0

  # Advancements never logged. Matched on the full key, and a trailing * matches a
  # whole tab -- "minecraft:husbandry/*" is every farming advancement.
  ignored_advancements: []

  # Recipe unlocks and tab roots fire constantly and mean nothing to a reader, so
  # they are skipped. Set true only if you genuinely want them.
  log_recipe_advancements: false

  # Teleport causes never logged. Teleports are the noisiest event on most servers.
  # The defaults are the ones that are not really teleports at all -- Minecraft moves
  # the player a block or two and reports it as one. Nobody wants a Discord message
  # because someone got out of bed.
  # Values: PLUGIN, COMMAND, ENDER_PEARL, CHORUS_FRUIT, NETHER_PORTAL, END_PORTAL,
  #         END_GATEWAY, SPECTATE, DISMOUNT, EXIT_BED, CONSUMABLE_EFFECT, UNKNOWN
  # Add PLUGIN if you use Essentials or similar -- /home, /warp and /spawn all
  # arrive as PLUGIN and are usually the bulk of what is left.
  ignored_teleport_causes:
    - EXIT_BED      # standing up from a bed
    - DISMOUNT      # getting off a horse, boat or minecart
    - SPECTATE      # a spectator jumping to a player

  # Skip teleports shorter than this many blocks. 0 disables it.
  # Never applies across worlds -- a nether portal is not a short hop.
  minimum_teleport_distance: 0

  # Deaths with these causes are never logged. Same names as the death causes in
  # lang.yml, upper case: VOID, FALL, LAVA, KILL, ENTITY_ATTACK, and so on.
  # A void world or a parkour course can produce a lot of VOID and FALL deaths.
  ignored_death_causes: []

  # Explosions from these sources are never logged. Use the entity name for mob and
  # TNT explosions (CREEPER, PRIMED_TNT, END_CRYSTAL, FIREBALL, WITHER_SKULL) or the
  # block name for block ones (BED, RESPAWN_ANCHOR).
  ignored_explosion_sources: []

  # Skip explosions that destroyed fewer than this many blocks. 0 disables it.
  # A creeper going off in the air breaks nothing and is rarely worth a message.
  minimum_explosion_blocks: 0

####################################################################################
#                                                                                  #
#     _                      _                ___         _    _                   #
#    | |    ___  __ _  __ _ (_) _ _   __ _   / _ \  _ __ | |_ (_) ___  _ _   ___   #
#    | |__ / _ \/ _` |/ _` || || ' \ / _` | | (_) || '_ \|  _|| |/ _ \| ' \ (_-<   #
#    |____|\___/\__, |\__, ||_||_||_|\__, |  \___/ | .__/ \__||_|\___/|_||_|/__/   #
#               |___/ |___/          |___/         |_|                             #
#                                                                                  #
####################################################################################

log:
  player:
    join: # Player Join
      enabled: true
      color: "#57F287" # green
      webhook: "" # Send just this event elsewhere. Empty = use webhook.url above
      show_platform: true # Flags players who joined from Bedrock (needs Geyser + Floodgate)

    quit: # Player Quit
      enabled: true
      color: "#ED4245" # red
      webhook: "" # Send just this event elsewhere. Empty = use webhook.url above

    chat: # Player Chat
      enabled: true
      color: "#5865F2" # blurple
      webhook: "" # Send just this event elsewhere. Empty = use webhook.url above

    command: # Commands executed by a player in-game
      enabled: true
      color: "#FEE75C" # yellow
      webhook: "" # Send just this event elsewhere. Empty = use webhook.url above

    death: # Player Death (with death message)
      enabled: true
      color: "#ED4245" # red
      webhook: "" # Send just this event elsewhere. Empty = use webhook.url above
      show_coords: false # Adds where the player died. Anyone who can see the channel can find the body

    advancement: # Logs when a player gets an advancement
      enabled: true
      color: "#2ECC71" # green
      webhook: "" # Send just this event elsewhere. Empty = use webhook.url above

    teleport: # Logs when a player teleports
      enabled: true
      color: "#3498DB" # blue
      webhook: "" # Send just this event elsewhere. Empty = use webhook.url above

    gamemode: # Logs when a players gamemode changes
      enabled: true
      color: "#9B59B6" # purple
      webhook: "" # Send just this event elsewhere. Empty = use webhook.url above

  server:
    command: # Commands executed via the server console/terminal
      enabled: true
      color: "#EB459E" # pink
      webhook: "" # Send just this event elsewhere. Empty = use webhook.url above

    start: # Logged when the plugin/server starts
      enabled: true
      color: "#43B581" # green
      webhook: "" # Send just this event elsewhere. Empty = use webhook.url above

    stop: # Logged on /stop / clean shutdown
      enabled: true
      color: "#ED4245" # red
      webhook: "" # Send just this event elsewhere. Empty = use webhook.url above

    explosion: # Log when an explosion occurs
      enabled: true
      color: "#E74C3C" # red
      webhook: "" # Send just this event elsewhere. Empty = use webhook.url above

  moderation:
    ban: # Logs when a player has been banned
      enabled: true
      color: "#FF0000" # red
      webhook: "" # Send just this event elsewhere. Empty = use webhook.url above

    unban: # Logs when a player has been unbanned
      enabled: true
      color: "#FF0000" # red
      webhook: "" # Send just this event elsewhere. Empty = use webhook.url above

    kick: # Logs when a player has been kicked
      enabled: true
      color: "#FF0000" # red
      webhook: "" # Send just this event elsewhere. Empty = use webhook.url above

    op: # Logs when a player is granted op premissions
      enabled: true
      color: "#FF0000" # red
      webhook: "" # Send just this event elsewhere. Empty = use webhook.url above

    deop: # Logs when a players op permissions are revoked
      enabled: true
      color: "#FF0000" # red
      webhook: "" # Send just this event elsewhere. Empty = use webhook.url above

    whitelist_toggle: # Logs when the whitelist is enabled/disabled
      enabled: true
      color: "#1ABC9C" # teal
      webhook: "" # Send just this event elsewhere. Empty = use webhook.url above

    whitelist_edit: # Logs when players are added/removed from the whitelist
      enabled: true
      color: "#16A085" # dark teal
      webhook: "" # Send just this event elsewhere. Empty = use webhook.url above

# CONFIG VERSION V10, DOWNLOADED FROM WEBSITE

Full lang.yml (v10)

The exact file that ships with v10.

####################################################################################################################################
#                                                                                                                                  #
#    /$$$$$$$  /$$                                               /$$ /$$                                                           #
#   | $$__  $$|__/                                              | $$| $$                                                           #
#   | $$  \ $$ /$$  /$$$$$$$  /$$$$$$$  /$$$$$$   /$$$$$$   /$$$$$$$| $$        /$$$$$$   /$$$$$$   /$$$$$$   /$$$$$$   /$$$$$$    #
#   | $$  | $$| $$ /$$_____/ /$$_____/ /$$__  $$ /$$__  $$ /$$__  $$| $$       /$$__  $$ /$$__  $$ /$$__  $$ /$$__  $$ /$$__  $$   #
#   | $$  | $$| $$|  $$$$$$ | $$      | $$  \ $$| $$  \__/| $$  | $$| $$      | $$  \ $$| $$  \ $$| $$  \ $$| $$$$$$$$| $$  \__/   #
#   | $$  | $$| $$ \____  $$| $$      | $$  | $$| $$      | $$  | $$| $$      | $$  | $$| $$  | $$| $$  | $$| $$_____/| $$         #
#   | $$$$$$$/| $$ /$$$$$$$/|  $$$$$$$|  $$$$$$/| $$      |  $$$$$$$| $$$$$$$$|  $$$$$$/|  $$$$$$$|  $$$$$$$|  $$$$$$$| $$         #
#   |_______/ |__/|_______/  \_______/ \______/ |__/       \_______/|________/ \______/  \____  $$ \____  $$ \_______/|__/         #
#                                                                                     /$$  \ $$ /$$  \ $$                          #
#                                                                                    |  $$$$$$/|  $$$$$$/                          #
#                                                                                     \______/  \______/                           #
#                                                                                                                                  #
####################################################################################################################################

#######################################################################################
#                                                                                     #
#    _____              __ _         _____                           _                #
#   /  __ \            / _(_)       |  __ \                         | |               #
#   | /  \/ ___  _ __ | |_ _  __ _  | |  \/ ___ _ __   ___ _ __ __ _| |_ ___  _ __    #
#   | |    / _ \| '_ \|  _| |/ _` | | | __ / _ \ '_ \ / _ \ '__/ _` | __/ _ \| '__|   #
#   | \__/\ (_) | | | | | | | (_| | | |_\ \  __/ | | |  __/ | | (_| | || (_) | |      #
#    \____/\___/|_| |_|_| |_|\__, |  \____/\___|_| |_|\___|_|  \__,_|\__\___/|_|      #
#                             __/ |                                                   #
#                            |___/                                                    #
#                                                                                     #
#######################################################################################

# If you don't feel like configuring yourself, try out our config generator, simply select your plugin version and configure easily
# https://discordlogger.godtiergamers.xyz/generator/

#############################
# D O C U M E N T A T I O N #
#############################

# Documentation for this config can be found at https://discordlogger.godtiergamers.xyz/config/v10/

#########################
# D O   N O T   E D I T #
#########################

# Set automatically.
config-version: 10

#####################################################
#                                                   #
#   _                                               #
#  | |    __ _ _ __   __ _ _   _  __ _  __ _  ___   #
#  | |   / _` | '_ \ / _` | | | |/ _` |/ _` |/ _ \  #
#  | |__| (_| | | | | (_| | |_| | (_| | (_| |  __/  #
#  |_____\__,_|_| |_|\__, |\__,_|\__,_|\__, |\___|  #
#                    |___/             |___/        #
#                                                   #
#####################################################

# Every message this plugin shows you, in one place. Change any of them and run
#   /discordlogger reload
# The plugin does not need restarting.
#
# ---------------------------------------------------------------------------
# THE TWO SECTIONS ARE NOT INTERCHANGEABLE
# ---------------------------------------------------------------------------
#
#   chat:     shown IN GAME. Uses MiniMessage for colour and formatting.
#   discord:  posted TO DISCORD. Plain text only.
#
# Discord renders Markdown, not MiniMessage. A <green> tag in the discord
# section is posted to your channel as the literal characters "<green>", so
# keep formatting tags out of it. Discord's own Markdown does work there:
# **bold**, *italic*, `code`, ~~strikethrough~~.
#
# ---------------------------------------------------------------------------
# MINIMESSAGE, IN 30 SECONDS
# ---------------------------------------------------------------------------
#
#   <red>text</red>            colour   (also: green, blue, yellow, gold,
#                                        aqua, gray, dark_gray, white, black,
#                                        dark_red, dark_green, dark_aqua,
#                                        dark_blue, dark_purple, light_purple)
#   <#ff8800>text</#ff8800>    any hex colour
#   <bold>text</bold>          also <italic>, <underlined>, <strikethrough>
#   <gradient:red:blue>text</gradient>
#   <click:open_url:'https://example.com'>text</click>
#   <hover:show_text:'Tooltip'>text</hover>
#
# Full reference: https://docs.advntr.dev/minimessage/format.html
#
# A tag you spell wrong is NOT an error -- it is shown to the player exactly as
# typed. If you see "<gren>" in game, that is the tag, not a bug.
#
# ---------------------------------------------------------------------------
# PLACEHOLDERS
# ---------------------------------------------------------------------------
#
# Placeholders look like {player} and are replaced before the message is sent.
# Each message below lists the ones it accepts, and they are NOT interchangeable
# between messages -- {player} only works where the plugin has a player to put
# there.
#
# A placeholder you spell wrong is left in the message rather than blanked, so
# a typo shows up as "{palyer} joined the server" instead of a sentence with a
# hole in it. That is deliberate: a visible mistake is a fixable one.
#
# You can also delete a placeholder entirely if you do not want that detail.
#   player-join: "{player} joined"        ->  "Steve joined"
#   player-join: "Someone joined"         ->  "Someone joined"
#
# ---------------------------------------------------------------------------
# IF YOU BREAK SOMETHING
# ---------------------------------------------------------------------------
#
# * Deleted a message?      The plugin falls back to the English shipped inside
#                           the jar. Nothing breaks.
# * Deleted a whole key?    You will see the key name itself, e.g.
#                           "chat.reload-ok". That names exactly what to fix.
# * Deleted the whole file? It is written again on the next start.
# * Broken the YAML?        The plugin logs the parse error on start and falls
#                           back to English. Check indentation first -- it must
#                           be spaces, never tabs.
#
# Console messages are deliberately NOT in this file. They stay in English so
# that searching an error, or pasting it into a support thread, still matches
# what everyone else sees.
#
##############################################################################

chat:

  # Put in front of the messages that use a prefix. Set to "" to remove it.
  prefix: "<gold>[DiscordLogger]</gold> "

  # ---------------------------------------------------------------- /reload --

  # Placeholders: {ms} -- how long the reload took, in milliseconds
  reload-ok: "<green>DiscordLogger configuration reloaded ({ms} ms).</green>"

  # Shown when the config loaded but webhook.url is empty or malformed.
  reload-no-webhook: "<red>Config reloaded, but webhook.url is missing or invalid.</red>"
  reload-no-webhook-hint: "<red>Set a valid Discord webhook URL and try again.</red>"

  # Shown when reloading detected a config from a NEWER plugin version.
  # Placeholders: {installed} -- the schema in config.yml
  #               {shipped}   -- the schema this build understands
  reload-config-ahead: "<red>Your config.yml (schema v{installed}) is newer than this build (v{shipped}). Keys it does not recognise are ignored.</red>"
  reload-config-ahead-fix: "<red>Update the plugin, or run <white>/discordlogger regen</white> to start fresh.</red>"

  # Shown when reloading upgraded the config from an older schema.
  # Placeholders: {from}, {to}
  reload-config-upgraded: "<green>config.yml upgraded from schema v{from} to v{to} (previous file saved as config.old.yml).</green>"

  # --------------------------------------------------------------- /webhook --

  # Shown when the command is run with no URL.
  webhook-usage: "<yellow>Usage: <white>/discordlogger webhook <url></white></yellow>"
  webhook-where: "<gray>Create one in Discord under Channel Settings > Integrations > Webhooks.</gray>"
  # Shown only to players, not from console -- a reminder that the URL is a secret.
  webhook-private: "<gray>Anyone who sees the URL can post to that channel, so avoid typing it on a shared screen. It is never shown back to you.</gray>"

  # Shown when the URL is not a Discord webhook.
  webhook-invalid: "<red>That does not look like a Discord webhook URL.</red>"
  webhook-expected: "<gray>Expected: https://discord.com/api/webhooks/<id>/<token></gray>"

  # Success. Placeholders: {channel} -- the channel id from the URL.
  # The full URL is never shown back, on purpose: it is a credential, and this
  # message may be on someone's screen or stream.
  webhook-set: "<green>Webhook set and reloaded - logging to channel {channel}.</green>"

  webhook-write-failed: "<red>Could not write webhook.url to config.yml. Check the file exists and is writable.</red>"
  webhook-rejected: "<red>Saved, but the plugin did not accept it. Check config.yml and the console.</red>"

  # ----------------------------------------------------------------- /regen --

  # Shown when /discordlogger regen is run without "confirm".
  regen-warning: "<yellow>This replaces config.yml with the default from this build. Your current file is backed up, but your settings are NOT carried over.</yellow>"
  regen-confirm: "<yellow>Run <white>/discordlogger regen confirm</white> to go ahead.</yellow>"

  # Placeholders: {schema} -- the config schema that was written, e.g. "v10"
  regen-done: "<green>config.yml rebuilt at schema {schema}.</green>"
  # Placeholders: {file} -- the backup filename
  regen-backup: "<gray>Previous file saved as {file}</gray>"
  regen-no-webhook: "<red>The new config has no webhook URL yet - set webhook.url, then run /discordlogger reload.</red>"

  regen-no-bundled: "<red>This build has no bundled config.yml to restore from.</red>"
  # Placeholders: {error}
  regen-read-failed: "<red>Could not read the bundled config.yml: {error}</red>"
  regen-write-failed: "<red>Could not rewrite config.yml: {error}</red>"

  # ------------------------------------------------------- command handling --

  help-header: "<aqua>DiscordLogger Commands:</aqua>"
  # One line per subcommand.
  # Placeholders: {label} -- the command as typed (discordlogger, dlog, dlogger)
  #               {command}, {description}
  help-entry: "<gray>  /{label} {command}<dark_gray> - <white>{description}"

  # Placeholders: {input} -- what they actually typed
  unknown-subcommand: "<red>Unknown subcommand: {input}</red>"
  # Placeholders: {label}, {command}
  no-permission: "<red>You do not have permission to use /{label} {command}</red>"

  # ------------------------------------------------------------- on joining --

  # Shown to OPS when config.yml is newer than this build understands.
  # Placeholders: {installed}, {shipped}
  config-ahead: "<gold>[DiscordLogger]</gold> <yellow>Your config.yml (schema v{installed}) is newer than this build (v{shipped}). Settings it does not recognise are being ignored.</yellow>"
  config-ahead-fix: "<yellow>Update the plugin, or run <white>/discordlogger regen</white> to rebuild the config from this build. Your current file is backed up.</yellow>"

  # Shown to OPS once per nightly build. Never appears on a stable release.
  nightly-notice: "<gold>[DiscordLogger]</gold> <yellow>This is a nightly build - it may be unstable. Upgrade often: <white>https://discordlogger.godtiergamers.xyz</white></yellow>"


##############################################################################
# DISCORD -- plain text. No MiniMessage tags; Discord Markdown works.        #
##############################################################################

discord:

  # Placeholders: {player} -- their display name, or nickname if enabled
  player-join: "{player} joined the server"
  player-quit: "{player} left the server"

  # Placeholders: {player}, {message}
  # ** ** is Discord's bold. The message is escaped before substitution, so a
  # player cannot inject Markdown into your channel.
  player-chat: "**{player}**: {message}"

  # Placeholders: {player}, {command} -- the command includes its leading slash
  # Commands listed in filters.ignored_commands never reach here at all.
  player-command: "{player} ran: {command}"

  # Placeholders: {sender} -- "Server" for the console, or the sender's name
  #               {command}
  server-command: "{sender} ran: {command}"

  death:

    # The line under the embed title. Placeholders: {player}
    description: "{player} died"

    # Field NAMES, not values -- the bold label above each field in the embed.
    cause-field: "Cause of Death"
    coords-field: "Coords"

    # Only shown when log.player.death.show_coords is true in config.yml.
    # Placeholders: {x}, {y}, {z} -- block coordinates
    #               {world}           -- the world's folder name
    coords-value: "{x}, {y}, {z} in {world}"

    # ---- how the death happened ------------------------------------------
    # These four cover deaths caused by a player or mob. The causes list below
    # covers everything else.

    # Killed by another player.
    # Placeholders: {killer} -- their display name
    #               {weapon} -- " [Diamond Sword]", or EMPTY if bare-handed.
    #                             The brackets and leading space are part of the
    #                             value, so remove {weapon} entirely to hide it.
    slain-by-player: "Slain by {killer}{weapon}"

    # Killed by a mob. Placeholders: {killer} -- e.g. "a zombie"
    slain-by-mob: "Slain by {killer}"

    # Shot from range. Placeholders: {killer} -- a player or a mob
    shot-by: "Shot by {killer}"
    # Shot, but the shooter is no longer known (they logged off, or despawned).
    shot: "Shot"

    # Last resort: the server reported a cause this plugin has no wording for.
    # If you ever see this in your channel, it is worth reporting -- it means
    # Minecraft added a damage type.
    unknown: "Died"

    # ---- one line per damage cause ---------------------------------------
    # Keys are Minecraft's own damage causes, lowercased with hyphens. Do not
    # rename them; the plugin looks each one up by that exact name.
    causes:
      # Fell too far.
      fall: "Fell from a high place"
      # Swam in lava.
      lava: "Tried to swim in lava"
      # Standing in fire.
      fire: "Burned to death"
      # Still burning after leaving the fire.
      fire-tick: "Burned to death"
      # Ran out of air.
      drowning: "Drowned"
      # Inside a solid block.
      suffocation: "Suffocated in a wall"
      # Fell out of the world.
      void: "Fell into the void"
      # Touched a cactus or sweet berry bush.
      contact: "Was pricked to death"
      # TNT, a bed in the Nether, a respawn anchor in the Overworld.
      block-explosion: "Blew up"
      # A creeper, a ghast fireball, an end crystal.
      entity-explosion: "Blew up"
      # A potion of harming, or an evoker's fangs.
      magic: "Was killed by magic"
      # Poison ran the health down.
      poison: "Was poisoned"
      # The wither effect.
      wither: "Withered away"
      # Hunger reached zero.
      starvation: "Starved to death"
      # Powder snow.
      freeze: "Froze to death"
      # Struck by lightning.
      lightning: "Was struck by lightning"
      # Standing on magma blocks.
      hot-floor: "Discovered the floor was lava"
      # Too many entities in one block.
      cramming: "Was squished too much"
      # The ender dragon's breath cloud.
      dragon-breath: "Was roasted by dragon breath"
      # Attacking someone wearing Thorns armour.
      thorns: "Was killed by thorns"
      # The /kill command.
      kill: "Killed by command"
      # /kill used on yourself.
      suicide: "Killed by command"
      # Outside the world border.
      world-border: "Left the world border"
      # A warden's ranged attack.
      sonic-boom: "Hit by a warden's sonic boom"
      # Standing in a campfire.
      campfire: "Burned on a campfire"
      # An anvil or gravel landed on them.
      falling-block: "Squashed by a falling block"
      # Elytra flight into a wall — kinetic damage.
      fly-into-wall: "Flew into a wall"
      # An axolotl or dolphin out of water.
      dryout: "Dried out"
      # A snow golem in a warm biome.
      melting: "Melted"
      # A mob or player hit them, when the attacker is no longer known.
      entity-attack: "Slain"
      # A sweeping sword attack, attacker no longer known.
      entity-sweep-attack: "Slain"
      # An arrow or similar, shooter no longer known.
      projectile: "Shot"
      # Damage dealt by another plugin. Nothing truthful can be said about it.
      custom: "Died"

  # The field added to a join when the player came from Bedrock, if
  # log.player.join.show_platform is true. It NEVER says "Java" -- see the docs.
  platform-field: "Platform"
  platform-bedrock: "Bedrock"

# CONFIG VERSION V10, DOWNLOADED FROM WEBSITE