FiveM NUI: como funciona, erros comuns e a skill de IA

488 instalações no skills.sh

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 com window.addEventListener('message', ...) e lê event.data.
  • Foco e cursor. SetNuiFocus(hasFocus, hasCursor) decide se a página captura teclado e mouse. Abra com SetNuiFocus(true, true) e feche com SetNuiFocus(false, false).
  • De JavaScript para Lua. RegisterNUICallback('close', function(data, cb) ... cb('ok') end) no cliente. A página chama com fetch('https://<resource-name>/close', { method: 'POST', body: JSON.stringify(data) }). Use GetParentResourceName() 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 chama my-shop, mas o JS chama https://myshop/buy. O console F8 mostra 404 ou “failed to fetch”. Use GetParentResourceName() e mantenha o nome do callback idêntico nos dois lados.
  • Nunca chamar cb. O callback Lua roda, faz o trabalho e termina sem cb(...). A promise do fetch no JS nunca resolve e a UI trava. Chame cb sempre, 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

  1. Clique em “Download SKILL.md” no topo desta página.
  2. 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.
  3. 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, RegisterNUICallback com cb e lista todos os arquivos no fxmanifest.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/.

Documentação de skills do Claude Code

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.

Documentação de regras do Cursor

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.

Documentação de instruções do VS Code

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.

Conteúdo da skill (inclui SKILL.md e quaisquer outros arquivos)

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_page and include every UI file in files in fxmanifest.lua; a missing file silently fails to load.
  • Reference assets with https://cfx-nui-<resource>/path; the nui:// protocol is deprecated.
  • RegisterNUICallback handlers must ALWAYS call cb(...) (at least cb({})), 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 call SetNUIFocus(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 SendNUIMessage calls: 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

  1. Add ui_page and files to the manifest (read rules/setup.md).
  2. Build index.html, CSS and JS; listen for message events keyed by type.
  3. Register Lua callbacks for every action the UI can request; call cb on every path.
  4. Manage focus on open/close; handle Escape to close.
  5. 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

Posso usar React ou Vue em uma NUI do FiveM?
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.
Uso NUI ou ox_lib para a minha interface?
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.
Posso usar esta skill com o ChatGPT?
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.

Leituras mais longas do blog da FiveAI sobre o mesmo tema.

Mais skills