Compatibility
Minecraft: Java Edition
Platforms
Supported environments
Tags
Creators
Details
Judicator
Your rules. Your workflow. Your server. Judicator is a configurable moderation plugin for Minecraft servers and networks, bringing punishments, player reports and staff oversight together. Manage a standalone server or coordinate moderation across your network, with configurable rules, messages and Discord notifications.
Documentation • Source code • Issues & suggestions
Features
- Flexible punishments: permanent and temporary bans, mutes and soft mutes, plus warnings and kicks.
- Consistent enforcement: progressive punishment presets, warning thresholds and staff duration limits.
- Player context: history, ID lookup, evidence links, private notes and linked-account checks.
- Report handling: assign, review and close player reports.
- Staff oversight: activity summaries, hierarchy checks and rollback previews.
- Network moderation: shared storage, synchronization and server/group scopes.
- Your presentation: customizable messages, menus and Discord webhook embeds.
- Your storage: SQLite by default, with MySQL, MariaDB and PostgreSQL support.
From the first warning to the final decision
Apply bans, mutes, soft mutes, warnings and kicks. Build progressive punishment rules, attach evidence and review a player's history before taking action. Staff notes and an assignable report queue keep the context available to your team.
Built around your moderation policy
Choose network-wide or scoped punishments, set staff hierarchy and duration limits, and review staff activity with rollback previews. Start with SQLite or connect your instances to a shared MySQL, MariaDB or PostgreSQL database.
See what you can customize
The defaults below show the actual configuration shipped with the project: punishment progression, cooldowns, staff limits, account checks, retention, menus, reports, storage and Discord embeds.
English, Portuguese, Spanish, French and German are included. Messages, punishment screens and menu text can be edited in the language files.
Expand any file to explore it. These are bundled example defaults; replace the sample database credentials and server branding with your own. Settings marked "restart" require a restart.
config.yml — Moderation rules, staff limits, menus & network behavior
# ============================================================
# Judicator — main configuration
# ============================================================
# /judicator reload applies every change, except the settings marked "restart".
# A setting missing from this file keeps its default, so an older config.yml keeps working.
#
# Durations: "<amount>:<unit>", several joined by commas — "30:m", "7:d,2:h", "1:mo".
# units: s, m, h, d, w, mo, y (or second(s), minute(s), hour(s), day(s), week(s), month(s), year(s))
# Permissions are listed in the README.
# ------------------------------------------------------------
# Language
# ------------------------------------------------------------
language: en # messages_<language>.yml: en, es, pt, fr or de are bundled; for another one, create messages_<xx>.yml in this folder
per-player-language: false # true: each player gets the messages in their game language when it is en, es, pt, fr or de (the console, Discord and login screens use 'language')
# ------------------------------------------------------------
# Punishments
# ------------------------------------------------------------
# Tells the players of the target's server about the punishment (silent ones, with -s, never are).
# true/false for every kind, or one line per kind:
# announce:
# ban: true
# mute: true
# kick: false
# warn: false
announce: true
staff-notifications: true # players with judicator.notify see every punishment; silent (-s) ones only judicator.notify.silent
log-kicks: false # true: /kick is stored in the punishment history (/phistory, /pview, /blame, /activity)
# Predefined reasons for /punish <player>, also usable in any command as #<key> (/ban Steve #reason2 x-ray).
# reason: the text stored as the punishment's reason
# permission: needed to use it when require-reason-permission is true (judicator.admin always can)
# type: BAN, TEMPBAN, MUTE or TEMPMUTE duration: for TEMPBAN/TEMPMUTE
# ip: true punishes the player's IP address instead of the account
# icon: the item that shows it in the /punish menu (an item id, e.g. tnt); without it, the item of its type
# steps: progressive punishment instead of type/duration — the 1st offence uses the 1st step, the 2nd the 2nd...
# and the last step repeats from then on
require-reason-permission: false
reasons:
reason1: # 1st time 7 days and 2 hours, 2nd time 30 days, from the 3rd time on permanent
reason: "Player Offense"
icon: poisonous_potato
permission: "punish.helper"
ip: false
steps:
- type: TEMPMUTE
duration: "7:d,2:h"
- type: TEMPMUTE
duration: "30:d"
- type: MUTE
reason2:
reason: "Cheating"
icon: diamond_sword
permission: "punish.moderator"
type: TEMPBAN
duration: "7:months,2:weeks"
ip: false
reason3:
reason: "Serious Dissemination"
icon: tnt
permission: "punish.moderator"
type: BAN
ip: false
# ------------------------------------------------------------
# Staff rules
# ------------------------------------------------------------
# The console skips all of these; judicator.admin skips time-limits and cooldowns, but not the hierarchy.
hierarchy:
enabled: true # staff can only punish players with a lower judicator.level.<N>; players without a level can always be punished
max-level: 100 # highest N checked in judicator.level.<N>
# Longest ban/mute a staff group may apply, given by the explicit permission judicator.timelimit.<group>.
# A limited staff member cannot apply a permanent punishment; with several groups the longest limit wins.
# Ranks that inherit a limited group must set its permission to false.
time-limits:
helper: # judicator.timelimit.helper
ban: "1:d"
mute: "7:d"
# Seconds before the same player can get another punishment of the same kind (0 = off).
# Stops two staff members from punishing the same player twice at once.
cooldowns:
ban: 30
mute: 30
warn: 30
kick: 0
# ------------------------------------------------------------
# Muted players
# ------------------------------------------------------------
block-global-chat: true # false: muted players can still chat (mutes are only recorded, and locked commands below are still blocked)
commands-locked-when-silenced: # commands muted players cannot use; also caught with a namespace (/minecraft:tell) or without the slash
- "/g"
- "/l"
- "/tell"
soft-mute-format: "<{player}> {message}" # proxy only (Velocity, BungeeCord): what a soft-muted player sees of their own message (Spigot/Paper keeps the server's chat format)
# ------------------------------------------------------------
# Warns
# ------------------------------------------------------------
# Console commands run when a player reaches a number of active warns. One entry per step, with any name;
# {player} is the warned player.
warns:
tree:
warns: 3
commands:
- "tempban {player} '3:d' got three warns"
# ------------------------------------------------------------
# Accounts and IP addresses
# ------------------------------------------------------------
# IPs or CIDR ranges shared by many players (a school network, the proxy itself): never IP-punished, ignored by alt
# warnings, alts.deny-if-banned and ip-limits.
exempt-addresses:
- "127.0.0.1"
- "::1"
ip-limits: # 0 = off
max-online: 0 # most accounts online at the same time from one IP
max-recent-accounts: 0 # most different accounts that may join from one IP within recent-period
recent-period: "1:d"
alts:
notify-on-join: true # players with judicator.alts.notify are warned when someone shares an IP with a banned/muted account
deny-if-banned: false # true: an account cannot join while another account that used the same IP is banned ('alts' in immune.yml passes)
notes:
notify-on-join: true # players with judicator.notes.notify are told when someone with staff notes (/note) joins
# ------------------------------------------------------------
# Data retention
# ------------------------------------------------------------
# Days to keep old records (0 = forever); older ones are deleted at startup and every 12 hours.
# Player names, IPs and histories are personal data. /judicator clear <player> deletes one player's data.
retention:
kicks: 0 # logged kicks (log-kicks)
finished-punishments: 0 # bans/mutes that ended or were revoked this long ago; nothing in force is deleted
finished-warns: 0 # temporary warns that ended this long ago
addresses: 0 # IPs no account used for this long (/alts and offline IP bans no longer find them)
notes: 0 # staff notes written this long ago
reports: 0 # player reports closed this long ago
# ------------------------------------------------------------
# Networks: proxy and several servers (see "Networks and Multiple Servers" in the README)
# ------------------------------------------------------------
# Spigot/Paper behind Velocity/BungeeCord with UUID forwarding (they report online-mode=false): true checks bans by
# UUID, as in online mode. Never on a real offline-mode server, where anyone can join with any UUID.
trust-uuids: false
sync: # servers sharing one MySQL/PostgreSQL database: what one applies, revokes or edits reaches the players of the others
enabled: false # true on every server of the network (restart)
poll-interval: 1 # seconds between checks for changes made by the other servers, 1 to 30 (restart)
proxy-mode: false # Spigot/Paper behind a Velocity or BungeeCord running Judicator, with sync on both: the proxy refuses logins, kicks, announces and notifies; this server only blocks muted chat (restart)
chat-on-backends: false # proxy only (Velocity, BungeeCord): true when the backends run Judicator in proxy-mode, so the proxy never denies (signed) chat of muted players itself
scopes: # punishments for one server or a group of servers of the network: /ban Steve -scope=survival hacking
server-name: '' # Spigot/Paper only: this server's name as the proxy's config calls it; empty = only global punishments here
groups: {} # e.g. survival: [survival1, survival2] (a group wins over a server with the same name)
menus: # Spigot/Paper: the menus of /jmenu
dialogs: mixed # Paper 1.21.6+, players whose game is 1.21.6 or newer: mixed = the lists (with their order and filters) as inventories, everything else (main menu, pages, confirmations, questions, sort-and-filter form) as dialogs; all = everything as dialogs; none = everything as inventories. Older games and Spigot always get inventories
replace-commands: true # the lookup commands open the menu for players: /banlist, /mutelist, /reports, /phistory, /whistory, /notes, /alts, /blame, /playerinfo, /pview, /wview and /punish (player) (the console keeps the chat answer; so does /blame with a period). false: chat answers, menus only through /jmenu. Behind a proxy running Judicator, the proxy answers those commands first
reports: # /report and /reports
require-permission: false # true: only players with judicator.report can use /report (on a proxy nobody has it without a permissions plugin)
cooldown: 60 # seconds a player waits between two reports
notify-on-join: true # staff with judicator.reports.notify hear how many reports are open when they join
data.yml — Database connection & pool settings
# ============================================================
# Judicator — database
# ============================================================
# /judicator reload reconnects with these settings; changing 'type' needs a restart.
# To move the data to another database (e.g. SQLite -> MySQL), see 'judicator' in import.yml.
database:
# sqlite (default) keeps everything in one file and needs no database server: fine for a single server or a small
# network. For several Spigot/Paper servers sharing punishments, switch to postgres or mysql (also for MariaDB).
type: 'sqlite' # sqlite, postgres or mysql
# Put before every table name so they never clash with another plugin's tables in the same database: a-z, 0-9 and
# _, up to 16 characters ('' = no prefix). The same on every server sharing the database; changing it needs a
# restart, and the tables already created keep their old names (rename them by hand). Tables of Judicator 1.x are
# renamed to the prefixed names on the first start.
table-prefix: 'judicator_'
# --- sqlite: one file, no database server (only 'file' is read) ---
file: 'judicator.db' # relative to the plugin folder
# --- postgres / mysql ---
host: 'localhost'
port: '' # empty: the default port of the type (5432 for postgres, 3306 for mysql)
database: 'postgres'
user: 'postgres'
password: 'password'
properties: # extra JDBC driver properties, e.g. MySQL: useSSL: 'false' / PostgreSQL: sslmode: 'require'
pool:
maximum-size: 10 # most connections open at once
minimum-idle: 2 # connections kept open while idle
connection-timeout: 30 # seconds to wait for a free connection before failing
discord.yml — Webhook events, embeds & colors
# ============================================================
# Judicator — Discord webhook
# ============================================================
# Posts an embed to a Discord channel for every punishment. Applied with /judicator reload.
# Create the webhook in Discord (channel settings > Integrations > Webhooks) and paste its URL below.
# The embed is posted once, by the server that applied the punishment.
#
# Placeholders for title, description and footer:
# {player} punished player {punisher} staff member who applied it
# {reason} reason {type} BAN, TEMPBAN, MUTE, SOFTMUTE, KICK... (labels.warn for warns)
# {id} id in the database {expires} end date, or the 'permanent'/'paused' label below
# Colours: hex, e.g. "#FF0000".
enabled: false
webhook-url: "" # channel for every event; an event can post to another one with its own webhook-url
username: "" # name shown as the author of the message (empty: the webhook's name)
avatar-url: "" # picture of the author (empty: the webhook's picture)
thumbnail-url: "https://mc-heads.net/avatar/{uuid}" # picture of the player; {uuid} is their UUID (MHF_Steve when unknown)
footer: "Judicator • ID #{id}"
labels: # names of the embed fields, and texts for what has no value
player: "Player"
punisher: "Punisher"
type: "Type"
reason: "Reason"
started-at: "Started At"
expires: "Expires"
scope: "Only on" # a punishment for one server or group (scopes in config.yml)
permanent: "Permanent"
paused: "Paused (online time only)"
no-reason: "No reason provided"
warn: "Warn" # the type shown for warns
report: "Report" # the type shown for player reports
reporter: "Reported by"
server: "Server" # where the reported player was
events:
ban:
enabled: true
color: "#E74C3C"
title: "🔨 Player Banned"
description: "Player **{player}** was permanently banned by **{punisher}**."
tempban:
enabled: true
color: "#E67E22"
title: "⏱️ Temporary Ban"
description: "Player **{player}** received a temporary ban from **{punisher}**."
mute:
enabled: true
color: "#9B59B6"
title: "🔇 Player Muted"
description: "Player **{player}** was permanently muted by **{punisher}**."
tempmute:
enabled: true
color: "#8E44AD"
title: "⏱️ Temporary Mute"
description: "Player **{player}** received a temporary mute from **{punisher}**."
kick:
enabled: true
color: "#F39C12"
title: "👢 Player Kicked"
description: "Player **{player}** was kicked by **{punisher}**."
warn:
enabled: true
color: "#F1C40F"
title: "⚠️ Warning Issued"
description: "Player **{player}** received a warning from **{punisher}**."
# webhook-url: "" # e.g. warns in a channel of their own
report: # /report: off by default, a busy server gets many
enabled: false
color: "#3498DB"
title: "📣 Player Reported"
description: "**{punisher}** reported **{player}**."
immune.yml — Player exemptions
# ============================================================
# Judicator — exemptions
# ============================================================
# Players who cannot get the punishments listed for them, not even from the console. Applied with /judicator reload.
#
# key: the player's UUID (recommended: it survives a name change, and in offline mode anyone can join with any
# name) or their name (any case)
# value: a list of all, ban, mute, kick, warn, alts, report
# alts = may join even when alts.deny-if-banned (config.yml) would refuse the account
# report = cannot be reported with /report
#
# An IP punishment is refused when any account that used that IP is exempt from it.
players:
# "069a79f4-44e9-4726-a5be-fca90e38aaf5": [all]
# "Builder": [mute, warn]
import.yml — Migration sources & database options
# ============================================================
# Judicator — importing from other plugins
# ============================================================
# Used only by /judicator import <source> [confirm], from the server console. Read when the command runs.
#
# - Back up your database first. Without "confirm" the command only reports what it would import.
# - Running it again is safe: punishments already in Judicator (same target, type and start) are skipped.
# - Judicator only reads the source; nothing is changed there.
#
# Each source takes:
# jdbc-url, user, password the source plugin's database (MySQL/MariaDB: jdbc:mysql://host:3306/<db>,
# PostgreSQL: jdbc:postgresql://host:5432/<db>)
# table-prefix where the plugin has one
# driver-jar, driver-class only for a database whose driver Judicator does not ship (H2, HSQLDB): put the driver
# jar in plugins/<Judicator folder>/drivers, set driver-jar to its file name and
# driver-class to its class (H2: org.h2.Driver, HSQLDB: org.hsqldb.jdbc.JDBCDriver)
#
# Embedded databases (H2, HSQLDB): stop the source plugin or, better, copy its files and point the URL at the COPY —
# an embedded file cannot be opened by two programs at once. Use the user/password the source plugin created it with
# (shown below for each default) and add ;IFEXISTS=TRUE (H2) or ;ifexists=true (HSQLDB), so a mistyped path fails
# instead of creating an empty database.
litebans:
# Default storage: H2 (LibertyBans' import guide uses h2-1.4.199.jar for it). URL: jdbc:h2:<path to the copy of
# LiteBans' database file>;ACCESS_MODE_DATA=r (read-only).
jdbc-url: ''
user: ''
password: ''
table-prefix: 'litebans_'
driver-jar: ''
driver-class: ''
advancedban:
# Default storage: HSQLDB, files plugins/AdvancedBan/data/storage.*, user 'SA', empty password.
# URL: jdbc:hsqldb:file:<path to the copy>/storage
jdbc-url: ''
user: ''
password: ''
driver-jar: ''
driver-class: ''
libertybans:
# Default storage: HSQLDB 2.7, files plugins/LibertyBans/internal/hypersql/punishments-database.*.
# URL: jdbc:hsqldb:file:<path to the copy>/punishments-database
jdbc-url: ''
user: ''
password: ''
table-prefix: 'libertybans_'
driver-jar: ''
driver-class: ''
banmanager:
# MySQL/MariaDB: the database of databases.local in BanManager's config.yml.
# Default storage: H2 1.4.200, file plugins/BanManager/local_bans (use the H2 1.4.200 driver jar).
# Only the table prefix is supported: tables renamed one by one in BanManager's config are not found.
jdbc-url: ''
user: ''
password: ''
table-prefix: 'bm_'
driver-jar: ''
driver-class: ''
vanilla:
# Folder with banned-players.json and banned-ips.json (also used by Essentials). Empty: the server folder.
directory: ''
judicator:
# Another Judicator database, e.g. to move from SQLite to MySQL/PostgreSQL: set data.yml to the new database,
# restart, then import the old one here. Copies punishments, warns, staff notes and the IP history used by /alts.
# SQLite: jdbc:sqlite:plugins/Judicator/judicator-old.db (a COPY of the old file). On Velocity the SQLite driver is
# only downloaded while data.yml uses SQLite: otherwise put sqlite-jdbc-3.46.1.2.jar in the drivers folder, with
# driver-class 'org.sqlite.JDBC'.
jdbc-url: ''
user: ''
password: ''
driver-jar: ''
driver-class: ''
table-prefix: 'judicator_' # table-prefix of the old database's data.yml; a database of Judicator 1.x is read without it
messages_en.yml — selected message, punishment screen & menu examples
The full English file contains more than 1,000 lines. The excerpts below show evidence prompts, announcements, a ban screen and menu labels. Other sections cover command responses, histories, reports, staff tools and more.
OpenMine Network and the example Discord/store addresses below are editable sample text.
prompt:
write-evidences: "&7Send the evidence one by one in chat. To finish, click or type \"{ready-prompt}\" or \"{cancel-prompt}\"."
next-link: "&aLink successfully attached. To finish, click or type \"{ready-prompt}\" or \"{cancel-prompt}\"."
evidence-limit: "&cThere is no room for this evidence (255 characters in total). Type \"{ready-prompt}\" to apply with the evidence already attached or \"{cancel-prompt}\"."
ready: "confirm"
cancel: "cancel"
nothing: "&cThere is nothing to confirm or cancel."
dialog: # the evidence on a dialog (Paper, 1.21.6+ clients); the chat otherwise
title: "&8Evidence"
label: "Links of the evidence, separated by spaces (optional):"
confirm: "&aApply"
cancel: "&cCancel"
announcements:
ban:
- ""
- "&c * User {nickname} was banned by {author}."
- ""
mute:
- ""
- "&c * User {nickname} was muted by {author}."
- ""
kick:
- ""
- "&c * User {nickname} was kicked by {author}."
- ""
warn:
- ""
- "&c * User {nickname} was warned by {author}.\n"
- "&c * Reason: {reason}."
- ""
runners:
ban-kick:
- "&6&lOpenMine Network\n"
- "&cYou have been banned from the server.\n"
- "\n"
- "&c * Reason: {reason}\n"
- "&c * Start: {startedAt}\n"
- "&c * End: {finishAt}\n"
- "&c * Evidence: {evidence}\n"
- "&c * Author: {author}\n"
- "&c * Where: {scope}\n"
- "\n"
- "&cUse ID &e#{id} &cto request a review on our Discord: &c&ndiscord.gg/your-server\n"
- "&c&lSTORE: &cstore.your-server.com.\n"
menu:
only-players: "&cMenus are for players in the game."
error: "&cThe menu could not be opened; see the server console."
no-permission: "&cYou do not have permission to do this."
prompt: "&eType {what} in the chat, or &f{cancel} &eto go back."
# a question on a dialog (Paper, 1.21.6+ clients) instead of the chat
question:
title: "&8Judicator"
label: "&7Type {what}:"
confirm: "&aOK"
cancel: "&cCancel"
denied:
name: "&cYou cannot see this"
lore:
- "&7Your permissions changed."
gone:
name: "&7It no longer exists"
lore:
- "&7It was deleted meanwhile."
empty:
name: "&7Nothing here"
lore: []
navigation:
back:
name: "&e« Back"
lore:
- "&7To the previous menu."
close:
name: "&cClose"
lore: []
previous:
name: "&e« Previous page"
lore:
- "&7Page {page} of {pages}."
next:
name: "&eNext page »"
lore:
- "&7Page {page} of {pages}."
page:
name: "&fPage {page}/{pages}"
lore:
- "&7{count} in total."
- "&7Click to refresh."
page-filtered:
name: "&fPage {page}/{pages}"
lore:
- "&7{count} found."
- "&eClick to clear the filters."
main:
title: "&8Judicator"
bans:
name: "&cBans in force &7({count})"
lore:
- "&7{count} in force."
- ""
- "&eClick to see them."
mutes:
name: "&6Mutes in force &7({count})"
lore:
- "&7{count} in force."
- ""
- "&eClick to see them."
reports:
name: "&eReports &7({count})"
lore:
- "&7{count} open."
- ""
- "&eClick to see them."
online:
name: "&aPlayers online &7({count})"
lore:
- "&7{count} online."
- ""
- "&eClick to see them."
search:
name: "&bFind a player"
lore:
- "&7Online or not."
- ""
- "&eClick and type the name."
search-what: "the player's name"
Commands & Permissions
Expand a section to see the command overview, syntax and permission nodes. Click an image to view it at full size.
Punishments & player tools
Arguments in (parentheses) are required; arguments in {braces} are optional.
Permanent Punishments
/ban (player) {reason}→judicator.ban/banip (player) {reason}→judicator.ban.ip/mute (player) {reason}→judicator.mute/muteip (player) {reason}→judicator.mute.ip/softmute (player) {reason}→judicator.softmute
Temporary Punishments
/tempban (player) (duration) {reason}→judicator.tempban/tempbanip (player) (duration) {reason}→judicator.tempban.ip/tempmute (player) (duration) {reason}→judicator.tempmute/tempmuteip (player) (duration) {reason}→judicator.tempmute.ip/tempsoftmute (player) (duration) {reason}→judicator.tempsoftmute
Warnings, Kicks and Progressive Punishments
/warn (player) {reason}→judicator.warn/tempwarn (player) (duration) {reason}→judicator.tempwarn/kick (player) {reason}→judicator.kick/punish (player) {reason}→judicator.punish
Player Overview and History
/playerinfo (player)→judicator.info/phistory (player)→judicator.history/pview (id)→judicator.view/whistory (player)→judicator.history/wview (id)→judicator.view/banlist {page}→judicator.banlist/mutelist {page}→judicator.mutelist/alts (player)→judicator.alts/jmenu {player}→judicator.menu— Spigot/Paper/Folia only.
Edit and Remove
/extend (id) (duration)→judicator.extend/changereason (id) (reason)→judicator.changereason/unban (player) {-s} {reason}→judicator.unban/unmute (player) {-s} {reason}→judicator.unmute/revoke (id)→judicator.admin/unwarn (id)→judicator.unwarn
Editing also checks staff hierarchy and punishment rules.
Private Staff Notes
/note (player) (text)→judicator.note/notes (player) {page}→judicator.notes/delnote (id)→judicator.delnote
Reports, staff audit & administration
Arguments in (parentheses) are required; arguments in {braces} are optional.
Player Reports
/report (player) (reason)→ open to everyone by default;judicator.reportwhen permission checks are enabled./reports→judicator.reports/reports list (open|assigned|closed|all) {page}→judicator.reports/reports info (id)→judicator.reports/reports assign (id) {staff}→judicator.reports.manage/reports unassign (id)→judicator.reports.manage/reports close (id) {comment}→judicator.reports.manage/reports tp (id)→judicator.reports.tp- Reporting offline players requires judicator.report.offline.
Staff Audit
/blame (staff) {period} {page}→judicator.blame/activity (period) {page}→judicator.activity/staffrollback (staff) (period) {confirm}→judicator.staffrollback
Rollback previews the affected actions before confirmation and requires a higher staff hierarchy level than the target.
Administration
/judicator help {category}→judicator.admin/judicator reload→judicator.admin/judicator version→judicator.admin/judicator import (source) {confirm}→ console only./judicator clear (player) {confirm}→ console only.
Import sources: litebans, advancedban, libertybans, banmanager, vanilla and judicator. Import and clear show a preview before confirmation.
Useful Aliases
/pinfo→ /playerinfo/staffhistory→ /blame/staffactivity→ /activity/judicatormenu→ /jmenu
Setup & Compatibility
Supported platforms & requirements
- Velocity: 3.4+, Java 17+.
- BungeeCord: 1.21+, Java 17+.
- Spigot / Paper: Minecraft 1.8.8+, Java 17+.
- Folia: 1.20.1+, using the Spigot/Paper build and Java 17+.
- Fabric: Minecraft 26.1+, Java 25 and Fabric API.
- NeoForge: Minecraft 26.1+, Java 25 and NeoForge 26.1+.
- Forge: Minecraft 26.1+, Java 25 and Forge 62+.
Choose the build for your platform. Features and requirements vary: /jmenu is available on Spigot/Paper/Folia, and native dialogs require a compatible Paper server and a 1.21.6+ client.
Feature availability
- Inventory menus: Spigot, Paper and Folia.
- Native dialogs: compatible Paper servers with a Minecraft 1.21.6+ client.
- PlaceholderAPI: Spigot/Paper.
- Hytale: experimental; muted-player commands are not blocked and messages do not have clickable actions.
Installation & network setup
Standalone Spigot / Paper / Folia
- Install the Judicator Bukkit build in your server's plugins folder.
- Start the server to generate the configuration files.
- Configure staff permissions and your moderation rules.
SQLite is enabled by default, so no external database server is needed.
Fabric / NeoForge / Forge Install the matching server mod in the mods folder and meet its platform requirements. Configuration files are stored in config/judicator/. Inventory menus are not available on these platforms.
Velocity or BungeeCord Use the matching proxy build to manage moderation across the network.
Several servers sharing moderation Point each instance to the same MySQL or PostgreSQL database and table prefix. Enable sync.enabled on each participating instance and restart.
Proxy + backends: signed chat and in-game menus Install the proxy build and the Bukkit build on the backends.
- Proxy: sync.enabled: true and chat-on-backends: true.
- Backends: sync.enabled: true and proxy-mode: true.
- For backends with correctly configured UUID forwarding, set trust-uuids: true.
Do not enable trust-uuids on a real offline-mode server. Network instances must use the same database and table prefix.
Database choices SQLite is suitable for local storage. Use MySQL, MariaDB or PostgreSQL for shared storage across machines. Changing the database type requires a restart.
Usage tips & migration
Punishment options, examples & extra permissions
Duration format Use values such as 10:m, 1:h, 3:d or 2:w. Combined values can be quoted: "1:h,30:m".
Examples
- /tempban Steve 3:d Cheating
- /tempmute Steve 1:h -o Spam
- /ban Steve -s Cheating
- /tempban Steve 7:d -scope=survival Cheating
- /activity 7:d
The survival scope must be configured before using the scoped example.
Optional behavior
- -s: silent actions on supported commands; requires judicator.silent.
- -o: count online time only for /tempmute and /tempsoftmute. Not available for IP mutes.
- -scope=(server or group): limit supported bans and mutes to a configured server or group.
- #key: insert a reason shortcut from config.yml.
- Soft mutes let the sender see their own messages while hiding them from other players.
- When asked for evidence, submit the links and confirm or cancel.
- IP-based actions require a recorded address for the target.
Messages and identity English, Portuguese, Spanish, French and German are included. Enable per-player-language to use the player's game language where supported. With trusted UUIDs, records follow the account through name changes; real offline-mode servers use name-based identity.
Additional Permissions
- judicator.silent — apply supported punishments silently with -s.
- judicator.notify — receive punishment notifications.
- judicator.notify.silent — receive silent punishment notifications.
- judicator.notes.notify — receive join alerts for players with staff notes.
- judicator.alts.notify — receive linked-account alerts.
- judicator.reports.notify — receive report notifications.
- judicator.level.(number) — assign a staff hierarchy level.
- judicator.timelimit.(group) — apply a configured punishment duration limit.
- judicator.admin — administrative access.
Importing data & upgrading to 2.0
Import from another moderation system Supported sources: LiteBans, AdvancedBan, LibertyBans, BanManager, vanilla and another Judicator database.
Configure the source in import.yml, then run from the console:
/judicator import (source)
/judicator import (source) confirm
The first command previews the import. The second writes the data. Replace (source) with litebans, advancedban, libertybans, banmanager, vanilla or judicator.
Back up your database before migration. Import coverage varies by source; H2/HSQLDB sources require their database driver.
Move between Judicator databases The judicator source can bring records from another Judicator database, including a move from SQLite to MySQL.
Upgrade from 1.x to 2.0 Stop every server sharing the database, update all instances, then start them. Version 2.0 changes the database tables; do not run mixed 1.x and 2.0 instances against the same database.
Retention and deletion Configure retention periods for old records in config.yml. For individual deletion requests, /judicator clear (player) previews stored data; adding confirm deletes it. This command is console-only.
Documentation & feedback
Find setup details and developer information in the documentation. To report a bug or suggest an improvement, open an issue on GitHub. Include your platform, Judicator version and relevant logs when reporting a problem.







