An original, server-authoritative administration suite for FiveM with the Jaramiyo cacao and rose interface.
- Responsive administration dashboard with live server health and activity.
- Online player search, rich profiles, map positions and lifecycle-safe targeting.
- Heal, revive, freeze, teleport, spectate, direct message, vehicle spawn, repair, flip and cleanup tools.
- Persistent bans, warnings, notes and audit records for sensitive staff actions.
- Player reports with claim, conversation and close workflows.
- Staff roles, hierarchy protection, duty tracking and granular permissions.
- Inventory, economy and job adapters for supported frameworks.
- World, announcement, event scheduling and resource modules behind explicit safety gates.
- Quick tools for noclip, god mode, invisibility, player names and coordinates.
- Spanish and English UI, keyboard navigation, reduced motion and local WebAudio SFX.
- No CDN, telemetry, external panel or remote service.
- A recent FiveM server artifact with OneSync enabled.
- oxmysql.
- One supported framework, or standalone mode for framework-independent features:
- ESX Legacy
- QBCore
- Qbox
- Copy the resource as
jrmy_admin. - Configure
config.lua. - Make sure the database user can create and alter the
jrmy_admin_tables. The resource installs its schema on first start. If DDL permissions are disabled, importsql/install.sqlmanually. - Configure the first owner using the dedicated section below.
- Start dependencies before the panel:
set onesync on
ensure oxmysql
ensure qbx_core # or qb-core / es_extended
ensure jrmy_adminFor standalone mode, omit the framework ensure line and set Config.Framework = 'standalone'.
Opening the panel and receiving an administrative role are separate permissions:
jrmy_admin.openonly opens the panel shell. It does not grant dashboard, duty or moderation permissions.jrmy_admin.bootstrapcreates the first database owner only whilejrmy_admin_staffhas no enabled staff records.Config.Ownersalways promotes the listed identifier to the protected owner role and is the recommended first setup.
Copy the exact license2: identifier into config.lua:
Config.Owners = {
'license2:REPLACE_WITH_YOUR_IDENTIFIER'
}Restart the resource after saving:
restart jrmy_adminThe configured owner can open the panel directly with /admin or F10. A database role already contains panel.open; no extra jrmy_admin.open ACE is required.
Use this alternative only when the staff table is empty. Place these lines before ensure jrmy_admin or in a permissions file executed before it:
add_principal identifier.license2:REPLACE_WITH_YOUR_IDENTIFIER group.admin
add_ace group.admin jrmy_admin.bootstrap allowDo not mix group names. If the principal belongs to group.admin, the ACE must also be assigned to group.admin.
ACE changes in server.cfg require a full server restart. If the lines live in a separate permissions file, run exec permissions.cfg from the server console and then restart jrmy_admin.
Connect with that identifier and open the panel once. The resource creates the first owner record. After confirming that the profile shows Owner, remove the bootstrap line and perform a full server restart. To revoke it immediately without restarting the server, run:
remove_ace group.admin jrmy_admin.bootstrap allowIf the profile shows ACE, the account only has panel-shell access. Close the panel and use Config.Owners, or grant the one-time bootstrap permission while the staff table is empty. Repeated No access and Too many requests messages are a symptom of the missing role, not a reason to grant jrmy_admin.all.
| Command | Audience | Purpose |
|---|---|---|
/admin |
Authorized staff | Opens the administration panel |
/report |
All players | Opens the report form |
The default panel key is F10 and can be changed in FiveM key bindings.
The included role hierarchy is:
| Role | Intended scope |
|---|---|
| Owner | Full access and staff management |
| Admin | Player, moderation, economy, world and audit tools |
| Moderator | Moderation, reports and common player actions |
| Helper | Reports and low-risk support actions |
Roles and their permission patterns are configured in Config.Roles. Every sensitive request is checked again on the server; hiding a UI action is never treated as authorization.
The following mutations are disabled by default in Config.AdvancedActions:
- Inventory changes
- Economy changes
- Job changes
- Resource start, stop or restart
- Integrated world control
Enable only the modules that match the server setup. Read-only views can remain available independently.
Config.Framework = 'auto' selects Qbox, QBCore or ESX when exactly one supported framework is running. Set the value explicitly on servers that expose more than one compatibility layer.
Framework adapters normalize:
- Character identity and display name
- Job and grade
- Cash and bank accounts
- Inventory reads and supported mutations
- Job and account mutations
An unsupported adapter fails closed and reports the capability as unavailable.
Config.Inventory = 'auto' detects a single compatible inventory. If more than one compatible inventory is active, select ox, qb, esx or none explicitly. Ambiguous or unavailable adapters stay disabled instead of guessing.
Qbox inventory tools require ox_inventory. QBCore supports qb-inventory or ox_inventory, and ESX supports its native inventory or ox_inventory.
Config.Medical = 'auto' integrates with qbx_medical, qb-ambulancejob or esx_ambulancejob when it matches the selected framework. Native health handling is selected automatically only in standalone mode. Set native explicitly to use it with another framework. Missing or incompatible medical adapters fail closed.
The server derives the actor identity from source and applies this sequence to every RPC:
- Request shape and rate limit
- Staff access and duty state
- Permission pattern
- Target availability and hierarchy
- Payload validation and configured feature gate
- Framework or database operation
- Server-generated audit entry for sensitive mutations
- Redacted response
Client-supplied permissions, identifiers, roles and audit fields are ignored. Source reuse, stale UI requests and disconnected targets are rejected.
Ban identifiers and player tokens are stored as hashes. The map exposes current positions only to authorized staff while the panel requests them; it does not keep a location history.
The resource owns only tables prefixed with jrmy_admin_. It does not alter framework schemas. Persistent data includes:
- Staff members and duty sessions
- Player index for offline lookup
- Bans, warnings and notes
- Reports and messages
- Audit records
- Staff events
Back up these tables before schema changes.
- Start the resource with oxmysql and one supported framework.
- Join with the configured owner identifier.
- Open
/admin, enter duty and confirm dashboard/player updates. - Test heal, freeze and teleport with a second player.
- Submit
/reportfrom the second player, claim it, reply and close it. - Create and revoke a temporary ban, then verify the audit trail.
- Leave duty and confirm privileged toggles are restored.
- Restart
jrmy_adminwhile connected and verify the panel can reopen cleanly. - Stop the resource while noclip or spectate is active and verify player state is restored.
exports.jrmy_admin:IsStaff(source)
exports.jrmy_admin:HasPermission(source, 'players.view')
exports.jrmy_admin:IsOnDuty(source)
exports.jrmy_admin:OpenPanel()
exports.jrmy_admin:ClosePanel()
exports.jrmy_admin:IsPanelOpen()Server exports receive a player source. OpenPanel, ClosePanel and IsPanelOpen are client exports.
Original code and Jaramiyo assets are released under the MIT License. Bundled fonts and icon artwork retain their respective licenses in THIRD_PARTY_NOTICES.md.