Core configuration for 0r-tattoo_designer
This guide covers the public resource configuration.
General settings live in 0r-tattoo_designer/config/init.lua. Secrets belong only in config/private.lua.
Copy private.example.lua to private.lua before configuring the resource. Do not put API keys, webhook URLs, or other credentials in init.lua.
Worker and locale#
Config.Locale = 'en'
Config.Worker = {
NodePath = nil,
RequestTimeoutMs = 240000,
}
Localeselects a lowercase language file fromlocales/.NodePathselects the host Node executable used by the worker. Leave itnilwhen the executable is on PATH.RequestTimeoutMsis the worker wait limit. The accepted range is 1,000–900,000 ms.
The delivered resource includes locales/en.json. If you provide another language, add a locale file with the matching name; an unavailable locale falls back to en.
Designer access and command#
Config.Access = {
PermissionObject = 'tattoo_designer.use',
DefaultAllow = 'group.admin',
}
Config.Command = {
Enabled = true,
Name = 'tdesigner',
}
Do not include the leading / in Config.Command.Name. This ACE controls access to the authoring studio. Professional Tattoo artist rules are configured separately under Config.TattooShop.Professional.
Saved projects and remote storage#
Config.SavedProjects controls saved projects, share codes, and remote design files:
Config.SavedProjects = {
Enabled = true,
Sharing = { Enabled = true, ExpiresHours = 24 },
Storage = {
Provider = 'discord_webhook',
FallbackProviders = { 'fivemanage' },
DeleteRemoteOnProjectDelete = true,
RequestTimeoutMs = 15000,
DiscordWebhook = {
BotName = '0Resmon Tattoo Designer',
},
FiveManage = {
BasePath = 'tattoo-designer/saved-projects',
},
},
}
The supported storage providers are discord_webhook and fivemanage. Credentials belong in private.lua:
return {
SavedProjects = {
Storage = {
DiscordWebhook = { Url = '' },
FiveManage = { ApiKey = '' },
},
},
}
Share codes can be imported repeatedly until they expire. Deleting the source project revokes its active share codes. The configured share lifetime is bounded to 1–168 hours; the default is 24 hours.
Unsaved Studio drafts are process-memory state. They are not saved-project rows and are cleared when the resource or server restarts. Save a project explicitly before exporting or publishing it.
Template Images catalog#
Vendor catalogs use the 0Resmon CDN. To use a customer-owned catalog, configure private.lua:
TemplateCatalog = {
Mode = 'custom',
Cdn = {
CatalogUrl = 'https://tattoos.example.com/catalogs/2026.08.0/catalog.json',
AssetBaseUrl = 'https://tattoos.example.com/',
ThumbnailBaseUrl = 'https://tattoos.example.com/',
RequestTimeoutMs = 15000,
},
}
CatalogUrl is the versioned metadata manifest. AssetBaseUrl and ThumbnailBaseUrl point to the CDN root so manifest paths such as assets/sha256/... and thumbnails/sha256/... resolve correctly.
custom mode never falls back to the vendor catalog. The catalog, assets, and thumbnails must be publicly readable by the NUI over HTTPS with the required CORS headers. Selecting a template only materializes an editable draft; the project must still be saved, built, and published before it becomes a Tattoo Shop preset.
The Studio can mark catalog entries as favorites and filter the catalog by those favorites. Favorites are stored in the NUI's local browser storage and do not change the vendor or customer-owned catalog.
Tattoo Shop settings#
Config.TattooShop is the root for the player-facing shop:
Config.TattooShop.Enabled = true
Config.TattooShop.EnabledZones = {
'torso', 'zone_head', 'left_arm', 'right_arm', 'left_leg', 'right_leg',
}
Config.TattooShop.Pricing.PricePerZone = 500
Config.TattooShop.Authoring.MaxImageLayers = 12
Config.TattooShop.Presets.Enabled = true
Config.TattooShop.AppliedTattoos = {
Enabled = true,
MaxPerPlayer = 8,
MaxPerZone = 3,
RemoteTextureSize = 512,
PreviewTextureSize = 1024,
InterestRadius = 45.0,
MaxVisiblePlayers = 32,
MaxRemoteZones = 116,
MaxManifestRequests = 4,
OutOfInterestGraceMs = 5000,
InterestUpdateMs = 1500,
}
Config.TattooShop.Preview.MaxDataUrlBytesPerZone = 512 * 1024
Config.TattooShop.Preview.MaxDataUrlBytesTotal = 2 * 1024 * 1024
The six EnabledZones values are the complete supported shop scope. RemoteTextureSize controls applied textures for the owner and nearby players; PreviewTextureSize controls the six local Studio preview textures. Both values accept 128–1024 pixels. The remaining AppliedTattoos values bound v2 runtime-interest visibility, manifest requests, and out-of-interest cleanup.
Add locations under Config.TattooShop.Locations as vector4(x, y, z, heading) values. Use Interaction for marker, blip, professional-target, and distance settings.
Professional artist rules are separate from the designer ACE:
Config.TattooShop.Professional = {
Enabled = true,
Access = {
Match = 'any',
Identifiers = {},
Jobs = {
tattoo = { MinGrade = 0, RequireOnDuty = true },
},
},
}
The tattoo_designer.use ACE grants administrators designer and self-service artist access. Other artists must match the configured identifier, job, or custom access rule. Customers do not receive the self-service editor interaction.
MaxImageLayers defaults to 12 and cannot exceed the shared 64-layer project ceiling. Live preview data URLs default to 512 KiB per zone and 2 MiB total. Both the UI and server enforce these budgets.
Appearance provider#
Config.AppearanceIntegration = {
ActiveProvider = 'illenium-appearance',
Providers = {
standalone = { Enabled = true, Label = 'Standalone', Restartable = false },
['illenium-appearance'] = {
Enabled = true,
Label = 'illenium-appearance',
Resource = 'illenium-appearance',
Restartable = true,
CompanionFile = 'shared/0r_tattoo_designer_tattoos.lua',
},
},
}
standalone applies tattoos without an external appearance resource. Tattoo Designer remains the canonical owner of saved-project ownership and applied records. illenium-appearance merges Tattoo Designer tattoos with the provider's appearance data and persists the appearance when requested.
An external appearance provider can reapply its own state later and visually overwrite a Tattoo Designer tattoo. Custom adapters must handle the provider's reapply and removal lifecycle explicitly.
Restart 0r-tattoo_designer after configuration changes. Export Reload requires command.refresh, command.stop, command.ensure, and command.start for resource.0r-tattoo_designer, because FiveM's ensure command calls start internally. Grant command.restart only when you also restart the selected appearance provider. See Installation for the permission block.