Graphics packs for FiveM
One design, cut to every slot your server shows up in: the server list strip, the Discord header, the stream art, each composed for its own crop.
FAM-261023-261025-UL4B9this weekendTick it in your cart Halloween Edition36 maps, limited runlimited runShop the drop FREE TOOL · NUI OVERLAY
Design a crosshair — a cross, a T, a dot or a ring — set the gap, the thickness, the colour and the outline, and watch it over four backgrounds that are deliberately awkward. Then take it away as a PNG, as an SVG, or as a finished FiveM resource you can drop into resources/ and ensure.
Read this part first: FiveM has no custom crosshair setting. The game draws its own reticle and nothing in the client replaces it. What this builds is an overlay — a transparent NUI page sitting on top of the frame — which is how every FiveM crosshair works, and which has consequences the section below spells out rather than hides.
Shape
Geometry
Colour
A one-pixel black outline is the single change that makes a crosshair readable on every background. It is why almost every shipped crosshair has one.
Start from a preset
The zip is built in this tab — nothing is uploaded and no account is involved. It contains four files: fxmanifest.lua, index.html, client.lua and a README.txt that repeats the install steps and the warnings on this page.
fx_version 'cerulean'
game 'gta5'
name 'my_crosshair'
author 'PiTyUs C'
description 'A static crosshair drawn as an always-on NUI overlay.'
version '1.0.0'
ui_page 'index.html'
files {
'index.html'
}
client_script 'client.lua'
The whole crosshair is in this one file. Note what is missing: no SetNuiFocus, no background colour on body, and pointer-events: none — a NUI page is the full screen, so a background here would hide the game.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>crosshair</title>
<style>
html, body {
margin: 0;
padding: 0;
width: 100%;
height: 100%;
overflow: hidden;
background: transparent;
pointer-events: none;
user-select: none;
}
#xh {
position: fixed;
left: 50%;
top: 50%;
width: 0;
height: 0;
opacity: 0.92;
}
#xh i {
position: absolute;
left: 0;
top: 0;
display: block;
box-sizing: content-box;
}
#xh .p0 { width: 2px; height: 10px; margin-left: -1px; margin-top: -16px; background: #00ff88; outline: 1px solid #000000; }
#xh .p1 { width: 2px; height: 10px; margin-left: -1px; margin-top: 6px; background: #00ff88; outline: 1px solid #000000; }
#xh .p2 { width: 10px; height: 2px; margin-left: -16px; margin-top: -1px; background: #00ff88; outline: 1px solid #000000; }
#xh .p3 { width: 10px; height: 2px; margin-left: 6px; margin-top: -1px; background: #00ff88; outline: 1px solid #000000; }
</style>
</head>
<body>
<div id="xh">
<i class="p0"></i>
<i class="p1"></i>
<i class="p2"></i>
<i class="p3"></i>
</div>
<script>
window.addEventListener('message', function (event) {
var data = event.data || {};
if (data.action !== 'crosshair:visible') return;
document.getElementById('xh').style.display = data.state ? 'block' : 'none';
});
</script>
</body>
</html>
Optional. Delete this file and the client_script line and the crosshair is simply always on. The flags at the top are the only configuration.
local HIDE_IN_PAUSE_MENU = true
local HIDE_WHEN_FADED = true
local ONLY_WHILE_AIMING = false
local HIDE_GAME_RETICLE = false
local shown = true
local function setShown(state)
if state == shown then return end
shown = state
SendNUIMessage({ action = 'crosshair:visible', state = state })
end
CreateThread(function()
while true do
Wait(200)
local want = true
if HIDE_IN_PAUSE_MENU and IsPauseMenuActive() then
want = false
end
if HIDE_WHEN_FADED and (IsScreenFadedOut() or IsScreenFadingOut()) then
want = false
end
if ONLY_WHILE_AIMING and not IsPlayerFreeAiming(PlayerId()) then
want = false
end
setShown(want)
end
end)
if HIDE_GAME_RETICLE then
CreateThread(function()
while true do
Wait(0)
HideHudComponentThisFrame(14)
end
end)
end
HOW TO USE IT
Download the zip, unpack the folder into your server’s resources directory, and add one line to server.cfg. There is no config file, no dependency and no build step: the crosshair itself is pixel values inside the <style> block of index.html, so you can keep tuning it by editing that file and restarting the resource.
Server-side.
## server.cfg — the whole install, once the folder is in resources/
ensure my_crosshair
## If you keep your own resources in a subfolder, FiveM needs to know about it:
# add_ace resource.my_crosshair command allow # not needed: the overlay runs no commands
#
## Already running? Two lines in the live console do it without a restart:
# refresh
# ensure my_crosshairClient-side. The download has the first of these behind a HIDE_GAME_RETICLE flag, switched off, because the game reticle still tells you something useful about spread.
-- Optional, client-side: remove the game's own reticle and keep only the overlay.
-- Component 14 is RETICLE in the FiveM HUD component list. The native is a
-- "ThisFrame" one, so it has to be called every frame or the reticle flickers back.
CreateThread(function()
while true do
Wait(0)
HideHudComponentThisFrame(14)
end
end)
-- The same pattern, but only while the player is actually aiming down the weapon:
CreateThread(function()
while true do
Wait(0)
if IsPlayerFreeAiming(PlayerId()) then
HideHudComponentThisFrame(14)
end
end
end)You can draw a crosshair with DrawRect in a per-frame thread, and some resources do. It costs you a Lua thread at Wait(0) forever, the coordinates are normalised 0–1 rather than pixels so it stretches with aspect ratio, and you cannot have an outline without drawing every rectangle twice. The NUI page is drawn by the browser layer instead and costs no Lua at all once it is up.
A pure white crosshair vanishes on daylight concrete and a green one vanishes on grass. One black pixel around every arm fixes both, which is why nearly every shipped crosshair in every game has an outline. Switch between the four preview backgrounds before you decide you do not need it.
In first person the aim point and the middle of the screen are the same place. In third person the camera sits over the shoulder, so the game’s own reticle is not at the geometric centre — a fixed centre overlay is a rough reference there, not a point of impact. Worth knowing before you hide the real reticle.
A NUI page only receives input once something calls SetNuiFocus(true, true). This resource never calls it — not once, anywhere — so the overlay cannot steal the cursor or swallow a keypress. That is the whole reason it can be always-on.
BE HONEST ABOUT IT
There is no technical trick here and we are not going to dress it up as one. The resource adds a transparent page with a few coloured boxes on it, drawn above everything the game renders. It does not read memory, does not call an aiming native, does not modify a weapon, and does not change where a bullet goes. It is a sticker on the inside of the monitor, shipped by the server.
Resources are sent to the client by the server. You cannot add this to your own install and carry it onto someone else’s city — which also means that when a server does install it, every player gets the same crosshair. That is the fair version, and it is the only version FiveM actually supports.
A permanent centre reference is an advantage the base game does not give you while hip-firing. Competitive and serious-roleplay servers often have a rule about overlays, and an anti-cheat may flag an unfamiliar resource on principle. Ask the owner first; that is a policy conversation, not a technical one.
An always-on NUI page sits above the pause menu, the map and any cutscene. The optional client.lua hides it during the pause menu and during screen fades for exactly this reason, with SendNUIMessage rather than focus.
Whether a given server’s anti-cheat tolerates it — we cannot test every anti-cheat, and we are not going to claim otherwise. Nor whether an overlay drawn this way is captured by any particular screenshot tool. The rest of the behaviour above is how NUI and the HUD natives are documented to work.
QUESTIONS
MORE
The manifest in the zip is the minimum one. This builds the full version, with the ui_page, files and script lists for a bigger resource.
Marker referenceThe other way the game draws things over the world: every DrawMarker type with its id and shape.
Chat and text coloursThe ^0 to ^9 colour codes, what each one looks like, and where they do and do not render.
All the free toolsThe hash calculator, the flag calculators, the icon makers and the server status checks.
ALSO FREE
Picked because they touch the same files, natives or part of the game.
FROM THE SHOP
The free tools and the paid work come out of the same place. These are the lines closest to what this page is about.
Grand opening: 25% off every product with FAM-261023-261025-UL4B9, until 25 October. It is applied at checkout.
One design, cut to every slot your server shows up in: the server list strip, the Discord header, the stream art, each composed for its own crop.
The one screen every player sees on every connect. Drag widgets onto a canvas, drop in a video background, and point your server at a single URL we host.

A native hud.gfx replacement rather than an NUI overlay, so it costs no frame time. Colours, shape and motion are yours before you pay.