Pepper Notify
Free notifications in four types with title, timer bar and sound – standalone for every server.
Free and open source: https://github.com/PepperScripts/pepper_notify
Overview
With Pepper Notify every message on your server looks the same: success, error, info or warning, with an optional
title, a timer bar and a sound. Your scripts call the export from the client or the server, the message appears in one
of 8 positions, the bar runs down and it is gone. If the same id comes in again, it replaces the message instead of
stacking it.
Features
- Four types:
success,error,info,warning, each with its own colour and icon - Optional title, timer bar and sound (native GTA sounds, no audio files)
- Eight screen positions with an adjustable distance from the edge (
Config.Offset); colours and durations set inconfig.lua - Exports for client and server, plus a client event
- Accepts the field names of ox_lib (
description,type = 'inform') and QBCore (text,length,'primary') - Same
idreplaces a notification instead of stacking it - No dependencies, no loop running in the background
Requirements
| Dependency | Required/optional | What for | Link |
|---|---|---|---|
FiveM server (fx_version 'cerulean', Lua 5.4) |
required | Runs the resource | https://docs.fivem.net/docs/server-manual/setting-up-a-server/ |
| Framework (ESX Legacy, QBCore, Qbox) | optional | Not needed – standalone. With a framework you can reroute its notifications (see "For developers") | – |
| OneSync | not needed | – | – |
| Database | not needed | Pepper Notify stores nothing – no database, no oxmysql | – |
Installation
- Put the
pepper_notifyfolder into yourresourcesfolder. Do not rename the folder – the exports are calledexports.pepper_notify:…and only work with exactly this name. - Add it to your
server.cfg– before the scripts that send notifications:ensure pepper_notify # then your other scripts, e.g. ensure my_garage - Restart the server. There is no database and there are no items.
First test
- In game press T and type
/notifytest(in the F8 console without the slash:notifytest). - Four messages appear on the right side in the middle: green "Saved successfully.", red "Something went wrong.", blue without a title and orange "Your vehicle is low on fuel.".
- Watch the timer bar: after about 5 seconds three messages disappear, the orange one stays for about 8 seconds.
- When everything looks right, set
Config.TestCommand = false.
Configuration
| File | Controls |
|---|---|
config.lua |
Position, distance from the edge, duration, count, timer bar, sound, colours, test command |
html/style.css |
Look of the notifications (font, corners, background) – for your own adjustments |
After a change, restart pepper_notify in the server console is enough (or a server restart).
Position and offset
Config.Position = 'center-right'
Config.Offset = { x = 1.5, y = 2.0 }
| Option | Default | Description |
|---|---|---|
Config.Position |
'center-right' |
top-right, top-left, top-center, center-right, center-left, bottom-right, bottom-left, bottom-center |
Config.Offset |
{ x = 1.5, y = 2.0 } |
Distance from the screen edge (1 = roughly one line of text) – use it to move notifications clear of your HUD |
Duration and count
| Option | Default | Description |
|---|---|---|
Config.DefaultDuration |
5000 |
Duration in milliseconds when the call does not give one |
Config.MinDuration |
1000 |
Shorter values are raised to this |
Config.MaxDuration |
30000 |
Longer values are cut to this |
Config.MaxVisible |
5 |
How many notifications are visible at once; older ones disappear first |
Config.ProgressBar |
true |
Timer bar below the notification |
Sound and colours
Config.Sound = {
enabled = true,
default = { name = 'SELECT', set = 'HUD_FRONTEND_DEFAULT_SOUNDSET' },
error = { name = 'ERROR', set = 'HUD_FRONTEND_DEFAULT_SOUNDSET' },
}
Config.Colors = { success = '#3DD68C', error = '#E5484D', info = '#4C9AFF', warning = '#FF8A3D' }
| Option | Default | Description |
|---|---|---|
Config.Sound.enabled |
true |
Sound on show on/off |
Config.Sound.default |
SELECT / HUD_FRONTEND_DEFAULT_SOUNDSET |
GTA sound for every type without its own entry |
Config.Sound.error |
ERROR / HUD_FRONTEND_DEFAULT_SOUNDSET |
Own sound for errors; you can add success, info or warning the same way |
Config.Colors |
see above | Accent colour per type (icon, border, timer bar) as a hex value |
Config.TestCommand |
true |
/notifytest command on/off |
For developers
Calling it
Client (long form as a table or short form):
exports.pepper_notify:Notify({ title = 'Garage', message = 'Vehicle parked.', type = 'success', duration = 5000 })
exports.pepper_notify:Notify('Vehicle parked.', 'success', 5000)
Server (the first value is the player ID, -1 = all players):
exports.pepper_notify:Notify(source, { title = 'Bank', message = 'You received $500.', type = 'info' })
exports.pepper_notify:Notify(-1, 'Server restart in 10 minutes.', 'warning', 10000)
| Field | Meaning |
|---|---|
message |
Text (required; description or text work too) |
title |
Bold first line (optional) |
type |
success, error, info or warning (default info); inform, primary → info, warn → warning |
duration |
Milliseconds (also length), limited to MinDuration–MaxDuration |
id |
A notification with the same id replaces the previous one |
Reroute your framework's notifications
- ESX: in
es_extended/client/functions.lua, letESX.ShowNotificationcallexports.pepper_notify:Notify(message, notifyType, length). - QBCore / Qbox: in
qb-core/client/functions.lua, letQBCore.Functions.Notifycallexports.pepper_notify:Notify(text, texttype, length).
Commands and permissions
| Command | Who | What |
|---|---|---|
/notifytest |
all players (no ACE permission) | Shows all four notification types; only active with Config.TestCommand = true |
There are no other commands, permissions or keys.
Exports and events
| Side | Name | Call |
|---|---|---|
| Client | Export Notify |
exports.pepper_notify:Notify(data) or Notify(text, type, duration) |
| Server | Export Notify |
exports.pepper_notify:Notify(playerId, data) or Notify(playerId, text, type, duration) |
| Client | Event pepper_notify:show |
TriggerClientEvent('pepper_notify:show', source, { message = 'Hello', type = 'info' }) |
FAQ
How do I use Notify from my script?
On the client exports.pepper_notify:Notify('Text', 'success'), on the server
exports.pepper_notify:Notify(source, 'Text', 'success'). Alternatively the event pepper_notify:show – examples under
"For developers".
The server does not know /notifytest – what now?
Check that ensure pepper_notify is in your server.cfg, the folder is named exactly pepper_notify and
Config.TestCommand = true is set. The command is only registered when the test command is switched on.
How do I change the colours?
Put a hex value per type into Config.Colors, e.g. success = '#22C55E', then restart pepper_notify.
The notifications cover my HUD – how do I move them?
Config.Position picks one of the 8 positions, Config.Offset pushes them further away from the edge (x
horizontal, y vertical, 1 ≈ one line of text).
Can I show ESX or QBCore notifications through Pepper Notify?
Yes. Let ESX.ShowNotification or QBCore.Functions.Notify call the export (one line, see "For developers"). The
type names primary (QBCore) and inform (ox_lib) automatically become info.
Do GTA colour codes like ~r~ or HTML work in the text?
No. Title and message are shown as plain text (textContent), so colour codes and HTML appear literally. This keeps
player texts from being run as HTML. The colour comes from the type.
How do I send a notification to all players?
On the server with -1 as the player ID: exports.pepper_notify:Notify(-1, 'Restart in 10 minutes.', 'warning', 10000).
How do I stop the same notification from stacking?
Pass a fixed id, e.g. { id = 'fuel', message = 'Fuel low', type = 'warning' }. A new notification with the same
id replaces the old one.
How long can a notification stay at most?
Between Config.MinDuration (1 second) and Config.MaxDuration (30 seconds); values outside are adjusted. Without a
value Config.DefaultDuration (5 seconds) applies.
How do I turn the sound off or change it?
Config.Sound.enabled = false turns it off. For another sound change name/set (GTA frontend sounds); for single
types add an entry like success = { name = '…', set = '…' }.
Are notifications lost right after joining?
No. If notifications arrive before the UI has loaded, the client keeps them and shows them as soon as the NUI is ready.
How do I update Pepper Notify?
Replace the folder, back up your config.lua first and put your values back afterwards. What changed is listed in the
CHANGELOG.md in the resource folder.
Support
Questions or bugs? Open a ticket in our Discord: https://discord.gg/6NaFJWKDYu – link your purchase with /verify
first. The source code is on GitHub: https://github.com/PepperScripts/pepper_notify
Permanently tested on the Pepper Scripts dev server.
Changelog
Current version 1.0.2: new positions center-right (new default) and center-left, plus Config.Offset. All
changes are listed in the CHANGELOG.md in the resource folder.
Found a mistake? Report it on Discord.