Compatibility
Minecraft: Java Edition
Platforms
Tags
Creators
Details
A modern in-game player reporting system designed for server moderation teams.
Players can easily report rule violations while moderators receive powerful tools to review, filter and process reports directly in-game using intuitive GUIs.
Version 4.0.0 is a complete rewrite, introducing a modern report workflow, improved moderation tools, database support, Discord integration and much more.
Almost every feature, message and visual can be configured in the config!
- Modern in-game reporting system
- Easy player reporting via
/report - Optional reason GUI and confirmation system
- Advanced moderation GUI for staff
- Assign moderators as report handlers
- Filter and sort reports directly in-game
- Teleport to reported players or saved locations
- Reward players for valid reports
- Supports online & offline reward claiming
- Discord webhook integration for reports and updates
- PlaceholderAPI support for statistics and integrations
- Storage support for YAML or MySQL
- Search reports by player, ID, reason or handler
- Notification system for staff members
- Automatic cleanup for old reports
- Highly configurable messages, GUIs and behavior
- Lightweight and optimized for performance
- Supports Folia
PlayerReport was built to help staff manage reports quickly and efficiently — directly in game.
Quick, how? → Reports can be reviewed and updated instantly.
Efficiently, how? → Lightweight design with optimized storage.
Effectively, how? → Clear moderation workflow with optional rewards.
Reports are displayed inside a fully configurable GUI.
Staff members can:
- review reports
- change report status
- assign handlers
- teleport to involved players (reporting and reported player)
- remove reports
Filtering and sorting options help moderators handle large amounts of reports efficiently.
Players can optionally receive rewards when their reports are confirmed.
Rewards support:
- command rewards
- item rewards
- offline reward storage
- reward claiming via
/reports claim
Due to the support of command rewards, this feature is compatible with other plugins, such as giving out vote keys as rewards or basically any other command.
This allows servers to encourage players to help maintain a fair environment.
Commands
| Command | Permission | Description |
|---|---|---|
/report <player> <reason> |
playerreport.report |
Create a report for a player. |
/reports |
playerreport.admin |
Open the moderation GUI to view and manage reports. |
/reports help |
playerreport.admin |
Shows all available PlayerReport commands. |
/reports search user <player> |
playerreport.admin |
Search reports created by or against a specific player. |
/reports search id <reportId> |
playerreport.admin |
Find a report by its unique ID. |
/reports search reason <text> |
playerreport.admin |
Search reports containing a specific reason. |
/reports search handler <player> |
playerreport.admin |
Show reports assigned to a specific moderator. |
/reports sethandler <reportId> <player|none> |
playerreport.admin.handler.set |
Assign or remove a moderator as the handler of a report. |
/reports clear |
playerreport.admin.clear |
Clear outdated or deleted reports. |
/reports claim |
playerreport.claim |
Claim rewards for confirmed reports. |
/reports on |
playerreport.admin.notify.toggle |
Enable report notifications. |
/reports off |
playerreport.admin.notify.toggle |
Disable report notifications. |
/reports reload |
playerreport.reload |
Reload the plugin configuration files. |
Permissions
| Permission | Description |
|---|---|
playerreport.* |
Grants access to all PlayerReport permissions. |
playerreport.report |
Allows players to create reports using /report. |
playerreport.bypass.cooldown |
Bypasses the report cooldown. |
playerreport.immune |
Prevents a player from being reported. |
playerreport.admin |
Allows access to the moderation GUI (/reports). |
playerreport.admin.handler.set |
Allows assigning or removing report handlers. |
playerreport.admin.clear |
Allows clearing outdated reports using /reports clear. |
playerreport.admin.notify.toggle |
Allows toggling report notifications using /reports on/off. |
playerreport.reload |
Allows reloading the plugin configuration with /reports reload. |
playerreport.update.notify |
Receive notifications when a plugin update is available. |
playerreport.claim |
Allows players to claim rewards for successful reports. |
config.yml
# =========================================================
# PlayerReport - config.yml
# Built for Paper 1.21.x (api-version: 1.20)
#
# Color codes:
# Use & for normal Minecraft colors (example: &a, &c, &7)
# HEX colors in lang.yml are supported via &#RRGGBB or #RRGGBB
# =========================================================
# =========================================================
# Reporting
# Settings for creating reports
# =========================================================
reporting:
# If true, the reported player must currently be online
# to be reported.
requireOnlineTarget: false
# Maximum number of open reports a single reporter
# can have at the same time.
maxOpenReportsPerReporter: 5
# Cooldown in seconds between creating reports.
cooldownSeconds: 10
# Defines how report reasons are handled.
# Available modes:
# - FREETEXT = players type any reason
# - PREDEFINED = players must use one of the predefined reasons
# - BOTH = both systems are allowed
reasonMode: FREETEXT
# List of predefined reasons used when PREDEFINED or BOTH is enabled.
predefinedReasons:
- "Cheating"
- "Bug abuse"
- "Harassment"
# GUI for selecting predefined report reasons.
reasonGui:
# Enables the reason selection GUI.
enabled: false
# If true, players may still enter a reason directly by command,
# even when the reason GUI is enabled.
allowCommandReason: true
# Inventory title of the reason selection GUI.
title: "&cSelect a reason for &f%target%"
# Inventory size of the reason selection GUI.
# Should be a valid chest size (9, 18, 27, 36, 45, 54).
size: 27
filler:
# If true, empty GUI slots are filled with the filler item.
enabled: true
# Material used for filler slots.
material: GRAY_STAINED_GLASS_PANE
reasonItem:
# Material used for each selectable reason.
material: PAPER
# Display name of a reason item.
name: "&a%reason%"
# Lore shown on each reason item.
lore:
- "&7Report &f%target% &7for: &b%reason%"
- ""
- "&eClick to continue"
# Confirmation GUI shown before the report is submitted.
confirm:
# Title of the confirmation GUI.
title: "&cReport &f%target% &cfor &b%reason%&c?"
filler:
# Material used for empty slots in the confirmation GUI.
material: GRAY_STAINED_GLASS_PANE
yes:
# Material of the confirmation button.
material: LIME_WOOL
# Display name of the confirmation button.
name: "&aYes"
no:
# Material of the cancel button.
material: RED_WOOL
# Display name of the cancel button.
name: "&cNo"
# =========================================================
# Claims
# Settings for claim / handler behavior
# =========================================================
claims:
# If true, a report will automatically be claimed by the
# moderator when its status changes to IN_PROGRESS.
autoClaimOnInProgress: true
# =========================================================
# Timestamps
# Formatting for displayed date and time values
# =========================================================
timestamps:
# Timezone used for report timestamps.
timezone: "Europe/Berlin"
# Date format pattern.
dateFormat: "dd.MM.yyyy"
# Time format pattern.
timeFormat: "HH:mm:ss"
# Final display format.
# Available placeholders: {date}, {time}
displayFormat: "{date} {time}"
# =========================================================
# Messages
# General message display settings
# =========================================================
messages:
headerFooter:
# Enables optional header/footer formatting in messages.
enabled: false
# =========================================================
# Notifications
# Staff notification settings
# =========================================================
notifications:
# If true, notification toggle states are stored persistently.
persist: true
toggleCommand:
# Enables the /reports on and /reports off commands.
enabled: true
# =========================================================
# Delete / Retention
# Controls how deleted reports are handled
# =========================================================
delete:
# Delete mode:
# - TAG = report is marked as deleted
# - PURGE = report is permanently removed
mode: TAG
# Retention period for deleted reports.
# 0 usually means no retention-based cleanup.
retention: 0
# =========================================================
# Updates
# Update notification settings
# =========================================================
updates:
# If true, players with the proper permission are notified
# on join when an update is available.
notifyOnJoin: true
# =========================================================
# PlaceholderAPI
# Placeholder expansion settings
# =========================================================
placeholderapi:
# Enables PlaceholderAPI support if PlaceholderAPI is installed.
enabled: true
# =========================================================
# Storage
# Storage backend for reports and pending rewards
#
# Supported types:
# - YAML = local file storage
# - MYSQL = MySQL / MariaDB database
# =========================================================
storage:
reports:
# Storage type used for reports.
type: YAML
pendingRewards:
# Storage type used for pending rewards.
type: YAML
mysql:
# MySQL server host.
host: "127.0.0.1"
# MySQL server port.
port: 3306
# Database name.
database: "playerreport"
# Database username.
username: "root"
# Database password.
password: ""
# Optional JDBC parameters appended to the connection URL.
params: "useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC"
# =========================================================
# Rewards
# Reward system for reporters
# Rewards themselves are defined in rewards.yml
# =========================================================
rewards:
# Enables the reward system.
enabled: false
# If true:
# when a report is set to CLOSED, rewards are automatically
# added to the reporter.
#
# If a report is marked as FALSE, it will be deleted
# to prevent rewards.
simpleReportHandling: false
# =========================================================
# Discord Webhook
# Sends report events to Discord
# =========================================================
discord:
webhook:
# Enables Discord webhook integration.
enabled: false
# Discord webhook URL.
url: ""
events:
# Send a webhook when a new report is created.
onReportCreated: true
# Send a webhook when a report status changes.
onStatusChanged: true
# Send a webhook when a handler changes.
onHandlerChanged: true
# Custom webhook username shown in Discord.
username: "PlayerReport"
# Optional avatar URL for the webhook.
avatarUrl: ""
# If true, webhook messages are sent as embeds.
useEmbeds: true
# Optional mention text, for example:
# "@everyone" or "<@&roleId>"
mention: ""
# =========================================================
# Reports GUI
# Main moderation GUI
# =========================================================
GUI:
# Title of the reports GUI.
# Placeholders:
# %filter%, %sort%, %page%, %pages%
Name: '&cReports &7(%filter% &8|&7 %sort% &8|&7 %page%/%pages%&7)'
# Inventory size of the reports GUI.
Size: 54
Filter-Item:
# Slot of the filter item in the GUI.
Slot: 49
OPEN:
# Material shown when the OPEN filter is active/selectable.
Material: GREEN_TERRACOTTA
# Display name of the OPEN filter item.
Name: '&a Open Reports'
# Lore of the OPEN filter item.
Lore:
- '&7Shows open & in-progress reports'
- ''
- '&eClick to switch filter'
CLOSED:
# Material shown when the CLOSED filter is active/selectable.
Material: RED_TERRACOTTA
# Display name of the CLOSED filter item.
Name: '&c Closed Reports'
# Lore of the CLOSED filter item.
Lore:
- '&7Shows closed reports'
- ''
- '&eClick to switch filter'
DELETED:
# Material shown when the DELETED filter is active/selectable.
Material: BROWN_TERRACOTTA
# Display name of the DELETED filter item.
Name: '&6 Deleted Reports'
# Lore of the DELETED filter item.
Lore:
- '&7Shows deleted reports'
- ''
- '&eClick to switch filter'
Sort-Item:
# Slot of the sort item in the GUI.
Slot: 45
# Material of the sort item.
Material: COMPARATOR
# Display name of the sort item.
Name: '&bSort: &f%sort%'
# Lore of the sort item.
Lore:
- '&7Filter: &f%filter%'
- ''
- '&7Modes:'
- '&f- NEWEST / OLDEST'
- '&f- STATUS_OPEN_FIRST / STATUS_IN_PROGRESS_FIRST (only in OPEN tab)'
- ''
- '&eClick to change sorting'
Navigation:
Prev:
# Slot of the previous-page button.
Slot: 48
# Material of the previous-page button.
Material: ARROW
# Display name of the previous-page button.
Name: '&a← Previous page'
# Lore of the previous-page button.
Lore:
- '&7Click to go back'
Next:
# Slot of the next-page button.
Slot: 50
# Material of the next-page button.
Material: ARROW
# Display name of the next-page button.
Name: '&aNext page →'
# Lore of the next-page button.
Lore:
- '&7Click to go forward'
# Always shown in the very last slot (bottom-right).
# Toggles whether the GUI should only show reports
# where the current viewer is the handler.
My-Handler-Only:
# Material of the toggle item.
Material: NAME_TAG
# Display name of the toggle item.
Name: '&bOnly my handled reports: &f%state%'
# Lore of the toggle item.
Lore:
- '&7Click to toggle'
- '&7When enabled, you will only'
- '&7see reports where you are'
- '&7the handler.'
Default-Item:
# Material used for report entries in the GUI.
Material: PAPER
# Display name of a report entry.
# Placeholders include report-related values like %id%, %reported%, etc.
Name: '&a %reported% &7(#%id%)'
# Lore of a report entry.
Lore:
- ''
- ' &eCreated: &7%created%'
- ' &eStatus: &7%status%'
- ' &eHandler: &7%handler%'
- ''
- ' &eReporter: &b%reporter%'
- ' &eReported: &c%reported%'
- ''
- ' &eReason: &b%reason%'
- ''
- '&aLeft-Click &7→ Open report'
- '&eMiddle-Click &7→ Change Status'
- '&cRight-Click &7→ Remove'
Player-Commands:
# Commands triggered for the different click types.
# Leave empty brackets [] to disable.
LEFT: []
MIDDLE: []
RIGHT: []
# =========================================================
# GUI Defaults
# Default filter and sorting for the reports GUI
# =========================================================
gui:
# Default filter when opening the reports GUI.
# Available: OPEN, CLOSED, DELETED
defaultFilter: OPEN
# Default sorting mode when opening the reports GUI.
# Available:
# - NEWEST
# - OLDEST
# - STATUS_OPEN_FIRST
# - STATUS_IN_PROGRESS_FIRST
defaultSort: NEWEST
lang.yml
prefix: "&8[&bPlayerReport&8]&r "
header: "&8&m------------------------"
footer: "&8&m------------------------"
only-in-game: "{prefix}&cThis command can only be used in-game."
no-permission: "{prefix}&cYou don’t have permission."
usage-report: "{prefix}&7Usage: &f/report <name> <reason>"
missing-reason: "{prefix}&cPlease provide a reason."
player-not-found: "{prefix}&cPlayer not found: &f{target}"
target-must-be-online: "{prefix}&cThis player must be online to be reported: &f{target}"
report-self-not-allowed: "{prefix}&cYou cannot report yourself."
report-target-immune: "{prefix}&cThis player cannot be reported: &f{target}"
report-cooldown: "{prefix}&cPlease wait &f{seconds}&c seconds before creating another report."
target-cooldown: "{prefix}&cThis player was reported recently. Please wait &f{seconds}&c seconds before reporting &f{target}&c again."
report-limit-reached: "{prefix}&cYou reached the limit. Max &f{limit} &cactive reports."
report-saved: "{prefix}&aReport saved."
report-failed: "{prefix}&cCould not create report."
report-select-reason: "{prefix}&7Select a reason for reporting &f{target}&7."
report-reason-not-allowed: "{prefix}&cFree-text reasons are disabled. Please pick one of the predefined reasons."
report-command-reason-disabled: "{prefix}&cReporting via command is disabled. Please use the GUI to report &f{target}&c."
admin-notify: "{prefix}&c{reporter} &7reported &c{target}&7: &f{reason}"
reports-search-usage: "{prefix}&7Usage: &f/reports search user <name>&7 | &f/reports search id <id>&7 | &f/reports search reason <reason>&7 | &f/reports search handler <name>"
reports-notify-on: "{prefix}&aNotifications enabled."
reports-notify-off: "{prefix}&cNotifications disabled."
reports-toggle-disabled: "{prefix}&cToggle command disabled in config."
reports-clear-failed: "{prefix}&cCould not clear reports."
reports-cleared: "{prefix}&aCleared &f{amount}&a reports."
usage-sethandler: "{prefix}&7Usage: &f/reports sethandler <id> <player|none>"
report-not-found: "{prefix}&cReport not found: &f{id}"
report-not-found-generic: "{prefix}&cReport not found."
handler-set: "{prefix}&aHandler for report &f#{id} &aset to &f{handler}&a."
handler-cleared: "{prefix}&eHandler for report &f#{id} &ecleared."
reload-success: "{prefix}&aReloaded config.yml and lang.yml."
reload-failed: "{prefix}&cReload failed. Check console."
rewards-disabled: "{prefix}&cRewards are disabled."
rewards-nothing: "{prefix}&7You have no rewards to claim."
rewards-claimed: "{prefix}&aClaimed &f{amount}&a rewards."
rewards-claim-in-progress: "{prefix}&ePlease wait, your previous reward claim is still being processed."
rewards-load-failed: "{prefix}&cCould not load your pending rewards right now."
rewards-claim-partial-restored: "{prefix}&cAn error occurred while giving your rewards. Remaining rewards were restored."
reward-granted: "{prefix}&aReward has been stored for the reporter."
reward-not-granted: "{prefix}&eNo reward stored (already granted or missing reporter/reward config)."
reward-skipped: "{prefix}&7No reward will be given."
rewards-available: "{prefix}&aYou have &f{amount}&a reward(s) available! Use &f/reports claim&a to collect them."
report-marked-false: "{prefix}&eReport marked as false and deleted."
update-available: "{prefix}&eUpdate available: &f{current} &7-> &a{latest}\n{prefix}&7Spigot: &b{url}"
reports-gui-delete-failed: "{prefix}&cReport could not be deleted."
reports-gui-status-update-failed: "{prefix}&cReport status could not be updated."
location-player-offline: "{prefix}&cLocation: N/A (player offline)"
location-not-available: "{prefix}&cLocation: N/A"
teleported: "{prefix}&aTeleported."
gui:
shared:
filler-name: " "
report-reason:
title: "&cSelect a reason for &f{target}"
reason-item:
name: "&a{reason}"
lore:
- "&7Report &f{target} &7for: &b{reason}"
- ""
- "&eClick to continue"
report-confirm:
title: "&cReport &f{target} &cfor &b{reason}&c?"
yes:
name: "&aYes"
no:
name: "&cNo"
reward-decision:
title: "&bGive reward? &7(# {id})"
yes: "&aYes, give reward"
no: "&cNo, don't give reward"
reports:
shared:
back:
name: "&cBack"
state-on: "&aON"
state-off: "&cOFF"
not-available: "N/A"
location: "&7Location: &f{location}"
filter:
open: "OPEN"
closed: "CLOSED"
deleted: "DELETED"
sort:
newest: "NEWEST"
oldest: "OLDEST"
status-open-first: "STATUS_OPEN_FIRST"
status-in-progress-first: "STATUS_IN_PROGRESS_FIRST"
status:
open: "OPEN"
in-progress: "IN_PROGRESS"
closed: "CLOSED"
deleted: "DELETED"
list:
title: "&cReports &7(%filter% &8|&7 %sort% &8|&7 %page%/%pages%&7)"
only-my-handler:
name: "&bOnly my handled reports: &f{state}"
lore:
- "&7Click to toggle"
- "&7When enabled, you will only"
- "&7see reports where you are"
- "&7the handler."
filter:
open:
name: "&a Open Reports"
lore:
- "&7Shows open & in-progress reports"
- ""
- "&eClick to switch filter"
closed:
name: "&c Closed Reports"
lore:
- "&7Shows closed reports"
- ""
- "&eClick to switch filter"
deleted:
name: "&6 Deleted Reports"
lore:
- "&7Shows deleted reports"
- ""
- "&eClick to switch filter"
sort:
name: "&bSort: &f{sort}"
lore:
- "&7Filter: &f{filter}"
- ""
- "&7Modes:"
- "&f- NEWEST / OLDEST"
- "&f- STATUS_OPEN_FIRST / STATUS_IN_PROGRESS_FIRST (only in OPEN tab)"
- ""
- "&eClick to change sorting"
navigation:
prev:
name: "&a← Previous page"
lore:
- "&7Click to go back"
next:
name: "&aNext page →"
lore:
- "&7Click to go forward"
search:
user: "User: {value}"
id: "ID: {value}"
reason: "Reason: {value}"
handler: "Handler: {value}"
entry:
name: "&a %reported% &7(#%id%)"
lore:
- ""
- " &eCreated: &7%created%"
- " &eStatus: &7{status_display}"
- " &eHandler: &7%handler%"
- ""
- " &eReporter: &b%reporter%"
- " &eReported: &c%reported%"
- ""
- " &eReason: &b%reason%"
- ""
- "&aLeft-Click &7→ Open report"
- "&eMiddle-Click &7→ Change Status"
- "&cRight-Click &7→ Remove"
confirm-delete:
title: "&cRemove report?"
confirm:
name: "&aConfirm"
cancel:
name: "&cCancel"
info:
name: "&7Target: &f{target}"
details:
title: "&cReport #{id}"
teleport-click: "&7Click to teleport"
teleport-reporter-current:
name: "&aTeleport: reporter (current)"
teleport-reporter-snapshot:
name: "&aTeleport: reporter (at report)"
teleport-target-current:
name: "&eTeleport: reported (current)"
teleport-target-snapshot:
name: "&eTeleport: reported (at report)"
status:
name: "&bSet status"
lore-created: "&7Created: &f{created}"
lore-current: "&7Current: &f{status}"
lore-handler: "&7Handler: &f{handler}"
lore-click: "&7Click to choose"
back:
lore: "&7Return to /reports"
status-select:
title: "&bSet status #{id}"
open:
name: "&aOPEN"
lore-1: "&7Set status to &aOPEN"
lore-2: "&7(Handler will be cleared)"
in-progress:
name: "&eIN_PROGRESS"
lore-1: "&7Set status to &eIN_PROGRESS"
closed:
name: "&cCLOSED"
lore-1: "&7Set status to &cCLOSED"
back:
lore: "&7Return to details"
discord:
report-created:
title: "New report #{id}"
description: "**Reporter:** {reporter}\n**Reported:** {target}\n**Reason:** {reason}\n**Status:** {status}"
status-changed:
title: "Report #{id} status changed"
description: "**Actor:** {actor}\n**Reported:** {target}\n**From:** {old_status}\n**To:** {new_status}\n**Handler:** {handler}"
handler-changed:
title: "Report #{id} handler updated"
description: "**Actor:** {actor}\n**Reported:** {target}\n**Handler:** {handler}\n**Status:** {status}"
Placeholders
| Placeholder | Description |
|---|---|
%playerreport_reports_total% |
Total number of reports stored on the server. |
%playerreport_reports_open% |
Total number of currently open reports. |
%playerreport_reports_in_progress% |
Total number of reports currently being handled. |
%playerreport_reports_closed% |
Total number of closed reports. |
%playerreport_reports_deleted% |
Total number of deleted reports. |
%playerreport_reports_created% |
Number of reports created by the player. |
%playerreport_reports_against% |
Number of reports made against the player. |
%playerreport_reports_handled% |
Number of reports handled by the player (as moderator). |
%playerreport_reports_open_for_player% |
Number of open reports created by the player. |
%playerreport_reports_handled_open% |
Number of open reports currently assigned to the player as handler. |
Please DO NOT leave bad reviews for issues.
If you encounter problems, please contact me via PM, the discussion tab or the Discord server.
Thank you!


