Before You Begin#
Before installing Tattoo Creator, make sure your server meets the requirements. Three resources are mandatory and one of them ships in the download; everything else is optional and detected on its own.
Requirement | Status | Notes |
|---|---|---|
FXServer with OneSync | Required | Any current artifact, Windows or Linux. The script also uses the server's built-in Mono runtime, which every current artifact includes. |
| Required | Database access. The tables create themselves. |
| Required | Callbacks, zones and shared helpers. |
| Required | Ships in the download. The decoration collections every tattoo is drawn on. |
Framework | Optional |
|
Appearance script | Optional | Puts tattoos back the instant a clothing menu rebuilds the character, and lists exported catalog tattoos in its own menu. |
Inventory | Optional |
|
Text UI | Optional |
|
Everything framework- or third-party-specific sits behind a small, open bridge file, and the resource picks the right one by looking at what is already running:
Layer | Detected |
|---|---|
Framework |
|
Appearance |
|
Inventory |
|
Text UI |
|
Every optional integration degrades silently: a missing resource makes its part stand down, nothing errors. Integrations has the details and how to pin one by hand.
github.comReleases · overextended/oxmysqlMySQL resource for FXServer.github.comReleases · overextended/ox_libA FiveM resource and script library for Lua and JS.Downloading Tattoo Creator#
After purchasing Tattoo Creator, 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 Tattoo Creator.
After extracting the download, you should have the following folder:
[tattoo-creator]/
├── qs-tattoo-creator/ -- the script
├── qs-tattoo-preview/ -- the decoration collections: never edit, never restart
└── [sql]/ -- database.sql (optional) · clean.sql (uninstall)Inside qs-tattoo-creator, these are the parts you may open:
qs-tattoo-creator/
├── config/config.lua -- framework, appearance and inventory detection, admin groups
├── custom/ -- yours: fonts, gallery designs, the undress list, image hosts, placement
├── client/custom/ -- bridges: appearance scripts, inventory, target (editable)
├── server/custom/ -- which appearance menus receive catalog tattoos (editable)
├── server/webhooks.lua -- Discord logging
├── locales/ -- 41 languages
└── web/ -- the interface, already builtKeep the folder names exactly as they are. The interface path, the
add_acelines and the two companion resources (qs-tattoo-previewandqs-tattoo-data) are found by name, so a renamed copy stops finding its own parts.
Installing the Resource#
Move the whole [tattoo-creator] folder into your server's resources directory. It can live anywhere inside it, including another category folder:
resources/
└── [tattoo-creator]/
├── qs-tattoo-creator/
└── qs-tattoo-preview/Then open your server.cfg. Every dependency — and everything it should detect — must start before Tattoo Creator, and the five add_ace lines go above it:
ensure oxmysql
ensure ox_lib
# Framework
ensure es_extended
# ensure qb-core
# ensure qbx_core
# Appearance, inventory, text UI
ensure qs-appearance
ensure qs-inventory
ensure qs-textui
# Tattoo Creator
add_ace resource.qs-tattoo-creator command.ensure allow
add_ace resource.qs-tattoo-creator command.start allow
add_ace resource.qs-tattoo-creator command.stop allow
add_ace resource.qs-tattoo-creator command.restart allow
add_ace resource.qs-tattoo-creator command.refresh allow
ensure qs-tattoo-preview
ensure qs-tattoo-creatorThe loading order matters. Detection only sees resources that are already started, so an appearance script or inventory that starts after Tattoo Creator is not found and that part runs standalone.
The Three Folders#
Tattoo Creator works as three resources side by side. Two come in the download; the third is created by the script on its first start, next to qs-tattoo-creator, and started automatically — it needs no ensure line.
Resource | What it is | Rule |
|---|---|---|
| The script: the studio, the shops, the admin panel. | Safe to restart at any time. |
| Static data: the live-preview presets and the 120-slot pool every worn tattoo is drawn into. | Never edit it, never restart it while players are online. The script starts it if you forget. |
| Your server's data: every tattoo your players wear, the images they linked, pictures waiting for a moderator and your exported catalog. | Never delete or replace it. Back it up with your database. |
Inside qs-tattoo-data:
Folder | Holds |
|---|---|
| The picture of every worn tattoo, one file per design. Files nobody wears any more are cleaned up on their own. |
| Images players linked into the studio, downloaded once. |
| Designs in transit and pictures waiting for a moderator. |
| The exported tattoo catalog: textures, the decoration collection and |
| A framework-neutral copy of the catalog for wiring it into other scripts. |
Why is
qs-tattoo-previewseparate? Stopping a resource that owns a decoration collection unmounts it, and a character still wearing one of its tattoos then crashes the game client on the next decoration call. Keeping the collections in their own resource is what makes restartingqs-tattoo-creatoralways safe — and what lets a new tattoo go live without restarting anything.
The Database#
There is nothing to import. Tattoo Creator creates its own tables on the first start, all prefixed qs_tattoo_. [sql]/database.sql holds exactly the same tables, for anyone who prefers to create them by hand.
Tables | Hold |
|---|---|
| Every character, and what they wear on each body part. |
| Saved designs, share codes and linked images. |
| What every player paid: tattoos, removals, commissions, refunds. |
| The studios, their ranks, their staff and every shift worked. |
| Each studio's till ledger, its supplies and its supply orders. |
| Tattoos waiting for, or decided by, a moderator. |
| The exported tattoo catalog and the history of every export. |
| Every setting you changed in game — one row per value that differs from the shipped default. |
Upgrades to the schema run on every start and each one applies exactly once, printing
Database: migrated <name>when it does. Updating never needs a manual SQL step.
Claiming Admin Access#
Placing studios and changing settings is done from the admin panel, opened with /tattoocreator. There is no separate permission system: an admin is whoever your framework already calls an admin, and the server console always counts as one.
Any player whose ESX group is in Config.AdminGroups, in config/config.lua:
Config.AdminGroups = { 'admin', 'superadmin', 'god' }Automatic: players with the god or admin permission, or with the command ace.
Players with the command ace — txAdmin's admin group has it. To grant it to a group of your own:
add_ace group.admin command allow
add_principal identifier.license:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx group.adminThe command's name is itself a setting (Settings → Commands → Admin panel command); a renamed command takes effect after a restart.
Configuring the Resource#
Almost nothing is configured in files. Prices, the camera, the tattoo spot, shops and payroll, the ink budget, images, moderation, commands and the language all live in the in-game Settings — 133 settings in twelve sections, each with a line explaining what it costs you. The files are for plumbing and for your own content:
File | Contents |
|---|---|
| What must be known before the database answers: framework, appearance script and inventory detection, and the admin groups. |
| Your own fonts and gallery designs, the clothing the studio takes off per body part, and the image host allowlist. |
| Written for you by |
| Discord webhook URLs per category, and a Fivemanage token for thumbnails. |
| Which appearance menus receive exported catalog tattoos. |
| Every text, including the Settings panel's own labels. A key missing from a translation falls back to English. |
Two values worth reviewing first, both in config/config.lua:
Config.AppearancePin = '' -- two appearance scripts installed? name the one players use
Config.AdminGroups = { 'admin', 'superadmin', 'god' } -- ESX groups treated as adminsThe default language of every Quasar resource can also be set once in server.cfg; a language saved in the Settings panel still wins over it:
setr qs:locale "es"Settings live in your database, not in a file, so an update never overwrites your tuning.
config/,custom/,client/custom/,server/custom/andlocales/are left open by the escrow, so they stay readable and editable.
Verifying the Installation#
Restart your server and read the console. A healthy start prints the framework it loaded and the version check, and nothing else from Tattoo Creator:
[INFO] Successfully loaded the framework. esx
You are using the latest version of qs-tattoo-creator!When a startup check fails, it prints one red line that names the check and says exactly what to fix, for example:
[qs-tattoo-creator] ✗ Preview collection qs-tattoo-preview is missing — add `ensure qs-tattoo-preview` to your server.cfgThen join your server and work through the first loop:
Open the admin panel
/tattoocreatoropens the panel on the Shops tab. If theadd_acelines are missing, a red notice tells you so the moment it opens.Place a studio
Press +, name it, draw its area and place its tattoo spot and NPC. Usage walks through every field.
Get a tattoo
Walk up to the studio's NPC and press
E. Pick a design, drag it onto your arm and pay — anybody standing next to you sees it within a second.Check the studio
Run
tattoo_shopin the server console: one block per studio, ending with a list of anything still missing.
Nothing needs a restart from here on. Every studio, price and setting is edited in game.
Updating#
Back up
Your database and the
qs-tattoo-datafolder, together.Replace two folders
Stop the server, then replace
qs-tattoo-creatorandqs-tattoo-previewwith the new ones. Never touchqs-tattoo-data.Keep your own files
Copy back your
config/config.lua,custom/andserver/webhooks.luaif you changed them, and comparecustom/config.luawith the one that shipped: a new version can add a block there. If the studio stops undressing the character after an update, theConfig.Studio.Revealblock is missing from your copy — the startup check says so.Start the server
Settings, studios and every worn tattoo are kept. The database upgrades itself on start.
Uninstalling#
Run [sql]/clean.sql to drop every qs_tattoo_ table, settings included. Delete the qs-tattoo-data folder to remove every picture and the exported catalog, then remove the ensure and add_ace lines from server.cfg.



