FiveM NUI: cómo funciona, errores comunes y la skill de IA
488 instalaciones en skills.sh
¿No quieres gestionar las skills tú mismo? Consigue la app completa.
FiveM NUI es el sistema que permite a un recurso dibujar su interfaz con HTML, CSS y JavaScript dentro de un navegador embebido. Cada inventario, teléfono, HUD y menú de tienda personalizado en un servidor FiveM es una página NUI. Si construyes una interfaz que ox_lib no cubre, necesitas entender cómo se declara la página, cómo se comunican Lua y JavaScript y dónde está la frontera de seguridad.
Qué te da FiveM NUI
El recurso declara su página en fxmanifest.lua con ui_page 'html/index.html' y lista cada asset que cargará el navegador en el bloque files {}. La página se renderiza a pantalla completa sobre el juego.
- De Lua a JavaScript.
SendNUIMessage({ action = 'open', data = ... })en el cliente envía un objeto JSON. La página lo recibe conwindow.addEventListener('message', ...)y leeevent.data. - Foco y cursor.
SetNuiFocus(hasFocus, hasCursor)decide si la página captura teclado y ratón. Abre conSetNuiFocus(true, true)y cierra conSetNuiFocus(false, false). - De JavaScript a Lua.
RegisterNUICallback('close', function(data, cb) ... cb('ok') end)en el cliente. La página lo llama confetch('https://<resource-name>/close', { method: 'POST', body: JSON.stringify(data) }). UsaGetParentResourceName()en JS para obtener el nombre del recurso sin escribirlo a mano. - Seguridad. El código NUI corre en la máquina del jugador. Todo lo que envíe debe validarse en el servidor antes de tocar dinero, items o la base de datos.
Los natives están documentados en docs.fivem.net/natives.
Errores comunes con FiveM NUI
- Olvidar
SetNuiFocus(false, false)al cerrar. La página desaparece pero el jugador no puede moverse ni abrir el menú de pausa. Cada ruta de cierre, incluida la tecla Escape y el botón de cerrar, debe liberar el foco. - URL equivocada en
fetch. La carpeta del recurso se llamamy-shoppero el JS llama ahttps://myshop/buy. La consola F8 muestra un 404 o “failed to fetch”. UsaGetParentResourceName()y mantén el nombre del callback idéntico en ambos lados. - No llamar nunca a
cb. El callback Lua se ejecuta, hace su trabajo y termina sincb(...). La promesa delfetchen JS nunca se resuelve y la UI se queda colgada. Llama acbsiempre, aunque sea con una tabla vacía. - Confiar en los datos de la NUI como si el servidor los hubiera validado. Un callback recibe
{ price = 0 }y el cliente lo reenvía al servidor, que cobra cero. Los callbacks NUI llegan del cliente, así que el servidor debe consultar precios y permisos por su cuenta. - Archivos que faltan en
files {}. La página carga en blanco y la consola F8 muestra un 404 para la hoja de estilos o el script. Cada archivo que carga la página debe estar listado, incluidas imágenes y fuentes.
Por qué los asistentes de IA se equivocan con FiveM NUI
Los asistentes genéricos confunden las capas. Ponen SendNUIMessage en un script de servidor, se inventan un RegisterNUICallback en el servidor o escriben fetch('/callback') con una ruta relativa que el navegador CEF no puede resolver. También tratan el payload del callback como entrada de confianza y escriben lógica de negocio en el cliente, que cualquier jugador puede editar.
La skill de FiveM NUI da al asistente un archivo de reglas por tema: setup.md para el manifest y la estructura de carpetas, fullscreen-nui.md para mensajería y foco, nui-callbacks.md para el contrato del callback y sus reglas de seguridad, best-practices.md para rendimiento y manejo de errores, y reference-links.md para la documentación oficial. El asistente lee la regla correspondiente y escribe el native correcto en el lado correcto.
Instala la skill de FiveM NUI en 30 segundos
- Haz clic en “Download SKILL.md” en la parte superior de esta página.
- Descomprímelo en la carpeta de skills o rules de tu herramienta de IA. La sección de instalación de abajo muestra la ruta exacta para Claude Code, Cursor y VS Code.
- Pide al asistente algo concreto, como “un menú a pantalla completa que se abre con un comando y se cierra con Escape”, y comprueba que usa
SetNuiFocus,RegisterNUICallbackconcby lista todos los archivos enfxmanifest.lua.
Cómo instalar esta skill
Descarga el zip, descomprímelo y coloca la carpeta donde tu herramienta carga skills o reglas. La ruta exacta depende de la herramienta:
Claude Code
Descomprime en .claude/skills/fivem-nui/ dentro del proyecto (la carpeta debe contener SKILL.md). Para todos los proyectos, usa ~/.claude/skills/fivem-nui/.
Cursor
Cursor carga las reglas del proyecto desde .cursor/rules/. Añade ahí un archivo de regla que apunte a la skill descomprimida, o pega el contenido de SKILL.md y los archivos de reglas en una regla. El formato es .mdc con frontmatter y cambia entre versiones, así que revisa la documentación de tu versión.
VS Code / Copilot
Copilot lee archivos de instrucciones desde .github/instructions/*.instructions.md. Copia SKILL.md ahí con un glob applyTo para tus archivos Lua y deja los archivos de reglas al lado.
El archivo SKILL.md
Este es el archivo que lee tu asistente de IA. Enlaza a los archivos de reglas incluidos en la descarga.
El contenido de la skill está en inglés: es documentación técnica pensada para agentes de IA.
FiveM NUI
HTML/CSS/JS interfaces for FiveM: manifest setup, Lua-to-browser messages, NUI callbacks and focus handling.
Activation Contract
Load this skill when the user asks to create or edit a FiveM UI, writes HTML/CSS/JS inside a resource, sets ui_page, or asks about SendNUIMessage, SetNUIFocus or RegisterNUICallback.
Hard Rules
- Declare
ui_pageand include every UI file infilesinfxmanifest.lua; a missing file silently fails to load. - Reference assets with
https://cfx-nui-<resource>/path; thenui://protocol is deprecated. RegisterNUICallbackhandlers must ALWAYS callcb(...)(at leastcb({})), or the browser request hangs.- Browser calls callbacks with
fetch('https://' + GetParentResourceName() + '/<name>', { method: 'POST', body: JSON.stringify(...) }); the URL name must match the registered name exactly. SetNUIFocus(keyboard, mouse): always callSetNUIFocus(false, false)when closing the UI.- NUI callbacks run on the CLIENT. Validate their data client-side, then re-validate on the server before any state change; never trust UI-sent prices, amounts or ids.
- Minimize
SendNUIMessagecalls: batch updates rather than sending per frame. - Debug with F8 and Chrome DevTools; test the page in a browser with a mock mode.
Decision Gates
| Direction | Mechanism |
|---|---|
| Lua to browser | SendNUIMessage({ type = ..., data = ... }) + window.addEventListener('message') |
| Browser to Lua | fetch POST to https://<resource>/<callback> + RegisterNUICallback |
| Browser wants server data | callback to Lua client, then a server callback |
| Show / hide cursor | SetNUIFocus(true, true) / SetNUIFocus(false, false) |
| Keyboard only | SetNUIFocus(true, false) |
Execution Steps
- Add
ui_pageandfilesto the manifest (read rules/setup.md). - Build
index.html, CSS and JS; listen formessageevents keyed bytype. - Register Lua callbacks for every action the UI can request; call
cbon every path. - Manage focus on open/close; handle
Escapeto close. - Forward any state-changing action to the server and validate there.
Output Contract
Return the manifest entries, the HTML/CSS/JS files, and the Lua client script with callbacks and focus handling. Keep security-relevant logic on the server.
References
- rules/setup.md — folder layout, manifest, build tools, common mistakes.
- rules/fullscreen-nui.md — SendNUIMessage, SetNUIFocus, focus stack, assets, devtools.
- rules/nui-callbacks.md — RegisterNUICallback, fetch, async, errors, security.
- rules/best-practices.md — performance, security, state, error handling, testing.
- rules/reference-links.md — official docs and natives reference.
Upstream docs: https://docs.fivem.net/docs/scripting-manual/nui-development/
Preguntas frecuentes
- Sí. NUI es un navegador CEF, así que cualquier framework que compile a HTML, CSS y JS estáticos funciona. Compila el proyecto, apunta ui_page a la salida y lista cada archivo generado en el bloque files de fxmanifest.lua.
- Usa ox_lib para notificaciones, diálogos, menús y barras de progreso estándar. Construye una NUI solo cuando necesites una interfaz personalizada que ox_lib no ofrece, como una cuadrícula de inventario o un teléfono.
- Sí, con un paso manual. El SKILL.md es markdown plano, así que puedes pegarlo en la conversación como contexto. El soporte nativo de skills es para Claude Code, Cursor y VS Code.
¿Puedo usar React o Vue en una NUI de FiveM?
¿Uso NUI o ox_lib para mi interfaz?
¿Puedo usar esta skill con ChatGPT?
Guías relacionadas
Lecturas más largas del blog de FiveAI sobre el mismo tema.