A built-in permission handler for a server that has not installed one. Optional, and dormant unless you choose it - install LuckPerms instead and nothing here changes.
The gap it fills
NeoForge's own default handler is four lines of substance: every answer is the node's own default.
standards.fly is op-or-nothing. A trusted regular cannot have flight, a donor
cannot have ten homes, and a builder cannot have /craft without being made an
operator - which hands them /stop as well.
That is the same gap the built-in economy fills, and it gets the same answer: ship something that works, and step aside the moment a real one arrives.
Not a Vault - one more handler
PermissionAPI is the facade, and handlers register themselves against it. The
server owner chooses which one is active - an explicit setting, not a priority contest:
# config/neoforge-server.toml
permissionHandler = "standards:permissions"
and /rank appears. Standards already calls that same facade for every check
it makes, so it behaves the same way under any handler - LuckPerms
works out of the box, with no configuration on either side.
| permissionHandler | Who ends up answering |
|---|---|
| neoforge:default_handler (the shipped value) | LuckPerms, if installed - otherwise the do-nothing default. |
| standards:permissions | Standards' own handler. |
Dormant unless you pick it. Leave that config line
alone and this handler never runs - /rank is not even registered.
Switching either way is that one line, with nothing to import and nothing to migrate off.
How a question gets answered
| Tier | Checked |
|---|---|
| 1 | The player's own grants and denials. |
| 2 | The groups they are directly in. |
| 3 | Those groups' parents, then theirs, outward - breadth-first. |
| 4 | The default group, which everybody is in without being put there. |
| 5 | The node's own default resolver - so op still means op, and everyone-nodes still work, for anyone nothing has been said about. |
The first tier that says anything wins outright. That is what makes "an explicit deny on the player beats everything" and "a deny in a group beats a grant in its parent" the same rule instead of two.
Within one tier, the most specific pattern wins: exact
standards.fly beats standards.home.* beats
standards.* beats *. A trailing wildcard covers
the bare node too - standards.home.* matches standards.home,
because granting the wildcard and finding the plain command still refused reads as the system
being broken.
A tie inside one tier resolves to no. Somebody in both
donor (granting) and guest (denying), at the same
distance, with no weights to separate them - quietly taking the permissive half of a
contradiction is the wrong direction to guess in.
Falling through to tier 5 is what makes this safe to switch on: a server that enables it and grants nothing behaves exactly as it did before. Booleans only - an integer, string or other typed node falls through to its own resolver untouched.
It tells you why
Every hour lost to a permissions system is spent asking why a player has something, and a plain yes-or-no makes you bisect it by hand.
> rank check Sablednah standards.home.others
standards.home.others = yes (from donor, via standards.home.*)
> rank group donor set standards.home.others false
> rank check Sablednah standards.home.others
standards.home.others = no (from donor, via standards.home.others)
> rank check Sablednah standards.god
standards.god = no (nothing set - the node's own default)
That last line matters as much as the other two: a bare no reads as a denial somebody configured, and sends an admin looking for a rule that does not exist.
A rank is a group, not just a bundle of nodes
Put somebody in moderator and they get their permission nodes, a
chat tag, and visibility to
every other mod on the server - one edit, no second list to keep in sync. A faction mod, a
party mod or a quest mod can ask who your moderators are, because ranks are published through the
same groups API as everything else here, as standards:role.
Permissions on their own are a solved problem. Ranks that the rest of the server can actually see are not - that's the part worth building.
A guest ladder that runs itself
Move players up a rank ladder on their own - guest to regular, and whatever comes after - without an admin doing it by hand.
startingGroup = "guest"
promote = true
promotions = ["guest -> regular after 24h and 2h played"]
A rule is one line, and takes any of three shapes:
after 24h (wall-clock time since first seen),
after 2h played (online and not AFK), or
after 24h and 2h played (both must pass).
Two clocks, because they answer different questions. Real time since a player was first seen asks for patience - a few minutes is enough to lose the fly-by griefer who is on another server by now, and it costs an honest new player nothing. Played time asks them to have actually done something, and is counted only while they are not AFK - unlike Minecraft's own play-time statistic, which happily counts a player idling in a corner all night. Give both and both must pass.
Requires Standards' own handler. Promotions move a
player between its groups, so they need permissionHandler = "standards:permissions" to be the active one. Under LuckPerms, the server says so at startup and does nothing -
LuckPerms has its own "tracks" for the same job.
startingGroup is not
defaultGroup. The default group is consulted last for
everybody and nobody is a member of it. startingGroup is real
membership a player can be promoted out of - a player who already has a group is
left alone, so an admin's own ranking is never undone by a later login. The group must
already exist (/rank group guest create), or nothing happens.
Conditions are a seam rather than a fixed pair - a vote, a website purchase, a moderator's nod are the same shape as a clock, and there is nothing stopping the list from growing beyond time and playtime.
What it is not
No per-world contexts, no temporary nodes, no promotion tracks, no weights, no SQL backend, no web editor. If you need any of that, a dedicated permissions mod is a better tool - and switching to one costs a single config line, with nothing to import and nothing to migrate off.
Generated from the source
86 declared nodes, plus a couple built at runtime. Ask a running server what it actually has
with /standards nodes, which lists every node really registered, runtime
ones included.
| Node | Default | What it allows |
|---|---|---|
| standards.fly | ops | Use /fly. |
| standards.fly.others | ops | Use /fly on another player. |
| standards.god | ops | Use /god. |
| standards.god.others | ops | Use /god on another player. |
| standards.smite | ops | Call down lightning. A gamemaster's tool, not a toy. |
| standards.vanish | ops | Hide from other players. |
| standards.vanish.others | ops | Use /vanish on another player. |
| standards.vanish.see | ops | See through someone else's vanish. Ops by default so staff are not invisible to each other. |
| Node | Default | What it allows |
|---|---|---|
| standards.back | everyone | Use /back. |
| standards.back.ondeath | nobody | Returning to your corpse is a gameplay decision, not a convenience. Off even though /back itself is open. |
| standards.jump | ops | Use /jump. |
| standards.top | everyone | Use /top. |
| Node | Default | What it allows |
|---|---|---|
| standards.delhome | everyone | Use /delhome. |
| standards.home | everyone | Use /home. |
| standards.home.limit.unlimited | ops | Any number of homes, beating every numbered home.limit.<n>. |
| standards.home.others | ops | Use /home on another player. |
| standards.sethome | everyone | Use /sethome. |
| Node | Default | What it allows |
|---|---|---|
| standards.bottom | ops | Op-only: near bedrock this is a crude ore finder as much as a travel command. |
| standards.feed | ops | Use /feed. |
| standards.feed.others | ops | Use /feed on another player. |
| standards.gc | everyone | Reading server health is not sensitive; knowing the TPS helps players report problems. |
| standards.heal | ops | Use /heal. |
| standards.heal.others | ops | Use /heal on another player. |
| standards.kit | everyone | Use /kit. |
| standards.mail | everyone | Use /mail. |
| standards.rest | ops | Use /rest. |
| standards.rest.others | ops | Use /rest on another player. |
| standards.setkit | ops | Use /setkit. |
| standards.setspawn | ops | Use /setspawn. |
| standards.spawn | everyone | Use /spawn. |
| standards.speed | ops | Use /speed. |
| standards.speed.others | ops | Use /speed on another player. |
| standards.tpoffline | ops | Op-only: logging off should not broadcast where you were. |
| Node | Default | What it allows |
|---|---|---|
| standards.afk | everyone | Use /afk. |
| standards.afk.exempt | ops | Never auto-kicked for idling. Ops and, typically, whoever runs the map render. |
| Node | Default | What it allows |
|---|---|---|
| standards.anvil | nobody | Use /anvil. |
| standards.craft | nobody | Portable workstations - nobody by default, including operators. That is the design, not an oversight. |
| standards.enderchest | nobody | Use /enderchest. |
| standards.grindstone | nobody | Use /grindstone. |
| standards.invsee | ops | Use /invsee. |
| standards.msg | everyone | Use /msg. |
| standards.msg.override | ops | Message someone who has /msgtoggle on. Staff need it; it is not for everyone. |
| standards.mute | ops | Use /mute. |
| standards.socialspy | ops | Use /socialspy. |
| standards.tempban | ops | Use /tempban. |
| standards.trashcan | nobody | Use /trashcan. |
| Node | Default | What it allows |
|---|---|---|
| standards.tpa | everyone | Use /tpa. |
| standards.tpa.override | ops | Ask someone who has /tptoggle on anyway. Staff need it, or /tptoggle becomes a place to hide from moderation. |
| standards.tpahere | everyone | Use /tpahere. |
| standards.tptoggle | everyone | Use /tptoggle. |
| Node | Default | What it allows |
|---|---|---|
| standards.setwarp | ops | Use /setwarp. |
| standards.warp | everyone | Use /warp. |
| Node | Default | What it allows |
|---|---|---|
| standards.balance | everyone | Use /balance. |
| standards.balance.others | ops | Use /balance on another player. |
| standards.baltop | everyone | Use /baltop. |
| standards.eco | ops | Use /eco. |
| standards.pay | everyone | Use /pay. |
| Node | Default | What it allows |
|---|---|---|
| standards.condense | everyone | Merge your own partial stacks - the only one of these a normal player wants, since it creates nothing and converts nothing. |
| standards.itemlore | ops | Use /itemlore. |
| standards.itemname | ops | Use /itemname. |
| standards.more | ops | Fill the held stack. Item duplication, plainly - ops only. |
| standards.powertool | ops | Bind a command to an item. Runs as the holder, so it is a shortcut and not an escalation. |
| standards.repair | ops | Repair the held item. A cheat - an anvil and the levels you did not spend. |
| standards.repair.all | ops | Repair everything you are carrying at once. |
| Node | Default | What it allows |
|---|---|---|
| standards.compass | everyone | Use /compass. |
| standards.depth | everyone | Your depth and your bearing. Everyone - F3 already shows both on an ordinary server. |
| standards.playtime | everyone | How long people have actually played. A scoreboard, not a secret. |
| standards.playtime.others | everyone | Use /playtime on another player. |
| standards.sudo | ops | Run a command as somebody, with their permissions. It cannot give anybody an ability they lack, because the command is parsed against their source. |
| standards.world | ops | /world and /worlds - moving between dimensions keeping your coordinates. |
| Node | Default | What it allows |
|---|---|---|
| standards.butcher | ops | Clearing entities in a radius. A lag tool, and a griefing tool. |
| standards.item | ops | Spawning items out of nothing. Ops, obviously - on a survival server this is the single most consequential thing in the mod. |
| standards.motd | everyone | /motd, /rules and /info - owner-written text. Everyone reads them. |
| standards.tp | ops | /tpx and /tppos - moving yourself about at will. A node rather than an op check, so a builder can be given this without also being given /stop. |
| standards.tp.others | ops | Moving other people - /tphere, and the two-player form of /tpx. |
| Node | Default | What it allows |
|---|---|---|
| standards.group | everyone | Founding and running a lightweight group. A social feature, like homes. |
| standards.nick | everyone | Set your own. A social feature, not a privilege. |
| standards.nick.color | ops | Colour codes in a nickname. Ops only - obfuscated codes render as animated gibberish on every line its owner speaks, and cannot be read, reported or typed back. |
| standards.nick.others | ops | Set or clear somebody else's - the moderator's undo for a nickname that had to go. |
| standards.realname | everyone | Look a nickname up. Deliberately open to everyone. |
| Node | Default | What it allows |
|---|---|---|
| standards.combat.bypass | ops | Leave a fight anyway. A permission and not an op check, so staff can have it without also getting /stop. |
| standards.teleport.instant | ops | Skip the teleport warmup - arrive immediately. |
| standards.teleport.nocooldown | ops | Skip the wait between teleports. |
| Node | Default | What it allows |
|---|---|---|
| standards.admin | ops | /standards - administering the mod itself, not using it. |
| standards.permissions | ops | Editing the built-in permission handler's groups and grants. Separate from admin because the two are different jobs: reloading messages is a caretaker's task, and handing out permissions is how somebody becomes an operator by proxy. |
| standards.rank | everyone | See your own rank with a bare /rank, and what you are working towards. |
Not declared in source - the server builds these from what it actually holds, so a permissions mod only sees them after a restart.
| Node | What it allows |
|---|---|
| standards.home.limit.<n> | That many homes. The highest granted number wins, and home.limit.unlimited beats them all. |
| standards.kit.<name> | One particular kit. Its default follows the kit's own access - see /kitaccess. A kit created since the last restart has no node, and is answered from that access directly. |
Commands
Only present when Standards' own handler is the active one. Node standards.permissions,
ops by default - deliberately separate from standards.admin, so a moderator
can reload messages without also being able to grant themselves everything. Players are named
rather than selected, so an offline player can be granted a rank.
| Command | Description |
|---|---|
| /rank groups | Every group on the server. |
| /rank group <name> create | delete | info | — |
| /rank group <name> set <node> [true|false] | Grant or deny a node on the group. |
| /rank group <name> unset <node> | Clear it back to inherited. |
| /rank group <name> parent add|remove <other> | Add or remove a parent group - inheritance. |
| /rank group <name> tag <tag|-> | The chat label, if roles are rendered. |
| /rank user <player> group add|remove <group> | Players are named, not selected - an offline player can be granted a rank. |
| /rank user <player> set <node> [true|false] · unset <node> | A grant or denial on the player directly. |
| /rank user <player> info | Their groups, their grants, and what it adds up to. |
| /rank check <player> <node> | One node, and which rule answered it - not just yes or no. |
/rank is the reliable name. Also
at /perm, but LuckPerms claims /perm as an alias
of /luckperms - so on a server carrying both, a bare
/perm runs LuckPerms' help while our subcommands still work underneath
it. /rank is claimed by nothing and always works.