FiveM NUI: como funciona, erros comuns e a skill de IA
Não quer gerenciar as skills por conta própria? Obtenha o app completo.
FiveM NUI é o sistema que permite a um recurso desenhar sua interface com HTML, CSS e JavaScript dentro de um navegador embutido. Cada inventário, celular, HUD e menu de loja personalizado em um servidor FiveM é uma página NUI. Se você está construindo uma interface que o ox_lib não cobre, precisa entender como a página é declarada, como Lua e JavaScript conversam e onde fica a fronteira de segurança.
O que o FiveM NUI oferece
O recurso declara sua página no fxmanifest.lua com ui_page 'html/index.html' e lista cada asset que o navegador vai carregar no bloco files {}. A página renderiza em tela cheia por cima do jogo.
- De Lua para JavaScript.
SendNUIMessage({ action = 'open', data = ... })no cliente envia um objeto JSON. A página recebe comwindow.addEventListener('message', ...)e lêevent.data. - Foco e cursor.
SetNuiFocus(hasFocus, hasCursor)decide se a página captura teclado e mouse. Abra comSetNuiFocus(true, true)e feche comSetNuiFocus(false, false). - De JavaScript para Lua.
RegisterNUICallback('close', function(data, cb) ... cb('ok') end)no cliente. A página chama comfetch('https://<resource-name>/close', { method: 'POST', body: JSON.stringify(data) }). UseGetParentResourceName()no JS para obter o nome do recurso sem escrever à mão. - Segurança. O código NUI roda na máquina do jogador. Tudo o que ele envia precisa ser validado no servidor antes de tocar dinheiro, itens ou o banco de dados.
Os natives estão documentados em docs.fivem.net/natives.
Erros comuns com FiveM NUI
- Esquecer
SetNuiFocus(false, false)ao fechar. A página some, mas o jogador não consegue se mover nem abrir o menu de pausa. Todo caminho de fechamento, incluindo a tecla Escape e o botão de fechar, precisa liberar o foco. - URL errada no
fetch. A pasta do recurso se chamamy-shop, mas o JS chamahttps://myshop/buy. O console F8 mostra 404 ou “failed to fetch”. UseGetParentResourceName()e mantenha o nome do callback idêntico nos dois lados. - Nunca chamar
cb. O callback Lua roda, faz o trabalho e termina semcb(...). A promise dofetchno JS nunca resolve e a UI trava. Chamecbsempre, mesmo com uma tabela vazia. - Confiar nos dados da NUI como se o servidor tivesse validado. Um callback recebe
{ price = 0 }e o cliente repassa ao servidor, que cobra zero. Callbacks NUI chegam do cliente, então o servidor precisa consultar preços e permissões por conta própria. - Arquivos faltando em
files {}. A página carrega em branco e o console F8 mostra 404 para a folha de estilos ou o script. Cada arquivo que a página carrega precisa estar listado, incluindo imagens e fontes.
Por que assistentes de IA erram com FiveM NUI
Assistentes genéricos confundem as camadas. Colocam SendNUIMessage em um script de servidor, inventam um RegisterNUICallback no servidor ou escrevem fetch('/callback') com um caminho relativo que o navegador CEF não resolve. Também tratam o payload do callback como entrada confiável e escrevem lógica de negócio no cliente, que qualquer jogador pode editar.
A skill de FiveM NUI dá ao assistente um arquivo de regras por tema: setup.md para o manifest e a estrutura de pastas, fullscreen-nui.md para mensagens e foco, nui-callbacks.md para o contrato do callback e suas regras de segurança, best-practices.md para desempenho e tratamento de erros, e reference-links.md para a documentação oficial. O assistente lê a regra correspondente e escreve o native certo do lado certo.
Instale a skill de FiveM NUI em 30 segundos
- Clique em “Download SKILL.md” no topo desta página.
- Descompacte na pasta de skills ou rules da sua ferramenta de IA. A seção de instalação abaixo mostra o caminho exato para Claude Code, Cursor e VS Code.
- Peça ao assistente algo concreto, como “um menu em tela cheia que abre com um comando e fecha com Escape”, e confira se ele usa
SetNuiFocus,RegisterNUICallbackcomcbe lista todos os arquivos nofxmanifest.lua.
Como instalar esta skill
Baixe o zip, descompacte e coloque a pasta onde a sua ferramenta carrega skills ou regras. O caminho exato depende da ferramenta:
Claude Code
Descompacte em .claude/skills/fivem-nui/ dentro do projeto (a pasta precisa conter SKILL.md). Para todos os projetos, use ~/.claude/skills/fivem-nui/.
Cursor
O Cursor carrega as regras do projeto de .cursor/rules/. Adicione ali um arquivo de regra apontando para a skill descompactada, ou cole o conteúdo do SKILL.md e dos arquivos de regras em uma regra. O formato é .mdc com frontmatter e muda entre versões, então confira a documentação da sua versão.
VS Code / Copilot
O Copilot lê arquivos de instruções em .github/instructions/*.instructions.md. Copie o SKILL.md para lá com um glob applyTo para os seus arquivos Lua e mantenha os arquivos de regras ao lado.
O arquivo SKILL.md
Este é o arquivo que o seu assistente de IA lê. Ele aponta para os arquivos de regras incluídos no download.
O conteúdo da skill está em inglês: é documentação técnica feita 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/
Perguntas frequentes
- Sim. NUI é um navegador CEF, então qualquer framework que compile para HTML, CSS e JS estáticos funciona. Faça o build do projeto, aponte ui_page para a saída e liste cada arquivo gerado no bloco files do fxmanifest.lua.
- Use ox_lib para notificações, diálogos, menus e barras de progresso padrão. Construa uma NUI só quando precisar de uma interface personalizada que o ox_lib não oferece, como uma grade de inventário ou um celular.
- Sim, com um passo manual. O SKILL.md é markdown puro, então você pode colar na conversa como contexto. O suporte nativo a skills é para Claude Code, Cursor e VS Code.
Posso usar React ou Vue em uma NUI do FiveM?
Uso NUI ou ox_lib para a minha interface?
Posso usar esta skill com o ChatGPT?
Guias relacionados
Leituras mais longas do blog da FiveAI sobre o mesmo tema.