Anything can draw a box on screen. What breaks a server is the fifth resource firing the same message in a loop while the third one sends a type that does not exist. Three gates sit between your scripts and the player's screen.
Two resources reacting to the same event send the same message twice. Anything identical inside 750 ms is dropped, and a repeat later collapses into the card already on screen as a counter — never a second card.
Repeats collapse, but a resource sending thirty different messages cannot be deduplicated. After 12 in 2 seconds that one resource goes into slow mode — on its own, while every other script keeps working normally.
Twenty-plus type aliases are normalised, an unknown type falls back to info instead of failing, and duration is clamped to 500–30000 ms. A badly written script cannot produce a broken notification.
Players open /notify and set scale, corner, sound and manual dismiss for themselves — saved locally, kept through reconnects. Anything important can wait for a Y or N instead of timing out while they were driving.
The common feature set is genuinely good and most stores ship it. These are the rows where the approach differs — and the reason this one is free.
| CAPABILITY | TYPICAL $6 SCRIPT | NOTIFY |
|---|---|---|
| Types, colours, sound, progress bar | Yes | Yes |
| In-game scale, position, sound, persistence | Yes | Yes |
| Works on QBCore, ESX, QBox, standalone | Yes | Yes |
| Intercepts the calls your scripts already make | You replace them by hand | One line |
| Interception can be switched off, original returns | — | Yes |
| Duplicate suppression | — | 750 ms |
| Rate limiting per resource | — | 12 / 2 s |
| Duration clamping | — | 500–30000 ms |
| Type alias normalisation | — | 20+ |
| ESX advanced notifications | — | Yes |
| Install self-test in the console | — | Yes |
| Idle cost | 0.01 ms | 0.00 ms |
| Price | $6.00 | Free |
config/ main.lua — open, yours to edit script/ — escrow protected fxmanifest.lua — open
Install it on the server you already run. If it does not earn its place, delete one line and everything is back the way it was.