This is worth doing when a resource has been renamed on your server, or when two candidates are running at once — detection walks the table unordered, so with two cores started the winner is genuinely unpredictable.
On QB a character holds one saved look per ped model, with exactly one marked active. Switch model and switch back, and the earlier look for that model returns. ESX keeps a single blob with no per-model variants.
Appearance keys everything on whatever identifier your framework hands it, so multi-character works with no extra setup — as long as that identifier is per character. ESX multicharacter prefixes and QB citizenids both are. A plain ESX install that keys users on the raw license gives every character on that license the same appearance, and nothing in Appearance can tell them apart.
Each file returns a table. types.lua lists exactly which functions the server and client sides must implement — identifiers, money accounts, items, job name and grade, the admin check, and loading and saving an appearance. Then register the folder:
The whole of custom/, config/, locales/, types.lua and the provider folders stay readable and editable on an escrowed build, by design.
Worth stating plainly, because it is the question that comes up most. Appearance does not turn garments into inventory items and registers no clothing items with any inventory. The inventory integration does exactly one thing: it stops a player opening their inventory while the clothing menu is open.
Money is touched only at checkout, through your framework's cash, bank or black-money accounts. To support another inventory, copy client/custom/inventory/standalone.lua, guard it on your own name, implement ToggleInventoryClothing(state), and add the resource to the inventories table.
Appearance answers the public surface of the three scripts it most often replaces, so your existing scripts do not have to be rewritten. These are compatibility shims — write new code against the real API — but old code keeps working.
Each catalogue row stores the address of its own picture. The roughly 28,900 shipped rows point at Quasar's CDN and are already photographed, so a new server needs no image hosting of any kind.
Hosting only becomes a question for clothing you add yourself. When you photograph an add-on pack, the picture is cropped in the interface and uploaded to FiveManage using the token in config/fivemanage.lua, and the returned address is written into the catalogue row. A placeholder token ships in the file — replace it with your own before the first run.
Three helper pieces ship alongside the script. greenscreen-map is the studio the capture teleports to, and is the only one most owners ever start. clothing-image-saver and clothing-ai-service are vendor tooling used to build the shipped catalogue — a local image host and an offline labelling service. Neither is needed to run a server, and the AI block in the config is marked development-only and ships disabled.
41 translations ship in locales/: Arabic, Bulgarian, Bengali, Catalan, Czech, Danish, German, Greek, English, Spanish, Estonian, Persian, Finnish, French, Hebrew, Hindi, Croatian, Hungarian, Indonesian, Italian, Japanese, Korean, Lithuanian, Latvian, Malay, Dutch, Norwegian, Polish, Portuguese, Romanian, Russian, Slovak, Slovenian, Swedish, Swahili, Thai, Turkish, Ukrainian, Urdu, Vietnamese and Chinese.
A missing file falls back to English with a console warning, and so does any individual key a translation has not caught up with — so a half-finished custom translation never shows a blank label. It shows the English one and tells you which key to add.