
Permissions
PermissionsKit
scriptgo//permissions-kit
Roles, inheritance, wildcard privileges and grants that survive restarts.
Runs on · 1.0.2
Godot 4
VerifiedPassed in the real runtime (scriptgo verify).
- Release
- 1.0.2
- Tested
LÖVE
VerifiedPassed in the real runtime (scriptgo verify).
- Release
- 1.0.2
- Tested
Luanti
VerifiedPassed in the real runtime (scriptgo verify).
- Release
- 1.0.2
- Tested
Neovim
VerifiedPassed in the real runtime (scriptgo verify).
- Release
- 1.0.2
- Tested
OPEN//77
VerifiedPassed in the real runtime (scriptgo verify).
- Release
- 1.0.2
- Tested
Standalone Lua
VerifiedPassed in the real runtime (scriptgo verify).
- Release
- 1.0.2
- Tested
CC: Tweaked (Minecraft)
FailingThe last run failed.
- Release
- 1.0.2
- Tested
PermissionsKit
Roles and privileges for any host. Roles inherit from each other, privileges take wildcards and denials, and grants are stored per player identifier, so they survive reconnects and restarts.
- Privileges are dotted names:
inventory.give,chat.mute. - Patterns: an exact name, a trailing wildcard (
inventory.*coversinventory.giveandinventory.admin.reset),*for everything, and-in front to deny. A denial wins over an allow of the same or lower specificity. - Roles with inheritance, from the config or defined at runtime; cycles are refused.
- Host operators (Luanti privileges, the OPEN//77 ACL, the standalone config) hold every
privilege through
scriptgo.admin, where the host offers thepermissionscapability.
Install
scriptgo add scriptgo//permissions-kit-- scriptgo.lua of your resource
dependency "sg_permissions >=1.0.0"Example
A mechanic role, granted to each player who joins. This block is the README example that
scriptgo verify runs next to the package in every environment; hosts with a (simulated) player
show the whole exchange, hosts without one show only the role definition.
local perms = exports.sg_permissions
-- Roles usually come from the config ("roles"); this one is added at runtime. Exports are called
-- from a thread or a handler, never at file scope (resource_preparing).
CreateThread(function()
print(perms:defineRole("mechanic", { inherits = { "user" }, privileges = { "vehicles.repair", "vehicles.tow" } }))
end)
local function report(playerId)
print(("player %d: repair=%s tow=%s kick=%s"):format(playerId,
tostring(perms:has(playerId, "vehicles.repair")),
tostring(perms:has(playerId, "vehicles.tow")),
tostring(perms:has(playerId, "players.kick"))))
end
AddEventHandler("playerJoining", function()
local playerId = source
report(playerId)
print(perms:grant(playerId, "mechanic")) -- true
report(playerId)
end)Server API
Call these through exports.sg_permissions:<name>(...).
| Export | Returns |
|---|---|
has(playerId, privilege) |
true or false |
grant(playerId, role) |
true, or false, reason (unknown_role, unknown_player) |
revoke(playerId, role) |
true, or false, reason (unknown_player, not_granted) |
roles(playerId) |
the player's roles, inherited ones included |
privileges(playerId) |
the player's effective patterns |
listRoles() |
{ { name, inherits, privileges } }, sorted by name |
defineRole(name, { inherits, privileges }) |
true, or false, reason; adds or replaces a role until the next restart |
Player 0 (the console) holds every privilege.
Events
| Event | Arguments |
|---|---|
sg_permissions:changed (server bus) |
playerId, roles |
sg_permissions:updated (client) |
roles |
Command
perm grant|revoke|check|roles <playerId> [role|privilege], for the console and players holding
permissions.manage.
Client API
| Export | Returns |
|---|---|
roles() |
the local player's roles |
can(privilege) |
the decision on the local player's patterns (for UI only: the server decides) |
Configuration
roles: a table of name = { inherits = { ... }, privileges = { ... } }. Without it:
| Role | Inherits | Privileges |
|---|---|---|
user |
||
moderator |
user |
chat.mute, players.kick, inventory.inspect |
admin |
moderator |
* |
License
MIT.
With the CLI
scriptgo add scriptgo//permissions-kitManual download
Zip of 1.0.2 · 7.9 KiB. Check the SHA-256 before unpacking.
Download sg_permissions-1.0.2.zipsha256 cf9ebb6eb41757cdddf547b25fcd0363937fc2e4f1686e7f1bc391a08991e53e
Set it up
| Environment | Status | Tested | Details |
|---|---|---|---|
| Godot 4 | Verified | Godot 4 VerifiedPassed in the real runtime (scriptgo verify).
| |
| LÖVE | Verified | LÖVE VerifiedPassed in the real runtime (scriptgo verify).
| |
| Luanti | Verified | Luanti VerifiedPassed in the real runtime (scriptgo verify).
| |
| Neovim | Verified | Neovim VerifiedPassed in the real runtime (scriptgo verify).
| |
| OPEN//77 | Verified | OPEN//77 VerifiedPassed in the real runtime (scriptgo verify).
| |
| Standalone Lua | Verified | Standalone Lua VerifiedPassed in the real runtime (scriptgo verify).
| |
| CC: Tweaked (Minecraft) | Failing | CC: Tweaked (Minecraft) FailingThe last run failed.
|
This release
- Signature
- ed25519, registry key 95f9 01ba 64d0 898a · signed 10 Nov 2026It covers the package, the version and the SHA-256 of the file you download.
scriptgo addrefuses a file that does not match.
What your server gets, per environment
| Environment | Tier there | For this release |
|---|---|---|
| Lua Standalone | Licence + signingAvailable today. | Free package. No licence is needed. The registry's signature shows the release was not altered. |
| LÖVE | Licence + signingAvailable today. | Free package. No licence is needed. The registry's signature shows the release was not altered. |
| Godot 4 | Licence + signingPlanned, not available yet. | Free package. No licence is needed. The registry's signature shows the release was not altered. |
| Luanti | Licence + signingAvailable today. | Free package. No licence is needed. The registry's signature shows the release was not altered. |
| OPEN//77 | Code escrowAvailable as an opt-in server feature. | Free package. No licence is needed. The registry's signature shows the release was not altered. |
| Neovim | Licence + signingAvailable today. | Free package. No licence is needed. The registry's signature shows the release was not altered. |
| CC: Tweaked (Minecraft) | No licence check | No licence check. The adapter there has no licence check, so nothing verifies a licence at run time. The release is signed, so you can check it was not altered. |
The platforms’ own rules
For information: whoever runs a script there answers for the platform's own rules.
- OPEN//77: A script is your own code. CD PROJEKT RED's own rules cover the game's content.
- CC: Tweaked (Minecraft): The Minecraft EULA lets you do what you want with your mods "as long as you don't sell them for money" (minecraft.net/en-us/eula).
Deterrence, traceability and revocation: only server scripts are protected, and a copy stays traceable. What protection does and does not do
sha256 cf9ebb6eb41757cdddf547b25fcd0363937fc2e4f1686e7f1bc391a08991e53e
- Declares Neovim: verified inside Neovim 0.12 through the SCRIPT//GO plugin.
- Code license
- MIT
No offers. Use the package under its code license (MIT).
Sold by SCRIPT//GO. No payment provider connected. License issued by SCRIPT//GO.
A license is granted only on a verified payment event.Who does what
- Declared
- 10 Nov 2026
- Ownership
- The creator states they own this code or are authorized to distribute it.
- Third-party game
- Does not target or include proprietary third-party game content.
Third-party assets
No third-party assets declared.
Dependencies
No dependencies.
Think this package infringes your rights? Report it. No account needed.
Data from the SCRIPT//GO API. Only recorded runs count.

