Garages V2 uses two main config files:
shared/ConfigClient.lua
shared/ConfigServer.lua
Changes apply after a resource restart.
| Option | Type | Default | Description |
|---|
Config.Debug | boolean | false | Enable debug logging for target, carkeys, locale, database, and framework info |
Config.ImgDirectory | string | "nui:/ox_inventory/web/images/" | Vehicle image path used in the UI |
Config.Locale | string | "en" | Locale file name from locales/ |
| Option | Type | Default | Description |
|---|
Config.UseTarget | boolean | true | Use a target system instead of markers and keys |
Config.Target.Resource | string | "" | Force a specific target resource |
Config.Target.KnownResources | table | auto-detect list | Supported target resources |
Auto-detect order:
ox_target
qb-target
qtarget
interact
If no target resource is found, the script falls back to markers and keys.
| Option | Type | Default | Description |
|---|
Config.CarKeys.Resource | string | "" | Force a specific car keys resource |
Config.CarKeys.KnownResources | table | supported list | Supported car key resources |
Config.CarKeys.functions | function or nil | nil | Custom key handler |
Supported car key integrations:
qb-vehiclekeys
vehicles_keys
mk_vehiclekeys
qs-vehiclekeys
MobbKeys
Renewed-Vehiclekeys
brp-vehiclekeys
t1ger_keys
jacksam_vehiclekeys
Custom handler example:
LuaConfig.CarKeys.functions = function(source, plate, action) if action == "addKey" then exports.my_keys:GiveKey(source, plate) elseif action == "removeKey" then exports.my_keys:RemoveKey(source, plate) endend
Keys
| Option | Type | Default | Description |
|---|
Config.Keys.Interact | number | 38 | Interact key |
Config.Keys.HideCar | number | 38 | Store vehicle key |
Control reference: FiveM controls (opens in a new tab)
Markers
| Option | Type | Default | Description |
|---|
Config.Marker.Type | number | 23 | Marker type |
Config.Marker.Size | vector3 | vec3(1.2, 1.2, 0.5) | Marker size |
Config.Marker.Color | table | {r=30, g=144, b=255, a=180} | RGBA color |
Config.Marker.DrawDistance | number | 8.0 | Draw distance |
Config.Marker.BobUpDown | boolean | false | Bobbing animation |
Config.Marker.FaceCamera | boolean | false | Face camera |
Config.Marker.Rotate | boolean | false | Rotate animation |
Vehicle classes and allowed typesLink copied
Vehicle classes
| Option | Type | Default | Description |
|---|
Config.Classes.car | string | "car" | Car type name |
Config.Classes.sea | string | "sea" | Boat type name |
Config.Classes.air | string | "air" | Aircraft type name |
Config.Classes.bike | string | "bike" | Bike type name |
Allowed types per zone
| Option | Description |
|---|
Config.AllowedTypes.Vehicle | Types allowed in vehicle garages |
Config.AllowedTypes.Boat | Types allowed in boat garages |
Config.AllowedTypes.Planes | Types allowed in aircraft garages |
Blips
| Option | Type | Description |
|---|
Config.Blip.VehicleGarage | table | Default car garage blips |
Config.Blip.PlanesGarage | table | Default aircraft garage blips |
Config.Blip.BoatsGarage | table | Default boat garage blips |
TextUI
| Option | Type | Description |
|---|
Config.TextUi.KeyControl | number | Interaction key |
Config.TextUi.Style | table | UI style object |
Config.TextUi.show | function | Custom TextUI renderer |
Impound
| Option | Type | Default | Description |
|---|
Config.Impound.PedModel | string | "s_m_y_dockwork_01" | Impound NPC model |
Config.Impound.Target | table | default table | Target settings |
Config.Impound.Blip | table | default table | Default impound blip |
Config.ImpoundPrice.Account | string | "money" | Payment method |
Config.ImpoundPrice.Price | number | 5000 | Default release fee |
Police tow
| Option | Type | Default | Description |
|---|
Config.PoliceTow.Enabled | boolean | true | Enable police tow system |
Config.PoliceTow.ImpoundName | string | "police_impound" | Default police impound |
Config.PoliceTow.MaxHoldHours | number | 72 | Maximum hold duration |
Config.PoliceTow.DefaultHold | number | 24 | Default hold duration |
Config.PoliceTow.RequiredJobs | table | {"police", "sheriff"} | Jobs that can tow |
Config.PoliceTow.NotifyPlayer | boolean | true | Notify owner on tow |
Police tow commands
| Option | Type | Default | Description |
|---|
Config.PoliceTowCommands.ImpoundPolice | string | "impoundpolice" | Police tow command |
Config.PoliceTowCommands.MassTow | string | "odholuj" | Admin mass tow command |
Boats, showroom, and hide carLink copied
Boats
| Option | Type | Description |
|---|
Config.Boats.PedModel | string | Boat garage NPC model |
Config.Boats.Coords | vector4 | Default NPC position |
Config.Boats.Target | table | Target settings |
Config.Boats.Blip | table | Blip settings |
Hide car
| Option | Type | Default | Description |
|---|
Config.HideCar.icon | string | "fa fa-car" | Target icon |
Config.HideCar.label | string | "Store vehicle" | Target label |
Config.HideCar.distance | number | 2.0 | Interaction distance |
Config.HideCar.NoTargetText | string | "[E] Store vehicle" | Non-target prompt |
Showroom DUI
| Option | Type | Default | Description |
|---|
Config.Showroom.PedModel | string | "a_m_m_salton_01" | Showroom NPC model |
Config.Showroom.Dui.Width | number | 512 | Texture width |
Config.Showroom.Dui.Height | number | 256 | Texture height |
Config.Showroom.Dui.RoofExtra | number | 0.5 | Height offset |
Config.Showroom.Dui.MaxDrawDistance | number | 8.0 | Draw distance |
Config.Showroom.Dui.SpriteSize | number | 1.2 | Base sprite size |
Config.Showroom.Dui.WarmupFrames | number | 60 | Warmup frames |
Config.Showroom.Dui.InitTimeoutMs | number | 5000 | Init timeout |
Config.Showroom.Dui.TextureRetries | number | 4 | Retry count |
Config.Showroom.Dui.TextureRetryWaitMs | number | 120 | Retry delay |
Insurance, plates, admin, and cacheLink copied
Insurance
| Option | Type | Default | Description |
|---|
Config.Insurance.CacheTtlSeconds | number | 300 | Server-side insurance cache lifetime |
Config.Insurance.CooldownSeconds.Buy | number | 3 | Buy cooldown |
Config.Insurance.CooldownSeconds.Cancel | number | 3 | Cancel cooldown |
Config.Insurance.CooldownSeconds.Check | number | 1 | Check cooldown |
Config.Insurance.CooldownSeconds.GetVehicleInsurance | number | 1 | Insurance detail fetch cooldown |
Config.Insurance.ExtendFromActivePolicy | boolean | true | Extend from current policy end date |
Config.Insurance.Features.FreeRepair | boolean | true | Enable free repair benefit |
Config.Insurance.Features.ImpoundDiscount | boolean | true | Enable impound discount benefit |
Config.Insurance.Features.ProtectDelete | boolean | true | Enable delete protection |
Insurance tier fields
| Field | Type | Description |
|---|
label | string | Display name |
price | number | Purchase price |
account | string | Payment account |
days | number | Duration in days |
freeImpound | boolean | Free impound release |
impoundDiscount | number | Discount from 0.0 to 1.0 |
freeRepair | boolean | Free repair on pull |
protectDelete | boolean | Prevent admin deletion |
Default tiers:
| Tier | Price | Days | Impound Discount | Free Repair | Delete Protection |
|---|
| Basic | $5,000 | 30 | 25% | No | No |
| Standard | $12,000 | 60 | 60% | Yes | No |
| Premium | $25,000 | 90 | 100% | Yes | Yes |
Example custom tier:
LuaConfig.InsuranceTiers.vip = { label = "VIP", price = 50000, account = "bank", days = 180, freeImpound = true, impoundDiscount = 1.0, freeRepair = true, protectDelete = true,}
Plate change
| Option | Type | Default | Description |
|---|
Config.ChangePlate.Command | string | "plate" | Plate UI command |
Config.ChangePlate.Price | number | 5000 | Plate change cost |
Config.ChangePlate.Account | string | "money" | Payment account |
Config.ChangePlate.PlateLength.Min | number | 6 | Minimum length |
Config.ChangePlate.PlateLength.Max | number | 8 | Maximum length |
Config.ChangePlate.BlackListedWords | table | {} | Blocked words |
Example blacklist:
LuaConfig.ChangePlate.BlackListedWords = { "ADMIN", "POLICE", "SWAT" }
Give car and admin panel
| Option | Type | Default | Description |
|---|
Config.GiveCar.Command | string | "givecar" | Give car command |
Config.GiveCar.Admins | table | {"best", "admin", "superadmin"} | ESX admin groups |
Config.AdminPanel.Command | string | "garagesadmin" | Admin panel command |
Config.AdminPanel.Shortcut.Enabled | boolean | true | Enable shortcut |
Config.AdminPanel.Shortcut.HoldKey | number | 21 | Hold key |
Config.AdminPanel.Shortcut.PressKey | number | 29 | Press key |
Sub-owner, cache, validation, and version check
| Option | Type | Default | Description |
|---|
Config.SubOwner.Command | string | "subowner" | Add co-owner command |
Config.Cache.VehicleTtlSeconds | number | 8 | Vehicle list cache |
Config.Cache.AvatarTtlSeconds | number | 300 | Avatar cache |
Config.Validation.MaxPlateLength | number | 8 | Max plate length |
Config.Validation.MaxNameLength | number | 64 | Max name length |
Config.Validation.MaxGarageLength | number | 128 | Max garage name length |
Config.VersionCheck.Enabled | boolean | true | Enable version checks |
Config.VersionCheck.Url | string | GitHub raw URL | Version file URL |
Webhook
| Option | Type | Default | Description |
|---|
ConfigServer.Webhook | string | "" | Discord webhook URL |
ConfigServer.SteamAPIKey | string | "" | Steam API key for avatars |
Security
| Option | Type | Default | Description |
|---|
ConfigServer.Security.EnableAntiExploitBan | boolean | true | Ban on detected exploits |
ConfigServer.Security.BanReasonPrefix | string | "[sc_garages anti-exploit] " | Ban reason prefix |
Log templates
Each ConfigServer.Logs entry supports these fields:
Title
Color
ShowAvatar
Fields
Field values support placeholders like %1, %2, and %3.
Common log keys include:
PullCar
HideCar
ImpoundCar
ImpoundPickup
TransferCar
ChangePlate
BuyInsurance
CancelInsurance
AdminAddVehicle
AdminRemoveVehicle
AdminEditVehicle
AdminCreateGarage
AdminDeleteGarage
AdminCreateImpound
AdminDeleteImpound
AdminCreateShowroom
AdminDeleteShowroom
Framework-specific options are stored in framework/shared/config.lua.
LuaBridge.Config.ESX = { AdminGroups = { "admin", "superadmin", "owner" },}Bridge.Config.QBCore = { AdminPermissions = { "admin", "god" }, DefaultCommandRank = "admin", NotifyTypeMap = { ... },}Bridge.Config.QBox = { AdminGroups = { "admin", "superadmin", "god", "owner" },}Bridge.Config.Standalone = { AdminAces = { "command", "admin" },}
Database tables and column names are fully configurable through Config.Database.
Tables
| Option | Default | Description |
|---|
Config.Database.Tables.OwnedVehicles | "owned_vehicles" | Main vehicle table |
Config.Database.Tables.VehicleHistory | "vehicle_history" | Vehicle history table |
Config.Database.Tables.Users | "users" | Users table |
Config.Database.Tables.Jobs | "jobs" | ESX jobs table |
Columns
| Option | Default | Used in |
|---|
Owner | "owner" | Vehicle owner identifier |
CoOwner | "co_owner" | Co-owner identifier |
Plate | "plate" | Vehicle plate |
VehicleData | "vehicle" | JSON vehicle props |
VehicleType | "type" | Vehicle type |
Stored | "stored" | Storage state |
Parking | "parking" | Last known location |
Insurance | "insurance" | Insurance JSON |
ImpoundName | "impound_name" | Active impound |
ImpoundedAt | "impounded_at" | Impound timestamp |
PoliceHoldUntil | "police_hold_until" | Hold expiry |
ImpoundReason | "impound_reason" | Impound reason |
LastUsed | "last_used" | Last interaction |
History columns
| Option | Default |
|---|
HistoryAction | "action" |
HistoryDetails | "details" |
HistoryActor | "actor" |
HistoryActorName | "actor_name" |
HistoryLocation | "location" |
HistoryCreatedAt | "created_at" |