Skip to content

Troubleshooting

The console does not open

Check the output for [Operator]. If Start failed, it says why and names the key or file at fault. Config mistakes are loud on purpose.

Are you allowed? With no Roles configured, only the place owner gets a console. Everyone else receives nothing at all, and that is indistinguishable from not being installed. In Studio you are usually the owner; in a group-owned place the owner is whoever holds rank 255 in the owning group.

Is something else using F2? Change it with Client = { ActivationKey = Enum.KeyCode.F4 }.

Is Client.UI off? UI = false, or setting Client.Mount, means no built-in console. Commands still work through the API.

A command does not appear

Is it registered? Run help. If it is missing, it never loaded.

Did loading fail? Loading is all-or-nothing. One bad file means no commands register, and the output names every offending file. If none of your commands appear, look there first.

Did you point Start at the folder? Commands = admin.Commands. If you used admin:FindFirstChild("Commands") and the folder is missing or misspelled, that returns nil silently and Operator starts with no commands and no complaint.

Does the module return the command? A server command file returns the command itself:

luau
return Command.new("thing"):run(function() end)

A client command file returns a function instead. Mixing them up is a load error naming the file.

Are you allowed to see it? A command with :permission("admin") is absent from the manifest for anyone without that role. It is not hidden in the list. It is not there.

NotFound when I expected Denied

This is deliberate, and it is the single most confusing thing about debugging your own permissions.

When you run a command you are not allowed to run, Operator replies unknown command, exactly as if it did not exist. It does not say "you lack permission".

That is because saying so would let anyone map your entire command list by guessing names and reading which ones came back "denied" rather than "unknown", including commands they were never meant to know about.

So when you see unknown command for a command you know exists, check your roles first.

luau
print(operator.roles:getRoles(player))
print(operator.roles:canRun(player, operator.registry:getCommand("ban")))

A guard refusal does report Denied with your message, because that is a condition about the moment, not about who they are, so it leaks nothing.

Roles changed but nothing happened

Roles resolve once per player and cache, so there is never a group call per command. After changing who holds what:

luau
operator.refresh(player)   -- or operator.refreshAll()

Without it, the change lands the next time they join.

A destructive command says "cancelled"

ban, unban and gravity are :destructive() and ask before running. Answer the prompt with Y or click Run it.

If you never saw a prompt, nothing is answering it. The built-in console installs a handler; a custom interface must call Api.setConfirmHandler itself. With no handler the answer is no, so destructive commands fail closed rather than running unconfirmed.

An argument is rejected and I do not know why

The console shows the type's own error inline as you type. Common ones:

  • "al" is ambiguous: a name prefix matching more than one player. Type more of it.
  • no player matching "x": they left, or the name is wrong. Names match on both username and display name.
  • --flag value not working: flag values need =. --reason=spam, or --reason="spam bot" if it has spaces.

The log panel is empty

Did anything happen yet? help, ping, jobid and players are :noAudit() and never appear. Try speed @me 32.

Ban Logs specifically only shows actions a command explicitly recorded with context:logAction. See The Log Panel.

Is auditing off? Audit = { Enabled = false } empties General Logs by design. It is the audit log.

Restarted the server? The log is in memory and per-server. It does not survive a shutdown, and one server never sees another's.

Still stuck

Include what [Operator] printed at startup. It usually contains the answer.

Released under the MIT Licence.