Pepper Newspaper
Newspaper stands, a newspaper item and a newsroom for journalists – ESX & QBCore.
Overview
Pepper Newspaper brings a daily newspaper to your roleplay server. Journalists write their own editions with articles and images in the newsroom menu, players buy the paper at the city's newspaper stands. The newspaper ends up as an item in the inventory, stays there and can be read as often as you like. The script is free.
Features
- Buy at every GTA newspaper stand (ox_target, qb-target or the E key) – with a display of the current and up to 3 older editions
- Newspaper item with the stored edition (ox_inventory, qb-inventory, ESX default inventory), bookmark when reopening
- Newsroom: up to 8 articles per edition, images, preview, publish, archive
- Sample edition with 8 articles while the newsroom has not published anything yet
/newsstandmarks the nearest stand on the map and minimap- Permissions per job and grade, ACE permission for admins, all checks server-side
- Notification for all players on a new edition, optional Discord webhook
Requirements
| Dependency | Required/optional | Used for | Link |
|---|---|---|---|
| FiveM server build 7290+ | required | declared in fxmanifest.lua as /server:7290; OneSync is not needed |
https://docs.fivem.net/docs/server-manual/setting-up-a-server/ |
ESX Legacy (es_extended) or QBCore (qb-core) |
required (one of them) | players, money, jobs, item; detected automatically (Config.Framework = 'auto') |
https://github.com/esx-framework/esx_core · https://github.com/qbcore-framework/qb-core |
| oxmysql | required | database (editions) | https://github.com/overextended/oxmysql |
| ox_target or qb-target | optional | interaction at the stand; without a target: help text with the E key | https://github.com/overextended/ox_target |
| ox_inventory or qb-inventory | optional | item with the stored edition (metadata); in the ESX default inventory the paper is consumed when read | https://github.com/overextended/ox_inventory |
Installation
- Download the resource from the Cfx.re portal → Granted Assets.
- Extract it to
resources/[pepper]/pepper_newspaper. Do not rename thepepper_newspaperfolder – the ox_inventory item entry callspepper_newspaper.useNewspaper, and other resources useexports.pepper_newspaper. - Add it to your
server.cfgafter framework, inventory and target:
ensure oxmysql
ensure es_extended # or: ensure qb-core
ensure ox_inventory # optional
ensure ox_target # optional
ensure pepper_newspaper
- Database: the table
pepper_newspaper_editionsis created automatically on first start. The manual way isinstall/pepper_newspaper.sql(it also contains the ESX item and, commented out, theweazeljob). - Add the
newspaperitem and copyinstall/newspaper.pnginto your inventory's image folder:
| Inventory | File | Entry | Image to |
|---|---|---|---|
| ox_inventory | ox_inventory/data/items.lua |
see below (with server = { export = 'pepper_newspaper.useNewspaper' }) |
ox_inventory/web/images/ |
| qb-inventory | qb-core/shared/items.lua |
see below (unique = true, useable = true) |
qb-inventory/html/images/ |
| ESX default inventory | database | INSERT IGNORE INTO items (name, label, weight) VALUES ('newspaper', 'Newspaper', 1); |
– |
-- ox_inventory/data/items.lua
['newspaper'] = {
label = 'Newspaper',
weight = 100,
stack = false,
close = true,
server = { export = 'pepper_newspaper.useNewspaper' },
},
-- qb-core/shared/items.lua
newspaper = { name = 'newspaper', label = 'Newspaper', weight = 100, type = 'item', image = 'newspaper.png', unique = true, useable = true, shouldClose = true, description = 'The latest issue' },
- Job for the newsroom: ESX – create the
weazeljob with the SQL at the end ofinstall/pepper_newspaper.sql(grades 0 reporter, 1 editor, 2 editor-in-chief). QBCore ships thereporterjob. - Set language (
Config.Locale, default'en'), price and jobs inconfig/config.luaand restart the server.
First test
- Start the server – the console reports “Pepper Newspaper v1.1.0 started (framework: …)”.
- Type
/newsstandand walk to the marked newspaper stand. - Open the display at the stand and buy the sample edition – it ends up as the
newspaperitem in your inventory. - Use the item: the newspaper opens for reading.
- As a journalist (job from
Config.Jobs) or admin, type/newspaperand publish your own edition.
Configuration
All settings are open (readable and editable under Asset Escrow):
| File | Controls |
|---|---|
config/config.lua |
language, framework, stands (price, account, interaction, models), item, back issues, /newsstand, newsroom (jobs, ACE, locations), sample edition, lengths, image hosts |
config/server.lua |
server-side only: Discord webhook, purchase logs, update notice |
config/demo.lua |
content of the sample edition (DE and EN) |
locales/de.json, locales/en.json |
all in-game and UI texts |
bridge/ |
framework bridge ESX/QBCore (open, adjustable if needed) |
Stands and item
Config.Price = 5
Config.Account = 'money'
Config.Interaction = 'auto'
Config.Item = 'newspaper'
Config.ConsumeOnRead = false
Config.BackIssues = 3
| Option | Default | Description |
|---|---|---|
Config.Locale |
'en' |
language (de or en) |
Config.Framework |
'auto' |
auto, esx or qbcore |
Config.Price |
5 |
price per newspaper (0 = free) |
Config.Account |
'money' |
money (cash) or bank |
Config.Interaction |
'auto' |
auto (ox_target → qb-target → key), ox_target, qb-target or key |
Config.InteractKey |
38 |
E key (only with key) |
Config.VendingModels |
10 GTA models | stand models, simply add more |
Config.Item |
'newspaper' |
item name |
Config.ConsumeOnRead |
false |
true = newspaper consumed after reading |
Config.BackIssues |
3 |
older editions at the stand (0–10) |
Config.FindCommand |
'newsstand' |
command for the nearest stand (false = off) |
Config.StandLocations |
empty | fixed stand locations for /newsstand (optional) |
Newsroom and content
Config.Jobs = {
weazel = { write = 0, publish = 0, manage = 2 },
reporter = { write = 0, publish = 0, manage = 0 },
}
Config.EditorAce = 'pepper.newspaper.editor'
| Option | Default | Description |
|---|---|---|
Config.Jobs |
weazel, reporter |
from which grade write, publish and manage (delete/archive) apply |
Config.EditorAce |
'pepper.newspaper.editor' |
ACE permission for full access regardless of job |
Config.EditorCommand |
'newspaper' |
command for the newsroom |
Config.EditorLocations |
empty | places where the newsroom also opens via interaction |
Config.AnnounceNewEdition |
true |
notify all players about a new edition |
Config.DemoEdition |
true |
sample edition while no own edition is published |
Config.MaxArticles |
8 |
articles per edition |
Config.MaxBodyLength |
3000 |
characters per article text |
Config.ImageHosts |
Imgur, Discord, Fivemanage, ImgBB | allowed image hosts (https only); also your own images from html/img/ |
Server settings
ServerConfig.LogWebhook = '' -- Discord webhook for publications, deletions, purchases ('' = off)
ServerConfig.LogPurchases = false -- also log purchases
ServerConfig.VersionUrl = '' -- update notice in the console (downloads no code)
Newsroom
/newspaper opens the newsroom: create an edition, write up to 8 articles with headline, text and image, check the
preview, publish. With the manage permission you can archive or delete editions. The sample edition from
config/demo.lua is at the stands until the newsroom publishes its own paper – remove it with “Archive”, recreate it with
newspaperdemo.
Commands and permissions
| Command | Who | What |
|---|---|---|
/newspaper |
journalists (Config.Jobs), ACE pepper.newspaper.editor |
open the newsroom |
/newsstand |
everyone | mark the nearest newspaper stand on the map and minimap |
newspaperdemo |
server console or ACE command.newspaperdemo |
publish the sample edition again |
E / target |
everyone | open the display at the stand |
add_ace group.admin pepper.newspaper.editor allow
add_ace group.admin command.newspaperdemo allow
Newsroom permissions depend on the job grade (write, publish, manage in Config.Jobs); the ACE permission grants full
access. All checks run server-side.
Exports and events
Server exports:
| Export | Returns |
|---|---|
getCurrentEdition() |
current edition or nil |
getVersion() |
version number of the resource |
useNewspaper |
for ox_inventory only (item entry server.export), not meant to be called directly |
local edition = exports.pepper_newspaper:getCurrentEdition()
FAQ
The console says “Kein unterstütztes Framework gefunden” (no supported framework found).
es_extended or qb-core must start before pepper_newspaper in your server.cfg. Alternatively set the framework
explicitly with Config.Framework = 'esx' or 'qbcore'.
Does Pepper Newspaper run on Qbox?
Officially supported are ESX Legacy and QBCore. Detection looks for the resources es_extended and qb-core; you can add
your own bridge in the open files under bridge/.
The table is missing in the database.
It is created on first start while oxmysql is running. Otherwise import install/pepper_newspaper.sql manually.
The item cannot be used.
With ox_inventory the item entry must contain server = { export = 'pepper_newspaper.useNewspaper' }. With QBCore the
item needs useable = true.
The item has no image.
Copy install/newspaper.png into your inventory's image folder (e.g. ox_inventory/web/images/).
The newspaper disappears after reading.
The ESX default inventory has no item metadata – there the paper is always consumed. With ox_inventory or qb-inventory it
stays as long as Config.ConsumeOnRead = false.
The newsroom does not open.
Check job and grade in Config.Jobs or grant the ACE permission pepper.newspaper.editor.
Nothing happens at the stand.
Check Config.Interaction: with 'key' you press E directly at the stand, with ox_target/qb-target the target script
must start before pepper_newspaper. Add your own stand models to Config.VendingModels.
An image is rejected.
Only https links from hosts in Config.ImageHosts are allowed – or your own images from html/img/ of the resource
(e.g. img/harbor.jpg).
Can the newspaper be free for players?
Yes – set Config.Price = 0.
Can I use a job other than weazel?
Yes. Add your job with the grades you want to Config.Jobs.
How do I change texts or the language?
Language via Config.Locale (de or en, default en); all texts are in locales/de.json and locales/en.json.
How much performance does the resource need?
Measured with resmon: 0.00 ms idle and 0.01 ms active.
Will an update delete my editions?
No, editions live in the database. Back up your changed files in config/, locales/ and bridge/ before updating and
carry your changes over to the new version. You can enable an update notice in the console via ServerConfig.VersionUrl.
Support
Questions and bugs: open a ticket in our Discord: https://discord.gg/6NaFJWKDYu – link your purchase with /verify first.
Permanently tested on the Pepper Scripts dev server.
Changelog
Current version: 1.1.0 (10 Oct 2026) – display with older editions, newspaper stays in the inventory after reading,
bookmark, /newsstand, sample edition and your own images from html/img/. All changes are listed in the CHANGELOG.md
file in the resource folder.
Found a mistake? Report it on Discord.