Customization
Two files hold everything you set, and the split between them comes down to one question: would it hurt if a player read it? shared/config.lua is sent to every client. shared/keys.lua is loaded as a server script only and never leaves the server.
Which file decides what
Section titled “Which file decides what”All paths are inside mic_cloth_designer unless they say otherwise.
| Where | What it decides | Open to edit |
|---|---|---|
shared/config.lua | Command, keybind, permission, language, shared or per-player library, resolution, the item, debug | Yes |
shared/keys.lua | Your keys and tokens, the AI settings, photo hosting, the list of designable components — server only | Yes |
locales/*.lua | Every string in the studio and its notifications; locales/locale.lua is the resolver | Yes |
items/ox.lua, items/qb.lua | The cloth_design item definition for ox_inventory and QBCore | Yes |
html/ | The studio’s interface; html/patterns/ holds the prints, html/previews/ the cached garment thumbnails | Not escrowed, but the scripts ship obfuscated |
base/addon_templates/ | Templates the studio uses to build new garments. Leave it alone | Yes |
client/, server/, bridge/ | The logic, the file writer, the bridges | Escrowed |
mic_cloth_addons/import/ | Where you drop your own .ydd garments | Yes |
mic_cloth_addons/stream/, metas/, fxmanifest.lua | The generated garments. Rewritten by the studio — do not edit by hand | Generated |
The open files are the ones in escrow_ignore in fxmanifest.lua.
shared/config.lua
Section titled “shared/config.lua”| Option | What it does | Default |
|---|---|---|
Config.Framework | 'esx' or 'qb'. Set it to match your server; the item bridge also detects the framework by itself. Use 'qb' on QBCore, on QBox (through its QBCore compatibility) and on a standalone server | 'qb' |
Config.Locale | Language of the studio and its notifications | 'en' |
Config.Command | Command that opens the studio | clothdesigner |
Config.Keybind | A key that opens it, such as 'F7'. false for none. Players can rebind it in their FiveM key settings | false |
Config.OpenPermission | The ACE a player needs to open the studio. false lets everybody in | mic_clothdesigner |
Config.GlobalContent | true: everybody allowed in shares one library of designs, items and outfits. false: each designer sees only their own | true |
Config.TextureResolution | Default texture size: 256, 512 or 1024. The editor’s dropdown changes it per design, and the AI follows it | 512 |
Config.MaxDesignsPerPlayer | A cap on saved designs. Present in the file but not enforced by the current version | 50 |
Config.Items.Enabled | Wearable items, outfits and shop items on or off | true |
Config.Items.Name | The generic item that carries a design | cloth_design |
Config.Items.Label | Kept for reference. Each item is shown with its own design’s name | Clothing Design |
Config.Debug | Prints what the studio is doing to the console. Ships on — turn it off for a live server | true |
shared/keys.lua
Section titled “shared/keys.lua”Your keys
Section titled “Your keys”| Key | What it does |
|---|---|
GeminiAPIKey | Turns the AI generator on. Empty = no AI |
FivemanageToken | Uploads design and item photos to Fivemanage and stores only the link. Empty = photos are kept in the database, which grows faster |
DiscordWebhook | Posts every AI generation with the prompt and an estimated cost. Empty = off |
ClothNetworkKey | Leave empty. Sharing to the Cloth Network works out of the box |
The AI generator — Config.AI
Section titled “The AI generator — Config.AI”Pre-tuned. The one worth knowing about is Model, which trades cost against quality.
| Option | What it does | Default |
|---|---|---|
Enabled | AI on or off, whatever the key | true |
Provider | 'gemini', or 'openai' for DALL·E (the key in GeminiAPIKey is then used for OpenAI) | 'gemini' |
Model | gemini-3.1-flash-lite-image is the cheapest, gemini-3.1-flash-image the balanced one, gemini-3-pro-image the most expensive | gemini-3.1-flash-image |
GeminiImageSize | Fallback output size. Normally unused: the editor’s resolution drives it | 512px |
ImageSize | Output size for OpenAI only | 1024x1024 |
AspectRatio | Textures are square | 1:1 |
Pricing | USD per million input and output tokens, used only for the cost estimate in the Discord log | 0.50 / 60.00 |
One generation runs at a time per player, with a short cooldown between them.
Photo hosting — Config.Fivemanage
Section titled “Photo hosting — Config.Fivemanage”Enabled and the token from above. Photos are the 3D render of each design, used in the library, on items (ox_inventory shows it as the item’s image) and on network cards.
Designable components — Config.Components
Section titled “Designable components — Config.Components”The twelve GTA clothing slots the studio can design for — head, mask, hair, arms, legs, gloves, shoes, accessory, bags, vest, decals and tops — each with the file prefix its garments use. It lives server-side so it cannot be changed from a client. Leave it as shipped.
Permissions
Section titled “Permissions”| Permission | Where | What it allows |
|---|---|---|
The ACE in Config.OpenPermission (mic_clothdesigner) | server.cfg — to a group or one identifier | Opening the studio and every action inside it. Checked on the server each time |
command.refresh, command.ensure, command.start, command.stop for resource.mic_cloth_designer | Top of server.cfg | Lets the studio reload mic_cloth_addons after an export |
Filesystem write from mic_cloth_designer to mic_cloth_addons | Top of server.cfg | Lets it save garments at all |
importaddons | Server console | Restricted command: the console, or an admin with the ACE for it |
Commands
Section titled “Commands”| Command | Who | What it does |
|---|---|---|
/clothdesigner | Players with the ACE | Opens the studio. The name is Config.Command |
importaddons | Server console | Turns the .ydd files waiting in mic_cloth_addons/import/ into designable garments. See 👕 Garments |
Languages
Section titled “Languages”Eleven ship in locales/: en, es, fr, de, it, pt, pl, ru, tr, nl, cs. Set Config.Locale and restart. A string missing from a language shows in English.
To add one:
- Copy
locales/en.luatolocales/<code>.luaand changeLocales['en']to your code. - Translate the values, never the keys, and keep every
%s. - Add the file to
shared_scriptsinfxmanifest.luabeforelocales/locale.lua— the resolver has to load after every language. Thenrefresh. - Set
Config.Localeto the new code.
The interface is translated by swapping its English text for yours, so the English values in en.lua have to stay exactly as they are.
The bridge
Section titled “The bridge”Both bridge files are escrowed; this is what they do, so you know what to expect.
| File | What it is for |
|---|---|
bridge/server_bridge.lua | Detects qb-core or es_extended, registers the usable items (ESX RegisterUsableItem / QBCore CreateUseableItem, which ox_inventory honours), and gives items with their design attached — through ox_inventory when it is running, otherwise the framework |
client/bridge.lua | Notifications. Inside the studio they are its own toasts; outside it, ox_lib’s notify when it is running, then ESX or QBCore, then the GTA feed |
Players are identified by their license: identifier, whatever the framework.