Wardly is a free, open-source ban / mute / kick / punishment management plugin for Minecraft servers and networks, built for Velocity, Paper (standalone) and Paper backends behind a Velocity proxy. It's a full moderation toolkit: durations, reason presets, staff permission groups, GeoIP-based ban-evasion detection, automatic multi-language translation of ban reasons, and a REST API for an external web admin panel.
- Punishments:
/ban,/ipban,/mute,/kick,/unban,/unmutewith human-readable durations (7d,2h,30m,permanent) and free-text or preset reasons. - Staff permission groups: per-group duration caps, granular per-command permissions and
admin/super-admin tiers, configured in
groups.yml. - Reason presets: reusable, tab-completable ban/mute/kick reasons with per-language text,
custom disconnect screens and automatic "ban-evading" alt detection (
presets.yml). - Ban evasion detection: alerts staff when a joining player shares an IP with an existing banned account.
- GeoIP: resolves a player's country/ISP for staff (
/geoip,/dupeip) and to auto-detect their language. - Multi-language: built-in messages in English, Italian, French, Spanish and German, plus optional automatic translation (DeepL / Google) of free-typed ban reasons.
/wardlystaff panel: paginated ban/mute/kick lists, search, per-staff statistics, lookup, force-expire, wipe and purge tooling.- REST API: a built-in HTTP admin API (players, bans, mutes, logs, GeoIP, ban-by-code lookup,
admin ban/kick/unban) for building an external web dashboard, no extra dependencies, no
framework, just
com.sun.net.httpserver. - MySQL storage via HikariCP, single schema shared across every deployment mode below.
Durations accept 7d, 2h, 30m or permanent. Reasons can be free text or a preset key from
presets.yml. Every command respects the caller's group permissions and duration caps
(groups.yml).
| Command | Description |
|---|---|
/ban <player> [duration] <reason> |
Ban a player, online or offline |
/ipban <player> [duration] <reason> |
Ban a player's IP address, disconnecting every account sharing it |
/unban <player> |
Remove an active ban or IP-ban |
/mute <player> [duration] <reason> |
Silence a player in chat |
/unmute <player> |
Remove an active mute |
/kick <player> <reason> |
Immediately disconnect a player |
/checkban <player> |
Show a player's active ban, if any |
/checkmute <player> |
Show a player's active mute, if any |
/banreason <player> <reason> |
Edit the reason of the most recent active ban |
/bantime <player> <duration> |
Edit the duration of the most recent active ban |
/banlist [page] |
Paginated list of active bans |
/history <player> [page] |
Full punishment history for a player |
/dupeip <player> |
List accounts that share the player's IP |
/geoip <player> |
Resolve a player's country/ISP |
/wardly |
Staff panel: list, active, recent, top, lookup, search, stats, groups, checkgroup, staffhistory, staffstats, expire, wipe, purgedata, reload |
Wardly is a multi-module Gradle project. Pick the module(s) that match your setup: you never need more than one.
| Setup | What to install | Config lives in |
|---|---|---|
| Network (Velocity + multiple backend servers) | velocity on the proxy, spigot-network on every Paper backend |
proxy only, backends need zero config or database |
| Standalone (single Paper server, no proxy) | spigot-standalone alone |
that server's own plugins/Wardly/ folder |
| Velocity only (no backend plugin) | velocity alone |
proxy (works, but see note below) |
spigot-network is a thin client: no config file, no database connection. Mute state and a
player's resolved language are pushed to it live from the proxy over plugin-messaging
(wardly:mute, wardly:lang). Commands and ban enforcement never need to run on the backend:
Velocity intercepts its own registered commands network-wide, and bans are already denied at
login before a player ever reaches a backend server. This design keeps configuration and the
database in exactly one place: the proxy.
spigot-standalone is the full plugin, with the same commands, enforcement and REST API as
velocity, for admins running a single Paper server with no proxy. It owns its own
plugins/Wardly/config.yml and MySQL connection. It will log a warning on startup if it detects
the server has Velocity/BungeeCord IP forwarding enabled, since that usually means you actually
want spigot-network instead.
Minecraft's chat-signing protocol means a proxy can't always deny an already-signed chat message,
so /mute enforcement on Velocity alone can occasionally miss a message. Pair velocity with
spigot-network on your backends for fully reliable mute enforcement.
./gradlew buildEach module produces its own jar under <module>/build/libs/:
velocity/build/libs/velocity-*.jar→ proxyplugins/spigot-standalone/build/libs/spigot-standalone-*.jar→ standalone serverplugins/spigot-network/build/libs/spigot-network-*.jar→ backend serverplugins/
Requires Java 21 and a MySQL/MariaDB database reachable from wherever you deploy velocity or
spigot-standalone.
core/ platform-agnostic business logic: commands, punishment/database/config
managers, localization, REST API. Shaded into velocity and spigot-standalone.
velocity/ Velocity proxy plugin (bootstrap, listeners, plugin-messaging bridges).
spigot-standalone/ full Paper plugin for single-server setups.
spigot-network/ thin Paper client for backends behind a Wardly-enabled Velocity proxy.
MIT: free to use, modify and self-host.
Keywords: minecraft ban plugin, minecraft punishment plugin, minecraft moderation plugin, velocity ban plugin, spigot ban plugin, paper ban plugin, minecraft mute plugin, minecraft kick plugin, minecraft staff tools, minecraft admin plugin, minecraft geoip ban, minecraft network punishment system.