Configuration
Every owner-editable entry in config.lua and config_server.lua. Defaults, types, and purpose.
All settings live in config.lua. The file is in escrow_ignore, so your edits
survive updates. It is ordered by how often an owner touches it: Quick Setup first,
then Features, then Advanced. Server-only secrets live in config_server.lua, a
server script that never downloads to clients. Keep tokens and API keys there.
Quick setup
Core
Config.Frameworkstringdefault: 'esx'Framework integration. One of 'esx', 'qbcore', or 'qbox'. 'qbx' is accepted as an alias of 'qbox'.
Config.Localestringdefault: 'en'Interface language. One of the ten shipped ids: en, fi, de, fr, pt-br, es, tr, nl, it, pl. Players can override it per account in Settings.
Config.Accountstringdefault: 'bank'Account used for trading. One of bank, money, or cash.
Config.LaptopItemstringdefault: 'laptop'Inventory item that places the laptop.
The laptop item must exist in ox_inventory. See Installation.
Config.TableNamestringdefault: 'nx_computer_assets'Database table that stores per-account assets. Change only if you renamed the table.
Config.BiometricUnlockbooleandefault: trueWhether players may enable fingerprint unlock and skip the PIN on a laptop they have signed into before. false requires the PIN every time.
Config.MaxAccountsPerCharacternumberdefault: 3How many separate accounts one character can create. Each account has its own handle, PIN, files, and mail. 1 allows a single account.
Config.AccountExportResourcesarraydefault: { 'nx_phone' }Resources allowed to create a laptop account for a player through the CreateAccountForCharacter export. nx_phone uses it for Create New Account in its Settings.
Banking
Backend for the Banking app and all in-app money movement.
Config.Banking.Backendstringdefault: 'auto'Money backend for the Banking app. One of auto, framework, or realbanking.
'auto'uses nx_realbanking when it is started, otherwise the framework backend. Recommended.'framework'uses the framework's own cash and bank accounts. Works anywhere with no dependencies.'realbanking'bridges to nx_realbanking. Proximity-gated, with a clean not-configured state when absent.
Config.Banking.CashAccountstringdefault: nilFramework-backend cash account name. nil uses stock naming per framework.
Config.Banking.BankAccountstringdefault: nilFramework-backend bank account name. nil uses stock naming per framework.
Config.Banking.MinTransfernumberdefault: 1Smallest transfer, request, or scheduled payment.
Config.Banking.MaxTransfernumberdefault: 1000000Largest single transfer, request, or scheduled payment.
Config.Banking.TransferMemoMaxLennumberdefault: 140Memo character cap. 0 disables memos.
Config.Banking.MaxTransfersPerMinutenumberdefault: 6Per-account outbound burst cap. Guards against a compromised client sweeping an account. The scheduled-payment watcher is exempt. 0 disables it.
Config.Banking.DailyTransferCapnumberdefault: 5000000Per-account outbound total over a trailing 24 hours, in fiat.
Config.Banking.SchedulePollIntervalMsnumberdefault: 60000Framework-backend standing-payment watcher cadence in milliseconds, clamped between 15 seconds and 10 minutes.
Config.Banking.MoneyRefreshDebounceMsnumberdefault: 250Delay in milliseconds before an open laptop refreshes after money moves, clamped between 50 and 2000.
Config.Banking.Adaptertabledefault: nilCustom money adapter, used only when Config.Framework is set to a custom value. Provides get, add, and remove functions for cash and bank. Mutators must be atomic, reject overdraw, and return a boolean success.
Apps
Built-in app ids: banking, finance, markets, jobs, vehicles, darknet, casino, forums, notes, docs, calculator, explorer, settings, email, messages, contacts, browser, terminal, map, photos, store, admin.
Config.Apps.Disabledarraydefault: {}Built-in apps to hide everywhere and refuse to open. Given as an array of ids or a map of id to true.
Config.Apps.ExternaltableSDK for third-party apps. Any resource can publish its own app that renders in a sandboxed frame with a locked-down bridge and no access to banking, crypto, inventory, admin, or identifiers.
Publishing third-party apps from another resource is covered in the SDK guide.
Config.Apps.External.Enabledbooleandefault: trueMaster toggle. false makes every registration call be ignored.
Config.Apps.External.Allowarraydefault: nilResource allowlist. nil or empty lets any resource register. A non-empty list restricts registration to those resources.
Config.Apps.External.Denyarraydefault: {}App ids that can never register.
Config.Apps.External.MaxAppsnumberdefault: 24Ceiling on the number of registered external apps.
Config.Apps.StoretableNX Store. Apps start uninstalled per account and are installed from the Store app. Ids also present in InstallerSites are hidden from the store and found through a website instead. An empty NotPreinstalled, or Enabled set to false, preinstalls everything.
Config.Apps.Store.Enabledbooleandefault: trueMaster toggle for the NX Store app.
Config.Apps.Store.NotPreinstalledarraydefault: { 'banking', 'finance', 'markets', 'contacts', 'jobs', 'vehicles', 'forums', 'casino', 'darknet' }Apps that start uninstalled per account.
Docs is preinstalled by default because .doc and .pdf attachments arrive from other players, and a reader that must be installed first leaves those files unopenable. Add 'docs' to the list to require the install.
Config.Apps.Store.InstallerSitestabledefault: { darknet = 'undernet.lc' }Map of app id to the .lc site that serves its installer. These apps are not sold in-store.
Targeting and placement
Config.TargetDistancenumberdefault: 1.5ox_target interaction range in meters.
Config.TargetOpenLabelstringdefault: 'Open Laptop'Label shown on the open-laptop target prompt.
Config.TargetOpenIconstringdefault: 'fa-solid fa-laptop'Font Awesome icon for the open-laptop target prompt.
Config.TargetPickupLabelstringdefault: 'Pick Up Laptop'Label shown on the pickup target prompt.
Config.TargetPickupIconstringdefault: 'fa-solid fa-box'Font Awesome icon for the pickup target prompt.
Config.EnablePickupbooleandefault: trueWhether a placed laptop can be picked back up.
Config.PlaceDistancenumberdefault: 5.0Maximum placement distance in meters.
Config.PreviewAlphanumberdefault: 100Opacity of the ghost placement preview.
Config.PickupMaxDistancenumberdefault: 5.0Server-side pickup range check. An anti-harvest guard, so keep it small.
Laptop in vehicles
Using the laptop item while seated opens it on the player's lap. Nothing is placed and the item stays in the inventory. The driver can open it only while stopped, and it closes if the vehicle moves. Passengers can use it while moving.
Config.Vehicle.Enabledbooleandefault: trueMaster toggle for lap mode.
Config.Vehicle.StopSpeednumberdefault: 0.5Speed in meters per second. The driver can open the laptop below this and is closed out above it.
Config.Vehicle.ExcludedClassesarraydefault: { 8, 13 }Vehicle classes with no lap. 8 is motorcycles, 13 is cycles.
Config.Vehicle.FadeMsnumberdefault: 350Open and close fade in milliseconds.
Config.Vehicle.LidMsnumberdefault: 250Milliseconds the closed lid shows before opening and before fading out.
Config.Vehicle.Laptabledefault: { Forward = 0.19, Up = 0.19, Lateral = 0.0, Pitch = -6.0 }Laptop position on the lap. Forward, Up, and Lateral are meters from the seat origin. Pitch is in degrees, with the hinge edge up.
Config.Vehicle.Cameratabledefault: { distance = 0.03, heightOffset = 0.42, aimOffset = vector3(0.0, 0.13, 0.10), fov = 50.0, nearClip = 0.2 }Focus camera in lap mode. It sits above the operator's eye line and looks down at the screen. A lower heightOffset gives a flatter angle.
Config.Vehicle.Animtabledefault: { Enabled = true, Dict = 'amb@world_human_stand_mobile@male@text@base', Name = 'base', Flag = 49 }Upper-body anim played while the laptop is on the lap.
Laptop placed on a vehicle
Aim the placement preview at a car's roof, bonnet, boot, flatbed, or dashboard and
the laptop attaches to it. It rides the vehicle and stays usable at any speed. It is
never saved to the database, and it returns to the owner's inventory when the vehicle
is gone. config.lua also ships an optional Camera entry, commented out, for the
focus camera.
Config.VehiclePlacement.Enabledbooleandefault: trueMaster toggle for placing a laptop on a vehicle.
Config.VehiclePlacement.ExcludedClassesarraydefault: {}Vehicle classes that refuse a laptop. For example, { 8, 13 } excludes motorcycles and cycles.
Config.VehiclePlacement.MinSurfaceDotnumberdefault: 0.55How level a panel must be to accept the laptop. 1 is perfectly flat.
Config.VehiclePlacement.SurfaceOffsetnumberdefault: 0.0Extra lift off the panel in meters.
Config.VehiclePlacement.ReturnDistancenumberdefault: 25.0When the vehicle is gone, the laptop goes straight back to the owner if they are within this many meters.
Config.VehiclePlacement.ReturnGraceMsnumberdefault: 180000Otherwise the laptop returns when the owner comes back in range, or after this many milliseconds.
Config.VehiclePlacement.AnchorLostMsnumberdefault: 20000Milliseconds a vehicle can stay unreachable before it counts as gone.
Config.VehiclePlacement.FocusMaxDistancenumberdefault: 4.5The screen closes if the vehicle carries the laptop further than this many meters from the operator.
Features
Exchange
Crypto and stock trading.
Config.Exchange.TradeFeeBpsnumberdefault: 25Trade fee in basis points. 25 equals 0.25 percent.
Config.Exchange.MinNotionalnumberdefault: 1Smallest trade value in fiat. Keep it at 1 or above so zero-fee dust trades are rejected.
Config.Exchange.MaxSlippageBpsnumberdefault: 200Maximum drift in basis points between the displayed quote and the fill price. 200 equals 2 percent. 0 disables the check.
Config.Exchange.StaleQuoteMsnumberdefault: 30000A protected fill whose quote is older than this many milliseconds is rejected.
Config.Exchange.OrderPollIntervalMsnumberdefault: 5000Limit-order and price-alert watcher cadence in milliseconds.
Simulated market engine
Prices come from a simulation that runs on your server. There is no outbound
HTTP call anywhere in the engine. The traded universe itself is declared in
shared/assets.lua; this block tunes how the engine behaves. The two dials that
change the feel of the market most are Speed and Events.MeanMinutes.
Config.Exchange.MarkettableEngine tuning for the simulated market.
Config.Exchange.Market.Enabledbooleandefault: trueMaster toggle for the market engine.
Config.Exchange.Market.Seedstringdefault: 'nx-market-v4'Seed for the synthetic price history.
Changing the seed rerolls history only while no player holds any asset. Once players hold assets the existing history is kept, because a reroll would destroy the valuation basis of every portfolio.
Config.Exchange.Market.TickIntervalMsnumberdefault: 5000How often prices move, in milliseconds. Also the floor for live price refreshes.
Config.Exchange.Market.BackfillDaysnumberdefault: 30Days of history generated on the first boot.
Config.Exchange.Market.Speednumberdefault: 4.0Market clock. 4.0 means one real day carries four market days of movement.
Config.Exchange.Market.Volatilitynumberdefault: 1.0Multiplies every asset's configured volatility. 1.0 leaves it as configured.
Config.Exchange.Market.EventstableNews events that move prices server-wide.
Config.Exchange.Market.Events.Enabledbooleandefault: trueWhether news events fire at all.
Config.Exchange.Market.Events.MeanMinutesnumberdefault: 45Average real minutes between news events, server-wide.
Config.Exchange.Market.Events.Magnitudenumberdefault: 1.0Event size multiplier. 2.0 is twice as violent.
Config.Exchange.Market.PlayerImpacttableWhether settled player trades nudge the price. Off by default.
Config.Exchange.Market.PlayerImpact.Enabledbooleandefault: falseWhen true, a player's settled trades move the price, never past the round-trip trade fee. It is forced off when TradeFeeBps is 0.
Config.Exchange.Market.PlayerImpact.Strengthnumberdefault: 0.15Nudge size per dollar traded, from 0 to 1.
Config.Exchange.Market.PlayerImpact.HourlyAccountAdvCapnumberdefault: 0.25Largest fraction of an asset's daily volume one account can move per hour.
Config.Exchange.Market.Spreadtabledefault: { BaseBps = 8 }Half-spread at top liquidity, in basis points. 8 equals 0.08 percent.
Config.Exchange.Market.Volumetabledefault: { NotionalPerDay = 6000000, EquityMult = 0.65 }Traded value per day at liquidity 1.0, with a separate multiplier for equities.
Config.Exchange.Market.MarketHourstableOpening hours for stocks. Off by default. Crypto never freezes either way.
Config.Exchange.Market.MarketHours.Enabledbooleandefault: falseWhether stock trading closes outside market hours.
Config.Exchange.Market.MarketHours.OpenHournumberdefault: 9.5Opening time in server-local hours. 9.5 is 09:30.
Config.Exchange.Market.MarketHours.CloseHournumberdefault: 16.0Closing time in server-local hours. 16.0 is 16:00.
Config.Exchange.Market.MarketHours.Daysarraydefault: { 2, 3, 4, 5, 6 }Trading days, where 1 is Sunday and 7 is Saturday.
Config.Exchange.Market.RetentiontableDays each chart resolution is kept. Daily candles are kept forever.
Config.Exchange.Market.Retention.OneMinDaysnumberdefault: 2Days of one-minute candles.
Config.Exchange.Market.Retention.FiveMinDaysnumberdefault: 14Days of five-minute candles. The 24 hour change is read from these, so keep it at 1 or above.
Config.Exchange.Market.Retention.HourDaysnumberdefault: 90Days of hourly candles.
Casino
Config.Casino.BlackjackBetsarraydefault: { 10, 25, 50, 100 }Selectable bet amounts for Blackjack.
Config.Casino.HiLoBetsarraydefault: { 10, 25, 50, 100 }Selectable bet amounts for Hi-Lo.
Config.Casino.VideoPokerBetsarraydefault: { 25, 50, 100, 250 }Selectable bet amounts for Video Poker.
Config.Casino.RouletteBetsarraydefault: { 10, 25, 50, 100 }Selectable bet amounts for Roulette.
Config.Casino.MaxPayoutnumberdefault: 1000000Absolute ceiling on a single payout in any game. Hi-Lo multipliers compound with no natural cap, so this clamps the pot. 0 removes the cap.
Config.Casino.PayoutstableBlackjack payout multipliers.
Config.Casino.Payouts.BlackjackWinnumberdefault: 2.0Payout multiplier for a standard Blackjack win.
Config.Casino.Payouts.Blackjacknumberdefault: 2.5Payout multiplier for a natural blackjack.
Config.Casino.Payouts.BlackjackPushnumberdefault: 1.0Payout multiplier for a push, returning the stake.
Config.Casino.HiLotableHi-Lo pays fair odds per call, computed live from the remaining deck.
Config.Casino.HiLo.HouseEdgenumberdefault: 0.05House hold per call. Expected value stays at 0.95 at any streak length.
Config.Casino.HiLo.MaxPerGuessMultipliernumberdefault: 20.0Cap on the multiplier offered for a single call.
Config.Casino.VideoPokerPaytabletableMap of hand name to payout multiplier. Shape: [handName] = number.
Config.Casino.VideoPokerPaytable = {
['Royal Flush'] = 250,
['Straight Flush'] = 50,
-- Four of a Kind 25, Full House 9, Flush 6, Straight 4,
-- Three of a Kind 3, Two Pair 2, Jacks or Better 1, Nothing 0
}...
Config.Casino.RoulettePayoutstableMap of bet type to payout multiplier. Shape: [betType] = number.
Config.Casino.RoulettePayouts = {
straight = 35,
split = 17,
-- street 11, corner 8, sixline 5, dozen 2, column 2,
-- red 1, black 1, even 1, odd 1, low 1, high 1
}...
Darknet
Darknet and black market.
Config.Darknet.Enabledbooleandefault: trueMaster toggle for the darknet app.
Config.Darknet.AccessItemstringdefault: 'usb'Inventory item required to enter the darknet.
The usb item must exist in ox_inventory. See Installation.
Config.Darknet.ListingFeenumberdefault: 0Flat fee to create a player-run listing.
Config.Darknet.MinPricenumberdefault: 250Minimum price for a player-run listing.
Config.Darknet.MaxPricenumberdefault: 500000Maximum price for a player-run listing.
Config.Darknet.PayInCryptotableCharges darknet purchases from the buyer's coin wallet instead of cash.
Config.Darknet.PayInCrypto.Enabledbooleandefault: trueCharge purchases from the buyer's coin wallet at the live exchange rate. Catalog prices stay in fiat. false restores cash payments.
Config.Darknet.PayInCrypto.Symbolstringdefault: 'NXC'Coin used to settle darknet purchases. It must be a coin declared in shared/assets.lua. The shipped coins are NXC, VWC, BLTR, and CHOP. An unknown symbol fails every purchase.
Config.Darknet.PickuptableCourier pickup point for physical orders. The hint fields control the in-world marker that points the player toward the pickup once a delivery is ready.
Config.Darknet.Pickup = {
coords = vector4(-1361.3589, -932.6345, 9.7058, 305.4851),
model = 's_m_m_dockwork_01',
scenario = 'WORLD_HUMAN_CLIPBOARD',
label = 'Collect Delivery',
icon = 'fa-solid fa-box-open',
distance = 2.0,
hintRadius = 120.0,
hintDuration = 300,
hintClearDistance = 3.0,
}Config.Darknet.DropPointsarrayPlayer-to-player hand-over points. A player listing is a courier job: the seller carries the goods to the closest of these contacts and hands them over, and only then does the listing go live. The buyer collects at one of them, picked at random per order. Leave the list empty and both legs use the Pickup contact. Catalog orders always use Pickup. Shape: { coords, model, scenario }, with optional label and distance per entry. The default ships 3 entries.
{ coords = vector4(717.28, -1088.79, 22.17, 178.62), model = 's_m_y_dealer_01', scenario = 'WORLD_HUMAN_SMOKING' },
-- Port of LS container yard, Little Seoul service alley...
Config.Darknet.PickupHoursnumberdefault: 48Hours a paid order waits at its contact before the goods stop being the buyer's. The sale itself is final either way, because both sides were settled at purchase time.
Config.Darknet.ExpiredItemsstringdefault: 'return'What happens to goods nobody collected. One of return, which sends them back for the seller to pick up, or forfeit, which destroys them.
Config.Darknet.CatalogarrayProducts in two shapes. Item products deliver a real inventory item through the courier pickup after a delay. Data-file products land instantly in the buyer's Downloads and are cosmetic. The default ships 5 entries: 3 item products and 2 data files. The item fields must reference items that exist in ox_inventory. See Installation.
-- item product: { id, label, item, amount, price, delivery }
{ id = 'lockpick_adv', label = 'Advanced Lockpick', item = 'advanced_lockpick', amount = 1, price = 2500, delivery = 180 },
-- data-file product: { id, label, category = 'datafile', price, description, file = { name, content } }
{ id = 'df_plates', label = 'Scraped Plate Registry', category = 'datafile', price = 3200, description = '...', file = { name = 'plate_registry_dump.csv', content = '...' } },...
Config.Darknet.DataFilesarraydefault: {}Your own purchasable data files, in the same shape as the datafile catalog entries. Kept in a separate list so script updates never touch it. The body may be inline through content, or read server-side from a path relative to the resource root through contentFile.
Vehicle marketplace
Config.VehicleMarket.Enabledbooleandefault: trueMaster toggle for the marketplace app.
Config.VehicleMarket.ListingFeenumberdefault: 0Flat fee charged to the seller to create a listing.
Config.VehicleMarket.TaxPercentnumberdefault: 0Percentage deducted from the sale price on a successful purchase.
Config.VehicleMarket.MinPricenumberdefault: 1000Minimum allowed listing price.
Config.VehicleMarket.MaxPricenumberdefault: 2500000Maximum allowed listing price.
Jobs hub
Config.JobsHub.Enabledbooleandefault: trueMaster toggle for the jobs app.
Config.JobsHub.ApplicationWebhooksbooleandefault: falseDiscord mirroring of new applications. The in-app flow is intended, where bosses review applications in the Jobs app and each decision emails the applicant. true also posts each new application to that job's webhook.
Webhook URLs belong in Config.JobsHubWebhooks in config_server.lua, which
never downloads to players.
Config.JobsHub.JobsarrayJob definitions. Shape: { id, label, description, requirements, questions }, where each question is { id, label, placeholder, required }. The default ships 3 entries (police, ems, mechanic), each with two questions.
{
id = 'police',
label = 'Los Santos Police Department',
description = '...',
requirements = '...',
questions = {
{ id = 'availability', label = 'Availability', placeholder = '...', required = true },
},
},...
Website builder
Bosses of any job, per AllowedRanks, can build a public company site addressable by a custom slug such as lscustoms.lc.
Config.SiteBuilder.Enabledbooleandefault: trueMaster toggle for the website builder.
Config.SiteBuilder.AllowedRankstableRank gate. Per-job entries are keyed by grade name or grade level, with a default fallback.
Config.SiteBuilder.AllowedRanks = {
['default'] = { ['boss'] = true, ['chief'] = true, ['manager'] = true },
-- per-job overrides keyed by grade name or grade level
}...
Config.SiteBuilder.Slug.MinLengthnumberdefault: 3Minimum slug length.
Config.SiteBuilder.Slug.MaxLengthnumberdefault: 32Maximum slug length.
Config.SiteBuilder.Slug.ReservedarraySlugs that can never be claimed. Static browser routes are reserved automatically server-side. The default ships 22 entries.
Config.SiteBuilder.Slug.Reserved = {
'home', 'manage', 'admin', 'www', 'site', 'sites', 'help', 'support',
-- about, contact, login, logout, browser, search, index, mail, email,
-- newspaper, weather, marketplace, casino, records
}...
Config.SiteBuilder.Limits.MaxBlocksnumberdefault: 60Maximum content blocks per site.
Config.SiteBuilder.Limits.MaxJobsnumberdefault: 20Maximum job openings per site.
Config.SiteBuilder.Limits.MaxProductsnumberdefault: 50Maximum products per site.
Config.SiteBuilder.Limits.MaxInquiriesShownnumberdefault: 200Maximum inquiries shown to a site owner.
Config.SiteBuilder.Limits.MaxReviewsShownnumberdefault: 200Maximum reviews shown on a site.
Config.SiteBuilder.Limits.InquiryBodyMaxnumberdefault: 1500Character cap on an inquiry body.
Config.SiteBuilder.Limits.ReviewBodyMaxnumberdefault: 600Character cap on a review body.
Config.SiteBuilder.AllowedImageHostsarraydefault: { 'cdn.discordapp.com', 'media.discordapp.net', 'i.ibb.co', 'raw.githubusercontent.com' }Extra image hosts allowed in typed image-URL fields. Imgur and anything uploaded through the laptop are always allowed. Published sites load these to visitors, so only add hosts you trust with visitor IPs. Matching is exact host, or a leading dot for subdomains.
Config.SiteBuilder.DefaultTheme.palettestringdefault: 'midnight'Legacy palette id.
Config.SiteBuilder.DefaultTheme.accentstringdefault: '#00bcff'Accent color for new sites. It must be an sRGB value in hex, rgb(), or hsl() form. oklch() is not supported.
Config.SiteBuilder.DefaultTheme.fontstringdefault: 'sora'Default site font.
Config.SiteBuilder.DefaultTheme.kitstringdefault: 'maze'One of the eight design kits.
Config.SiteBuilder.DefaultTheme.densitystringdefault: 'standard'Layout density. One of compact, standard, or spacious.
Config.SiteBuilder.DirectorytableDirectory-site SDK, the browser counterpart of the external apps SDK. Other resources publish .lc browser sites through an export. A registered slug is reserved against player sites.
Publishing directory sites from another resource is covered in the SDK guide.
Config.SiteBuilder.Directory.Enabledbooleandefault: trueMaster toggle. false makes every registration call be ignored.
Config.SiteBuilder.Directory.Allowarraydefault: nilSlug allowlist. nil or empty lets any slug register. A non-empty list restricts registration to those slugs.
Config.SiteBuilder.Directory.Denyarraydefault: {}Slugs that can never register.
Config.SiteBuilder.Directory.MaxSitesnumberdefault: 24Ceiling on the number of registered directory sites.
Email addresses
Every account's address is <username>@<domain>, the same on the laptop and on
nx_phone. A player can still be reached by @handle.
Config.Mail.Domainstringdefault: 'auto'The mail domain, for example 'yourcity.com'.
'auto' uses the nx_mail_domain convar when it is set. Otherwise it builds a
.com domain from your sv_projectName (or sv_hostname), and falls back to
lsmail.lc. A value that is not a valid domain falls back to the same rule and
prints a warning. After you change the domain, mail sent to the old one keeps
arriving.
Config.Mail.LegacyDomainsarraydefault: { 'lsmail.lc' }Older domains that still deliver to the matching account.
Config.Mail.KeepOldNamesbooleandefault: trueWhether a renamed account still receives mail sent to its old username.
Newsroom
The news desk app. Reporters write, edit and publish stories with pictures, sorted into categories. Editors can edit anyone's story and publish Breaking news, which sends a notification to every online player's laptop. With nx_phone running, the same stories appear in its Bulletin app.
Config.Newsroom.Enabledbooleandefault: trueMaster toggle for the Newsroom app.
Config.Newsroom.Jobstabledefault: { reporter = 0, weazel = 0 }Who can write. Each key is a job name and its value is the lowest grade that gets the app.
Config.Newsroom.EditorGradestring | numberdefault: 'boss'Who can edit any story and publish Breaking news. 'boss' means the job's boss grade and up. A number means that grade and up.
A job with no boss grade makes its highest grade the editor, so every desk has one.
Config.Newsroom.Categoriesarraydefault: { 'city', 'crime', 'business', 'sport', 'weather', 'opinion' }Story categories, in the order the app shows them.
Config.Newsroom.BreakingCooldownMinnumberdefault: 10Minutes between Breaking stories, server-wide.
Config.Newsroom.BreakingHoursnumberdefault: 6How many hours the front page shows a Breaking story.
Config.Newsroom.ExportResourcesarraydefault: { 'nx_phone' }Resources allowed to read and write the news desk for a player through the Newsroom exports. nx_phone's Bulletin uses it.
Email forwarding
Players can forward a copy of every email they receive to other handles, or to everyone who works the same job. Forwarded copies go one level deep: a forwarded mail never forwards again.
Config.EmailForwarding.Enabledbooleandefault: trueMaster toggle. false hides the whole Forwarding pane in the Email app.
Config.EmailForwarding.MaxTargetsnumberdefault: 10Maximum handle rules per account. The job rule is counted separately.
Config.EmailForwarding.AllowJobTargetsbooleandefault: trueWhether the forward-to-everyone-in-my-job toggle is offered.
Config.EmailForwarding.MaxJobFanOutnumberdefault: 50Maximum colleagues one job rule may deliver to per email.
Media uploads
Player uploads go through FiveManage at fivemanage.com. The server validates every
upload for size, sniffed type, and rate, then relays it with your API token. The
token is a secret set in config_server.lua.
Config.Media.Providerstringdefault: 'fivemanage'Upload provider. FiveManage is the only one supported.
Config.Media.MaxImageBytesnumberdefault: 6 * 1024 * 1024Ceiling per decoded image in bytes. FiveManage plan limits still apply.
Config.Media.AllowedTypesarraydefault: { 'png', 'jpg', 'gif', 'webp' }Allowed image types, sniffed from magic bytes and never trusted from the client. jpg covers jpeg.
Config.Media.AllowPdfbooleandefault: trueWhether Docs offers Export to PDF, which saves a PDF file to the player's Documents folder. false hides the export button.
Config.Media.RateLimit.Windownumberdefault: 60Rate-limit window in seconds.
Config.Media.RateLimit.Burstnumberdefault: 8Uploads allowed per window. 0 turns the limit off.
Config.Media.PageSizenumberdefault: 60Photos gallery page size.
Config.Media.MaxPerAccountnumberdefault: 500Maximum stored rows per account. The oldest are pruned on upload.
Config.Media.PhoneSynctableMirrors lb-phone gallery photos into the laptop's Photos app, in a new folder under Pictures.
Nothing is re-uploaded. The phone's hosted link is copied, so deleting the laptop copy never touches the phone's photo. This needs lb-phone's phone_photos table to be readable by the same database user as nx_computer, which holds on a normal one-database install.
Config.Media.PhoneSync.Enabledstring | booleandefault: 'auto'One of 'auto', which mirrors only while lb-phone is running, true, or false.
Config.Media.PhoneSync.IntervalSecnumberdefault: 30Seconds between checks for new phone photos.
Config.Media.PhoneSync.Folderstringdefault: 'Phone'Folder name under Pictures.
Config.Media.PhoneSync.Backfillbooleandefault: falsetrue also imports photos taken before install.
Phone bridge
Sends a phone notification when something lands on the laptop, so a player with the laptop packed away still hears about it. It is optional: with no phone resource running it does nothing, and it is never a dependency.
Config.PhoneBridge.Enabledstring | booleandefault: 'auto'One of 'auto', which forwards only while the phone resource is running, true, or false.
Config.PhoneBridge.Resourcestringdefault: 'lb-phone'Phone resource name. Change it for a renamed fork.
Config.PhoneBridge.Eventstabledefault: { Email = true, Message = true }What gets forwarded. Email covers new mail in the Email app, Message covers new chats in the Messages app.
You can add your own keys here and send them with the exports['nx_computer']:PhoneNotify(target, kind, payload) export.
Config.PhoneBridge.Appstabledefault: { Email = 'Mail', Message = 'Messages' }The lb-phone app id each event shows under. This sets the notification icon.
Config.PhoneBridge.CoalesceMsnumberdefault: 4000Events inside this window in milliseconds are grouped into one notification, such as 3 new emails.
Config.PhoneBridge.MaxPerMinnumberdefault: 8Hard ceiling of phone notifications per player per minute.
Filesystem
Explorer, desktop, and Recycle Bin.
Config.Filesystem.MaxItemsnumberdefault: 600Total items per account including the Recycle Bin. The disk reports full past this.
Config.Filesystem.MaxFileBytesnumberdefault: 16000Size ceiling per text file in bytes.
Config.Filesystem.MaxCopyNodesnumberdefault: 120Maximum nodes one copy or paste may duplicate. Protects the database.
Camera
The camera item opens photo mode and requires the screencapture resource.
Config.Camera.Enabledbooleandefault: trueMaster toggle for photo mode.
Config.Camera.ItemNamestringdefault: 'camera'Inventory item that opens photo mode.
The camera item must exist in ox_inventory. See Installation.
Config.Camera.Cooldownnumberdefault: 1500Milliseconds between shots.
Config.Camera.Encodingstringdefault: 'jpg'Image encoding. One of jpg, png, or webp.
Config.Camera.UploadMbpsnumberdefault: 1Pacing in megabits per second for the fallback upload path. Unused while the screencapture resource is running.
Config.Camera.Gridbooleandefault: trueWhether the rule-of-thirds grid shows by default.
Config.Camera.Lensbooleandefault: trueOptical lens treatment on the viewfinder. false gives a flat viewfinder, which is lighter on low-end clients.
Config.Camera.LookSensitivitynumberdefault: 6.0Mouse-look speed in photo mode.
Config.Camera.AllowMovementbooleandefault: trueWhether the player can walk and sprint while framing a shot. false keeps them standing still.
Config.Camera.MinFovnumberdefault: 18.0Maximum zoom-in. Lower is closer.
Config.Camera.MaxFovnumberdefault: 70.0Zoomed-out default framing.
Config.Camera.Soundtabledefault: { name = 'Camera_Shoot', set = 'Phone_SoundSet_Default' }Shutter sound from a frontend soundset.
Config.Camera.RateLimittabledefault: { Burst = 20, Window = 60 }Server-side upload anti-spam, separate from laptop uploads.
Config.Camera.Debugbooleandefault: falseDeveloper-only prop placement tuner for the camera. Keep it false in production.
Config.Camera.ProptableHeld prop and idle anim while shooting. The position and rotation are tuned for prop_ing_camera_01 on the right hand. Set Prop to false to disable the held prop.
Config.Camera.Prop = {
model = 'prop_ing_camera_01',
bone = 28422,
pos = vector3(0.21, -0.04, -0.04),
rot = vector3(-85, 75, 97),
}Config.Camera.FiltersarrayVisual styles cycled with the F key. Each maps to a GTA timecycle modifier baked into the frame. Shape: { id, name, modifier, strength }, where modifier may be nil. The default ships 6 entries.
{ id = 'normal', name = 'Normal', modifier = nil, strength = 0.0 },
{ id = 'mono', name = 'Mono', modifier = 'NG_deathfail_BW_base', strength = 1.00 },
-- sepia, vintage, vivid, noir...
Polaroid prints
A camera shot can be printed into a physical polaroid item. Players hold it up, place it on a wall or table, and with the free nx_write resource draw on it.
Config.Camera.Polaroid.Enabledbooleandefault: trueMaster toggle for the print path.
Config.Camera.Polaroid.ItemNamestringdefault: 'polaroid'Inventory item minted by a print.
The polaroid item must exist in ox_inventory. See Installation.
Config.Camera.Polaroid.PrintModestringdefault: 'prompt'When a shot is printed. One of prompt, which asks per shot, auto, which always prints, or off.
Config.Camera.Polaroid.RequireFilmbooleandefault: falsetrue consumes one film item per print.
Config.Camera.Polaroid.FilmItemstringdefault: 'polaroid_film'Inventory item consumed when RequireFilm is true.
Config.Camera.Polaroid.MaxMetadataCharsnumberdefault: 512Character cap on the capture metadata stored with a print.
Config.Camera.Polaroid.FilmLookbooleandefault: trueWhether the printed card gets an instant-film look. The saved photo in the Photos app is untouched either way.
Config.Camera.Polaroid.RateLimittabledefault: { Burst = 6, Window = 60 }Print-path rate limit. Burst prints per Window seconds.
Config.Camera.Polaroid.Inspect.CullDistancenumberdefault: 25Meters within which a polaroid renders its photo.
Config.Camera.Polaroid.Inspect.TargetDistancenumberdefault: 1.6ox_target pickup range on a placed polaroid, in meters.
Config.Camera.Polaroid.Place.Enabledbooleandefault: trueWhether a held polaroid can be placed in the world.
Config.Camera.Polaroid.Place.AllowedSurfacestabledefault: { wall = true, table = true }Surface kinds a polaroid may be placed on.
Config.Camera.Polaroid.Place.MaxPlaceDistancenumberdefault: 5Maximum placement distance in meters.
Config.Camera.Polaroid.Place.MaxActivenumberdefault: 24Maximum placed polaroids per character. 0 is unlimited.
Config.Camera.Polaroid.Place.RateLimittabledefault: { Burst = 10, Window = 60 }Placement rate limit. Burst placements per Window seconds.
Config.Camera.Polaroid.WritetableDrawing on a held polaroid. Needs the free nx_write resource. Without it every part of this block no-ops.
Config.Camera.Polaroid.Write.Enabledbooleandefault: trueWhether drawing on a held polaroid is offered.
Config.Camera.Polaroid.Write.Keynumberdefault: 74Control id that opens the drawing session while inspecting. 74 is the H key.
Projector
The projector pairs with the laptop as a third display and throws the picture onto the wall its lens faces. It comes from interiors that carry a v_res_mountedprojector or from a placeable item. See Displays for pairing, placement, and calibration.
Config.Projector.Enabledbooleandefault: trueMaster toggle for the projector display.
Config.Projector.Itemstringdefault: 'projector'Placeable projector item. nil or empty limits the feature to world-mapped projectors.
The projector item must exist in ox_inventory. See Installation.
Config.Projector.Modelstringdefault: 'v_res_mountedprojector'Projector prop model.
Config.Projector.LensOffsettabledefault: vector3(0.0, 0.0, -0.78)Lens offset that seeds the raycast deciding where the image lands.
Config.Projector.LensForwardtabledefault: vector3(1.0, 0.0, 0.0)Forward direction of the lens raycast.
Config.Projector.BeamOffsettabledefault: vector3(-0.15, 0.18, -0.075)Where the visible beam starts. nil uses the same point as LensOffset.
Config.Projector.MaxThrownumberdefault: 24.0Maximum meters from lens to wall before no surface is reported.
Config.Projector.MinThrownumberdefault: 0.8Closer than this leaves no room for an image.
Config.Projector.ThrowRationumberdefault: 0.55Image width equals distance times this ratio, clamped, at 16 by 9.
Config.Projector.MinWidthnumberdefault: 0.9Minimum image width in meters.
Config.Projector.MaxWidthnumberdefault: 6.0Image width stops growing here.
Config.Projector.WallGapnumberdefault: 0.022Meters the image floats off the wall, guarding against z-fighting.
Config.Projector.ResWnumberdefault: 1280Projected image width in pixels.
Config.Projector.ResHnumberdefault: 720Projected image height in pixels.
Config.Projector.Alphanumberdefault: 240Image opacity. Below 255 gives a slightly translucent beamer wash.
Config.Projector.FlipImagebooleandefault: falseFlip the image if an odd surface renders it rotated 180 degrees.
Config.Projector.DetectRadiusnumberdefault: 8.0Maximum laptop to projector distance for the connect option.
Config.Projector.PlaceDistancenumberdefault: 6.0Item placement distance, mounted against a ceiling.
Config.Projector.Calibration.Enabledbooleandefault: trueWhether the player-facing calibrate option is offered.
Config.Projector.Calibration.MaxVerticalnumberdefault: 0.50Meters of up and down lens shift.
Config.Projector.Calibration.MaxHorizontalnumberdefault: 0.25Meters of left and right lens shift.
Config.Projector.Calibration.MinScalenumberdefault: 0.75Lower bound of the zoom range, times the throw-derived size.
Config.Projector.Calibration.MaxScalenumberdefault: 1.25Upper bound of the zoom range.
Config.Projector.Calibration.Stepnumberdefault: 0.02Meters per arrow nudge. Hold Shift for five times the step.
Config.Projector.Calibration.ScaleStepnumberdefault: 0.02Zoom change per scroll notch.
Config.Projector.Camera.fovnumberdefault: 50.0Field of view while the projection is focused.
Config.Projector.Camera.marginnumberdefault: 1.18Framing margin around the projection.
Config.Projector.Camera.distancenumberdefault: nilCamera distance. nil auto-frames the projection.
Config.Projector.Beam.Enabledbooleandefault: trueWhether the visible light cone renders.
Config.Projector.Beam.Colortabledefault: { r = 226, g = 233, b = 255 }Base beam color.
Config.Projector.Beam.Brightnessnumberdefault: 0.12Beam brightness.
Config.Projector.Beam.Hardnessnumberdefault: 0.17Beam edge hardness.
Config.Projector.Beam.Falloffnumberdefault: 25.0Beam falloff rate.
Config.Projector.Beam.TintFromScreennumberdefault: 0.7How far the cone blends toward the average on-screen color.
Config.Projector.Beam.Shaft.Enabledbooleandefault: trueWhether the layered light shaft renders.
Config.Projector.Beam.Shaft.Alphanumberdefault: 10Per-layer alpha from 0 to 255.
Config.Projector.Beam.Shaft.Layersnumberdefault: 3Nested planes from full cone down to a hot core.
Config.Projector.Beam.Dust.Enabledbooleandefault: trueWhether dust motes render inside the cone.
Config.Projector.Beam.Dust.Effectstringdefault: 'env_dust_motes_int_hvy'Looped particle effect inside the cone.
Config.Projector.Beam.Dust.Pointsnumberdefault: 4Emitters spread along the beam.
Config.Projector.Beam.Dust.Scalenumberdefault: 2.0Dust emitter scale.
Config.Projector.Fx.Additivebooleandefault: trueAdditive blending for the projected image.
Config.Projector.Fx.Floornumberdefault: 0.8Per-pixel alpha floor. 0 is physically pure, 1 is a flat screen.
Config.Projector.Fx.Blurnumberdefault: 0.6Lens defocus in pixels.
Config.Projector.Fx.Chromanumberdefault: 0.8RGB convergence error in pixels.
Config.Projector.Fx.Hotspotbooleandefault: trueWhether the center hotspot renders.
Config.Projector.Fx.Vignettenumberdefault: 0.34Vignette strength.
Config.Projector.Fx.EdgeFeatherbooleandefault: trueWhether the image edges are feathered.
Config.Projector.Fx.Fringebooleandefault: trueWhether color fringing renders.
Config.Projector.Fx.PixelGridnumberdefault: 0.12LCD screen-door structure opacity. 0 turns it off.
Config.Projector.Fx.Grainbooleandefault: trueWhether film grain renders.
Config.Projector.Fx.GrainOpacitynumberdefault: 0.12Grain opacity.
Config.Projector.Fx.Flickerbooleandefault: trueWhether the image shimmers by about 1.5 percent.
Config.Projector.Glow.Pushnumberdefault: 0.27Meters the wall glow sits in front of the surface.
Config.Projector.Glow.Rangenumberdefault: 2.4Wall glow radius.
Config.Projector.Glow.Intensitynumberdefault: 1.7Wall glow brightness.
Config.Projector.SyncForAllbooleandefault: trueWhether bystanders see the projected image, beam, and glow.
Config.Projector.SyncRadiusnumberdefault: 20.0Meters within which bystanders receive projector sync.
Display switcher
With a paired monitor both screens stay live. Alt and 1 selects the laptop, Alt and 2 selects the monitor. See Displays for the paired-monitor workflow.
Config.DisplaySwitch.Enabledbooleandefault: trueMaster toggle for the display switcher.
Config.DisplaySwitch.HintPositionstringdefault: 'bottom-center'ox_lib textUI position. One of bottom-center, top-center, left-center, or right-center.
Config.DisplaySwitch.TransitionMsnumberdefault: 350Camera glide time in milliseconds between displays. Lower is snappier.
Boot sequence
Config.Boot.Cinematicbooleandefault: trueWhether the cinematic boot plays on the first laptop a player opens each session. Later opens always use the short version. false makes every open the short one.
Config.Boot.SleepAfterMsnumberdefault: 45000Milliseconds before a suspended screen blanks. 0 keeps it lit.
Screen prewarm
Boots the OS page in the background while a player stands near a closed laptop, so the open shows a live screen right away.
Config.Prewarm.Enabledbooleandefault: trueMaster toggle for screen prewarm.
Config.Prewarm.Distancenumberdefault: 12.0Meters from a placed, closed laptop at which prewarm starts.
Shared screen
The open lid, screen glow, and monitor cable always sync to nearby players. This block controls whether the screen content itself is mirrored.
Config.Networking.OpenLaptopForAllbooleandefault: truetrue mirrors the live screen to nearby players within SyncRadius. false keeps screen content private to the operator.
Config.Networking.SyncRadiusnumberdefault: 12.0Meters within which players see the mirrored screen.
Meetings
Video calls between laptops. One player creates a meeting and shares its code, and others join by code. Everyone sees each other's character on live video, hears each other, and one person at a time can share their screen. Video goes player to player. Voice rides a pma-voice call channel.
Config.Meetings.Enabledbooleandefault: trueMaster toggle for meetings.
Config.Meetings.MaxParticipantsnumberdefault: 6Participants per meeting. 12 is the ceiling. Every extra participant costs every camera one more upload.
Config.Meetings.MaxMeetingsnumberdefault: 25Live meetings server-wide.
Config.Meetings.MaxMinutesnumberdefault: 180A meeting ends itself after this many minutes.
Config.Meetings.AwayGraceSecondsnumberdefault: 90A participant away from the laptop for this many seconds drops out.
Config.Meetings.Videotabledefault: { Width = 640, Height = 360, Fps = 15 }Face cam resolution and frame rate per participant.
Config.Meetings.IceServersarraydefault: { { urls = 'stun:stun.l.google.com:19302' } }Relay servers for the player-to-player link.
STUN is enough for most home connections. If some players never get video, add a TURN entry:
{ urls = 'turn:turn.example.com:3478', username = '...', credential = '...' },Config.Meetings.Voice.Enabledbooleandefault: trueWhether meetings carry voice.
Config.Meetings.Voice.ChannelBasenumberdefault: 900000pma-voice call channels used are ChannelBase + 1, + 2, and so on. Keep this range clear of your phone's channels.
Config.Meetings.Voice.MuteStrategystringdefault: 'targets'How mute works. With targets, mute stops others hearing you and you keep hearing them. With leave, mute leaves the call channel and you stop hearing too. Use leave if mute misbehaves after a pma-voice update.
Config.Meetings.Webcamtabledefault: { Fov = 38.0, Forward = 0.02, AimUp = 0.02, NearClip = 0.05 }Webcam pose. The webcam sits at the top edge of the screen and looks at the operator.
Operator stance
While a screen is focused the operator is posed for the surface height. Bands are chosen by height above the floor, highest first, and the first enabled band that fits wins.
Config.Animation.Enabledbooleandefault: trueMaster toggle for the operator stance.
Config.Animation.FreezePedbooleandefault: trueWhether the operator is frozen while posed.
Config.Animation.BlendInnumberdefault: 4Anim blend-in speed.
Config.Animation.BlendOutnumberdefault: -4Anim blend-out speed.
Config.Animation.Align.Enabledbooleandefault: trueWhether the operator is aligned to the surface.
Config.Animation.Align.Headingbooleandefault: trueWhether heading is adjusted during alignment.
Config.Animation.Align.Slidebooleandefault: trueWhether the operator slides into position.
Config.Animation.Align.Lateralnumberdefault: 0Lateral alignment offset.
Config.Animation.Align.PosTolerancenumberdefault: 0.3Position tolerance in meters before a nudge is applied.
Config.Animation.Align.HeadingToleranceDegnumberdefault: 22Heading tolerance in degrees before a turn is applied.
Config.Animation.Align.MaxNudgenumberdefault: 0.6Maximum slide distance in meters.
Config.Animation.Align.SettleMsnumberdefault: 350Settle time in milliseconds after alignment.
Config.Animation.BandsarrayOrdered pose bands. Shape: { Id, Enabled, Min, StandOffset, Flag, Dict, Name }, where Min is the height at which the band applies and Dict and Name are the anim. The default ships 5 entries: stand and kneel enabled, seated, low, and floor disabled.
{ Id = 'stand', Enabled = true, Min = 0.64, StandOffset = 0.726, Flag = 1,
Dict = 'anim@amb@warehouse@laptop@', Name = 'idle_a' },
{ Id = 'kneel', Enabled = true, Min = 0, StandOffset = 0.5, Flag = 1,
Dict = 'amb@medic@standing@kneel@base', Name = 'base' },
-- seated, low, floor...
Audio
Native GTA soundsets only. Retune by swapping any set and name pair.
Config.Audio.Enabledbooleandefault: trueMaster switch for all UI sounds.
Config.Audio.Keystroketabledefault: { enabled = true, throttleMs = 50 }Keystroke tick, throttled so key-repeat does not machine-gun.
Config.Audio.Clicktabledefault: { enabled = true }Left-click tick.
Config.Audio.BootFromEntitybooleandefault: trueWhether the power-on chime plays from the laptop in 3D so bystanders hear it.
Config.Audio.SoundstableMap of sound key to a set and name pair. Shape: [key] = { set, name }. The keys are keystroke, click, boot, notify, success, error, close, and lockout.
Config.Audio.Sounds = {
boot = { set = 'GTAO_Exec_SecuroServ_Warehouse_PC_Sounds', name = 'Login' },
notify = { set = 'HUD_MINI_GAME_SOUNDSET', name = 'CONFIRM_BEEP' },
lockout = { set = 'DLC_HEIST_BIOLAB_PREP_HACKING_SOUNDS', name = 'Hack_Failed' },
}...
Screen glow
A lit screen casts colored light onto the player and desk, tinted per zone by colors sampled from the layout.
Config.ScreenGlow.Enabledbooleandefault: trueMaster toggle for the screen glow.
Config.ScreenGlow.DayStartnumberdefault: 7Hour at which daytime begins. Glow shows outside the daytime window or when inside an interior.
Config.ScreenGlow.DayEndnumberdefault: 19Hour at which daytime ends.
Config.ScreenGlow.ForceAlwaysbooleandefault: falsetrue ignores the day and interior gate.
Config.ScreenGlow.Pushnumberdefault: 0.04Meters the lights sit in front of the screen.
Config.ScreenGlow.Rangenumberdefault: 0.40Per-light radius in meters.
Config.ScreenGlow.Intensitynumberdefault: 2.2Per-light brightness.
Config.ScreenGlow.LerpRatenumberdefault: 6.0Color easing per second. Higher is snappier.
Config.ScreenGlow.Flickernumberdefault: 0.04Subtle screen flicker. 0 turns it off.
Config.ScreenGlow.Networkedbooleandefault: trueWhether the owner's zone colors broadcast so bystanders see the glow too.
Config.ScreenGlow.SyncRadiusnumberdefault: 14.0Meters within which players receive glow updates.
MDT
The records terminal for police-style jobs: cases, evidence, warrants, permits, duty roster, and the audit trail. Access is decided server-side from the live framework job. Officers are on duty automatically while they hold one of the agency's jobs. Ranks mirror your job grades, one MDT rank per grade of the agency's first job, named exactly as your framework names it. The boss grade becomes the command rank. Rename or reorder ranks in your job grades, not here.
Config.MDT.Enabledbooleandefault: trueMaster toggle for the MDT.
Config.MDT.AgenciesarrayOne entry per agency. Shape: { key, label, jobs, pack, charges }, where jobs are framework job names and pack picks the template pack: generic (the default), us, or fi. The optional charges field picks the charge list separately from the pack (generic, us, or fi). Leave it out to use the pack's own list. Set it when you want one pack's case types with another pack's charges, for example a Finnish-language server that prefers the US charge codes. Their names are translated into all ten languages. The default ships 1 entry.
{ key = 'police', label = 'Los Santos Police Department', jobs = { 'police' }, pack = 'generic' },
-- { key = 'poliisi', label = 'Poliisi', jobs = { 'police' }, pack = 'fi', charges = 'us' },...
Config.MDT.PersonSearchstringdefault: 'open'Citizen lookup by name, either a single word or a full name. It also reads framework characters. One of open, warrant, which restricts lookup to people with a warrant, or off.
Config.MDT.EvidenceLockersarraydefault: {}Evidence-room locations as vector3 values. Empty means no proximity requirement.
Config.MDT.RetentiontableDays a row is kept before the retention sweep removes it.
Config.MDT.Retention.AuditReadDaysnumberdefault: 14Days audit rows for reads are kept. These are the bulk of the audit trail.
Config.MDT.Retention.AuditDaysnumberdefault: 180Days audit rows for writes, decisions, and admin actions are kept.
Config.MDT.Retention.UnitTrackDaysnumberdefault: 30Days of unit position history.
Config.MDT.Retention.BodycamDaysnumberdefault: 30Days of bodycam clip metadata.
Config.MDT.ShiftAlerttableDiscord ping when an officer asks for backup with nobody else on duty. Webhook URLs go in Config.MDTWebhooks in config_server.lua.
Config.MDT.ShiftAlert.Enabledbooleandefault: trueWhether backup alerts are sent.
Config.MDT.ShiftAlert.CooldownMinutesnumberdefault: 30Minimum gap between alerts per agency.
Config.MDT.ShiftAlert.DailyCapPerOfficernumberdefault: 3Alerts one officer can trigger per day.
Config.MDT.JailAdaptertableHand-off to your jail script when a sentence starts serving.
Config.MDT.JailAdapter.Modestringdefault: 'none'Hand-off style. One of none, export, server_event, or client_event.
Config.MDT.JailAdapter.Exporttabledefault: { resource = '', fn = '' }Export mode target. The named export on the named resource is called with the player source, the sentence in minutes, and a data table.
Config.MDT.JailAdapter.ServerEventstringdefault: ''Server-event mode target. The event is triggered with the player source, the sentence in minutes, and a data table.
Config.MDT.JailAdapter.ClientEventstringdefault: ''Client-event mode target. The event is triggered on the sentenced player with the source, the sentence in minutes, and a data table.
Config.MDT.Units.Enabledbooleandefault: trueWhether live unit positions show on the tactical map.
Config.MDT.Tracks.Enabledbooleandefault: trueWhether route history and playback are recorded. Capped by Retention.UnitTrackDays.
Config.MDT.Trackers.Enabledbooleandefault: trueMaster toggle for GPS trackers.
Config.MDT.Trackers.BatteryMinutesnumberdefault: 120Tracker battery life in minutes. A random variation of plus or minus 10 percent is applied per tracker.
Config.MDT.Trackers.RequireWarrantbooleandefault: falsetrue refuses tracker attachment without an approved warrant.
Config.MDT.Bodycam.Enabledbooleandefault: trueMaster toggle for bodycam clips. The feature needs the screencapture resource and a FiveManage token in config_server.lua, otherwise it stays dark.
Config.MDT.Bodycam.MaxSecondsnumberdefault: 60Hard ceiling per clip in seconds, enforced server-side.
Config.MDT.LiveBodycamtableA supervisor watches an on-duty officer's game view inside the MDT. Video goes player to player and the server only carries the handshake. Officers are notified and cannot decline while on duty. Every viewing is on the audit trail.
Config.MDT.LiveBodycam.Enabledbooleandefault: trueMaster toggle for live bodycam.
Config.MDT.LiveBodycam.MaxMinutesnumberdefault: 10One viewing ends itself after this many minutes.
Config.MDT.LiveBodycam.IceServersarraydefault: { { urls = 'stun:stun.l.google.com:19302' } }Relay servers for the player-to-player link. STUN is enough for most home connections. Add a TURN entry, in the same shape as Config.Meetings.IceServers, for players behind strict NAT.
Config.MDT.Bank.Backendstringdefault: 'auto'Backend for the financial investigation lens. One of auto, nx_realbanking, or none.
Config.MDT.Phone.Enabledbooleandefault: trueSeized phones, cell tower dumps and device traces in the MDT. Needs nx_phone running.
Config.MDT.External.Enabledbooleandefault: falseWhether a case or artifact can be shared with another agency.
Advanced
Vehicle ownership tables
Where the Vehicle Marketplace reads and writes owned vehicles, per framework. Defaults match stock schemas.
Config.VehicleTablestablePer-framework map of column roles to database column names. Change only if your server uses a non-standard schema.
Config.VehicleTables = {
esx = { table = 'owned_vehicles', ownerColumn = 'owner', plateColumn = 'plate', vehicleColumn = 'vehicle', typeColumn = 'type', storedColumn = 'stored', storedValue = 1 },
qbcore = { table = 'player_vehicles', ownerColumn = 'citizenid', plateColumn = 'plate', modelColumn = 'vehicle', modsColumn = 'mods', stateColumn = 'state', stateValue = 1, garageColumn = 'garage', defaultGarage = 'pillbox' },
-- qbox and qbx match qbcore
}...
Map tiles
Config.MapTileCDNstringdefault: nilBase URL for hosted map tiles. Atlas tiles ship bundled. To offer Satellite or Grid styles, host them on your own CDN or bucket and set the base URL. nil serves Atlas only.
Security and audit
Config.AuditLargeMoveFiatnumberdefault: 50000Money movements at or above this fiat value are logged in the security audit log. Visibility only. It does not block or cap transfers.
Config.AllowCommandAceAdminbooleandefault: falseThe admin console requires the nx_computer.admin ace or a framework admin check. true also accepts holders of the broad command ace, which is not recommended.
Debug
Config.Debugbooleandefault: falseMaster switch for the developer tuning tools. Developer-only. Keep it false in production. true unlocks the tuning commands (/nxc_place, /nxc_anim, /nxc_cam, /nxc_cable, /nxcc, /nxc_freelook, /nxcnc) plus verbose site-builder logging.
Config.PlacerAdminAccessbooleandefault: trueLets admins use the placement tools (/nxc_place and /nxc_cable) while Config.Debug is off. Admin means the nx_computer.admin ace or your framework's own admin check. false limits the tools to Config.Debug.
Config.PlacerAdminGroupsarraydefault: { 'admin', 'superadmin' }ESX groups that count as admin for Config.PlacerAdminAccess.
Config.Camera.Debug is a second developer-only flag, also false by default, for
the camera prop tuner. Keep both off on a live server.
The helper functions at the bottom of config.lua are internal to the resource and
are not meant to be edited.
Data files
Three groups of owner-editable data ship outside config.lua. All of them are in
escrow_ignore, so you can read and edit them, and your edits survive updates.
shared/assets.lua declares the asset universe the Exchange trades: the coins and
companies, their sectors, and their per-asset tuning. Add, remove, or retune assets
there. The file opens with a field reference and the rules that keep the engine
stable, including the reminder that a symbol is a primary key and renaming one
orphans every player's position.
shared/display.lua holds the placement values for the in-world panels: where the
laptop and monitor screens sit on their props, their size and resolution, the focus
camera for each, and which monitor models the connect option appears on. The values
are meant to be tuned in-game rather than typed by hand, and the tuning commands
write a ready block back for pasting.
data/mdt/pack_generic.lua, pack_us.lua, and pack_fi.lua carry the MDT
vocabulary for each template pack, and charges_us.lua and charges_fi.lua carry
the charge catalogues with their fines and sentence lengths. An agency uses its
pack's charge list unless its charges field in Config.MDT.Agencies picks
another. Each file opens with
its own shape contract. The disk file is a seed: edits bosses make in-game are
layered on top of it and win, and the game never rewrites the file. A charge is
copied onto a case when it is filed, so retuning a catalogue never rewrites a case
that is already filed.
Server secrets (config_server.lua)
config_server.lua loads only on the server and never ships to clients. It extends the
same Config table. Put all secrets and API tokens here.
Config.Media.FiveManageTokenstringdefault: ''FiveManage Images API token, the one secret the media and Photos feature needs. Create an Images token in the FiveManage dashboard under API keys and paste it here. Leaving it empty keeps uploads disabled with a clean not-set-up state.
Never put this token in config.lua, which downloads to every client. It belongs only in config_server.lua.
Config.Media.FiveManageVideoTokenstringdefault: ''Separate FiveManage video token for MDT bodycam clips, only if your plan issues one. Left empty, clips upload with the image token above.
Config.JobsHubWebhookstabledefault: {}Per-job Discord webhook URLs, keyed by the job ids from Config.JobsHub.Jobs. Fires when Config.JobsHub.ApplicationWebhooks is true. This replaces the deprecated per-job webhook fields in config.lua.
Config.MDTWebhookstabledefault: {}Per-agency Discord webhook URLs, keyed by the agency keys from Config.MDT.Agencies. Fires when Config.MDT.ShiftAlert.Enabled is true. An agency with no key here sends no alert.