Farmstead Mods
RU

Configuration

Every key, its default and its explanation — straight from the files the mod installs.

On this page

animations.json 14

KeyDefaultDescription
animations
animations.name"Rainbow"Classic rainbow letter-cycling effect
animations.frames
animations.frameDuration500—
name"PulseStar"Pulsing star — good as decorative separator or bullet
frames
frameDuration400—
name"StatusDot"Blinking dot — good for status indicators
frames
frameDuration750—
name"LoadingDots"Animated loading ellipsis
frames
frameDuration400—
name"GoldBanner"Scrolling server-name banner using gradient colour shifts
frames
frameDuration600—
name"Spinner"Classic BTLP-style spinning pipe
frames
frameDuration200—
name"HeartBeat"Alternating heart colour pattern
frames
frameDuration600—

config.json 615

KeyDefaultDescription
general — Plain, single-line server name — used by the {server_name} placeholder (scoreboard, tablist, chat, etc). Deliberately separate from server.properties' "motd" (and from NeoEssentials' own /motd system): that MOTD is typically multi-line and heavily formatted for the multiplayer server list, which breaks when dropped into a single scoreboard/tablist line. Use {server_motd} instead if you actually want the configured MOTD text somewhere.
general.serverName"My Server"—
hologram — How often the hologram scheduler POLLS every hologram to see if it's due for a refresh (pollIntervalTicks, in server ticks — 20 = once/second) and advances animation/spin/hover (animationInterval, in ticks — 1 = every tick, the fastest possible). pollIntervalTicks is NOT how often placeholders actually refresh — that's each hologram's own refreshInterval (in SECONDS, default 5, set via "/hologram refreshinterval <id> <seconds>"). Lowering pollIntervalTicks below that per-hologram gate does nothing visible; it only exists so the gate itself gets checked promptly rather than up to a full poll cycle late. animationInterval only covers {animation:NAME} frame advancement, /hologram addframes cycling, and spin/hover motion — there's no benefit setting it below 1, since an animation's own frameDuration is already clamped to a 50ms (1-tick) minimum. Apply changes with "/neoe reload".
hologram.pollIntervalTicks10—
hologram.animationInterval1—
modules — Enable or disable major mod subsystems (true = enabled, false = disabled). RESTART REQUIRED — whether a command is registered at all (and whether a subsystem's manager is initialized) is decided once at server start. "/neoe reload" only refreshes config VALUES, it can't add/remove already-registered commands, so toggling anything in this section (or in "commands" below) will NOT take effect until the server restarts.
modules.economyEnabledtrue—
modules.permissionsEnabledtrue—
modules.kitsEnabledtrue—
modules.teleportationEnabledtrue—
modules.moderationEnabledtrue—
modules.chatEnabledtrue—
modules.webDashboardEnabledtrue—
modules.hologramsEnabledtrue—
modules.shopEnabledtrue—
modules.auctionHouseEnabledtrue—
modules.vaultEnabledtrue—
modules.tablistEnabledtrue—
modules.scoreboardEnabledtrue—
modules.resourcePacksEnabledtrue—
modules.playerTagsEnabledtrue—
modules.discordIntegrationEnabledtrue—
modules.votifierEnabledtrue—
modules.cratesEnabledtrue—
logging — Per-subsystem logging control. For each category: "normal": routine info-level messages -> console + logs/latest.log (default: on) "debug": verbose trace messages -> logs/debug.log only (default: off) Warnings and errors are ALWAYS logged regardless of these settings — these toggles only control routine chatter and opt-in verbose tracing, never real problems. Reload in-game with /neoessentials reload after changing these.
logging.categories
logging.categories.chat{ "normal": true, "debug": false }—
logging.categories.economy{ "normal": true, "debug": false }—
logging.categories.permissions{ "normal": true, "debug": false }—
logging.categories.teleportation{ "normal": true, "debug": false }—
logging.categories.moderation{ "normal": true, "debug": false }—
logging.categories.auctionHouse{ "normal": true, "debug": false }—
logging.categories.kits{ "normal": true, "debug": false }—
logging.categories.webDashboard{ "normal": true, "debug": false }—
logging.categories.discord{ "normal": true, "debug": false }—
logging.categories.config{ "normal": true, "debug": false }—
logging.categories.commands{ "normal": true, "debug": false }—
logging.categories.votifier{ "normal": true, "debug": false }—
logging.categories.crates{ "normal": true, "debug": false }—
logging.categories.general{ "normal": true, "debug": false }—
storage
storage.type"json""json" (default, one file per collection), "yaml" (same shape, human-editable), "sqlite" (single embedded database file), or "mysql" (shared network database — use this to sync moderation/economy/etc. data across multiple servers). RESTART REQUIRED — StorageManager picks the backend once at server start and never reconstructs it; "/neoe reload" only refreshes config VALUES, so changing this and reloading silently keeps every manager on the OLD backend with no warning that anything is wrong. Existing data auto-migrates into the new backend on the restart that actually picks it up (see autoMigrate below).
storage.autoMigratetrueExisting JSON data is imported automatically the first time you switch away from "json" — set false only if you deliberately want a fresh, empty store.
storage.sqlite
storage.sqlite.file"data.db"Relative to the server's data directory (neoessentials/store/<this file>)
storage.sqlite.autoDownloadDrivertrueThe SQLite driver isn't bundled in the mod jar (it used to be, but its native library caused it to conflict with other mods that also bundle their own copy — see the SqliteDriverProvisioner javadoc). It's downloaded from Maven Central and verified against a pinned checksum the first time SQLite storage is actually used. Set false to disable that download and place the driver jar yourself instead — the server log will tell you the exact path and download URL if it's missing.
storage.mysql
storage.mysql.host"localhost"—
storage.mysql.port3306—
storage.mysql.database"neoessentials"—
storage.mysql.username"neoessentials"—
storage.mysql.password""—
storage.mysql.useSSLfalse—
storage.mysql.poolSize10Max concurrent connections in the pool
storage.mysql.autoDownloadDrivertrueThe MySQL driver isn't bundled in the mod jar (it used to be, but it caused the same kind of split-package module conflict as the SQLite driver used to — see the MySqlDriverProvisioner javadoc). It's downloaded from Maven Central and verified against a pinned checksum the first time MySQL storage is actually used. Set false to disable that download and place the driver jar yourself instead — the server log will tell you the exact path and download URL if it's missing.
commands
commands.balancetrue—
commands.paytrue—
commands.paytoggletrue—
commands.ecotrue—
commands.baltoptrue—
commands.repairtrue—
commands.disposetrue—
commands.powertooltrue—
commands.powertooltoggletrue—
commands.tablisttrue—
commands.scoreboardtrue—
commands.clearinventorytrue—
commands.enchanttrue—
commands.enchanthandtrue—
commands.msgtrue—
commands.replytrue—
commands.afktrue—
commands.ignoretrue—
commands.unignoretrue—
commands.mutetrue—
commands.unmutetrue—
commands.msgtoggletrue—
commands.socialspytrue—
commands.mutelisttrue—
commands.permissionstrue—
commands.kittrue—
commands.createkittrue—
commands.delkittrue—
commands.listkitstrue—
commands.hometrue—
commands.sethometrue—
commands.delhometrue—
commands.listhomestrue—
commands.warptrue—
commands.setwarptrue—
commands.delwarptrue—
commands.listwarpstrue—
commands.spawntrue—
commands.setspawntrue—
commands.tpatrue—
commands.tpaheretrue—
commands.tpaccepttrue—
commands.tpdenytrue—
commands.tpcanceltrue—
commands.tptrue—
commands.tpheretrue—
commands.tpalltrue—
commands.tpotrue—
commands.tppostrue—
commands.backtrue—
commands.toptrue—
commands.jumptrue—
commands.jumptotrue—
commands.tprtrue—
commands.settprtrue—
commands.bantrue—
commands.tempbantrue—
commands.unbantrue—
commands.baniptrue—
commands.unbaniptrue—
commands.kicktrue—
commands.kickalltrue—
commands.jailtrue—
commands.unjailtrue—
commands.setjailtrue—
commands.deljailtrue—
commands.vanishtrue—
commands.freezetrue—
commands.unfreezetrue—
commands.dashboardtrue—
commands.anviltrue—
commands.booktrue—
commands.craftingtrue—
commands.compasstrue—
commands.getpostrue—
commands.fletchingtrue—
commands.depthtrue—
commands.helpoptrue—
commands.listtrue—
commands.neartrue—
commands.motdtrue—
commands.nicktrue—
commands.realnametrue—
commands.rulestrue—
commands.signtrue—
commands.seentrue—
commands.smithingtrue—
commands.stonecuttingtrue—
commands.suicidetrue—
commands.whoistrue—
commands.invseetrue—
commands.enderchesttrue—
commands.enderchestedittrue—
commands.worthtrue—
commands.selltrue—
commands.setworthtrue—
commands.kitresettrue—
commands.broadcasttrue—
commands.timetrue—
commands.daytrue—
commands.nighttrue—
commands.weathertrue—
commands.suntrue—
commands.stormtrue—
commands.thundertrue—
commands.killtrue—
commands.gamemodetrue—
commands.tpoheretrue—
commands.tpofflinetrue—
commands.ptimetrue—
commands.pweathertrue—
commands.effecttrue—
commands.spawnmobtrue—
commands.mobtrue—
commands.unlimitedtrue—
commands.condensetrue—
commands.metrue—
commands.tptoggletrue—
commands.gctrue—
commands.memtrue—
commands.lightningtrue—
commands.smitetrue—
commands.skulltrue—
commands.itemnametrue—
commands.renametrue—
commands.itemloretrue—
commands.removetrue—
commands.loomtrue—
commands.cartographytrue—
commands.cartographytabletrue—
commands.renamehometrue—
commands.warpinfotrue—
commands.worldtrue—
commands.spawnertrue—
commands.recipetrue—
commands.tpautotrue—
commands.fireballtrue—
commands.treetrue—
commands.bigtreetrue—
commands.breaktrue—
commands.icetrue—
commands.bottomtrue—
commands.tpaalltrue—
commands.broadcastworldtrue—
commands.bcastworldtrue—
commands.pingtrue—
commands.playtimetrue—
commands.sudotrue—
commands.rtoggletrue—
commands.fireworktrue—
commands.nuketrue—
commands.itemdbtrue—
commands.potiontrue—
commands.infotrue—
commands.antiochtrue—
commands.kittycannontrue—
commands.beezookatrue—
commands.resttrue—
commands.backuptrue—
commands.backupCommand""Shell command to run when /backup is used (leave empty to disable)
commands.showkittrue—
commands.powertoollisttrue—
commands.customtexttrue—
commands.payconfirmtoggletrue—
commands.ciconfirmtoggletrue—
commands.itemtrue—
commands.itrue—
commands.helptrue—
commands.tempbaniptrue—
commands.togglejailtrue—
commands.jailstrue—
commands.jailinfotrue—
commands.banlisttruePreviously missing entries (commands that existed in code but had no toggle — added so every registered command is actually controllable).
commands.clearwarningstrue—
commands.freezealltrue—
commands.unfreezealltrue—
commands.freezelisttrue—
commands.jailfortrue—
commands.jaillisttrue—
commands.unvanishtrue—
commands.vanishlisttrue—
commands.warntrue—
commands.warningstrue—
commands.removewarntrue—
commands.notetrue—
commands.notestrue—
commands.removenotetrue—
commands.reporttrue—
commands.reportstrue—
commands.reviewreporttrue—
commands.chatformattrue—
commands.dashboardregistertrue—
commands.linkaccounttrue—
commands.languagetrue—
commands.neoetrue—
commands.neoessentialstrue—
commands.placeholdertrue—
commands.pextrue—
commands.mailtrue—
commands.nearbytrue—
commands.whotrue—
commands.onlinetrue—
commands.nicknametrue—
commands.setnicktrue—
commands.grindstonetrue—
commands.citrue—
commands.clearinvtrue—
commands.fixtrue—
commands.trashtrue—
commands.invtrue—
commands.ectrue—
commands.ecedittrue—
commands.pttrue—
commands.ptttrue—
commands.pwarptrue—
commands.setpwarptrue—
commands.delpwarptrue—
commands.pwarpstrue—
commands.holotrue—
commands.hologramtrue—
commands.chestshoptrue—
commands.cshoptrue—
commands.npcshoptrue—
commands.ahtrue—
commands.auctionhousetrue—
commands.vaulttrue—
economy
economy.sellMultiplier1.0Currency symbol and starting balance are configured in economy.json, not here — these keys used to also exist here but were always shadowed by economy.json's copy. Multiplier for all /sell prices (1.0 = 100%, 0.5 = 50%, 2.0 = 200%)
economy.allowSellNamedItemsfalseAllow selling items that have a custom display name (renamed items)
economy.useExternalEconomyfalseUse a detected external economy mod (e.g. SG Economy API) instead of NeoEssentials' own internal balances, registered at higher priority into the Vault service registry (see vault/VaultManager.java). Off by default — an operator has to explicitly opt in, since silently switching which mod controls player money is higher-stakes than the equivalent external-permissions toggle.
localization
localization.language""Language code (e.g. "fr_fr", "de_de"). Leave empty for "en_us". Change with /language <code>.
localization.preserveCustomTranslationsfalse—
webDashboard
webDashboard.enabledtrueMaster switch for the web dashboard
webDashboard.autoStartfalseStart automatically on server boot. false = use /dashboard start
webDashboard.port8080HTTP server port (1024–65535). Restart required after changing.
webDashboard.websocketPort8081WebSocket port for real-time updates. Must differ from HTTP port.
webDashboard.bindAddress"0.0.0.0"Bind address: '0.0.0.0' = all interfaces, '127.0.0.1' = localhost only (more secure)
webDashboard.mode"external"How the dashboard is served: "external" — serve ONLY the REST API under "/api/*"; the "/" static-file route is not registered at all (default). Use this if you run a separate dashboard app (e.g. NeoEssentials-Dashboard, a Laravel app) that talks to this API from outside. "internal" — serve the mod's own bundled dashboard UI (webdashboard-ui) at "/" AND the REST API under "/api/*". "both" — serve both (same as "internal", kept as an explicit alias for clarity when you intentionally use the built-in UI AND point an external app at the same API).
webDashboard.publicUrl""Public-facing base URL for the mod's OWN bundled dashboard (mode "internal"/"both"), e.g. "http://your.server.ip:8080" or "https://mc.example.com" if reverse-proxied. The mod cannot reliably auto-detect this — it may sit behind NAT/port-forwarding or a proxy, so bindAddress/port alone aren't enough to build a browser-usable link. Leave empty to disable features that need a public dashboard link (e.g. the in-chat "view profile" link on player names) when running in "internal" mode. Not needed at all in "external" mode — externalDashboard.url below is used instead.
webDashboard.customProfileUrlTemplate""Point the in-chat "view profile" link at your OWN external site instead of either NeoEssentials dashboard — full control over the URL shape. Supports {player} (URL-encoded username) and {uuid} placeholders, e.g. "https://myserver.com/players/{player}". Takes priority over externalDashboard.url/publicUrl above when set. Leave empty to use one of those instead.
webDashboard.externalDashboard — Populated automatically by running `/dashboard pair <dashboardUrl> <code>` in-game/ console (get the code from the dashboard's own Configuration page) — never hand-type these. Once paired, url/token push a notification (Authorization: Bearer <token>) whenever a dashboard_user is created/updated/deleted here, so the external dashboard can mirror the change into its own user table automatically. Empty/absent = not paired yet. Use /dashboard unpair to clear. This URL is also reused to build the in-chat "view profile" link on player names when running in "external" mode.
webDashboard.externalDashboard.url""—
webDashboard.externalDashboard.token""—
webDashboard.externalDashboard.keyId""—
webDashboard.roleSync — Keeps a linked player's dashboard role (see /dashboardregister) in sync with their real in-game permission status — grants ADMIN when they gain the configured permission/group, revokes it again when they lose it. Off by default. Only ever adjusts roles it granted itself — a role you set manually (e.g. /apikey create <label> OPERATOR) is never touched.
webDashboard.roleSync.enabledfalse—
webDashboard.roleSync.intervalSeconds300How often (seconds) the reconciliation sweep runs, in addition to an immediate check whenever a linked player joins.
webDashboard.roleSync.adminPermission"neoessentials.admin.dashboard"A player with this permission node is granted the dashboard ADMIN role. Leave empty to not check by permission node.
webDashboard.roleSync.adminGroup"admin"A player in this permission group is granted the dashboard ADMIN role. Leave empty to not check by group. Checked in addition to (OR) adminPermission.
webDashboard.securitySettings
webDashboard.securitySettings.requireAuthenticationtrueRequire Bearer token authentication on all API endpoints (strongly recommended)
webDashboard.securitySettings.enableRateLimitingtrueEnable per-IP rate limiting on dashboard API requests
webDashboard.securitySettings.maxRequestsPerMinute60Maximum API requests per IP per minute when rate limiting is enabled
webDashboard.securitySettings.publicModerationLookupEnabledtruePublic, no-login player moderation lookup (bans/mutes/kicks/warns by player name, plus a recent-punishments feed) — matches ban-management plugins' public transparency page. Never exposes IP bans/IP mutes regardless of this setting.
security
security.enableInputValidationtrue—
security.maxCommandLength256—
security.maxReasonLength500—
security.allowUnsafeCommandstrue—
security.enableCommandLengthEnforcertrueControls whether the CommandLengthEnforcer event handler validates player commands
items
items.permission-based-item-spawnfalseRequire 'neoessentials.item.spawn' (and per-item nodes) to spawn items via commands
items.oversized-stacksize64Maximum stack size for oversized stacks
items.default-stack-size-1Default stack size for all items. -1 = use vanilla behaviour.
items.unsafe-enchantmentstrueAllow enchantments beyond vanilla limits (e.g. Sharpness X)
items.max-unsafe-enchantment-level32767Maximum level allowed when unsafe-enchantments is true
items.item-spawn-blacklist — Items that cannot be spawned via commands even with permissions
items.inventoryAuditLogtrueLog every /invsee and /enderchest view/edit to neoessentials/inventory_audit.log
shop
shop.pricing
shop.pricing.enabledfalseMaster switch. false = every shop uses its raw configured buy/sell price, no computation overhead at all. All the sub-sections below are ignored while off.
shop.pricing.supplyDemand — Prices drift toward maxMultiplier as a shop's stock depletes, and toward minMultiplier as it fills back up — buying gets more expensive, selling gets less rewarding, the closer a shop is to running out.
shop.pricing.supplyDemand.enabledtrue—
shop.pricing.supplyDemand.maxStock500Stock level (items) at which the multiplier bottoms out at minMultiplier
shop.pricing.supplyDemand.minMultiplier0.8—
shop.pricing.supplyDemand.maxMultiplier2.0—
shop.pricing.timeDiscount — Flat percentage discount on buy prices during a fixed daily time window (server time, 24h clock).
shop.pricing.timeDiscount.enabledtrue—
shop.pricing.timeDiscount.startHour12—
shop.pricing.timeDiscount.endHour14—
shop.pricing.timeDiscount.discountPercent10.0—
shop.pricing.bulkTiers — Extra discount for buying in bulk. Each tier's discount applies once the purchase quantity reaches minQuantity; only the highest tier a purchase qualifies for is applied. Leave the array empty to disable bulk discounts without touching the other rules above.
permissions
permissions.useExternalPermissionstrueUse an external permission system (LuckPerms etc.) instead of the built-in one
permissions.defaultGroup"default"—
permissions.opsBypassPermissionstrueAllow server operators (OP level) to bypass permission checks
permissions.vanillaOpFallbacktrue—
permissions.requireExplicitGranttrueWhen true, a player gets a command only if you granted its node (LuckPerms or the internal manager). PermissionRegistry defaultValue=true is NOT used as a silent grant. OP still bypasses when opsBypassPermissions is true. Set false to restore "player commands work for everyone unless denied".
permissions.opsBypassEconomyModifierPermissionsfalseWhether the two OP-bypass settings above also apply to GRADED economy-modifier permission nodes (neoessentials.economy.sellmultiplier.*, .taxexempt, .nopaycooldown, .maxbalance.*, .paylimit.*). Those nodes represent opt-in bonuses meant to be granted explicitly (per-player or per-group) — not admin capabilities — so this defaults to false: OPs get their usual command-permission bypass, but do NOT silently receive the highest sell multiplier / free tax exemption / no pay cooldown just for being OP. Set true to restore the old blanket-bypass behavior.
permissions.wildcardsGrantEconomyModifierPermissionsfalseWhether a wildcard permission (e.g. "neoessentials.*", "neoessentials.economy.*") granted to a group or user is allowed to satisfy the same graded economy-modifier nodes above (sellmultiplier tiers, taxexempt, nopaycooldown, maxbalance/paylimit tiers). Defaults to false: those nodes must be listed explicitly (either the exact node itself, or a wildcard scoped no broader than "neoessentials.economy.sellmultiplier.*" etc.) even for a group whose permission list is just "neoessentials.*" — a broad admin wildcard should not silently hand out a 3x sell multiplier or free tax exemption nobody deliberately assigned that group. Set true to let wildcards cover these nodes too.
permissions.cachePermissionstrue—
permissions.permissionCacheExpiryMinutes30Minutes before cached permission entries expire
permissions.auditLoggingtrueLog all permission grant/revoke actions
afk
afk.enabledtrue—
afk.timeout300Seconds of inactivity before a player is marked AFK
afk.kickTimeout0Seconds after going AFK before the player is kicked (0 = disabled)
afk.afkkickMessage"Kicked for being AFK too long"—
afk.enableafkBroadcaststrue—
afk.broadcastOnAfktrue—
afk.broadcastOnReturntrue—
afk.afkMessage"{player} is now AFK"—
afk.returnMessage"{player} is no longer AFK"—
afk.ignoreAfkInSleeptrueAFK indicator in the tablist is configured in tablist.json (showAfkIndicator/afkSuffix), not here. Ignore AFK players when counting sleep votes
afk.enableActivityTrackingtrue—
afk.trackMovementtrue—
afk.trackChattrue—
afk.trackCommandstrue—
afk.trackInteractionstrue—
afk.movementThreshold0.1—
afk.rotationThreshold5.0—
afk.excludedCommands["afk", "list", "who", "tps", "ping", "help", "?"]Commands that do not reset the AFK timer
afk.autoSavetrue—
afk.saveInterval60—
afk.invulnerableWhenAfkfalseMake AFK players immune to all damage (mobs, environment, explosions, etc.) Useful for hardcore-style servers where an AFK death would be permanent
kits
kits.skipUsedOneTimeKitsFromKitListfalseHide one-time-use kits from /kit list after they have been claimed
kits.kitAutoEquipfalseAuto-equip kit armor when the player's armor slots are empty
kits.pastebinCreatekitfalseUse pastebin for /createkit output instead of writing to kits.json directly
kits.maxKitsPerPlayer10Maximum active kit cooldowns per player (-1 = unlimited)
kits.allowKitOverridetrueAllow players with the override permission to bypass kit cooldowns
kits.logKitUsagetrueLog kit usage to server logs
kits.commandCosts — Economy cost per kit command use (0 = free)
kits.commandCosts.kit0—
kits.commandCosts.createkit0—
kits.commandCosts.delkit0—
kits.commandCosts.listkits0—
kits.newPlayerKit — Kit given to players on their very first join (bypasses cost and permissions)
kits.newPlayerKit.enabledfalse—
kits.newPlayerKit.kitName""Kit name, e.g. "starter". Leave empty to disable.
teleportation
teleportation.homeSettings
teleportation.homeSettings.maxHomes5Maximum homes per player (-1 = unlimited)
teleportation.homeSettings.allowCrossDimensionHomestrueAllow homes to be set in the Nether, End, etc.
teleportation.homeSettings.homeSetCooldown30Cooldown in seconds between /sethome uses (0 = disabled)
teleportation.homeSettings.homeTeleportCooldown5Cooldown in seconds between /home teleports (0 = disabled)
teleportation.homeSettings.homeDeleteCooldown10Cooldown in seconds between /delhome uses (0 = disabled)
teleportation.homeSettings.requireConfirmationForDeletetrueRequire confirmation dialog before deleting a home
teleportation.homeSettings.enableHomeTeleportSafetytrueBlock /home if the destination is unsafe (lava, void, solid ceiling, etc.)
teleportation.homeSettings.logHomeActionstrueLog home set / delete / teleport actions
teleportation.warpSettings
teleportation.warpSettings.allowPlayerWarpstrueAllow players to create their own warps (requires permission)
teleportation.warpSettings.maxPlayerWarps3Maximum player-created warps (-1 = unlimited)
teleportation.warpSettings.warpCooldown10Cooldown in seconds between /warp uses (0 = disabled)
teleportation.warpSettings.warpSetCooldown60Cooldown in seconds between /setwarp uses (0 = disabled)
teleportation.warpSettings.allowCrossDimensionWarpstrueAllow warps across dimensions
teleportation.warpSettings.logWarpActionstrueLog warp creation / deletion / usage
teleportation.warpSettings.perWarpPermissionfalseRequire 'neoessentials.warps.<name>' permission for each individual warp
teleportation.spawnSettings
teleportation.spawnSettings.spawnOnJointrueTeleport players to spawn on their first join
teleportation.spawnSettings.spawnOnDeathfalseTeleport players to spawn on death (overrides bed spawn)
teleportation.spawnSettings.spawnCooldown5Cooldown in seconds between /spawn uses (0 = disabled)
teleportation.spawnSettings.allowSpawnSettrueAllow /setspawn
teleportation.spawnSettings.enableSpawnSafetytrueBlock spawn teleport if the spawn location is unsafe
teleportation.spawnSettings.logSpawnActionstrueLog spawn teleports and spawn point changes
teleportation.teleportRequestSettings
teleportation.teleportRequestSettings.requestTimeout60Seconds before TPA requests expire
teleportation.teleportRequestSettings.maxPendingRequests5Maximum pending requests a player can have at once
teleportation.teleportRequestSettings.cooldownBetweenRequests10Cooldown in seconds between sending TPA requests
teleportation.teleportRequestSettings.allowMultipleRequestsfalseAllow multiple TPA requests to the same player
teleportation.teleportRequestSettings.enableRequestNotificationstrueSend chat notifications for incoming TPA requests
teleportation.teleportRequestSettings.autoAcceptFromFriendsfalseAuto-accept requests from friends (requires friends system)
teleportation.teleportRequestSettings.enableTeleportSafetytrueBlock teleportation to unsafe destinations
teleportation.teleportRequestSettings.logTeleportRequeststrueLog TPA request actions
teleportation.generalSettings
teleportation.generalSettings.teleportDelay3Warm-up delay in seconds before teleportation completes (0 = instant)
teleportation.generalSettings.cancelOnMovementtrueCancel the teleport if the player moves during the warm-up delay
teleportation.generalSettings.cancelOnDamagefalseCancel the teleport if the player takes damage during the warm-up delay
teleportation.generalSettings.enableTeleportWarmuptrueShow countdown messages during the teleport delay
teleportation.generalSettings.allowTeleportInCombatfalseAllow teleportation while in combat (requires combat system)
teleportation.generalSettings.maxTeleportDistance-1Maximum teleport distance in blocks (-1 = unlimited)
teleportation.generalSettings.enableParticleEffectstrueShow particle effects at source / destination
teleportation.generalSettings.enableSoundEffectstruePlay sound effects during teleportation
teleportation.generalSettings.protectedAreas[]World regions where teleportation is blocked (requires a region plugin)
teleportation.randomTeleportSettings
teleportation.randomTeleportSettings.defaultLocation"{world}"Default named location slot when /tpr is run with no argument. {world} is replaced with the player's current world name.
teleportation.randomTeleportSettings.defaultMinRange0Global minimum distance from centre in blocks
teleportation.randomTeleportSettings.defaultMaxRange5000Global maximum distance from centre (-1 = half the world border). Every attempt that lands outside already-generated terrain forces a real (potentially costly) chunk generation on the main thread — a smaller range means repeated /tpr uses are more likely to reuse terrain generated by earlier ones, instead of constantly pushing into brand-new territory. Raise this once the surrounding area is mostly pre-generated.
teleportation.randomTeleportSettings.findAttempts6Attempts to find a safe random position before giving up. Each attempt that lands on ungenerated terrain force-generates a chunk — keep this modest on servers without pre-generated terrain, since 10 failed attempts in a row means 10 forced generations.
teleportation.randomTeleportSettings.cacheThreshold5Minimum pre-computed cached locations to maintain
teleportation.randomTeleportSettings.prewarmBatchSize2How many NEW cache slots one /tpr use is allowed to force-generate in the background right after teleporting. Keeping this small (rather than bursting the full gap up to cacheThreshold at once) spreads that cost across several /tpr uses instead of stacking a second lag spike immediately after every teleport.
teleportation.randomTeleportSettings.cooldown60Cooldown in seconds between /tpr uses per player (0 = disabled)
teleportation.randomTeleportSettings.mode"command""command" (default) = /tpr instantly teleports, exactly as before. "gui" = bare /tpr (no location argument) opens a chest-GUI biome picker instead — /tpr <locationName> still bypasses the GUI either way.
teleportation.randomTeleportSettings.biomeSearchRadius6400Search radius/step (in blocks) used only by GUI biome-picker teleports — same engine /locate biome uses. Larger radius finds rarer biomes but is slower.
teleportation.randomTeleportSettings.biomeSearchStep32—
teleportation.randomTeleportSettings.biomeMenuItems — GUI-only: pin specific biomes to fixed slots and/or override their icon. slot — 0-44, page-1 slot to pin this biome to (0 = top-left box). Optional — omit to leave the biome auto-positioned (alphabetical, like every other biome) while still overriding just its icon. item — icon item id override. Optional — omit to keep the built-in default icon (that biome's sapling/dedicated block, or a generic fallback if unmapped). Pinned biomes are removed from the auto-listed pool (shown once, at their pinned slot); every unpinned biome — including any this mod doesn't recognize, e.g. from a biome mod — still fills the remaining slots automatically across page 1 and beyond.
teleportation.randomTeleportSettings.excludedBiomes[]Biome resource locations excluded globally (e.g. "minecraft:ocean")
teleportation.randomTeleportSettings.locations — Named location slots. Update centre in-game with /settpr <name>.
teleportation.randomTeleportSettings.locations.default
teleportation.randomTeleportSettings.locations.default.center{ "x": 0, "y": 64, "z": 0, "world": "minecraft:overworld" }—
teleportation.randomTeleportSettings.locations.default.minRange0—
teleportation.randomTeleportSettings.locations.default.maxRange10000—
teleportation.randomTeleportSettings.locations.default.excludedBiomes
teleportation.backSettings
teleportation.backSettings.enableDeathBacktrueSave death location so /back returns the player to where they died
teleportation.backSettings.enableTeleportBacktrueSave pre-teleport location for /back (home / warp / spawn / tpa)
teleportation.backSettings.enableBackSafetyfalseCheck destination safety before /back teleport. Off on this server: the check treats unloaded chunks as unsafe, which broke /back after any long-range teleport (origin chunks unload once the player leaves); vanilla teleportTo loads the target chunk itself.
teleportation.backSettings.teleportDelay3Warm-up delay for /back in seconds (0 = instant, overrides generalSettings.teleportDelay)
teleportation.backSettings.backCooldown0Cooldown between /back uses in seconds (0 = disabled)
moderation
moderation.banSettings
moderation.banSettings.enablePermanentBanstrue—
moderation.banSettings.enableTempBanstrue—
moderation.banSettings.enableIPBanstrue—
moderation.banSettings.maxBanReason500—
moderation.banSettings.defaultBanReason"Banned by an operator"—
moderation.banSettings.autoExpireTempBanstrue—
moderation.banSettings.checkExpiredBansInterval300Interval in seconds to check for expired temp bans (300 = 5 min, 0 = disabled, min 5)
moderation.banSettings.logBanActionstrueLog all ban / unban actions
moderation.banSettings.broadcastBansfalseBroadcast ban actions to online staff
moderation.banSettings.banMessageFormat"You have been banned from this server.\nReason: {reason}\nBanned by: {bannedBy}\n{duration}"—
moderation.banSettings.tempBanMessageFormat"You have been temporarily banned from this server.\nReason: {reason}\nBanned by: {bannedBy}\nExpires: {expiry}"—
moderation.banSettings.ipBanMessageFormat"Your IP address has been banned from this server.\nReason: {reason}\nBanned by: {bannedBy}"—
moderation.jailSettings
moderation.jailSettings.enableJailSystemtrue—
moderation.jailSettings.requireJailLocationtrueRequire a jail location to be set before jailing players
moderation.jailSettings.jailTeleportOnLogintrueTeleport jailed players back to jail when they reconnect
moderation.jailSettings.maxJailReason500—
moderation.jailSettings.defaultJailReason"Jailed by an operator"—
moderation.jailSettings.jailMessageFormat"You have been jailed.\nReason: {reason}\nJailed by: {jailedBy}\nJail: {jail}"—
moderation.jailSettings.preventJailEscapetruePrevent jailed players from using teleportation commands
moderation.jailSettings.logJailActionstrueLog all jail / unjail actions
moderation.jailSettings.defaultSphereRadius10.0Default radius (blocks) for sphere-shaped jails when no explicit radius is given
moderation.jailSettings.maxJailsBeforeTempBan3Repeat-offender auto-escalation: jailing the same player this many times (tracked per-player, resets after a perm-ban fires) automatically issues a ban instead of the Nth jail. maxJailsBeforePermBan must stay HIGHER than maxJailsBeforeTempBan, or the temp-ban tier never triggers (the perm-ban check runs first). The admin who triggered the auto-ban gets a direct in-game notice when this fires, in addition to the log line.
moderation.jailSettings.maxJailsBeforePermBan6—
moderation.jailSettings.tempBanDurationMinutes1440Duration (minutes) of the automatic temp-ban issued at the maxJailsBeforeTempBan threshold. Default 1440 = 24 hours.
moderation.vanishSettings
moderation.vanishSettings.enableVanishSystemtrue—
moderation.vanishSettings.vanishOnJoinfalseAuto-vanish staff members when they join
moderation.vanishSettings.hideFromTabListtrueHide vanished players from the tab list
moderation.vanishSettings.preventInteractiontruePrevent vanished players from interacting with non-staff
moderation.vanishSettings.broadcastToStaffVanishfalseBroadcast vanish toggles to online staff
moderation.vanishSettings.BroadcastToAllVanishfalseBroadcast vanish actions to all players (fake join / quit message)
moderation.vanishSettings.logVanishActionstrueLog vanish toggle actions
moderation.freezeSettings
moderation.freezeSettings.enableFreezeSystemtrue—
moderation.freezeSettings.preventCommandstruePrevent frozen players from using commands (except those listed in allowedCommands)
moderation.freezeSettings.allowedCommands["help", "rules", "appeal"]Commands frozen players are still allowed to use
moderation.freezeSettings.freezeOnLogintrueKeep players frozen when they reconnect
moderation.freezeSettings.maxFreezeReason500—
moderation.freezeSettings.defaultFreezeReason"Frozen by an operator"—
moderation.freezeSettings.freezeMessage"You have been frozen by {freezer}.\nReason: {reason}\nYou cannot move or interact until unfrozen."—
moderation.freezeSettings.unfreezeMessage"You have been unfrozen by {unfreezer}"—
moderation.freezeSettings.freezeReminder"You are currently frozen. Contact staff if you need assistance."—
moderation.freezeSettings.freezeReminderInterval30Interval in seconds to remind frozen players (0 = disabled)
moderation.freezeSettings.logFreezeActionstrueLog all freeze / unfreeze actions
moderation.kickSettings
moderation.kickSettings.enableKickSystemtrue—
moderation.kickSettings.maxKickReason500—
moderation.kickSettings.defaultKickReason"Kicked by an operator"—
moderation.kickSettings.broadcastKicksfalseBroadcast kick actions to online staff
moderation.kickSettings.kickMessage"You have been kicked from the server.\nReason: {reason}\nKicked by: {kicker}"—
moderation.kickSettings.kickAllMessage"Server maintenance in progress. Please reconnect in a few minutes."—
moderation.kickSettings.notifyStaffOnKicktrueNotify online staff when a player is kicked
moderation.kickSettings.logKickActionstrueLog all kick actions
moderation.generalSettings
moderation.generalSettings.staffNotificationPermission"neoessentials.moderation.notify"Permission required to receive staff moderation notifications
chat
chat.modMessagePrefix""Prefix prepended to NeoEssentials command-feedback (success/error/warning/info) and in-game admin support notices. Accepts & and § color codes. Empty string hides the tag. Restore the old branded tag with "&8[&bNE&8] &r". Not the player chat-format.
chat.chat-format
chat.chat-format.default"<{neoessentials_prefix} {neoessentials_displayname} {neoessentials_suffix}> {MESSAGE}"—
chat.chat-format.group:admin"&c[Admin] {neoessentials_displayname}: {MESSAGE}"—
chat.chat-format.group:mod"&2[Mod] {neoessentials_displayname}: {MESSAGE}"—
chat.chat-format.world:creative"&b[C] {neoessentials_displayname}: {MESSAGE}"—
chat.enableChatEnhancementstrueEnable Phase 2 enhancements: clickable names, mentions, URL linking, [item] display
chat.clickablePlayerNamestrueMake player names in chat clickable (hover for stats, click to message)
chat.showProfileLinkInChattrueAppend a small clickable link icon after clickable player names in chat that opens their public dashboard profile (/lookup?player=<name>) in a browser. Requires clickablePlayerNames above AND a resolvable dashboard URL — webDashboard.externalDashboard.url (set via /dashboard pair) in "external" mode, or webDashboard.publicUrl in "internal" mode. Silently has no effect if neither URL is configured.
chat.autoLinkUrlstrueAutomatically linkify URLs in chat
chat.allowItemLinkstrueAllow [item] placeholder to show the held item in chat
chat.mentions
chat.mentions.enabledtrueEnable @PlayerName mention system
chat.mentions.highlightColor"&e"Color code applied to highlighted @mentions (e.g. &e = yellow)
chat.mentions.playSoundtruePlay a sound when a player is mentioned
chat.mentions.soundName"entity.experience_orb.pickup"Sound name: entity.experience_orb.pickup, block.note_block.pling, etc.
chat.mentions.soundVolume1.0—
chat.mentions.requirePermissionfalseRequire 'neoessentials.chat.mention' permission to use @mentions
chat.mentions.permission"neoessentials.chat.mention"—
chat.badges
chat.badges.enabledtrueEnable rank badges and status icons in chat
chat.badges.badgePosition"before_prefix"Badge position: 'before_prefix' | 'after_prefix' | 'before_name' | 'after_name'
chat.badges.useCustomImagesfalseNOT FULLY IMPLEMENTED YET — see docs/Wiki/ChatSystem.md#custom-png-badge-images-current-limitations. Generates a resource pack from config/neoessentials/badges/<rank>.png files, but (a) the pack is never actually pushed to players (autoSendResourcePack below doesn't send anything despite the name — you'd have to host it yourself and set server.properties manually) and (b) even then, chat always shows the rankBadges emoji below, never the custom image. Leave this false and use rankBadges (emoji/text) instead — that part fully works today.
chat.badges.customImageSize16Badge image size in pixels (16, 24, or 32) — only relevant once useCustomImages actually renders in chat
chat.badges.customImagePath"config/neoessentials/badges"Path to badge images folder relative to server root
chat.badges.autoSendResourcePackfalseDoes NOT auto-send anything yet — only generates the pack + logs manual server.properties setup instructions on join. See the useCustomImages note above.
chat.badges.requireResourcePackfalseReserved for when auto-send is implemented — currently unused
chat.badges.resourcePackUrl""Public URL where the resource pack is hosted, for the manual server.properties setup above.
chat.badges.resourcePackPrompt"This server uses custom badge images. Please accept the resource pack for the best experience!"Reserved for when auto-send is implemented — currently unused
chat.badges.rankBadges — Emoji/text badge shown per rank (looked up by primary group, lowercased) — this is the part that actually works. A group with no entry, or an empty string, gets no badge.
chat.badges.rankBadges.owner""—
chat.badges.rankBadges.admin"⭐"—
chat.badges.rankBadges.moderator"️"—
chat.badges.rankBadges.helper""—
chat.badges.rankBadges.vip""—
chat.badges.rankBadges.vipplus""—
chat.badges.rankBadges.mvp""—
chat.badges.rankBadges.builder""—
chat.badges.rankBadges.developer""—
chat.badges.statusIcons
chat.badges.statusIcons.enabledtrueShow status icons (AFK, vanished, etc.) in chat
chat.badges.statusIcons.iconPosition"after_name"Position: 'before_name' | 'after_name' | 'after_message'
chat.badges.statusIcons.afk""—
chat.badges.statusIcons.vanished""—
chat.badges.statusIcons.streaming""—
chat.badges.statusIcons.muted""—
chat.antiSpam
chat.antiSpam.enabledtrueMaster switch for the anti-spam filter
chat.antiSpam.capsFilter
chat.antiSpam.capsFilter.enabledtrueFilter messages with excessive CAPS (shouting)
chat.antiSpam.capsFilter.maxPercentage70Maximum percentage of uppercase letters allowed (1–100)
chat.antiSpam.capsFilter.action"lowercase"Action: 'lowercase' | 'block' | 'warn'
chat.antiSpam.capsFilter.bypassPermission"neoessentials.chat.caps.bypass"—
chat.antiSpam.capsFilter.minimumLength5Minimum message length to check (avoids flagging short messages like "OK")
chat.antiSpam.repeatFilter
chat.antiSpam.repeatFilter.enabledtruePrevent sending identical messages in quick succession
chat.antiSpam.repeatFilter.cooldownSeconds5Seconds before the same message can be sent again
chat.antiSpam.repeatFilter.action"block"Action: 'block' | 'warn'
chat.antiSpam.repeatFilter.bypassPermission"neoessentials.chat.repeat.bypass"—
chat.antiSpam.linkFilter
chat.antiSpam.linkFilter.enabledfalseFilter URLs in chat
chat.antiSpam.linkFilter.action"allow"Action: 'allow' (all) | 'block' (all) | 'whitelist' (only listed domains)
chat.antiSpam.linkFilter.whitelist["minecraft.net", "neoforged.net", "github.com"]—
chat.antiSpam.linkFilter.bypassPermission"neoessentials.chat.links.bypass"—
chat.antiSpam.spamFilter
chat.antiSpam.spamFilter.enabledtrueRate-limit chat to prevent message flooding
chat.antiSpam.spamFilter.messagesPerPeriod5Maximum messages per period before blocking
chat.antiSpam.spamFilter.periodSeconds10Period length in seconds
chat.antiSpam.spamFilter.action"block"Action: 'block' | 'warn'
chat.antiSpam.spamFilter.bypassPermission"neoessentials.chat.spam.bypass"—
chat.formatTemplates
chat.formatTemplates.enabledfalseWhen true, use 'activeTemplate' instead of 'chat-format'
chat.formatTemplates.activeTemplate"default"Active template: 'default' | 'rpg' | 'modern' | 'minimal' | 'detailed' | 'ranked' | 'custom'
chat.formatTemplates.templates
chat.formatTemplates.templates.default"<{neoessentials_prefix} {neoessentials_displayname} {neoessentials_suffix}> {MESSAGE}"—
chat.formatTemplates.templates.rpg"&7[Lv.{neoessentials_level}] {neoessentials_prefix}{neoessentials_displayname}&r: {MESSAGE}"—
chat.formatTemplates.templates.modern"● {neoessentials_prefix}{neoessentials_displayname} &8› &r{MESSAGE}"—
chat.formatTemplates.templates.minimal"{neoessentials_displayname}: {MESSAGE}"—
chat.formatTemplates.templates.detailed"&7[{neoessentials_world}] &r<{neoessentials_prefix}{neoessentials_displayname}{neoessentials_suffix}&r> {MESSAGE}"—
chat.formatTemplates.templates.ranked"&7[{neoessentials_group}] {neoessentials_prefix}{neoessentials_displayname}&r: {MESSAGE}"—
chat.formatTemplates.templates.custom"<{neoessentials_prefix} {neoessentials_displayname} {neoessentials_suffix}> {MESSAGE}"—
chat.richText
chat.richText.enabledfalseEnable Phase 4 rich-text effects (gradients, rainbow). Can be performance-intensive.
chat.richText.allowGradientstrueAllow <gradient:FF0000-0000FF>text</gradient> syntax
chat.richText.allowRainbowtrueAllow <rainbow>text</rainbow> syntax
chat.conditionalFormatting
chat.conditionalFormatting.enabledfalseEnable Phase 4 conditional formatting (time / stat / state-based dynamic formats)
chat.conditionalFormatting.allowTimeConditionalstrueAllow <if:time=morning>…</if> (morning/afternoon/evening/night/day/weekday/weekend)
chat.conditionalFormatting.allowStatConditionalstrueAllow <if:health<50>…</if> (health/level/food/armor/xp with <, >, =, !=)
chat.conditionalFormatting.allowStateConditionalstrueAllow <if:afk>…</if> (afk/vanished/flying/creative/survival/spectator/op/…)
chat.channels
chat.channels.enabledtrue—
chat.channels.team
chat.channels.team.enabledtrue—
chat.channels.team.command"team"—
chat.channels.team.aliases["t", "teamchat"]—
chat.channels.team.displayName"&a⛨ Team"—
chat.channels.team.teamBasedtrue—
chat.channels.team.defaultfalse—
chat.channels.team.discord
chat.channels.team.discord.enabledfalse—
chat.channels.team.discord.channelId""—
chat.channels.team.discord.webhookUrl""No-bot-required alternative to channelId — a Discord webhook URL (Discord: Server Settings > Integrations > Webhooks). If both are set, both fire.
chat.channels.local
chat.channels.local.enabledtrue—
chat.channels.local.radius100—
chat.channels.local.command"l"—
chat.channels.local.aliases["local", "lc"]—
chat.channels.local.prefix""—
chat.channels.local.defaulttrue—
chat.channels.local.discord
chat.channels.local.discord.enabledfalseUsually disabled: local chat is proximity-based, discord bridge is global
chat.channels.local.discord.channelId""Discord channel ID. Leave empty to use the default 'chat' channel.
chat.channels.local.discord.webhookUrl""—
chat.channels.global
chat.channels.global.enabledtrue—
chat.channels.global.command"g"—
chat.channels.global.aliases["global"]"gc" was previously listed here too, but it collides with the built-in memory/TPS diagnostics command (/gc) — that command wins the registration, so the alias was silently unusable for switching channels. Use /g or /global instead.
chat.channels.global.prefix"!"—
chat.channels.global.defaultfalse—
chat.channels.global.discord
chat.channels.global.discord.enabledtrue—
chat.channels.global.discord.channelId""—
chat.channels.global.discord.webhookUrl""—
chat.enable-chat-formattingtrue—
chat.enable-color-codestrue—
chat.logChatToConsoletrueLog all chat messages to console/log. false = suppress chat from console entirely.
chat.muteCommands[]Commands blocked when a player is muted
chat.messaging
chat.messaging.socialspyFormat""SocialSpy broadcast format. Default: "&8[&eSocialSpy&8] &b{sender} &7→ &b{receiver}&7: &f{message}"
chat.messaging.msgFormatTo""/msg sender format. Default: "&7[&aTo &f{neoessentials_displayname}&7] &f{message}"
chat.messaging.msgFormatFrom""/msg receiver format. Default: "&7[&bFrom &f{neoessentials_displayname}&7] &f{message}"
chat.messaging.replyFormatTo""/reply sender format (blank = use msgFormatTo default)
chat.messaging.replyFormatFrom""/reply receiver format (blank = use msgFormatFrom default)
chat.playerChatPermissions[]—
chat.suppressVanillaJoinQuitMessagesfalse—
chat.customJoinMessage"none"—
chat.customQuitMessage"none"—
discordEmbedTemplate
discordEmbedTemplate.enabledtrueMaster switch. false = fall back to a plain "PlayerName: message" line.
discordEmbedTemplate.authorName"{player}"Placeholders available in every field below: {player} - the sender's username {uuid} - the sender's UUID (for building an avatar URL yourself) {message} - the chat message content {channel} - the NeoEssentials chat channel name (e.g. "global")
discordEmbedTemplate.authorIconUrl"https://mc-heads.net/avatar/{uuid}"—
discordEmbedTemplate.description"{message}"—
discordEmbedTemplate.color"#5865F2"Hex color for the embed's side bar, e.g. "#5865F2" (Discord blurple). Leave empty ("") for Discord's default embed color.
discordEmbedTemplate.footerText""Optional footer text/icon. Leave both empty to omit the footer entirely.
discordEmbedTemplate.footerIconUrl""—
discordEmbedTemplate.showTimestampfalseShow the current time as the embed's timestamp
discordEmbedTemplate.join — Per-event-type overrides below — same fields as above (any field left out falls back to that event's own built-in default, NOT the chat template above). Only used by SDLink so far, for the same explicit-channel-override case chat's own embed above covers. {message} here means: join/leave - unused; mute/afk - the full built status line; advancement - just the advancement's name.
discordEmbedTemplate.join.enabledtrue—
discordEmbedTemplate.join.description"**{player}** joined the server"—
discordEmbedTemplate.join.color"#57F287"—
discordEmbedTemplate.join.showTimestamptrue—
discordEmbedTemplate.leave
discordEmbedTemplate.leave.enabledtrue—
discordEmbedTemplate.leave.description"**{player}** left the server"—
discordEmbedTemplate.leave.color"#ED4245"—
discordEmbedTemplate.leave.showTimestamptrue—
discordEmbedTemplate.mute
discordEmbedTemplate.mute.enabledtrue—
discordEmbedTemplate.mute.description"{message}"—
discordEmbedTemplate.mute.color"#FEE75C"—
discordEmbedTemplate.afk
discordEmbedTemplate.afk.enabledtrue—
discordEmbedTemplate.afk.description"{message}"—
discordEmbedTemplate.advancement
discordEmbedTemplate.advancement.enabledtrue—
discordEmbedTemplate.advancement.description"**{player}** earned the advancement **{message}**"—
discordEmbedTemplate.advancement.color"#FAA61A"—
discordEmbedTemplate.advancement.showTimestamptrue—
discordEventChannels
discordEventChannels.join{ "enabled": false, "channelId": "", "webhookUrl": "" }—
discordEventChannels.leave{ "enabled": false, "channelId": "", "webhookUrl": "" }—
discordEventChannels.mute{ "enabled": false, "channelId": "", "webhookUrl": "" }—
discordEventChannels.afk{ "enabled": false, "channelId": "", "webhookUrl": "" }—
discordEventChannels.advancement{ "enabled": false, "channelId": "", "webhookUrl": "" }—
discordEventChannels.privateMessage{ "enabled": false, "channelId": "", "webhookUrl": "" }—

crates.json 18

KeyDefaultDescription
crates — Each entry is one crate, keyed by its id. Primarily authored here as a file — the in-game /crate admin commands are convenience helpers on top of this (e.g. addreward captures your currently-held item as a new reward), not a full editor. displayName — shown in GUI titles/messages block — cosmetic only, which vanilla block a physical placement uses animation — "roulette" (CS:GO-style spinning strip) | "sequential" (a few quick flickers before settling) | "instant" (no animation) keyItem — the item given/held as this crate's key (full item, including any custom name/model data you've set on it) — set via /crate admin setkey rewards — weighted pool; "weight" is relative, doesn't need to sum to 100. broadcastRare (+ optional broadcastMessage, {player} substituted) announces server-wide when that specific reward is won.
crates.common
crates.common.displayName"&7Common Crate"—
crates.common.block"minecraft:chest"—
crates.common.animation"roulette"—
crates.common.keyItem
crates.common.keyItem.item"minecraft:tripwire_hook"—
crates.common.keyItem.count1—
crates.common.rewards
crates.common.rewards.id"diamonds"—
crates.common.rewards.weight30—
crates.common.rewards.item{ "item": "minecraft:diamond", "count": 3 }—
crates.common.rewards.broadcastRarefalse—
crates.common.id"iron"—
crates.common.weight50—
crates.common.item{ "item": "minecraft:iron_ingot", "count": 8 }—
crates.common.broadcastRarefalse—
crates.id"emerald_block"—
crates.weight5—
crates.item{ "item": "minecraft:emerald_block", "count": 1 }—
crates.broadcastRaretrue—
crates.broadcastMessage"&6{player} &7won an &aEmerald Block &7from a &7Common Crate&7!"—

discord_auth.json 15

KeyDefaultDescription
enabledfalseEnable/disable Discord-linked dashboard login. Requires a player to have already linked their account in-game via Simple Discord Link or Mc2Discord's own commands.
requireLinkedAccounttrueWhen true, dashboard login via Discord identity requires the player's Minecraft account to actually be linked to Discord (recommended: true).
allowAutoRegistrationtrueAutomatically create dashboard accounts for Discord users on first login (recommended: true)
defaultRole"VIEWER"Default role for users with no Discord role mapping (ADMIN | MODERATOR | VIEWER)
roleMapping
roleMapping.709352979668533341"ADMIN"—
roleMapping.709353103530655857"MODERATOR"—
roleMapping.709353464475680788"VIEWER"—
roleHierarchy — Define which dashboard roles each Discord role ID grants (for multi-role users)
roleHierarchy.709352979668533341["ADMIN", "MODERATOR", "VIEWER"]—
roleHierarchy.709353103530655857["MODERATOR", "VIEWER"]—
roleHierarchy.709353464475680788["VIEWER"]—
whitelistedRoles[]Only allow Discord users with these role IDs (empty = allow all)
blacklistedUsers[]Block specific Discord user IDs from logging in
sessionDuration86400000Session duration in milliseconds (86400000 = 24 hours)
permissionSync
permissionSync.enabledtrueEnable/disable Discord role → Minecraft permission synchronization
permissionSync.syncOnJointrueAutomatically sync permissions when a player joins the server (recommended: true)
permissionSync.permissionMappings
permissionSync.permissionMappings.709352979668533341
permissionSync.permissionMappings.709353103530655857
permissionSync.permissionMappings.709353464475680788

discordrolesync.json 2

KeyDefaultDescription
discordRoleSync
discordRoleSync.enabledfalseMaster switch. Requires a Discord bridge mod that can read a linked player's current Discord role list (currently DCIntegration only — SDLink/Mc2Discord don't expose a public API for this) and NeoEssentials' OWN internal permission manager (not an external adapter like LuckPerms/FTB Ranks, since this can't write into another plugin's groups).
discordRoleSync.intervalSeconds300How often (seconds) the periodic sweep re-checks every online player's Discord roles, in case a role changed outside this server (a booster role expiring, a manual Discord edit, etc). Also runs once immediately whenever a player joins.
discordRoleSync.roleGroupMap — Maps a Discord role's snowflake ID to a NeoEssentials permission group name (permissions.json). If a player holds more than one mapped role at once, the group with the higher "priority" wins. A player holding NONE of the mapped roles is left alone — this only ever grants/upgrades a group, it never demotes a player back to a default group.

economy.json 15

KeyDefaultDescription
currencySymbol"$"Symbol shown before money amounts (e.g. "$100.00")
currencyName"coins"Singular currency name shown in messages
currencyNamePlural"coins"Plural currency name
onboardingCompletionReward25000Coins awarded once when a genuinely new player completes the Farmstead onboarding route. Set to 0 to disable.
maxBalance999999999.99Maximum balance a player can hold (999999999.99 = ~1 billion)
taxPercentage0.0Global tax percentage on all transfers (0.0 = no tax)
allowNegativeBalancesfalseAllow player balances to go negative
logTransactionstrueLog every transaction to logs/neoessentials/transactions.log
transactionHistoryLimit50Maximum number of transactions kept per player for /history
maxTransferAmount10000.0Maximum amount that can be sent in a single /pay transfer
paytoggleDefaulttrueDefault state of /paytoggle (true = payments enabled on join)
cacheMaximumSize10000Caffeine cache maximum size for in-memory balance lookups
cacheExpireAfterAccessMinutes60Minutes after last access before a cache entry expires
cleanupInactiveAccountstrueRemove economy accounts for players inactive longer than inactiveAccountCleanupDays
inactiveAccountCleanupDays30—

kits.json 8

KeyDefaultDescription
kits
kits.name"starter"—
kits.cooldown86400Cooldown in seconds before the kit can be claimed again (86400 = 24 hours, -1 = one-time)
kits.items
kits.items.item"minecraft:stone_sword"—
kits.items.count1—
kits.items.nbt"{}"—
kits.item"minecraft:bread"—
kits.count16—
kits.nbt"{}"—
commands — Commands run as console when the kit is claimed ({player} = player name)

leaderboard.json 16

KeyDefaultDescription
leaderboard
leaderboard.boards
leaderboard.boards.higherIsBettertrue, "exemptPermission": "neoessentials.economy.baltop.exempt"—
leaderboard.boards.enabledtrue }—
leaderboard.boards.displayName"Player Kills", "format": "integer", "higherIsBetter": true—
leaderboard.boards.exemptPermission"neoessentials.leaderboard.kills.exempt", "enabled": true }—
leaderboard.boards.displayName"Mob Kills", "format": "integer", "higherIsBetter": true—
leaderboard.boards.exemptPermission"neoessentials.leaderboard.mob_kills.exempt", "enabled": true }—
leaderboard.boards.displayName"Playtime", "format": "time", "higherIsBetter": true—
leaderboard.boards.exemptPermission"neoessentials.leaderboard.playtime.exempt", "refreshInterval": 300—
leaderboard.boards.enabledtrue }—
leaderboard.boards.displayName"Diamond Ore Mined", "format": "integer", "higherIsBetter": true, "enabled": false }—
leaderboard.boards.displayName"Zombie Kills", "format": "integer", "higherIsBetter": true, "enabled": false }—
leaderboard.boards.displayName"Distance Walked (cm)", "format": "integer", "higherIsBetter": true, "enabled": false }—
leaderboard.boards.displayName"Deaths", "format": "integer", "higherIsBetter": true, "enabled": false }—
leaderboard.boards.higherIsBettertrue, "enabled": false }—
leaderboard.boards.higherIsBettertrue, "refreshInterval": 120, "icon": "minecraft:emerald"—
leaderboard.boards.entryFormat"{rankColor}{medal} #{rank} &f{name} &8- &a{value}", "enabled": true }—

permissions.json 13

KeyDefaultDescription
defaultGroup"default"The group assigned to players with no explicit group
groups
groups.name"default"—
groups.prefix"&7"—
groups.suffix""—
groups.permissions
groups.inherits[]—
name"moderator"—
prefix"&2[Mod] "—
suffix""—
permissions
inherits["default"]—
name"admin"—
prefix"&c[Admin] "—
suffix""—
permissions
inherits["moderator"]—

scoreboard.json 7

KeyDefaultDescription
scoreboard
scoreboard.enabledtrueSet false to hide the sidebar scoreboard entirely.
scoreboard.refreshInterval10How often the scoreboard updates in ticks (20 = 1s). Lower = smoother, more traffic.
scoreboard.joinDelayTicks40Ticks to wait after a player joins before showing them a board (avoids a flash of content during the join sequence).
scoreboard.boards
scoreboard.boards.name"default"—
scoreboard.boards.priority0—
scoreboard.boards.conditions[]—
scoreboard.boards.title"<gradient:FFD700-FF8C00>&l{server_name}"—
scoreboard.boards.lines
groups
players — Per-player title/line overrides, keyed by player UUID.

tablist.json 31

KeyDefaultDescription
tablist
tablist.enabledtrueSet false to restore the vanilla tablist appearance
tablist.independentModetrue—
tablist.refreshInterval10How often the tablist header/footer updates in ticks (20 = 1 s). Lower = smoother, more traffic.
tablist.header
tablist.footer — Text displayed BELOW the player list. Same syntax and placeholder support as header.
tablist.playerFormat"&f{prefix}&r{player}{suffix}"—
tablist.nameColorMeta"farmstead-namecolor"—
tablist.hideVanishedtrueHide vanished players from other players' tablists and {online} count. Staff with 'neoessentials.vanish.see' always see them.
tablist.showAfkIndicatortrueAppend afkSuffix to AFK players' names in the tablist
tablist.afkSuffix" &7[AFK]"Suffix appended to AFK players' names. Supports all color syntax.
tablist.nametagSettings
tablist.nametagSettings.enabledtrue—
tablist.groupColors
tablist.groupColors.owner"&#FF4444"—
tablist.groupColors.admin"&c"—
tablist.groupColors.mod"&6"—
tablist.groupColors.vip"&#00CFFF"—
tablist.groupColors.default"&f"—
tablist.groups
tablist.groups.admin
tablist.groups.admin.header
tablist.groups.admin.footer"&cAdmin tools: &f/vanish /kick /ban /mute &8| &7{world}"—
tablist.groups.mod
tablist.groups.mod.header"<gradient:FFA500-FFD700>&l✪ Moderator ✪&r &8| &e{online}&8/&e{max} &7online"—
tablist.groups.mod.footer"&6Staff tools: &f/mute /warn /tempban &8| &7{world}"—
tablist.groups.vip
tablist.groups.vip.header
tablist.groups.vip.footer"&#00CFFF{player}&7 — &aBalance: &f{balance} &8| &7Ping: &a{ping}ms"—
tablist.players
tablist.proxy
tablist.proxy.enabledfalse—
tablist.proxy.serverLabel"Main"—
tablist.proxy.pollIntervalTicks100—
tablist.proxy.showNetworkPlayersfalse—
tablist.proxy.knownServers[]—
tablist.fakePlayers[]—
tablist.layout
tablist.layout.columns1—
tablist.layout.sortByGroupWeighttrue—
tablist.layout.groupSectionsfalse—
tablist.layout.playersByServerfalse—
tablist.layout.excludeServers[]—
tablist.layout.hiddenServers[]—
tablist.layout.maxSlotsPerColumn20—

votifier.json 10

KeyDefaultDescription
votifier
votifier.enabledtrueMaster switch — also see modules.votifierEnabled in config.json (that one requires a restart to take effect; this one is reloadable but only actually stops/starts the listener on the next server restart too, since the socket lifecycle is tied to server start/stop, not /neoe reload).
votifier.host"0.0.0.0"Bind address for the vote-listener socket — separate from the Minecraft server port.
votifier.port8192—
votifier.v2Token""Auto-generated on first boot if empty — this is the shared secret used to verify Votifier PROTOCOL V2 (NuVotifier-compatible) votes via HMAC-SHA256. Paste this into your vote site's panel wherever it asks for a "Votifier v2 token"/"NuVotifier token". Leave untouched once generated — changing it invalidates any vote site already configured with the old value.
votifier.sites — Per-vote-site reward configuration, keyed by the exact "serviceName" string the vote site sends (case-insensitive) — e.g. "PlanetMinecraft", "minecraftservers.org". A vote from a site with no matching entry here uses "default" instead.
votifier.sites.default
votifier.sites.default.commands — Console commands run on vote, {player} replaced with the voter's username.
votifier.sites.default.keys{}Crate keys granted per vote, by crate id -> amount. Requires modules.cratesEnabled and a matching crate defined in crates.json — silently skipped otherwise.
votifier.voteLinks — Shown by /vote — plain links/instructions for where to vote, not used for anything else.
votifier.voteLinks.example-site"https://example-vote-site.com/vote/YourServerName"—
votifier.broadcastMessage"&a{player} &7voted for the server! Thanks for your support &c&l❤"Broadcast to the whole server when someone votes. Empty = no broadcast.
votifier.voteParty — Players can opt out of seeing (or causing) the broadcast via /togglevotebroadcast — this only controls whether IT'S SENT to a given player, not whether their own vote triggers one for everyone else.
votifier.voteParty.enabledtrue—
votifier.voteParty.votesRequired50Total votes (server-wide, cumulative) needed to trigger the party
votifier.voteParty.commands
votifier.voteParty.resetOnRestartfalsefalse = the counter keeps counting across restarts toward the next party; true = it resets to 0 every time the server restarts