Community owner manual
Running your community
Written for the person who owns the community — the one who pays for it, connects the server, and decides who gets to ban people. Read it once from the top; after that use the contents on the left.
Your staff do not need to read all of this. Sections 4 to 7 are the moderation ones — those are worth sending to your team. The rest is yours.
1 Getting set up
- Sign in with SteamThere is no separate password. Your Steam account is your login, so there is nothing to remember and nothing to leak.
- Create your communityOn the welcome page. This starts your 14-day free trial automatically — no payment details, and nothing charges you when it ends.
- Add your serverSettings → Edit Servers. Name, the
ip:portyour players connect to, and your RCON password. - Install the resourceCovered in the next section. Takes about five minutes.
Joining someone else's community instead?
Ask one of their owners to add you — they can pick you straight from their player list, and you do not need to sign into the panel first. Being staff somewhere else is always free and never counts against your own plan.
2 Connecting your game server
There is nothing to configure by hand. The download is generated for your server, with your community ID and address already inside it.
- Support → DownloadsClick Download next to the server you added.
- Extract into
resources/Thestafffolder goes in whole. - Add one line to
server.cfgensure staff ensure screenshot-basic # only if you want screenshotsUse a built copy of
screenshot-basic— the one that ships with most FiveM server builds is ideal. The GitHub source needs yarn and webpack to build before FiveM can load it. If yours is missing or unbuilt, the panel says so in your server console rather than failing silently. - RestartYour players appear under Servers within about 30 seconds.
If players do not appear
Check your server console for lines starting with [Staff Panel]. They report exactly what failed, in plain words.
The usual cause is the address in the panel not matching what the resource is configured for. Edit it in place under Settings → Edit Servers — you do not need to remove the server and start again.
If the download hands you a config.json instead of a zip, your host simply cannot build archives. Put that file into the staff folder yourself; nothing else changes.
What the detections do, and what they deliberately do not
The resource watches for explosion floods, entity spam and client-triggered server events, and reports them to the player’s record. Two of those also cancel the action. It is worth knowing where the lines are drawn, because the wrong setting here makes the panel accuse ordinary players.
Explosions are limited by rate, not by type. Twelve per player per ten seconds; over that they are cancelled and reported. Rate is the honest test — a script blowing up the map is abnormal by volume whatever it uses, and nobody reaches that many by playing. explosion_types_blocked lets you block particular types outright and ships empty, because which explosions are legitimate depends on your server. A rocket is griefing on one server and a gang war on another. Take particular care before listing petrol pumps, barrels, planes, trains, fireworks or snowballs: all six happen in normal play, so blocking them stops the world reacting the way players expect and marks them as griefers for shooting a petrol station.
Entity spam only reports; it does not cancel. GTA streams its pedestrians and traffic in through whichever player is nearest, so those count as entities that player created — loading into the world creates hundreds in seconds, and even mid-session, ordinary driving along a busy road produces a burst of the same vehicle model repeating, because GTA's population system leans on one vehicle type per road class rather than varying it. The limit is therefore high (150 per ten seconds), nothing is counted for the first minute after someone connects, and cancelling is off. You can turn cancelling on with entity_cancel while dealing with an active spawner, but leave it off the rest of the time: the entities being blocked are mostly scenery, so it deletes the world around your players rather than stopping an attack.
Protected events report; they do not block. List the server events in your framework that a client should never fire — usually the ones handing out money, items or jobs — and anyone who fires one is named on their record. It cannot stop the event: cancelling only works where the code that raised the event checks for it, which the game engine does for connections, entities, explosions and chat, but no framework does for its own events. So the money is still granted; what you get is the person who did it. protected_events_kick adds a kick, off by default, and it stops the next attempt rather than the first one.
All of these live under detections in config.json, and the whole thing switches off with "enabled": false.
The numbers you can change
Every one of these is optional. Leave it out and the default below applies, which is what the download ships with. The two _cancel settings are the only ones that change what a player experiences rather than only what you are told about.
| Setting | Default | What it does |
|---|---|---|
enabled | true | Turns the whole thing off when false. Nothing is watched and nothing is reported |
explosion_limit | 12 | Explosions one player may cause per ten seconds. Over this they are cancelled and reported. Lower it only if you know your server’s normal traffic — legitimate scripted explosions count too |
explosion_types_blocked | empty | Explosion types refused outright however slowly they come, by number. Empty means judge by rate alone |
entity_limit | 150 | Entities one player may create per ten seconds before it is reported. High on purpose: GTA streams pedestrians and traffic in through whichever player is nearest, so ordinary driving creates a great many |
entity_cancel | false | Whether to actually block entity creation over the limit. Off by default and worth leaving off unless you have watched your own numbers, because blocking the wrong thing here breaks the world for an innocent player |
entity_grace_seconds | 60 | How long after a player connects entity counting is ignored. Joining streams a lot of world in at once and would otherwise look exactly like spam |
object_limit | 25 | Objects (props) one player may spawn per ten seconds before it is reported. Separate from entities because prop spam is deliberate where traffic is not |
object_cancel | false | Whether to block those spawns rather than only report them |
object_models_blocked | empty | Model names refused whatever the rate — the props people grief with. Matched by name, so partial names work |
protected_events | empty | Server events in your framework that a client should never fire — usually the ones handing out money, items or jobs. Reported when one does |
protected_events_kick | false | Whether firing one also kicks. Off by default: name an event wrongly and you kick everybody |
A limit is per player, per ten seconds, and a given kind of report is only written once per player per minute — so a burst leaves one entry explaining itself, not hundreds burying everything else on their record.
Every detection on a player's page has Mark reviewed and Delete, both needing Delete Records. Reviewing keeps the entry but marks it looked at, so a busy queue shows what still needs attention. Delete removes it outright — for a false positive, since the checks above are deliberately generous and still catch the odd legitimate player.
Optional: refusing connections before they start
Two settings in config.json are left empty on purpose, because switching them on will refuse real players as well as the ones you are aiming at. Both are checked on the server, before the player is admitted, so neither can be defeated by a modified client.
"connection": {
"require_identifiers": ["steam"],
"blocked_names": ["admin", "moderator"]
}
require_identifiers is the one worth understanding. A ban recorded against a Steam ID does nothing to someone who closes Steam before reconnecting — there is no Steam ID left to match. Listing steam here refuses that connection instead of letting it through. You can also list discord, fivem, license2, xbl or live. There is no point listing license: it is always present, and it is what every ban is matched on regardless.
Think hard before listing steam. It does not only affect people who closed Steam. GTA V is sold through the Epic Games Store and the Rockstar Games Launcher as well, and those players have no Steam identifier at all — they cannot get one, whatever they do. Requiring it turns away a large share of ordinary, paying players who have done nothing wrong, and the refusal message will tell them to start something they may not even own.
The same warning applies to xbl and live, only harder: those exist only for players on a Microsoft Store or Xbox app copy, so requiring one turns away almost everybody, including every Steam, Epic and Rockstar player. They are useful to record and to ban on; they are close to useless to require.
If your aim is that bans cannot be dodged, license already does that on its own and is always present. require_identifiers is for servers that have decided, deliberately, to accept only one storefront.
blocked_names refuses anyone whose name contains one of these words, ignoring case. It is a substring match because impersonation is nearly always [admin] or admin rather than exactly admin.
Both write a refusal to the player’s record, so you can see who was turned away and why rather than only finding it in the console.
The messages those refusals show sit in the same block and can be reworded:
| Setting | What it does |
|---|---|
identifier_message | Shown when require_identifiers turns somebody away. The %s in it is replaced with the identifier they were missing, so keep it in — without it the player is told to start something without being told what |
blocked_name_message | Shown when blocked_names turns somebody away. Deliberately does not say which word matched, so somebody testing names cannot map your list |
Every setting in config.json
The download fills in the first four for you. You should not need to touch them unless something moves.
| Setting | What it does |
|---|---|
url | Your panel’s address. The resource reports here |
panel_ip | Only for servers whose host cannot resolve your panel’s hostname. Setting it connects by IP instead, which forces plain HTTP — leave it empty unless you have that problem |
server_connection | This server’s address. Must match what the panel has exactly, or players never appear online |
communityid | How this server proves itself to your panel. Treat it as a password that happens to live in a file |
| Setting | What it does |
|---|---|
prefix | Tag on panel messages in chat. Supports colour codes, e.g. ^8[BWRP] |
ban_message | What a banned player sees. Placeholders: {ban_staff}, {ban_reason}, {ban_issued}, {ban_expires}, {appeal}, {username}, {license}, {steam}, {playtime}, {firstjoined}, {lastplayed}, {trustscore}. If you leave {appeal} out, the appeal link is added at the end anyway |
notify_type | Which notification system warnings use: ox_lib, chat, esx, qb, vorp, rsg or custom |
notify_event | Only used when notify_type is custom — the client event to trigger instead |
notify_duration | How long a notification stays on screen, in milliseconds |
notify_position | Where ox_lib notifications appear, e.g. top |
framework | Which framework the panel should use when it has to give a player money or a job — esx, qbcore or qbox. Leave it empty and those two reward types quietly do nothing, because there is nothing to hand them over with. Items do not need it. Only set it if you actually sell money or job rewards |
The three that decide what gets stored
These are worth a deliberate decision rather than leaving at the default, because they control how much personal data your panel keeps about your players.
| Setting | What it does |
|---|---|
server_logs | Records joins, leaves and moderation actions to your panel |
chat_logs | Records what players type in chat. Remove the line entirely and it follows server_logs, so an older install keeps behaving the way its owner already agreed to. Set it to false to keep server logs while storing no chat at all |
chat_proccessing | Sends chat to the panel for the in-game staff commands to work. Note the spelling — the key really is chat_proccessing |
Chat is the highest-volume thing the panel stores and the most sensitive. If you do not need it, turning it off is a legitimate choice, and your retention period applies to whatever you do keep.
ip_address and debug appear in the file but the resource never reads them — they do nothing. They are left in place so an existing config is not invalidated; changing them has no effect either way.
3 Staff and permissions
Go to Settings → Edit Staff. The dropdown is searchable and offers everyone who has played on your servers, most recent first and shown by their in-game name — usually exactly who you are looking for. Existing panel accounts are listed separately.
Pick a person, choose a rank, submit. They do not need to visit the panel first. Adding them creates their account straight away; the first time they sign in with Steam their real name fills itself in and their rank is already waiting. People already on your staff are hidden from the list, so it only ever offers people you can actually add.
Deciding what each rank may do
Settings → Panel Settings has a grid of permissions down the side and your ranks across the top. Tick what each rank may do; every permission carries a line explaining what it actually covers.
The first column is your owner rank, and it always holds every permission. Its boxes are fixed on purpose. There is no hidden override behind the scenes — the panel checks the rank's own list and nothing else — so an owner rank missing Edit Panel would mean nobody could ever open this page again, and only a change made directly in the database would undo it.
The one that matters
A new moderator does not need Edit Panel or Edit Staff. Those let someone change your settings and promote themselves. Give new people the moderation ticks only, and keep the two editing permissions on ranks you genuinely trust.
Someone can be staff in several communities at once. Adding them here has no effect on their rank anywhere else, and every warning, kick, ban and note they issue records their name against it.
Staff cannot moderate each other
Two rules are enforced regardless of what you tick, because they are about conduct rather than capability:
| Rule | Why |
|---|---|
| Nobody can warn, kick, ban or freeze their own account | Doing it to yourself is either a mistake or a way to manufacture a record. There is no legitimate reason for it, so it is refused for everyone — including you |
| Only the owner rank can action another staff member | Peers disciplining each other turns moderation into an internal weapon. A moderator who falls out with another moderator should not be able to ban them; that decision belongs to whoever runs the community |
The owner rank is the first rank in your permissions list. It is exempt from the second rule but not the first.
Banning a staff member removes them from staff
Automatic, and it happens in the same action. Without it a banned staff member keeps their panel account and every permission on it — still able to sign in, warn, kick, ban and read your players' identifiers. The ban would only have removed them from the game.
Scoped to your community only, the same as the Remove Staff button. If they are staff somewhere else, that is not affected. It is logged and posted to your Discord, naming the rank they held.
Who you hand access to is your call, and your responsibility
Staff can read your players' identifiers, hardware IDs and past screenshots, and can request new ones. That is real personal data about real people, and in law you are the one accountable for it — not us. We only hold it on your instructions.
So check someone before you promote them, give them the least they need, and remove them the day they leave your team. A breach by someone you gave access to is treated as a breach by you.
If we are satisfied that a community has used the panel to harass, expose or profile people, we can suspend or terminate it. Players can report misuse to us directly, and we act on credible evidence. This is set out in the Acceptable Use Policy and the Data Processing Addendum.
4 Moderating players
What the dashboard tells you
Two things worth glancing at before anything else.
Staff online lists which of your staff are in game right now, with their rank and which server. Useful for the question you actually ask at 9pm on a Saturday — is anybody covering, or is the server unstaffed?
One honest limit. Staff are matched by their Steam account, so somebody playing without Steam running cannot be identified and will not be listed even though they are in game. The card says so on screen rather than leaving you to think they are offline.
Moderation, last 14 days plots warnings, kicks and bans per day, with the last seven days compared against the seven before. The comparison is the part that matters — a count on its own tells you nothing, but “up 40% on last week” is the difference between a quiet fortnight and something starting.
It also shows how many new players arrived this week, which is the other half of the same picture: more moderation with more players is normal, more moderation with the same players is not.
Recent Players — who just left
Player Data → Recent Players List shows everyone who has disconnected recently, newest first, with their playtime and trust score. It is the page for the question that comes up straight after something happens in game: somebody did it and immediately dropped, and you need their name before you can do anything about it.
A name appears within a second or two of them leaving, and the page keeps itself current on its own — you do not need to refresh it. Anyone still in game is left out, so the list is only people who have actually gone.
How far back it looks is Recent Players Time Limit in Panel Settings, ten minutes by default, and the heading on the page says which. If your server stops reporting in — it crashed, or the staff resource is not running — the panel cannot tell who is still on it, and everyone it last saw will drift into this list. That is the honest answer rather than a wrong one.
The player profile
Reach a player from Servers (whoever is online right now) or Player Data → Player List (everyone ever seen). Their profile carries these tabs:
| Tab | What it does |
|---|---|
| Warn | Records a warning and sends the player a private on-screen notice. Only they see it — nobody is humiliated in front of the server |
| Kick | Records a kick and removes them from the server |
| Ban | Records a ban and removes them. Length in seconds; 0 is permanent |
| Commend | A positive note. Raises their trust score |
| Note | Staff-only. Flags the profile for other staff; the player never sees it |
| Other Actions | Risk summary, linked accounts, screenshots, inventory and freeze |
Freeze
Under Other Actions, behind its own Freeze permission (off by default). Holds a player in place so they cannot run off mid-conversation — the thing you actually want when someone is being questioned but has done nothing worth kicking them for yet.
It survives a reconnect. Dropping out to escape it no longer works: the freeze lives on their record, and the game server re-applies it the moment they load back in. If they are offline when you freeze them, it takes effect next time they join.
They see a notice on screen for as long as the freeze lasts, showing your reason and the time remaining. It stays put through death and respawn, so somebody cannot miss it and be left wondering why they are stuck. It was previously a chat message, which scrolls away and is invisible to anyone playing with chat hidden — if you froze someone before and they seemed confused rather than co-operative, that is why. Re-download the resource to get the notice.
They are also made invincible while held — a frozen player cannot run away, so without that they are a stationary target while you are talking to them.
It always expires. You set a length between 1 and 240 minutes, and it lifts on its own. This is deliberate: a freeze with no end is a ban the player cannot appeal and may not even understand, and one staff member forgetting to release somebody should not leave them stuck indefinitely. Release early with the button whenever you are done.
Every freeze and release is written to your logs and posted to Discord, naming who did it. A freeze that leaves no trace is how somebody ends up stuck with nobody knowing why.
It is a moderation tool, not a security control. The freeze is enforced on the player's own game client, so a modified client can ignore it. The server re-applies it on every connect, but do not treat it as something a determined cheater cannot get around — if they are that far gone, ban them.
Every freeze and release is listed on the Freeze Log page under Server Data, with the staff member's name. Search a name there to read only theirs — freezing holds someone in place, so it is worth being able to see who uses it and how often.
| Ban length | Seconds |
|---|---|
| Permanent | 0 |
| One day | 86400 |
| One week | 604800 |
Trust score rises with playtime and commends, and falls with warnings, kicks and bans. Treat it as a rough reputation signal, not a verdict.
Wherever it appears — the player list, a profile, the server page, the dashboard, and on the labels in game — it is drawn the same way: the number, and four small bars filled to its band.
| Trust | Bars | Roughly |
|---|---|---|
| 80 and above | 4, green | Long-standing, nothing against them |
| 60 to 79 | 3, plain | Ordinary. Most of your server |
| 40 to 59 | 2, amber | Something on record, or very new |
| Below 40 | 1, red | Worth a look before they do it again |
The bar count says the same thing the colour does on purpose. Printed in black and white, or read by somebody who cannot separate red from green — roughly one man in twelve — the band is still legible.
Reading identifiers
Steam IDs, licences, hardware IDs and Discord IDs are set in a monospaced typeface with figures that line up in a column, because the only thing you ever do with them is compare one against another, character by character. In an ordinary typeface a 1 and a 7, or an 8 and a B, are close enough to slide past.
A Discord ID is an eighteen-digit number that tells you nothing on sight. If you have set up a Discord bot in Panel Settings, the panel looks up the name behind it and shows that alongside — preferring their nickname in your Discord server over their global name, because the nickname is what your staff will recognise. Names are refreshed once a day, and only for players who are actually online. Without a bot configured the row simply does not appear.
On a player’s profile the long ones do not wrap. Breaking a licence across two lines gives you two ragged rows of near-identical characters, which is the worst possible way to show the one thing those fields are for — so they scroll sideways instead and fade at the right-hand edge to show there is more. Hover to see the whole value, or click once to select all of it: copying takes the entire identifier, including the part off screen.
Donator vehicles
Further down the same player profile. Grant a vehicle and it belongs to that player: it is tied to their account, not to a character, so a character wipe, a new character or a fresh start does not take away something they paid you for. Enter the spawn name (adder), and optionally a display name and a plate.
The player picks from a menu. They type /mycars in game and see everything they own plus anything a friend has shared with them, and spawn any of it. Shared vehicles are marked with the name of the friend who shared it.
Owners share with friends themselves, from their own record page — up to five people per vehicle, added and removed whenever they like. You do not have to do it for them, and a friend can drive it whether or not the owner is online.
Anyone else who tries to drive it loses it. If somebody who is neither the owner nor a shared friend takes the driver seat, the vehicle is removed. Not merely ejected — ejecting leaves the car sitting there for the next person to try, and on most servers the next person parks it in their own garage and keeps it permanently.
Passengers are deliberately left alone. Riding along with a friend is ordinary roleplay; it is driving off with it that is the problem.
Revoking a grant is immediate and also removes every share on it.
It needs the optional resource. donator_vehicles is a separate download under Support → Downloads, listed beside the main one. Install it only if you hand out vehicles. Grants made without it are recorded in the panel but nothing happens in game.
It works on any framework — Qbox, ESX, QBCore or your own — because it answers only what may this player drive and leaves spawning and storage to your own scripts. If you want your garage script to refuse to save one, it exposes exports.donator_vehicles:IsDonatorVehicle(netId) for exactly that.
Unlike the freeze above, this check runs on your game server rather than on the player's computer, so a modified game client cannot skip it. A cheater can decline to tell the server they got in; they cannot hide from the server that they are sitting in the driver seat, which is re-checked every few seconds regardless.
Selling perks through your own Tebex store
A different thing from paying for the panel itself — this is your own Tebex store, selling to your own players. In Settings → Panel Settings, map a package you sell to something it should grant, and a purchase delivers itself without you touching the panel.
| Grants | How it is delivered |
|---|---|
| Vehicle | Immediately — a database row, the same as granting one from a player's profile |
| Discord role | Immediately, through the same Discord bot bulk role assignment already uses. Needs that bot set up and the player's Discord linked |
| Item | Queued, delivered the next time that player connects — only the game server can actually give an item |
| Money (cash or bank) | Queued the same way. Needs your Framework set (ESX, QBCore or Qbox) — there is no safe generic way to add money without knowing which one you run |
| Job | Queued the same way, and needs Framework too |
Setting it up: paste the webhook URL Settings shows you into your Tebex store's webhook configuration, along with the secret from that same page. Add one row per package, with the Tebex package ID from that package's URL on your store, and what it should grant.
When Tebex asks what the package delivers, do not choose “Game Server Commands” or “Discord Actions”. This is the step people get wrong, and it is an easy mistake to make: you are selling a vehicle, so a deliverable that runs commands on your server sounds exactly right.
The panel is what hands the reward over, from the mapping you set up here. If Tebex is configured to deliver it as well, both happen and your buyer receives it twice — two vehicles, double the cash, the Discord role granted from both directions. Nothing errors, so it can run that way for a while before anyone notices.
Leave the deliverable empty if Tebex allows it. If it insists, use File Download with a short note thanking them and saying the reward is on their account. It is the only one of the five options that does not also perform a delivery.
Your store must be registered under the FiveM or RedM game type, not Universal. That is what turns on the “in-game username” field at Tebex's checkout, which is the only thing this feature has to go on to work out who bought something. Without it, nothing here can function at all.
If Tebex has already told you your store needs to move off Universal, this is exactly why.
A purchase is matched against the players on record for your community by that username, case-insensitively. If nobody matches, or more than one player shares the name, it is not guessed at — it lands in the Donator Queue (in the sidebar, same permission as granting a vehicle manually) with the reason, for a staff member to type in the right license and resolve it, or dismiss it.
A job is a different kind of grant. A vehicle or an item is something a player owns; a job changes what they are allowed to do in your roleplay. Settings warns about this next to the mapping table on purpose — think about whether a job is something you actually want sold as a donator perk before mapping a package to one.
Item, money and job delivery are honestly documented as best-effort against each framework's usual player object, not verified against a live server of every kind as part of building this. If a delivery is not arriving, check your server's console when that player connects — a failed delivery stays queued and retries automatically rather than being silently lost, so it will keep trying and keep failing the same way until whatever is wrong is fixed.
Bulk actions
On Servers, select several online players with the checkboxes and act on all of them at once. Each needs its own permission, off by default, in Settings → Panel Settings:
| Permission | What it does |
|---|---|
| Bulk Give Item | One item and count to every selected player, in a single action. Reports back how many of the selection were actually online and received it — a player who left between selecting and submitting is skipped, not an error |
| Bulk Discord Roles | Assign or remove a Discord role for every selected player who has linked their Discord account. Needs the Discord bot set up first — see Settings worth doing |
Give these to a rank deliberately. Bulk item-give in particular is an easy way for a compromised staff account to duplicate items at scale — that is why it is a separate permission from giving a single player something, not bundled in with the moderation tabs above.
Server permissions — FiveM's ACE system
Under Settings → Server Permissions, owner only. This manages FiveM's own permission system, the one most scripts check with IsPlayerAceAllowed, so you can grant and revoke without editing server.cfg and restarting to find out whether it worked.
Set it up once. Add this line to your server.cfg, after your existing permission lines so these win:
exec @staff/panel_permissions.cfg
If your console says No such config file: @staff/panel_permissions.cfg, you are on a resource downloaded before 16 August 2026. The file now ships with it, empty, precisely so that line works from the first boot — re-download from Support → Downloads. Nothing is broken in the meantime; the server logs the line and carries on.
| Term | What it means |
|---|---|
| Principal | Who somebody is — group.admin, or identifier.steam:110000112345678 for one person |
| Object | What they may use — command.kick, command for everything, or whatever a script documents |
| Inheritance | One principal gets everything another has, so group.admin can inherit group.moderator |
Changes apply immediately. Adding or removing a rule is pushed to the running server as a live add_ace or remove_ace, and written to the file so it survives a restart. There is nothing to reload, and a revoked permission stops working now rather than at the next restart.
The panel writes only panel_permissions.cfg. It never edits server.cfg, so a mistake here leaves a permission wrong — it cannot leave you with a server that will not boot.
This grants rights on your game server, not just in the panel. Somebody who can add an ace can give an account command access to the machine itself. That is why it is owner-only rather than a rank permission, and why every change is written to your audit log with who made it.
Principals and objects may only contain letters, numbers and . _ : - [ ]. Anything with a space or a quote is refused at both ends — these become arguments to a server console command, and a space would turn one command into two.
The in-game staff menu
Press F6 in game. A narrow panel opens in the corner: a title, a counter showing where you are in the current list, one list at a time, and a line at the bottom describing whatever is highlighted. The key is rebindable in the game’s own settings under FiveM — nothing to edit in a config file.
It is driven with the keyboard, not the mouse. There is no cursor, which is deliberate: taking the mouse also hands the game your camera, so aiming at a button swung your view. With keyboard control the game receives nothing at all while the menu is open and your character stands still.
| Key | What it does |
|---|---|
| ↑ ↓ | Move up and down the list |
| Enter or → | Select. On a row with a › it opens that list |
| Backspace or ← | Back one list. From the first one, closes the menu |
| Esc | Close |
| Typing | Filters, on the player list. Faster than scrolling past sixty names |
Lists open inside each other rather than side by side: Staff → Players → that player → the actions your rank allows. Each list remembers where you were, so backing out of a player puts you back on that player and not at the top.
Choosing a player does nothing to them. It opens their list of actions; nothing is sent until you select one.
| Item | What it does |
|---|---|
| Watch | Follows that player’s camera without them being told. Backspace to stop |
| Screenshot | Takes a screenshot of their screen, exactly as the panel’s own screenshot button does. It lands on their record |
| Warn / Kick / Ban | Asks for a reason, then does the same thing the panel does. The record is identical either way |
| Commend / Note | Positive record, and a staff-only note. Both ask for text |
| Freecam | On the first list. Flies the camera anywhere. WASD to move, space and ctrl for up and down, shift to sprint, scroll to change speed, backspace to land |
| Position | Which corner the menu opens in. It moves as you arrow through the four, so you can see where it lands. Remembered on your own computer, so each staff member can put it wherever their HUD leaves room |
The menu sits in a corner on purpose rather than filling the screen. You are looking at the world while you use it, and the in-world labels draw into that same world — anything centred covers the thing you are trying to look at.
The menu decides nothing. It builds the same command you would have typed and sends it the same way, so every rule already in place still applies — your rank’s permissions, the reason being required, and not being able to action your own account or another staff member’s unless you are the owner.
That is why picking your own name shows your record but no buttons: the action would only be refused, so it is not offered.
Watch and Freecam need the Spectate permission, and no rank has it until you grant it. Including yours. It is under Settings → Panel Settings, listed as Spectate & Freecam.
It is deliberately not part of Screenshot. A screenshot is one frame, and a player could in principle notice it; following somebody around invisibly for ten minutes is a different thing to hand out, so it is a separate decision.
This needs the updated resource. If F6 does nothing, you are running an older copy — re-download it from Support → Downloads, replace the folder and restart the resource.
While in freecam your character stays where you left it, frozen and invisible to everyone else, and is put back when you exit. Dying, or the resource restarting, also puts you back.
The ESP overlay — seeing who is where
Switched on from the ESP section of the F6 menu. It draws a label over every connected player and every vehicle in the world: the player’s name and server id, or the vehicle’s model and plate. Labels fade with distance and stop being drawn past it — players at 300 metres, vehicles at 120.
The labels stay when you close the menu. That is the point of them: you switch them on, close the panel, and then look around. They keep drawing until you switch them off again, and that choice is remembered until you do.
A player’s label is coloured by their trust score, using the same four bands the player list and the website use, so one colour means one thing everywhere:
| Trust | Colour | Roughly |
|---|---|---|
| 80 and above | Green | Long-standing, nothing against them |
| 60 to 79 | White | Ordinary. Most of your server |
| 40 to 59 | Amber | Something on record, or very new |
| Below 40 | Red | Worth a look before they do it again |
To act on somebody you can see but cannot find in a list: open the menu, choose Free look under Tools, and the cursor is released so you can aim the camera. Point at a label — it turns amber — and press G. That target’s actions open on their own, including Ghost if your rank has it, which puts you next to them invisible and non-colliding so you can watch what is actually happening before deciding anything.
ESP Overlay is its own permission, and no rank has it until you grant it. Under Settings → Panel Settings. Without it the ESP section does not appear in the menu at all.
Seeing every player’s position on the map at all times is a real capability, and being able to see somebody is not the same as being allowed to act on them — picking a target still checks each individual action’s own permission, exactly as the list does. Ghost is separate again, for the same reason Spectate is.
The Audit Log — yours alone
Under Servers in the sidebar, and only the owner rank can open it. No other rank sees the link, and none can reach the data behind it either — showing it to the people it covers would defeat the point of keeping it.
It records the actions that change what your panel holds, or who is allowed to change it:
| Recorded | What it keeps |
|---|---|
| Deleting any record | Bans, warnings, kicks, commendations, notes, screenshots, detections — along with what the deleted record said, not just that something was deleted |
| Staff changes | Adding someone, removing them, changing a rank |
| Settings changes | Which settings moved. For rank permissions it keeps the before and the after |
| Server changes | Address edits, key rotations, and RCON password changes |
| Billing and licensing | Licence claims and failed claims, card payments being switched on or off, purchases marked as tests |
| Donator deliveries | A reward marked as received, or queued again after it did not arrive |
| Permissions pushed to your server | ACE rules added and removed |
| Packages and waivers | Package changes, Tebex donator settings, and refund waivers accepted at checkout |
| CSV imports | What was imported, how many rows, and how many were skipped |
| Data export and erasure | Who exported or erased what, and when |
Each entry is written out in plain words — “Licence claim failed”, “Donator reward marked as received” — with the panel’s own stored name for it printed underneath in small type. The stored name is what the search box matches on, and it is the exact string to quote if you ever need to ask us about a specific entry.
Deletions are the part that matters. A ban already records who issued it. Until this existed, removing one left nothing at all — so every record in your panel was only as trustworthy as whoever held the delete permission. The same was true of permissions themselves: somebody could grant their own rank the ability to delete, use it, and set it back, and nothing anywhere would show it.
Both are now recorded, which is what makes the rest of your records worth relying on.
Each entry records the staff member's IP address. That is the difference between “an admin deleted this ban” and “an admin deleted this ban from an address they have never used before” — which is what a stolen staff account looks like from the outside.
It is your staff's address, not a player's. Because it identifies them personally, tell your staff it is recorded. That is both fair and what data protection law expects of you as the controller — see the DPA.
Kept indefinitely. Your Server Log is pruned on a schedule because chat fills it up; the audit log is not, because the entries most likely to be asked about later are the ones worth keeping longest. It is included in Export My Data, so it can leave the panel if somebody asks you for it in writing.
What it does not record: who merely looked at a player's record. On a busy panel that is thousands of entries a day and it would bury the ones that matter. If you need read-tracking for a specific reason, ask — it is a deliberate omission, not an oversight.
Staff Activity — also yours alone
Under Servers in the sidebar, next to the Audit Log, and gated the same way — owner rank only. It answers a different question than the audit log: not what got deleted, but who is doing the work, and how well.
| Column | What it shows |
|---|---|
| Active (30d) / Issued (all time) | Warnings, kicks, bans and commendations issued, both recently and in total. Sorted by the 30-day figure first — a staff member with a long history but no recent activity should not outrank someone active right now |
| Accuracy | What share of a staff member's own records have not been reversed by someone else later |
| Playtime | Total time that staff member has spent connected to one of your servers, all time |
| Issued offline | Of the records where this is known, how many were issued through the website while that staff member was not connected to any server |
| Every staff member appears, including anyone who has never issued anything — a row of zeros, rather than no row. Absent and inactive should not look the same. | |
Accuracy is a proxy, not a verdict. It only counts records that were later deleted through the panel — a ban lifted because it was appealed and rightly upheld looks identical here to one that should never have been issued in the first place. Read a low number as worth a closer look, not as proof of a bad call.
It also only counts reversals recorded after this feature shipped. A long-serving staff member's true rate may be better than shown, never worse.
Issued offline is not automatically wrong. An in-game /warn, /kick, /ban or /commend requires being connected, so those always count as online. Issuing something from the website while not connected is normal too — reviewing a report after the fact, or acting on footage a player sent you.
What is worth a second look is a pattern of offline records from someone whose job is meant to be in-game moderation, or a burst of them from an account you don't expect to see active right now.
Server Logs and Chat Logs — two pages, on purpose
Both under Servers in the sidebar, visible to anyone who can already see the Servers group — not owner-only, unlike Audit Log and Staff Activity above. Server Logs and Chat Logs used to be one page; they were split because the two are read for different reasons: server logs are scanned for what happened — joins, leaves, warnings, kicks, bans — while chat is searched for what was said. A busy server's chat drowns out a join/leave line within seconds, so leaving them mixed meant the moderation trail was the thing that got buried.
| Column | What it shows |
|---|---|
| Action (Server Logs only) | What happened — a join, a leave, or a moderation action |
| Player | Who it concerns, shown by name where the panel can resolve one |
| Message | The detail — the chat line itself on Chat Logs, or a short description on Server Logs |
| Date | When it happened |
Chat Logs only exists if chat_logs is switched on in your resource's config.json — see the connecting your game server section above. It is the highest-volume, most sensitive thing the panel stores, so turning it off and keeping only Server Logs is a legitimate choice, not a compromise.
Server Logs is pruned on a schedule (your Log retention setting), same as Chat Logs — unlike the Audit Log, which is kept indefinitely because those entries are the ones most likely to be asked about later.
Reasons — what your players are actually doing
Under Player Data → Reasons. Every warning, kick and ban you have issued, grouped by the reason written on it. Unlike the two reports above, this one is not owner-only — no staff name appears on it. It reports on your players, not on your team, so anyone who can already read the warnings list can read this.
Staff Activity answers how much moderation is happening and who is doing it. This answers what it is all for, which is usually the one you can act on: a rule producing a third of your warnings is either a rule people cannot follow or one that needs saying more clearly, and neither of those is visible from a count.
| Column | What it shows |
|---|---|
| Warns / Kicks / Bans | How many times that reason was used for each kind of action — the same wording appearing under all three usually means it escalates |
| Total and Share | How much of all your moderation this one reason accounts for |
| Last 30 days | Whether it is still happening or is something you already fixed |
| Last used | When it was last needed |
It groups the words, not the meaning. “Cheating”, “cheating.” and “CHEATING” are counted as one. “cheat” and “aimbot” are counted separately, because treating those as the same thing would mean guessing what your staff meant, and a report that invents categories is worse than one that shows you what was actually typed.
So if one category is split across several rows, that is worth knowing in itself: it means your team has not agreed on the wording. Agreeing a short list of standard reasons makes this page far more useful, and makes appeals easier to answer.
Lifted records stay counted. Removing a warning or ban takes it off the player's record and stops enforcing it, but the reason is kept — so this page still shows what your community was dealing with after somebody tidies up. The Lifted column shows how often each reason did not stick.
A reason lifted half the time usually means a rule nobody can follow, or one being applied wrongly. That is the most useful thing here for training. It only counts records lifted from August 2026 onward; anything deleted before that is gone.
A reason is required. Neither the panel nor the in-game commands will issue a warning, kick, ban, note or commendation without one — typing /warn 5 with nothing after it is refused and tells you the correct usage. If the page shows a count of records with no reason, those are from before that was enforced; it cannot happen now.
5 How bans really work
A ban is not attached to one account. When you ban someone, the panel stores every identifier they had at that moment — Steam, Discord, licence, licence2, their Cfx.re account, their Xbox Live account if they have one, and their hardware IDs. On every connection attempt it checks all of them, and matching any single one blocks entry.
So a banned player coming back on a brand-new Steam account, from the same machine, is still stopped by the hardware ID.
The two worth understanding are the ones a new account does not shake off. Making a new Rockstar account changes both licence identifiers, and someone evading deliberately is usually not running Steam and never linked Discord — so those give you nothing. But playing FiveM at all needs a Cfx.re account, and a Microsoft Store or Xbox app copy of the game carries the Xbox Live account it was bought with. Replacing that one means buying the game again, which is a real cost rather than a few minutes of effort.
The honest limit, which you should know now rather than discover later
Hardware IDs are reported by the player's own computer, and tools that fake them are openly sold. A determined evader with a spoofer and a fresh account will get past a hardware ban.
What hardware bans reliably stop is the lazy returner — which is most of them. For the rest, the panel gives you identifier analysis: it cannot stop a spoofer, but it can show you the signs that someone is using one.
6 Investigating
Linked accounts
Under Other Actions. Lists other players sharing this one's Steam, Discord, licence2, Cfx.re account, Xbox Live account or any hardware ID — showing which identifiers overlap and whether that account is already banned. This is how you find alt accounts and ban evaders.
Risk summary
Trust score, Steam account age (flagged under 30 days, typical of throwaway evasion accounts), recent warnings and kicks, and total bans.
Name mismatch
Compares the name the game client reports against the real Steam account name. Cheat menus can fake the in-game name; they cannot fake the Steam one.
A mismatch is a hint, not proof. Roleplay character names, framework renaming and a recent Steam rename all set it off perfectly innocently. Always check further before you act on it.
Identifier analysis
Every player page carries a short analysis of the identifiers that player has connected with. It exists because of the uncomfortable fact above: since hardware IDs can be faked, what is worth watching is not the values themselves but whether they stay consistent. A player whose hardware ID changes every session is telling you something.
Live map
On each server's page, needs the Live Map permission (off by default — Settings → Panel Settings). Plots every connected player's current position as an arrow pointing the way they are facing. A player still loading in has no position yet and is left off rather than shown at the wrong spot; one whose direction is not known yet shows as a plain dot.
While you have the map open it refreshes every two seconds. Opening it is what asks your game server for that: it starts sending fast position updates, and stops within a few seconds of the last map being closed, so a server nobody is watching sends nothing extra at all. Going live takes up to 30 seconds — the request rides on the heartbeat your server already sends, and that runs on a 30-second timer. Until then the map shows the 30-second snapshot it always did.
The badge in the top-left corner says which you are looking at:
- Live — positions are two seconds old at most.
- Every 30s — the snapshot. Either the map has only just been opened, or the server is on a resource older than 2.4.1.
- No data — nobody is connected, or the server has not reported in.
The fast updates carry three numbers per player and nothing else — no names, no identifiers. Those come from the 30-second report as they always have, and the two are read together. Somebody who connected in the last half-minute therefore appears at the next 30-second beat, which is also when the panel first learns their name.
No game map image ships by default — positions plot on a plain grid until you supply one. This is deliberate: the in-game map texture belongs to the game, not to us, so sourcing an image is left to you rather than decided on your behalf.
Inventory, trunk and glovebox
On a player's own page, needs the Screenshot permission (the same one that gates screenshot requests — both are "look at what this player actually has right now" tools). Reads live from the game server: their inventory, or whatever vehicle they are currently sitting in.
Trunk and glovebox only work for the vehicle the player is currently in — not an arbitrary plate. A parked, unattended vehicle cannot be read this way; that is a limit of how the game server tracks vehicles, not a bug.
7 The player portal
Your players have their own page at /me on the panel. They sign in with Steam — no account to create — and see what your community records about them.
| They see | They never see |
|---|---|
| Their playtime, first and last seen | Anyone else's records |
| Their warnings, kicks and commends, with reasons and dates | Your staff notes — those stay private |
| Whether they are banned, why, and when it expires | Their trust score, linked accounts or identifier analysis |
| An appeal form, if they are banned | Anything about your other servers or your staff |
It covers every community they play on that uses this panel — each one separately, and only their own rows.
Sharing a donator vehicle
If a player owns a donator vehicle, it is listed on the same page with a box to share it. They type a friend's exact in-game name, and that friend can then drive it whenever they like — the owner does not need to be online. Up to five friends per vehicle, removed again with one click.
Deliberately the player's job rather than yours. The alternative is your staff handling “can you add my mate to my car” tickets forever, and there is nothing in that decision a staff member needs to approve.
Ban appeals
A banned player can appeal from that page. The appeal arrives as an ordinary support ticket in your queue, so it lands where you already look rather than somewhere new. One open appeal at a time, so a frustrated player cannot flood you.
This is worth turning on in your community's mind: it saves your staff answering the same "why was I banned" question in Discord all week.
8 Settings worth doing
All under Settings → Panel Settings.
| Setting | Why it matters |
|---|---|
| Discord webhook | Where moderation alerts, support replies and renewal reminders are posted. Leave it empty and you get no notifications at all — including replies to your own support tickets |
| Timezone | Every date in the panel and in ban messages uses this. Type to search |
| Community name | Shown throughout your panel |
| Trust score values | How far each action moves a player's score |
| Server buttons | Custom buttons on a server's page — pick a server, action, label and colour |
| Your framework | Qbox, QBCore, ESX or Sandbox. Features needing an inventory stay hidden on Sandbox. See below |
| Your Steam API key | Optional. Your own key instead of the shared one, so you are not competing for someone else's rate limit. See below |
| Approved server addresses | A second lock on your community ID. See below |
Set the Discord webhook first
It is the single most useful five seconds in this list. Without it your staff cannot see moderation happening, and you will not be warned before your plan runs out.
Your framework
Qbox, QBCore, ESX, or Sandbox — no framework, which is the default. It controls one thing today: whether the panel offers features that need an inventory to exist.
Left on None, Give to Selected on the Servers page is hidden. That is deliberate — on a server with no item system there is nothing to give, so offering the box would only ever produce a silent failure.
Set this, then restart your staff resource once. On start it reads your server's real item list and sends it to the panel, and the item box becomes a searchable dropdown of what you actually have — with proper names like “Water Bottle” next to water.
Until it has reported, the box stays a plain text field and says so. Typing an internal name still works; it is just easier to get wrong, and a name that does not exist fails silently because handing over a nonexistent item does nothing at all.
The list is refreshed every time the resource starts, so adding items to your server and restarting is all it takes to see them here.
Your own Steam API key
Optional, free, and takes about a minute. The panel uses a Steam key to turn a player’s Steam ID into their real Steam name and account age — which is what powers name-mismatch detection and the “this account is four days old” signal when you are investigating somebody.
Leave it blank and the panel’s own key is used. That works, and nothing breaks. But Steam limits requests per key, and on a hosted panel that one key is shared with every other community here — so a busy neighbour can eat into what is available to you.
Get one at steamcommunity.com/dev/apikey, paste it into Settings → Panel Settings, and save.
It is never shown again once saved, the same as an RCON password. Leaving the box empty keeps the key you already have — it does not clear it. To stop using your own key and go back to the shared one, type remove in the box and save.
Changing it is recorded in your Audit Log. The fact that it changed, never the key itself.
Self-hosted? There is only ever one key on your install, and this field simply is not needed — set it in your config file instead.
Approved server addresses
Your community ID is how your game server proves itself to the panel. It sits in a file on that server, so treat it as something that could be discovered rather than as a password.
It cannot be used to warn, kick or ban anyone — those need a signed-in panel account. But it is worth a second lock: list the addresses your game server actually calls from, and the community ID alone stops being enough.
The panel records every address it sees, so you can copy real values rather than typing one from memory. A wrong entry stops your bans being enforced, so use the recorded list.
Server signing, and the “New key” button
Under Settings → Edit Servers, each server shows a signed or unsigned label. Signed means it is running a resource built after each server got its own individual credentials, so it proves which server is calling rather than just quoting your shared community ID. Unsigned means it predates that — re-download it from Support → Downloads when convenient. Nothing is broken in the meantime; an unsigned server keeps working exactly as before.
“New key” takes that server offline immediately. Issuing a fresh signing key retires the old one straight away, so the server cannot report in again until you re-download its resource from Support → Downloads and restart it. Use it if you think that server's key may have been seen by somebody else — not as a routine action.
Your other servers are unaffected; each has its own key.
Import Moderation History — bringing records over from another tool
Under Settings → Import Moderation History, owner only — it writes bulk records straight into your bans, warnings and kicks, the same tier as deleting a community. It lets you bring a CSV export from another moderation tool into the panel instead of losing that history when you switch.
- Upload a CSV of bans, warnings or kicks (pick which one first — each import is one type at a time).
- Map columns — tell the panel which column in your file is the player name, reason, identifier, date and so on. It guesses from your header row where it can; you confirm or correct it.
- Review a dry-run summary before anything is written — how many rows will import, how many will be skipped, and why.
A row that cannot be imported is skipped and listed, never guessed at or silently dropped. An identifier the panel cannot resolve to a known player, a date it cannot parse, or a value too long for its field is left out of the count and named in the skipped list — so you know exactly what did not make it over and why, rather than finding a gap later.
Nothing is written until you confirm the review step. Leaving the page, or pressing Cancel, discards the upload with nothing saved.
Every completed import writes one entry to your Audit Log: how many records were imported and how many rows were skipped.
Discord bot (for bulk roles)
A separate integration from the webhook above — a webhook can only post messages, this can grant Discord roles, so it needs its own bot with its own token. It only powers Bulk Discord Roles; nothing else in the panel needs it.
- Create a bot at discord.com/developers/applications.
- Invite it to your server with the
Manage Rolespermission — nothing wider than that. - Move its own role above any role you want it able to grant, in your Discord server's own role list. This is a Discord rule, not ours: a bot can never assign a role equal to or higher than its own.
- Paste the token and Server ID into Settings → Panel Settings, add the roles you want available, and hit Test Connection. It checks both the token and, if you have already listed roles, whether the bot can actually grant each one — so a role-order mistake is caught here rather than mid-assignment later.
The bot token is write-only once saved — the field always shows blank, the same as your RCON passwords. Leaving it blank on a later save keeps the existing token; nothing is ever redisplayed.
9 Your plan and paying
Sidebar → Account → Landing Page shows your current plan, how much of your allowance you have used, and days remaining.
| Package | Price | Communities |
|---|---|---|
| Free trial | — | 1, for 14 days |
| Starter | $8 / 30 days | 1 |
| Duo | $15 / 30 days | 2 |
| Pro | $25 / 30 days | 5 |
Renewing early adds to your remaining time rather than replacing it, so there is no reason to leave it late. Belonging to other people's communities is always free and never counts against your allowance — the limit is only on communities you own. If you own more than one, a dropdown appears at the top of the sidebar to switch between them.
Paying by card
Press Pay on the Landing Page and you are taken to Tebex, who handle the payment. We never see or store your card details.
Tebex will ask you to sign in with your Cfx.re account — the same one you use for your server key. That is simply how Tebex identifies FiveM customers; your plan stays tied to the Steam account you signed into this panel with, not to Cfx.re.
Your statement will read BWRP - FiveM Server Management, which is the name of our Tebex store.
Your free trial needs none of this — it starts by itself, with no card and nothing to arrange.
If you bought on our store instead of in the panel
A purchase made directly on our Tebex store arrives without an account attached to it, because only a checkout started inside the panel knows who you are. Nothing is lost when that happens — the payment is held, not discarded — but it does not apply itself.
On the Landing Page there is a link reading Bought on our Tebex store instead? Claim it here. Enter the transaction reference from your receipt (it starts with tbx-) and the email you used at checkout, tick the immediate-access box, and your plan applies straight away.
Both the reference and the email are required, and repeated wrong guesses are refused for an hour. That is deliberate: without it, somebody who guessed a reference could claim a stranger's purchase. If you are stuck, email [email protected] and we will apply it by hand.
Once you have claimed once, later renewals of that subscription attach themselves automatically. You only ever do this the first time.
Before you pay
On the same Landing Page, under the packages, there is a box headed Before you pay. Do this before sending any money:
- Choose your package from the dropdown — the one you actually intend to buy.
- Tick the box confirming you want immediate access and understand you give up the 14-day cancellation right by taking it.
This exists so both sides know where they stand. It is recorded with the exact wording, the package and the time.
You are warned on Discord, not by email
The panel has no email feature. Before your plan ends it posts to your own Discord webhook at 7 days, 3 days and 1 day — once each. Receipts come from the payment provider, not from us.
If a plan does lapse, nothing is lost
Your game server keeps running and your bans stay enforced — the resource does not stop working. Only the panel pauses, nothing is deleted, and renewing brings everything back exactly as it was.
10 Your players' data
You hold real personal data about real people: identifiers, hardware IDs, chat and screenshots. Two tools exist so you can meet requests without asking anyone's permission.
Download everything
Settings → Download My Data gives you the whole community as JSON, CSV and the screenshot image files.
That file is your players' personal data. Once it is on your computer you are responsible for it. Do not pass it around your staff team.
Downloads are recorded in your Server Logs and announced to your Discord webhook, so you can see if anyone else ever takes one.
Delete one player
On that player's page, for when a player asks you to. It permanently removes their profile, warnings, kicks, notes, commends and screenshots in your community, and the image files on disk. You confirm by typing ERASE, because it is irreversible. Records held by other communities are theirs, not yours, and are untouched.
Keep the ban — erasure is not a way out of one
The erase form has a keep bans option. Tick it and everything else about that player goes while the ban record stays and keeps working.
Use it whenever the person asking is banned. Data protection law does not require you to delete records you need in order to prevent abuse, and a ban record is exactly that. Without this, "please delete my data" would be the cheapest ban evasion there is.
Players cannot erase anything themselves. From their own page they can only view their record and appeal, so every erasure is a decision you make.
Delete one screenshot
Each screenshot on a player's page has a Remove label next to it, for anyone with the Delete Records permission. It deletes the database record and the image file together — there is nothing left to clean up afterwards. Use it for a screenshot that should not have been kept, without erasing the rest of that player's history.
Delete the whole community
Available to the registered owner only, and confirmed by typing a phrase so it cannot happen by accident.
Our side of this is set out in the Data Processing Addendum. Worth reading once if you take players from the EU or UK.
11 Using the panel without a mouse
Everything below works today, on both the hosted and self-hosted panel. Nothing here needs turning on.
Keyboard
Tab moves forward through the page, Shift+Tab back, Enter or Space activates whatever has focus. Whatever holds the keyboard draws a blue ring around itself, so you can always see where you are. The ring only appears when you are actually using the keyboard — clicking a button with the mouse does not leave one behind.
The first Tab on any page is “Skip to main content”. It stays hidden until you get to it. The sidebar is around thirty links and it comes before the page content, so without this you would press Tab thirty times on every page before reaching the thing you came for. Press Enter on it and you land in the content itself.
Screen readers
Every field is tied to the label printed beside it, so the field announces the same words you can see — and clicking a label puts the cursor in its box, which is useful with a mouse too. Buttons that show only an icon, like the map's zoom controls, say what they do. In the permissions grid each checkbox announces both of its coordinates, as “kick for moderator”, because a bare checkbox in the middle of a grid tells you nothing on its own.
Each page has one top-level heading naming the page, then a heading per card, so you can jump between sections by heading rather than reading through. Tables announce their column headings as you move across a row.
Zoom and text size
The panel is usable at 200% zoom without the page scrolling sideways. Browser zoom (Ctrl and +, or Cmd and + on a Mac) is the one to use. An older version of the panel told your browser to block pinch-zoom on a phone; that is gone.
Wide tables scroll on their own. The player list has a lot of columns. On a narrow window or at high zoom, drag the table sideways rather than the page — or reduce the columns you are looking at with Show entries and the search box.
If something here does not behave as described, that is a bug worth telling us about rather than a limit of the panel. Open a support ticket and say which page and what you were using.
12 Upgrading a self-hosted panel
However the panel is run, a tab that was open before a new version went live notices within a minute — or as soon as you switch back to it — and shows a bar at the top of the page with a Refresh button. It never refreshes on its own, so a half-written ban reason is never lost. After refreshing, What’s New lists what changed.
Hosted customers can skip the rest of this section — we run these steps for you, and you will simply see the new version appear. This is for licensees running the panel on their own server.
An upgrade is three things, in this order: replace the files, run the migration tool, then re-download the game-server resource if the release says to.
1. Replace the files, keep your config
Overwrite the panel files with the new release, but keep your own config.php — it holds your database details and two encryption keys that cannot be regenerated. If you lose those keys, the stored RCON and server credentials they protect cannot be read back. Take a copy before you start.
Never leave a backup of config.php inside the web folder — not even for a minute, and not with a .bak ending. Anything in that folder can be requested over the web, and that file contains every secret the panel has. Copy it somewhere outside the site entirely. The panel now refuses to serve such files, but do not rely on that.
2. Run the migration tool
From the panel folder, on the server:
php tools/migrate-schema.php
Run without --apply it changes nothing — it prints exactly what it would do, and you decide. Add --apply when you are happy. It brings an older database up to what the release expects: text stored so that every alphabet survives, timestamps that no longer reject a missing value, and the relationships between tables.
Two flags are worth knowing:
| Command | What it does |
|---|---|
--orphans | Lists rows that point at a community or player that no longer exists. Read this before adding the relationships below, since those rows are what would block it |
--add-foreign-keys | Makes the database enforce its own relationships, so removing a community removes what belonged to it instead of leaving it behind invisibly. Lists anything orphaned first and refuses rather than deleting your data |
If you are upgrading a panel that predates per-server keys, there is also php tools/migrate-server-keys.php, which gives each of your servers its own credentials. The release notes say when this is needed.
Back the database up first. A migration changes column types across every table. It reports before it acts and refuses when something looks wrong, but a backup is the thing that makes a bad afternoon into a short one.
3. Re-download the resource, if the release says so
Some releases change how your game server talks to the panel — the move to signed requests did. When that happens the release notes say re-download the resource. Get it from Support → Downloads, replace the staff folder on each game server, and restart that resource. Your panel keeps working with an older copy in the meantime; it just keeps doing the old thing until you update.
Check it worked
Platform Admin → Diagnostics reads its numbers from the running server rather than from a config file, so it will tell you what PHP is actually doing, which extensions are present, your database version, and whether signed requests are being required. Anything below what the panel needs is marked.
13 When something breaks
| Symptom | Almost always |
|---|---|
| Players not showing under Servers | The address in the panel does not match the resource. Edit it in place under Settings → Edit Servers, and check the console for [Staff Panel] lines |
| Kicks or bans not reaching players | On resource 2.5.1 or newer these no longer use RCON at all — your server collects them itself, so check the server's page for Actions that did not reach your server, which says what happened. On older resources it is almost always a wrong or missing RCON password: retype it in the second box on the server's row, and check server.cfg actually sets rcon_password |
| “Restart resource” or a console command does nothing | Those two need one line in server.cfg: add_ace resource.staff command allow. Without it the resource is refused permission and the action is listed as one that did not reach your server |
| No Discord notifications | The webhook field in Panel Settings is empty |
| “No Access” on a page | The screen names the exact permission you are missing. Ask an owner to grant it |
| Bans stopped being enforced | A wrong entry in Approved server addresses. Copy from the recorded list rather than typing one |
No such config file: @staff/panel_permissions.cfg | A resource downloaded before 16 Aug 2026, which did not yet ship that file. Re-download from Support → Downloads. Harmless until you do — the line is logged and the server carries on |
| F6 opens nothing in game | The same thing: an older resource. Re-download, replace the folder, restart it |
Opening a ticket
Support → Support Tickets. Status moves through Open, In-Progress, Pending and Closed. Replies appear on your dashboard with a New reply badge, and are posted to your Discord webhook if you have set one.
Questions about pricing, bigger networks, or running the panel on your own hosting: [email protected].