Before You Begin#
Before installing Camera, make sure your server meets the requirements. Four resources are mandatory, and the fourth — the props — ships in the same download.
Requirement | Status | Notes |
|---|---|---|
| Required | Database access for albums, walls, boards and settings. |
| Required | Callbacks, notifications and progress bars. |
| Required | Captures the picture on the player's game. Without it no photo or card can be taken. |
| Required | Included in the download. The streamed models — instant camera, cards, frames, cork boards and albums — that photos are drawn on. |
Inventory | Required |
|
Framework | Optional |
|
| Optional | Quasar-styled notifications, progress bars and HUD hiding. ox_lib is used otherwise. |
The framework and the inventory are picked by looking at what is already running:
Layer | Detected from |
|---|---|
Framework |
|
Inventory |
|
Detection only sees resources that are already started, so both must come before Camera in server.cfg. Integrations explains each bridge and how to point it at a renamed resource.
Downloading Camera#
After purchasing Camera, the resource is automatically linked to your CFX Portal account.
Sign in to the CFX Portal using the same account used during checkout, open Granted Assets, and download Camera.
After extracting the download, you have two resources and three folders of extras:
[camera]/
├── qs-camera/ -- the script
│ ├── shared/config.lua -- debug mode and detection
│ ├── server/webhook.lua -- where photos are uploaded
│ ├── client/custom/ -- bridges you may edit (framework, inventory, HUD, prompts)
│ ├── server/custom/ -- bridges and quests you may edit
│ ├── locales/ -- 41 languages
│ └── database/sql.sql -- the database tables
├── qs-camera-props/ -- the streamed models
├── [items]/ -- item definitions to paste into your inventory
├── [images]/ -- item icons
└── [sql]/ -- the same sql.sqlNeither resource may be renamed.
qs-camerastops working and printsYou have renamed the script!if its folder name changes, and it reads its models from a resource called exactlyqs-camera-props.
Installing the Resources#
Move both folders into your server's resources directory. They can live anywhere inside it, including a category folder:
resources/
└── [qs]/
└── [camera]/
├── qs-camera/
└── qs-camera-props/Then open your server.cfg and make sure every dependency — and the framework and inventory it should detect — starts before Camera, with the props before the script:
ensure oxmysql
ensure ox_lib
ensure screenshot-basic
# Framework
ensure es_extended
# ensure qb-core
# ensure qbx_core
# Inventory
ensure ox_inventory
# ensure qs-inventory
# ensure qb-inventory
ensure qs-camera-props
ensure qs-cameraThe loading order matters. A framework or inventory that starts after Camera is not detected, and without qs-camera-props already running no card, frame, board or album can show its photo.
The Database#
Import sql.sql — it is in [sql]/ and in qs-camera/database/ — into your server's database with HeidiSQL, phpMyAdmin or your host's panel. It creates five tables:
Table | Holds |
|---|---|
| The photos inside each digital photo album. |
| Every card hung on a wall: where it is, its photo and who hung it. |
| Every cork board: where it is, its size, its owner and the cards pinned to it. |
| The cards in each card album. The script renames it to |
| Everything changed in the in-game settings panel. |
Only the settings table is created by the script on its own. The other four come from the SQL file — without them walls and boards cannot load and albums cannot save. Importing the file again later is harmless: every statement is
CREATE TABLE IF NOT EXISTS.
Photo Uploads#
Every photo and card is an image stored online; the item only keeps its address. Camera uploads to Fivemanage (recommended) or to a Discord webhook, set in one line of qs-camera/server/webhook.lua:
-- qs-camera/server/webhook.lua
DEFAULT_WEBHOOK = 'your-fivemanage-api-key'
-- or a Discord webhook, ending in ?wait=true:
-- DEFAULT_WEBHOOK = 'https://discord.com/api/webhooks/0000000000/xxxxxxxx?wait=true'A value that starts with http is used as a Discord webhook; anything else is used as a Fivemanage API key. While it is empty, neither camera opens and players are told No webhook or Fivemanage token is configured.
Create a Fivemanage account
Sign up at fivemanage.com.
Generate an API token
In the Fivemanage dashboard, create a token that can upload images. Keep one token just for Camera.
Paste it and restart
Put the token between the quotes of
DEFAULT_WEBHOOKinserver/webhook.luaand restartqs-camera.
This video walks through creating the account and the token:
YouTubeFIVEMANAGE | Token creation at fivemanage.comA short tutorial on creating a token at fivemanage.com to store images safely and quickly.
Digital photos are uploaded from the player's own game through
screenshot-basic, so the token is handed to the player who takes the photo. That is why it should be a token used for nothing else. Instant cards are uploaded by the server, and only accepted from the hosts listed under Uploads in the settings panel.
Adding the Items#
Camera uses eleven items. Add them to your inventory before anything can be given or used, and copy the icons from [images]/ into your inventory's image folder. Inventory Items has every definition ready to paste for ox_inventory, qs-inventory and qb-inventory.
Access to the Settings Panel#
Almost nothing is configured in files. Wear, film, photo quality, papers, filters, keys, distances and the language all live in an in-game panel opened with /cameraconfig. It is behind an ace, so give it to your staff in server.cfg:
The usual route: everybody in your admin group can open it.
add_ace group.admin command.cameraconfig allowAny identifier the player is known by works — license:, discord:, steam: or fivem:.
add_ace identifier.license:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx command.cameraconfig allowLines added to server.cfg apply on the next restart; typed into the server console they apply at once. Somebody without the ace is told You do not have permission to open the camera settings, and the server console prints their name and the exact line that would let them in.
Configuring the Resource#
The files are only for plumbing. Everything a server owner tunes is in /cameraconfig — see Usage.
File | Contents |
|---|---|
| Debug mode, and the resource names the framework and inventory are detected by. |
| Where photos are uploaded. |
| Which HUD is hidden while a camera, an album or the board editor is open. |
| How the floating prompts on walls and boards are drawn. |
| The framework and inventory bridges, notifications, progress bars and the qs-inventory quests. |
| Every text, per language. |
-- qs-camera/shared/config.lua
Config.Debug = false -- extra console output and the developer commands; keep it off on a live serverThe settings live in your database, in
qs_camera_settings, so updating the script never wipes them. Reset section and Reset everything in the panel put back what shipped.
Verifying the Installation#
Restart your server and read the console. Camera prints one line saying what it detected:
[INFO] qs-camera v2.0.0 started (esx / ox)The two words in brackets are the framework and the inventory it picked. standalone or the wrong inventory means that resource starts after Camera — move its ensure above. Either of these red lines means a requirement is missing:
[ERROR] No webhook or Fivemanage token set in server/webhook.lua — no photo can be taken until you fill it in
[ERROR] screenshot-basic is not running, so photos cannot be uploadedThen join your server and work through the first loop:
Take a photo
Give yourself a
cameraand acamera_film. Use the camera, press Load film, then Take photos and click. Aphotoarrives in your inventory.Print a card
Give yourself an
instant_cameraand a fewinstant_film. Use the camera, shoot, pick a paper and press Print.Hang it
Use the card, press
Gand click a wall. Anybody walking past sees your photo on it.Open the settings
/cameraconfigopens the panel. Usage covers every section.
Almost nothing needs a restart from here on. The few settings that do are marked Needs restart in the panel.



