Lightweight Spigot plugin for server punishments: bans, mutes, and kicks.

Simple and effective punishment plugin for Spigot / Paper servers.
Warn, kick, mute and ban players, permanently or for a set time, with a full history stored locally in H2.
Features
- Warnings, kicks, mutes and bans. Mutes and bans can be permanent or temporary (
/tempmute,/tempban). - Punishment history. Every punishment is recorded, including revoked and expired ones.
- Silent mode. Add
-s/--silentto any command so only staff withwarrant.notifysee the announcement. - Offline targets. Ban, mute or warn players who aren't online. Warnings are delivered the next time they join.
- Mute command blocking. Muted players can't use private-message commands like
/msg,/tellor/r. - MiniMessage formatting. Every message lives in a language file and can be restyled.
- Developer API. Cancellable events fire whenever a punishment is issued or revoked.

Requirements
| Component | Version |
|---|---|
| Server | Spigot / Paper 26.2 |
| Java | 25 or newer |
Installation
- Download the latest jar from the releases page, or build it yourself.
- Drop it into your server's
plugins/folder. - Start the server.
config.yml,lang/en_US.ymland the H2 database (warrant.mv.db) are created inplugins/Warrant/.
Commands
<player> accepts online and offline players (except /kick, which needs an online player). [reason] is optional unless noted. Every command accepts -s / --silent.
| Command | Description | Permission |
|---|---|---|
/warn <player> <reason> |
Warn a player (reason required) | warrant.warn |
/unwarn <player> [id] [reason] |
Remove a warning (latest one if no ID is given) | warrant.unwarn |
/kick <player> [reason] |
Kick an online player | warrant.kick |
/mute <player> [reason] |
Permanently mute a player | warrant.mute |
/tempmute <player> <duration> [reason] |
Mute a player for a set time | warrant.tempmute |
/unmute <player> [reason] |
Lift an active mute | warrant.unmute |
/ban <player> [reason] |
Permanently ban a player | warrant.ban |
/tempban <player> <duration> [reason] |
Ban a player for a set time | warrant.tempban |
/unban <player> [reason] |
Lift an active ban | warrant.unban |
/punish history <player> |
View a player's punishment history | warrant.history |
Durations
Durations combine a number with a unit: s (seconds), m (minutes), h (hours), d (days) and w (weeks). Units can be chained.
/tempban Steve 7d Griefing spawn
/tempmute Alex 1h30m Spamming chat
/ban Herobrine -s Ban evasion

Other permissions
| Permission | Description |
|---|---|
warrant.notify |
See announcements for silent punishments |
warrant.exempt |
Can't be punished (server operators are always exempt) |
Configuration
config.yml
# Language file to load from plugins/Warrant/lang/
language: en_US
mute:
# Commands muted players are not allowed to use
blocked-commands:
- msg
- tell
- w
- whisper
- r
- reply
- me
- teammsg
Messages
All messages live in lang/<language>.yml and use MiniMessage formatting. Keys missing from a custom language file fall back to the bundled en_US.yml.
ban:
announce: "<red><name> was banned by <staff> for <duration>: <reason>"
screen: "<red>You are banned for <remaining><newline><gray><reason>"
| Placeholder | Meaning |
|---|---|
<name> |
The punished player |
<staff> |
The staff member (or console) issuing the action |
<reason> |
The reason, or the no-reason message |
<duration> |
The full punishment length |
<remaining> |
Time left on an active mute or ban |
<id> |
The punishment's unique ID |

Developer API
Listen for PlayerPunishedEvent and PlayerPunishmentRevokedEvent to react to punishments, or cancel them before they're saved.
import com.lotusplugins.warrant.api.events.PlayerPunishedEvent;
import com.lotusplugins.warrant.api.model.PunishmentType;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
public final class PunishmentLogger implements Listener {
@EventHandler
public void onPunish(PlayerPunishedEvent event) {
var punishment = event.getPunishment();
if (punishment.type() == PunishmentType.BAN && punishment.reason() == null) {
event.setCancelled(true); // require a reason for bans
}
}
}
Note
Commands run asynchronously, so these events usually fire off the main thread. Don't touch the Bukkit world directly from your listener.
Community
Questions, feedback or just want to chat? Join our Discord server.
Pinned Versions
- R26.2–26.3
Pages
Members
2Owner
Admin