Commands
F5 Board exposes two commands. Both can be renamed, disabled, or gated independently.
| Command | Default | Description | Default access |
|---|---|---|---|
/board | /board | Open the board catalog (NUI grid) | Admin |
/badmin | /badmin | Open the admin panel (map view + board list) | Admin |
/board — Board Catalog
Opens a NUI grid showing all configured board models. The player picks one, the catalog closes, and the placer opens.
Config.Command = {
name = 'board',
enabled = true,
suggestion = 'ui_cmd_board_help',
access = 'admin',
permission = 'admin',
jobs = nil,
requestCooldownMs = 700,
placeCooldownMs = 400,
requestTimeoutMs = 3000,
requireItem = false,
}
Access Modes
The access field controls who can open the catalog:
| Value | Behaviour |
|---|---|
'admin' | Only players who pass the permission check (Config.Command.permission) |
'job' | Admins (by permission), or any player whose job matches Config.Command.jobs |
'everyone' | Everyone |
| anything else | Fail-closed — treated as 'admin' |
Access — Admin Only (default)
Config.Command = {
access = 'admin',
permission = 'admin',
}
The player must pass the admin permission check (see Permissions for how this is resolved per framework).
Access — Job-Based
Config.Command = {
access = 'job',
permission = 'admin', -- admins bypass the job check
jobs = { 'police' },
}
Config.Command = {
access = 'job',
permission = 'admin',
jobs = {
police = { min = 2 }, -- police grade >= 2
sheriff = { 3, 4, 5 }, -- sheriff grades 3, 4 or 5
medic = true, -- any medic
mechanic = { max = 3 }, -- mechanic grade <= 3
},
}
Job-spec shape is the same as Config.AllowedJobs — see the Configuration page for the full grammar.
Access — Everyone
Config.Command = {
access = 'everyone',
}
permission and jobs are ignored. Cooldowns and MaxBoardsPerPlayer still apply.
Item Gating (requireItem)
By default, /board lets the player place any configured board for free — the catalog is just a picker. Enabling requireItem turns the catalog into an inventory view: the player only sees boards they actually carry, and placement consumes one item.
Config.Command = {
requireItem = true,
}
With requireItem = true:
- Each board tile in the catalog shows the carried count (
3 / 5 available). - Tiles for items the player doesn't carry are dimmed and labelled
MISSING ITEM. - Confirming a placement removes one item from the inventory (
Bridge.RemoveItem). - If the remove call fails (full slot conflict, race condition), placement is aborted and the player notified.
Cooldowns and Timeouts
| Option | Default | Description |
|---|---|---|
requestCooldownMs | 700 | Min interval (ms) between opening the catalog. Prevents NUI flicker spam |
placeCooldownMs | 400 | Min interval (ms) between consecutive board placements |
requestTimeoutMs | 3000 | If the server doesn't respond to the catalog open request within this window, the player sees notify_catalog_timeout |
Both cooldowns are tracked per player citizen ID, not per server slot. They're cleared when the player disconnects.
Disabling /board
Config.Command = {
enabled = false,
}
The command is unregistered. Players who type /board see notify_catalog_disabled. Item-triggered placement (Bridge.CreateUseableItem) still works.
Renaming /board
Config.Command = {
name = 'placeboard',
}
The command becomes /placeboard. The chat suggestion picks the new name automatically.
/badmin — Admin Panel
Opens the admin panel — a fullscreen map view with all placed boards, a filterable list, and per-board detail preview.
Config.AdminCommand = {
name = 'badmin',
enabled = true,
suggestion = 'admin_command_help',
permission = 'admin',
ownerCacheTtlMs = 30000,
}
What the Panel Shows
| Section | Content |
|---|---|
| Map view | Pannable, zoomable game map with a pin per placed board, colored by blip color. Double-click a pin to open its preview |
| Board list | Filterable list (search by owner name). Click a row to preview, hover for tooltip |
| Preview | Static render of the board content + owner details (citizen ID, source, Steam, Discord), online status, model, coords |
| Actions | TELEPORT in front of the board · DELETE this board · DELETE ALL (with double-confirm) · REFRESH the list |
Offline-Owner Resolution
The panel resolves the owner's display name even when they're offline by reading their charinfo from the database. The result is cached per citizen ID for ownerCacheTtlMs ms (default 30 s) to avoid hammering the DB while the panel is open.
Permissions
| Action | Required permission |
|---|---|
Open /badmin | Config.AdminCommand.permission (default admin) |
| Delete a single board | Same as above |
| Delete all boards | Same as above |
| Teleport to a board | Same as above |
All admin actions are also audit-logged to Discord via the delete webhook event when configured — see Webhooks.
Disabling /badmin
Config.AdminCommand = {
enabled = false,
}
The command is unregistered. The admin functionality stays accessible via the NUI callbacks but with no entry point — effectively turning the admin panel off.
Permission Resolution
When the script asks Bridge.HasPermission(src, 'admin'), the bridge resolves it like this:
| Framework | Default mechanism |
|---|---|
| QBCore | QBCore.Functions.HasPermission(src, 'admin') |
| QBox | IsPlayerAceAllowed(src, 'admin') |
| ESX | xPlayer.getGroup() ∈ { 'admin', 'superadmin' } |
| ox_core | IsPlayerAceAllowed(src, 'admin') |
You can globally switch to ACE-only mode, enable ACE fallback, or define custom logical permissions — see Permissions.
Chat Suggestions
Both commands publish chat suggestions via chat:addSuggestion. The suggestion text is a locale key, not a literal string:
Config.Command.suggestion = 'ui_cmd_board_help' -- → 'Open the board catalog'
Config.AdminCommand.suggestion = 'admin_command_help' -- → 'Open the boards admin panel'
Translate those keys in locales/<code>.lua to localize the suggestions.
See Also
- Permissions — full permission-mapping reference (ACE, framework-native, mixed)
- Configuration — every
Config.CommandandConfig.AdminCommandfield - Features — what each
/badminaction does in detail - Webhooks — Discord audit logging for
/badminactions