Welcome to the Hangar Open Beta. Please report any issue you encounter on GitHub!
Avatar for lotusplugins

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

Report Warrant?

Warrant banner

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.

Discord


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 / --silent to any command so only staff with warrant.notify see 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, /tell or /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.

Ban screen preview

Requirements

Component Version
Server Spigot / Paper 26.2
Java 25 or newer

Installation

  1. Download the latest jar from the releases page, or build it yourself.
  2. Drop it into your server's plugins/ folder.
  3. Start the server. config.yml, lang/en_US.yml and the H2 database (warrant.mv.db) are created in plugins/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

Punishment history preview

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

Chat announcement preview

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.

Information

Category
Admin Tools
Published
October 9, 2026
License
1Downloads
1Stars

Pinned Versions

Members

2