LuckPerms is a permission management plugin. It decides who can use which command and feature, and puts players into groups like VIP, Moderator or Admin, including a prefix in chat. We'll go through how permissions work and then build a complete group structure for a typical server, step by step.
What you'll need
- A Minecraft server of type Paper or Purpur (LuckPerms also exists for Fabric, Forge and NeoForge; the differences are covered below)
- Access to the Console and Plugins tabs (the owner, or a member with the Console and Files permissions)
- For chat prefixes: Vault and a chat format plugin (for example EssentialsX Chat), see Recommended plugins
- About 30 minutes
How permissions work#
| Term | What it is | Example |
|---|---|---|
| Permission (node) | Dot-separated text that unlocks one command or feature. Each plugin has its own permissions. | essentials.home allows the /home command |
| Value | true grants the permission, false explicitly takes it away. A permission that isn't set usually behaves like false. | essentials.fly = false |
Wildcard * | Grants all permissions that start the same way. | essentials.* = all EssentialsX permissions |
| Group | A set of permissions you give to players all at once. | vip, moderator, admin |
The default group | Every player belongs to it automatically. It can't be deleted or renamed. | Basic commands for everyone |
| Inheritance (parent) | A group takes over the permissions of another group. A player inherits from their groups. | moderator inherits from helper |
| Weight | A group's priority number. When two of a player's groups set the same permission differently, the group with the higher weight wins. Prefixes have their own priority (see Chat prefixes). | admin 400 beats vip 100 |
| Context | A condition for where a permission applies. | world=world_nether, gamemode=creative |
You'll find permission names in each plugin's documentation. On Paper, permissions for Minecraft's own commands look like minecraft., for example minecraft.command.kick or minecraft. (the /tp command). If you don't know a permission, LuckPerms can find it for you, see Checking and troubleshooting.
Installation and data storage#
- In the Plugins tab › Browse, search for
LuckPermsand click Install (or upload the file from luckperms.net/download (opens in a new window) to thepluginsfolder, see Installing plugins). - Restart the server.
- In the console, check that LuckPerms started (the line
[LuckPerms] Enabling LuckPerms …with no errors). On first start the plugin downloads its libraries, so startup may take a little longer.
LuckPerms creates a plugins/LuckPerms folder with its settings in config.yml. Where it stores data is set by the storage-method option:
storage-method value | Where the data is | When to choose it |
|---|---|---|
h2 (default) | The file plugins/ (luckperms-h2.mv.db in older versions) | A single server. Nothing to set up. |
yaml or json | Readable files in the yaml-storage or json-storage folder | When you want to read or edit the data in files |
mariadb or mysql | A database from the Database tab | Several servers with shared groups (a Velocity network), or lots of players |
For a single server, keep h2. Setting up MySQL is covered in the article MySQL for plugins. If you change the storage later, the data doesn't move over on its own:
- Export it with
lp export prevod. This creates the fileplugins/.LuckPerms/ prevod. json. gz - Stop the server and change
storage-methodinplugins/(for MySQL, the login details too).LuckPerms/ config. yml - Start the server and load the data with
lp import prevod.json.gz. Type the file name including the.json.gzextension.
Instead of prevod, you can use any name without spaces or accented characters.
Backing up permissions
The lp export zaloha-opravneni command saves all groups and players to the file plugins/. Run it before every bigger change. You load it back with lp import zaloha-opravneni.json.gz (with --replace at the end it replaces the current data; without it, the data is merged).
Full rights for yourself#
After installation, nobody except the console and operators can use LuckPerms commands. Operators are allowed to use LuckPerms commands by default (the commands-allow-op: true option in plugins/).
Join the server so that LuckPerms knows your account.
In the Console tab, type:
Consoletext lp user <NICK> permission set luckperms.* truelp– short for the LuckPerms command (the long form isluckperms).user <NICK>– we're editing a player. Replace<NICK>with your in-game name, for exampleSteve.permission set– we're setting a permission.luckperms.*– all LuckPerms permissions, i.e. access to all its commands.true– grant the permission (falsewould explicitly deny it).
In the game you then use the commands with a slash (/lp …), in the console without one.
Don't give yourself the `*` permission
The * permission (absolutely everything) looks convenient, but it also turns on permissions that change how plugins behave: bypassing land protection, immunity to bans, reading private messages and so on. WorldGuard protection then seems not to work, because you're implicitly bypassing it. For yourself, use the owner group with selected permissions (below) together with operator rights.
Creating groups and inheritance#
We'll build a structure that suits most servers:
default
├── vip
└── helper
└── moderator
└── admin
└── ownerEach group inherits everything from the group above it. So an admin can do everything a moderator can, a moderator everything a helper can, and everyone everything default can. VIP is a separate branch, so VIPs don't get staff rights.
Create the groups along with their weights. Type these into the console one by one:
Consoletext lp creategroup vip 100 lp creategroup helper 200 lp creategroup moderator 300 lp creategroup admin 400 lp creategroup owner 500creategroup <group>– creates an empty group. Write names in lowercase without accents or spaces.- The number after the name is the weight. A higher weight takes priority. Gaps of a hundred leave room for groups you add later (for example
vip-pluswith a weight of 150).
Set up inheritance:
Consoletext lp group vip parent add default lp group helper parent add default lp group moderator parent add helper lp group admin parent add moderator lp group owner parent add admingroup <group>– we're editing a group.parent add <parent>– the group starts inheriting the parent's permissions. Inheritance chains, soownergets the permissions of every group below it.
Give the groups the names players will see (optional):
Consoletext lp group moderator setdisplayname ModeratorThe display name can contain accented characters. This way you can also show the
defaultgroup as “Player” without changing its actual name.
Permissions for groups#
You add a permission with lp group <group> permission set <permission> [true|false] [context…]. If you leave out the value, true is used.
The basics for all players (the
defaultgroup), an example for EssentialsX:Consoletext lp group default permission set essentials.home lp group default permission set essentials.sethome lp group default permission set essentials.delhome lp group default permission set essentials.spawn lp group default permission set essentials.tpa lp group default permission set essentials.tpaccept lp group default permission set essentials.tpdeny lp group default permission set essentials.back lp group default permission set essentials.msg lp group default permission set essentials.warp lp group default permission set essentials.warp.listThis gives players homes (
/home,/sethome,/delhome), a return to spawn, teleport requests (/tpa,/tpaccept,/tpdeny), a return to their last location (/back), private messages and warps.VIPs with more homes and a crafting table anywhere:
Consoletext lp group vip permission set essentials.sethome.multiple lp group vip permission set essentials.sethome.multiple.vip lp group vip permission set essentials.workbench lp group vip permission set essentials.hatThe number of homes for “vip” is set in
plugins/in theEssentials/ config. yml sethome-multiplesection (5 by default), see Recommended plugins.Staff (helper, moderator, admin):
Consoletext lp group helper permission set essentials.mute lp group helper permission set essentials.kick lp group helper permission set coreprotect.inspect lp group helper permission set coreprotect.lookup lp group moderator permission set essentials.tempban lp group moderator permission set essentials.vanish lp group moderator permission set essentials.invsee lp group moderator permission set essentials.tp lp group moderator permission set coreprotect.rollback lp group moderator permission set coreprotect.restore lp group admin permission set essentials.ban lp group admin permission set essentials.unban lp group admin permission set essentials.gamemode lp group admin permission set essentials.fly lp group admin permission set worldedit.* lp group admin permission set worldguard.region.* lp group owner permission set luckperms.* lp group owner permission set essentials.*The CoreProtect, WorldEdit and WorldGuard permissions are explained in the article Recommended plugins. The
worldedit.*wildcard grants all WorldEdit permissions.
Denials and exceptions#
The value false explicitly denies a permission, even if the group inherits it. Example: by default on Paper, players can list the plugins with /plugins. If you want to hide that:
lp group default permission set bukkit.command.plugins falseThe lp group <group> permission unset <permission> command, on the other hand, removes the setting entirely (the permission goes back to “not set”).
Permissions only in some places: contexts#
You can add a context to the end of the command. The permission then only applies under that condition:
lp group vip permission set essentials.fly true world=world
lp group default permission set essentials.home false world=pvp_arenaworld=world– VIPs can only fly in the world whose folder isworld(not in the Nether,world_nether).world=pvp_arena–/homedoesn't work in the arena.
Other contexts are gamemode=creative, or server=<SERVER_NAME> for server networks (the server name is set by the server option in plugins/).
Temporary permissions#
lp user <NICK> permission settemp essentials.fly true 1dsettemp adds a permission for a limited time. The duration is written as 30m (minutes), 12h (hours), 7d (days), 1mo (month) or a combination, for example 1mo3d12h.
Chat prefixes#
A prefix is the text in front of a player's name in chat, for example [Admin] Steve: hi. LuckPerms only stores it. It's shown by a plugin that formats chat (for example EssentialsX Chat), which reads it through the Vault plugin. Without both, the prefix won't appear in chat.
Set prefixes for the groups:
Consoletext lp group vip meta setprefix 100 "&6[VIP] " lp group helper meta setprefix 200 "&a[Helper] " lp group moderator meta setprefix 300 "&9[Moderator] " lp group admin meta setprefix 400 "&c[Admin] " lp group owner meta setprefix 500 "&4[Owner] "meta setprefix– sets a prefix and replaces the group's previous prefix.- The number (
100to500) is the prefix priority. When a player belongs to several groups, the prefix with the highest priority is shown. So a moderator who is also a VIP gets the[Moderator]prefix. - The text in quotes is the prefix. The quotes are needed because of the space at the end, which separates the prefix from the name.
&6,&a… are color codes (table below).
Check that your chat plugin reads the prefix: type
vault-infoin the console. The output must list LuckPerms as the source of permissions and chat.
| Code | Color | Code | Color |
|---|---|---|---|
&0 | black | &8 | dark gray |
&1 | dark blue | &9 | blue |
&2 | dark green | &a | green |
&3 | turquoise | &b | light blue |
&4 | dark red | &c | red |
&5 | purple | &d | pink |
&6 | gold | &e | yellow |
&7 | gray | &f | white |
&l | bold | &o | italic |
&n | underline | &r | reset formatting |
Put formatting codes (&l, &o, &n) after the color code, for example &c&l[Admin].
Adding a player to a group#
The player should join the server at least once so that LuckPerms knows their account.
lp user <NICK> parent add vipparent add <group>– adds a group to the player. Their other groups stay. Useful for giving VIP to a staff member.
lp user <NICK> parent set moderatorparent set <group>– gives the player only this group and removes the others. Useful for changing someone's rank.
lp user <NICK> parent remove vipparent remove <group>– removes the group. If the player has no other group, they go back todefault.
lp user <NICK> parent addtemp vip 30dparent addtemp <group> <duration>– a group for a limited time (here 30 days), for example a month of VIP. When it runs out, LuckPerms removes it automatically.
The web editor#
Instead of commands, you can edit everything in your browser.
Type
lp editorin the console.LuckPerms prints a link. Open it in your browser.
On the left, pick a group or player. Add permissions in the Add Permission field (the editor suggests known permissions), and change values by clicking in the table. Add a context with the Add Contexts button.
Click Save (or Ctrl+S).
The editor shows a command in the form
/lp applyedits <CODE>. Click it to copy it.Paste it into the console without the slash at the start and press Enter.
The console prints a summary of the changes. Only now are they saved.
Editor changes aren't saved without applyedits
Saving in the browser doesn't send the changes to the server. You have to run the generated lp applyedits command. To open the editor for a single group, use lp group <group> editor.
In the editor, weight, prefix and parent are written as special permissions: weight.400, prefix.400.&c[Admin] and group.moderator.
Promotion ladders (tracks)#
A track is a ladder of groups you move players along with a single command. It doesn't affect inheritance.
Create a track and add the groups to it in the right order:
Consoletext lp createtrack tym lp track tym append helper lp track tym append moderator lp track tym append adminPromote and demote:
Consoletext lp user <NICK> promote tym lp user <NICK> demote tympromote– moves the player one step up and removes their previous group from the track. If they aren't on the track yet, they get the first group (helper).demote– moves the player one step down.
Checking and troubleshooting#
| Command | What it shows |
|---|---|
lp user <NICK> info | The primary group, all of the player's groups, the current context and the prefix |
lp user <NICK> permission check <permission> | Whether the player has the permission and where it comes from |
lp group <group> info | The group's weight, parents and number of permissions |
lp group <group> permission info | The group's list of permissions |
lp group <group> listmembers | The players in the group |
lp user <NICK> meta info | All of the player's prefixes, sorted by priority |
When you don't know which permission a command needs, use verbose:
- Type
lp verbose record <NICK>in the console. - Have the player run the command that isn't working in the game.
- Type
lp verbose upload. LuckPerms prints a link to an overview of all permission checks. Look for the lines with the resultfalse.
A recommended structure for a typical server#
| Group | Weight | Inherits from | Who it's for | Example permissions |
|---|---|---|---|---|
default | – | – | Every player | essentials.home, essentials.sethome, essentials.spawn, essentials.tpa, essentials.msg |
vip | 100 | default | Supporters | essentials., essentials., essentials.workbench |
helper | 200 | default | New staff members | essentials.mute, essentials.kick, coreprotect.inspect |
moderator | 300 | helper | Moderators | essentials.tempban, essentials.vanish, coreprotect.rollback |
admin | 400 | moderator | Administrators | essentials.ban, essentials.gamemode, worldedit.* |
owner | 500 | admin | The owner | luckperms.*, essentials.* + operator rights |
Principles: only give the permissions a group really needs. Add new permissions to the lowest group that should have them, and the higher groups inherit them. Handle exceptions with the value false or a context, not by copying permissions into several groups.
LuckPerms on Fabric, Forge and NeoForge#
LuckPerms also exists as a mod. The commands are the same, the file goes in the mods folder and the settings are in the config folder, in the LuckPerms subfolder. One difference: Fabric doesn't check permissions for Minecraft's own commands, so permissions like minecraft. don't work on Fabric without another mod. Commands from mods that support LuckPerms work normally.
Quick recipes#
| I want to… | Console command |
|---|---|
| Give a player VIP for 30 days | lp user <NICK> parent addtemp vip 30d |
| Remove VIP from a player | lp user <NICK> parent remove vip |
| Make a player a moderator (and remove their other groups) | lp user <NICK> parent set moderator |
Let VIPs fly only in the lobby world | lp group vip permission set essentials.fly true world=lobby |
Find out who's in the admin group | lp group admin listmembers |
| Copy a group as the base for a new one | lp group vip clone vip-plus |
| Rename a group | lp group vip-plus rename mvp |
| Delete a group | lp deletegroup mvp |
| List all groups | lp listgroups |
| Back up all permissions to a file | lp export zaloha-opravneni |
Replace <NICK> with the player's in-game name. In the game, type the commands with a slash (/lp …).
LuckPerms on a server network (Velocity)#
When you run several servers connected through a Velocity proxy, you usually want the same groups everywhere. The procedure in a nutshell:
- Install LuckPerms on every server and on the proxy (the Velocity version). On the proxy, the commands are typed as
lpvinstead oflp. - Create one MariaDB or MySQL database that all instances connect to, see MySQL for plugins.
- On each instance, edit
plugins/(with the server stopped):LuckPerms/ config. yml
| Setting | What it does | Recommended value | When to change it |
|---|---|---|---|
server | The instance name. Used in the server=… context for permissions that apply only on some servers. | A short name, for example lobby or survival | Keep the default global only on a standalone server. |
storage-method | Where LuckPerms stores data. All instances must use the same storage. | mysql (works with both MySQL and MariaDB) | mariadb if you know the database server is MariaDB (LuckPerms recommends it for MariaDB). |
data (address, database, username, password) | The database login details. The port goes into address in the form host:port. | The details from the Database tab | When the database password changes. |
messaging-service | How instances notify each other about changes so they take effect right away. | sql (with a shared database) | pluginmsg on a small network with one proxy where LuckPerms runs everywhere. |
- Restart all servers and the proxy. A change made on one server then shows up on the others too.
Setting up the network itself is covered in the article A server network with Velocity.
Verification#
- Type
lp user <NICK> infofor a test player. The output shows their groups and prefix. - Join as a regular player (without operator status,
deop <NICK>) and try commands the group should be able to use, and ones it shouldn't. - Send a chat message and check the prefix.
Troubleshooting#
Typing /lp only shows the plugin version#
You don't have permission for any LuckPerms command. Give it to yourself from the console with lp user <NICK> permission set luckperms.* true.
Permissions don't work even though the player is in the group#
- Another permission plugin is on the server (PermissionsEx, GroupManager and the like). LuckPerms has to be the only one; remove the others.
- You're testing as an operator. Operators get plugin permissions automatically, which skews the result. Test without op.
- A typo in the permission name. Check it with
lp verbose(above). - The permission is set to
falsesomewhere.lp user <NICK> permission check <permission>shows where the value comes from.
The prefix doesn't show in chat#
Vault or a chat format plugin is missing. Install Vault (or VaultUnlocked) and EssentialsX Chat and restart the server. In EssentialsX Chat, the chat format must contain {DISPLAYNAME} or {PREFIX}. If a player sees a different prefix than you expect, compare the priorities in lp user <NICK> meta info.
Changes from the web editor didn't take effect#
You didn't run the lp applyedits <CODE> command generated after saving. Save again and run the command.
lp user can't find the player#
The player hasn't joined the server yet, so LuckPerms doesn't know their account. Have them join, or use their UUID instead of the name.
A player in a group has no prefix or permissions after being added with parent set#
Check the group name (lp listgroups). parent set with a group that doesn't exist ends with an error and adds nothing to the player.
Summary
- Permissions are given to groups, and players inherit them. Every player is automatically in the
defaultgroup. - Create groups with a weight (
lp creategroup admin 400) and link them withparent add. - Permissions:
lp group <group> permission set <permission>; a player into a group:lp user <NICK> parent add <group>. - Prefix:
lp group <group> meta setprefix <priority> "<text>". To display it, you need Vault and a chat plugin. - Changes from
lp editorare only saved bylp applyedits. - Don't give anyone the
*permission, and test without operator status.