
A professional whitelist workflow with Discord actions, dual VPN/Proxy detection, GeoIP, optional captcha, Discord account linking, and statistics. Built for production servers.
A modern whitelist system for Minecraft Paper 1.21.x with Discord integration. When a player attempts to join and is not whitelisted, a structured request is posted to your Discord channel. Admins can accept, deny, or ban directly from Discord using buttons.
WhitelistPluginButBetter-1.0.0.jar in your server's plugins/ folderplugins/WhitelistPluginButBetter/config.yml/wlp reload or restart the serverbot, applications.commandsSend Messages, Embed Links, Read Message HistoryEnable Developer Mode in Discord (Settings → Advanced → Developer Mode)
discord:
bot-token: "YOUR_BOT_TOKEN_HERE"
webhook-url: "YOUR_WEBHOOK_URL_HERE"
server-id: "YOUR_SERVER_ID_HERE"
channel-id: "YOUR_CHANNEL_ID_HERE"
admin-user-ids: "USER_ID_1,USER_ID_2"
ping-admins: true
cooldowns:
deny-cooldown: 60 # Minutes before denied player can try again
pending-cooldown: 5 # Minutes between join attempts while pending
ip-cooldown: 10 # Minutes before same IP can make new request
geoip:
enabled: true
database-path: "plugins/WhitelistPluginButBetter/GeoLite2-City.mmdb"
See the full config.yml for all options!
| Command | Description |
|---|---|
/wlp accept <player> |
Accept a pending whitelist request |
/wlp deny <player> |
Deny a pending whitelist request |
/wlp pending |
View all pending requests |
/wlp list [page] |
View whitelisted players |
/wlp add <player> |
Manually add a player to whitelist |
/wlp remove <player> |
Remove a player from whitelist |
/wlp info <player> |
View detailed player info |
/wlp status |
View plugin status |
/wlp reload |
Reload configuration |
| Permission | Description | Default |
|---|---|---|
whitelistplugin.admin |
Access to all commands | OP |
whitelistplugin.bypass |
Bypass whitelist check | OP |
When a player tries to join, admins receive an embed like this:
┌─────────────────────────────────────────┐
│ New Whitelist Request │
├─────────────────────────────────────────┤
│ Player: Steve │
│ UUID: 069a79f4-... │
│ IP: ||192.168.1.1|| │
│ Location: New York, United States │
│ Client: fabric │
│ Language: en_US │
│ Requested: 2024-01-15 14:30 UTC │
│ │
│ Same IP as: Alex (1 other request) │
│ │
│ [Accept] [Deny] [Ban] │
└─────────────────────────────────────────┘
plugins/WhitelistPluginButBetter/
├── config.yml # Main configuration
├── whitelist.json # Whitelisted players
├── pending-requests.json # Pending requests
├── denied-players.json # Denied players (for cooldowns)
├── requests.log # Action log
└── GeoLite2-City.mmdb # GeoIP database (you provide this)
/plugins)whitelistplugin.bypass permissionThis happens when using a reverse proxy (BungeeCord, Velocity, TCPShield, etc.)
For BungeeCord:
bungeecord: true in spigot.ymlFor Velocity:
config/paper-global.ymlproxies.velocity.enabled: truesecret to match Velocity's forwarding secretFor TCPShield/Other:
Follow your proxy's documentation for IP forwarding.
This is expected! The plugin intercepts players before they fully connect, so client brand and locale data isn't available yet. This is a Minecraft limitation, not a bug.
The data we DO capture (IP, UUID, GeoIP location) is still very useful for identifying players and alts!
All Rights Reserved.Any modifications without informing is illegal.
Made for the Minecraft community!