NX CreativeNX CreativeDocs
Scriptsnx_computer

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: true

Whether 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: 3

How 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: nil

Framework-backend cash account name. nil uses stock naming per framework.

Config.Banking.BankAccountstringdefault: nil

Framework-backend bank account name. nil uses stock naming per framework.

Config.Banking.MinTransfernumberdefault: 1

Smallest transfer, request, or scheduled payment.

Config.Banking.MaxTransfernumberdefault: 1000000

Largest single transfer, request, or scheduled payment.

Config.Banking.TransferMemoMaxLennumberdefault: 140

Memo character cap. 0 disables memos.

Config.Banking.MaxTransfersPerMinutenumberdefault: 6

Per-account outbound burst cap. Guards against a compromised client sweeping an account. The scheduled-payment watcher is exempt. 0 disables it.

Config.Banking.DailyTransferCapnumberdefault: 5000000

Per-account outbound total over a trailing 24 hours, in fiat.

Config.Banking.SchedulePollIntervalMsnumberdefault: 60000

Framework-backend standing-payment watcher cadence in milliseconds, clamped between 15 seconds and 10 minutes.

Config.Banking.MoneyRefreshDebounceMsnumberdefault: 250

Delay in milliseconds before an open laptop refreshes after money moves, clamped between 50 and 2000.

Config.Banking.Adaptertabledefault: nil

Custom 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.Externaltable

SDK 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: true

Master toggle. false makes every registration call be ignored.

Config.Apps.External.Allowarraydefault: nil

Resource 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: 24

Ceiling on the number of registered external apps.

Config.Apps.Storetable

NX 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: true

Master 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.5

ox_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: true

Whether a placed laptop can be picked back up.

Config.PlaceDistancenumberdefault: 5.0

Maximum placement distance in meters.

Config.PreviewAlphanumberdefault: 100

Opacity of the ghost placement preview.

Config.PickupMaxDistancenumberdefault: 5.0

Server-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: true

Master toggle for lap mode.

Config.Vehicle.StopSpeednumberdefault: 0.5

Speed 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: 350

Open and close fade in milliseconds.

Config.Vehicle.LidMsnumberdefault: 250

Milliseconds 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: true

Master 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.55

How level a panel must be to accept the laptop. 1 is perfectly flat.

Config.VehiclePlacement.SurfaceOffsetnumberdefault: 0.0

Extra lift off the panel in meters.

Config.VehiclePlacement.ReturnDistancenumberdefault: 25.0

When the vehicle is gone, the laptop goes straight back to the owner if they are within this many meters.

Config.VehiclePlacement.ReturnGraceMsnumberdefault: 180000

Otherwise the laptop returns when the owner comes back in range, or after this many milliseconds.

Config.VehiclePlacement.AnchorLostMsnumberdefault: 20000

Milliseconds a vehicle can stay unreachable before it counts as gone.

Config.VehiclePlacement.FocusMaxDistancenumberdefault: 4.5

The 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: 25

Trade fee in basis points. 25 equals 0.25 percent.

Config.Exchange.MinNotionalnumberdefault: 1

Smallest trade value in fiat. Keep it at 1 or above so zero-fee dust trades are rejected.

Config.Exchange.MaxSlippageBpsnumberdefault: 200

Maximum drift in basis points between the displayed quote and the fill price. 200 equals 2 percent. 0 disables the check.

Config.Exchange.StaleQuoteMsnumberdefault: 30000

A protected fill whose quote is older than this many milliseconds is rejected.

Config.Exchange.OrderPollIntervalMsnumberdefault: 5000

Limit-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.Markettable

Engine tuning for the simulated market.

Config.Exchange.Market.Enabledbooleandefault: true

Master 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: 5000

How often prices move, in milliseconds. Also the floor for live price refreshes.

Config.Exchange.Market.BackfillDaysnumberdefault: 30

Days of history generated on the first boot.

Config.Exchange.Market.Speednumberdefault: 4.0

Market clock. 4.0 means one real day carries four market days of movement.

Config.Exchange.Market.Volatilitynumberdefault: 1.0

Multiplies every asset's configured volatility. 1.0 leaves it as configured.

Config.Exchange.Market.Eventstable

News events that move prices server-wide.

Config.Exchange.Market.Events.Enabledbooleandefault: true

Whether news events fire at all.

Config.Exchange.Market.Events.MeanMinutesnumberdefault: 45

Average real minutes between news events, server-wide.

Config.Exchange.Market.Events.Magnitudenumberdefault: 1.0

Event size multiplier. 2.0 is twice as violent.

Config.Exchange.Market.PlayerImpacttable

Whether settled player trades nudge the price. Off by default.

Config.Exchange.Market.PlayerImpact.Enabledbooleandefault: false

When 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.15

Nudge size per dollar traded, from 0 to 1.

Config.Exchange.Market.PlayerImpact.HourlyAccountAdvCapnumberdefault: 0.25

Largest 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.MarketHourstable

Opening hours for stocks. Off by default. Crypto never freezes either way.

Config.Exchange.Market.MarketHours.Enabledbooleandefault: false

Whether stock trading closes outside market hours.

Config.Exchange.Market.MarketHours.OpenHournumberdefault: 9.5

Opening time in server-local hours. 9.5 is 09:30.

Config.Exchange.Market.MarketHours.CloseHournumberdefault: 16.0

Closing 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.Retentiontable

Days each chart resolution is kept. Daily candles are kept forever.

Config.Exchange.Market.Retention.OneMinDaysnumberdefault: 2

Days of one-minute candles.

Config.Exchange.Market.Retention.FiveMinDaysnumberdefault: 14

Days of five-minute candles. The 24 hour change is read from these, so keep it at 1 or above.

Config.Exchange.Market.Retention.HourDaysnumberdefault: 90

Days 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: 1000000

Absolute 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.Payoutstable

Blackjack payout multipliers.

Config.Casino.Payouts.BlackjackWinnumberdefault: 2.0

Payout multiplier for a standard Blackjack win.

Config.Casino.Payouts.Blackjacknumberdefault: 2.5

Payout multiplier for a natural blackjack.

Config.Casino.Payouts.BlackjackPushnumberdefault: 1.0

Payout multiplier for a push, returning the stake.

Config.Casino.HiLotable

Hi-Lo pays fair odds per call, computed live from the remaining deck.

Config.Casino.HiLo.HouseEdgenumberdefault: 0.05

House hold per call. Expected value stays at 0.95 at any streak length.

Config.Casino.HiLo.MaxPerGuessMultipliernumberdefault: 20.0

Cap on the multiplier offered for a single call.

Config.Casino.VideoPokerPaytabletable

Map 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.RoulettePayoutstable

Map 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: true

Master 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: 0

Flat fee to create a player-run listing.

Config.Darknet.MinPricenumberdefault: 250

Minimum price for a player-run listing.

Config.Darknet.MaxPricenumberdefault: 500000

Maximum price for a player-run listing.

Config.Darknet.PayInCryptotable

Charges darknet purchases from the buyer's coin wallet instead of cash.

Config.Darknet.PayInCrypto.Enabledbooleandefault: true

Charge 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.Pickuptable

Courier 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.DropPointsarray

Player-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: 48

Hours 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.Catalogarray

Products 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: true

Master toggle for the marketplace app.

Config.VehicleMarket.ListingFeenumberdefault: 0

Flat fee charged to the seller to create a listing.

Config.VehicleMarket.TaxPercentnumberdefault: 0

Percentage deducted from the sale price on a successful purchase.

Config.VehicleMarket.MinPricenumberdefault: 1000

Minimum allowed listing price.

Config.VehicleMarket.MaxPricenumberdefault: 2500000

Maximum allowed listing price.

Jobs hub

Config.JobsHub.Enabledbooleandefault: true

Master toggle for the jobs app.

Config.JobsHub.ApplicationWebhooksbooleandefault: false

Discord 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.Jobsarray

Job 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: true

Master toggle for the website builder.

Config.SiteBuilder.AllowedRankstable

Rank 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: 3

Minimum slug length.

Config.SiteBuilder.Slug.MaxLengthnumberdefault: 32

Maximum slug length.

Config.SiteBuilder.Slug.Reservedarray

Slugs 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: 60

Maximum content blocks per site.

Config.SiteBuilder.Limits.MaxJobsnumberdefault: 20

Maximum job openings per site.

Config.SiteBuilder.Limits.MaxProductsnumberdefault: 50

Maximum products per site.

Config.SiteBuilder.Limits.MaxInquiriesShownnumberdefault: 200

Maximum inquiries shown to a site owner.

Config.SiteBuilder.Limits.MaxReviewsShownnumberdefault: 200

Maximum reviews shown on a site.

Config.SiteBuilder.Limits.InquiryBodyMaxnumberdefault: 1500

Character cap on an inquiry body.

Config.SiteBuilder.Limits.ReviewBodyMaxnumberdefault: 600

Character 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.Directorytable

Directory-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: true

Master toggle. false makes every registration call be ignored.

Config.SiteBuilder.Directory.Allowarraydefault: nil

Slug 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: 24

Ceiling 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: true

Whether 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: true

Master 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: 10

Minutes between Breaking stories, server-wide.

Config.Newsroom.BreakingHoursnumberdefault: 6

How 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: true

Master toggle. false hides the whole Forwarding pane in the Email app.

Config.EmailForwarding.MaxTargetsnumberdefault: 10

Maximum handle rules per account. The job rule is counted separately.

Config.EmailForwarding.AllowJobTargetsbooleandefault: true

Whether the forward-to-everyone-in-my-job toggle is offered.

Config.EmailForwarding.MaxJobFanOutnumberdefault: 50

Maximum 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 * 1024

Ceiling 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: true

Whether 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: 60

Rate-limit window in seconds.

Config.Media.RateLimit.Burstnumberdefault: 8

Uploads allowed per window. 0 turns the limit off.

Config.Media.PageSizenumberdefault: 60

Photos gallery page size.

Config.Media.MaxPerAccountnumberdefault: 500

Maximum stored rows per account. The oldest are pruned on upload.

Config.Media.PhoneSynctable

Mirrors 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: 30

Seconds between checks for new phone photos.

Config.Media.PhoneSync.Folderstringdefault: 'Phone'

Folder name under Pictures.

Config.Media.PhoneSync.Backfillbooleandefault: false

true 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: 4000

Events inside this window in milliseconds are grouped into one notification, such as 3 new emails.

Config.PhoneBridge.MaxPerMinnumberdefault: 8

Hard ceiling of phone notifications per player per minute.

Filesystem

Explorer, desktop, and Recycle Bin.

Config.Filesystem.MaxItemsnumberdefault: 600

Total items per account including the Recycle Bin. The disk reports full past this.

Config.Filesystem.MaxFileBytesnumberdefault: 16000

Size ceiling per text file in bytes.

Config.Filesystem.MaxCopyNodesnumberdefault: 120

Maximum 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: true

Master 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: 1500

Milliseconds between shots.

Config.Camera.Encodingstringdefault: 'jpg'

Image encoding. One of jpg, png, or webp.

Config.Camera.UploadMbpsnumberdefault: 1

Pacing in megabits per second for the fallback upload path. Unused while the screencapture resource is running.

Config.Camera.Gridbooleandefault: true

Whether the rule-of-thirds grid shows by default.

Config.Camera.Lensbooleandefault: true

Optical lens treatment on the viewfinder. false gives a flat viewfinder, which is lighter on low-end clients.

Config.Camera.LookSensitivitynumberdefault: 6.0

Mouse-look speed in photo mode.

Config.Camera.AllowMovementbooleandefault: true

Whether the player can walk and sprint while framing a shot. false keeps them standing still.

Config.Camera.MinFovnumberdefault: 18.0

Maximum zoom-in. Lower is closer.

Config.Camera.MaxFovnumberdefault: 70.0

Zoomed-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: false

Developer-only prop placement tuner for the camera. Keep it false in production.

Config.Camera.Proptable

Held 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.Filtersarray

Visual 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: true

Master 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: false

true consumes one film item per print.

Config.Camera.Polaroid.FilmItemstringdefault: 'polaroid_film'

Inventory item consumed when RequireFilm is true.

Config.Camera.Polaroid.MaxMetadataCharsnumberdefault: 512

Character cap on the capture metadata stored with a print.

Config.Camera.Polaroid.FilmLookbooleandefault: true

Whether 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: 25

Meters within which a polaroid renders its photo.

Config.Camera.Polaroid.Inspect.TargetDistancenumberdefault: 1.6

ox_target pickup range on a placed polaroid, in meters.

Config.Camera.Polaroid.Place.Enabledbooleandefault: true

Whether 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: 5

Maximum placement distance in meters.

Config.Camera.Polaroid.Place.MaxActivenumberdefault: 24

Maximum 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.Writetable

Drawing on a held polaroid. Needs the free nx_write resource. Without it every part of this block no-ops.

Config.Camera.Polaroid.Write.Enabledbooleandefault: true

Whether drawing on a held polaroid is offered.

Config.Camera.Polaroid.Write.Keynumberdefault: 74

Control 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: true

Master 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.0

Maximum meters from lens to wall before no surface is reported.

Config.Projector.MinThrownumberdefault: 0.8

Closer than this leaves no room for an image.

Config.Projector.ThrowRationumberdefault: 0.55

Image width equals distance times this ratio, clamped, at 16 by 9.

Config.Projector.MinWidthnumberdefault: 0.9

Minimum image width in meters.

Config.Projector.MaxWidthnumberdefault: 6.0

Image width stops growing here.

Config.Projector.WallGapnumberdefault: 0.022

Meters the image floats off the wall, guarding against z-fighting.

Config.Projector.ResWnumberdefault: 1280

Projected image width in pixels.

Config.Projector.ResHnumberdefault: 720

Projected image height in pixels.

Config.Projector.Alphanumberdefault: 240

Image opacity. Below 255 gives a slightly translucent beamer wash.

Config.Projector.FlipImagebooleandefault: false

Flip the image if an odd surface renders it rotated 180 degrees.

Config.Projector.DetectRadiusnumberdefault: 8.0

Maximum laptop to projector distance for the connect option.

Config.Projector.PlaceDistancenumberdefault: 6.0

Item placement distance, mounted against a ceiling.

Config.Projector.Calibration.Enabledbooleandefault: true

Whether the player-facing calibrate option is offered.

Config.Projector.Calibration.MaxVerticalnumberdefault: 0.50

Meters of up and down lens shift.

Config.Projector.Calibration.MaxHorizontalnumberdefault: 0.25

Meters of left and right lens shift.

Config.Projector.Calibration.MinScalenumberdefault: 0.75

Lower bound of the zoom range, times the throw-derived size.

Config.Projector.Calibration.MaxScalenumberdefault: 1.25

Upper bound of the zoom range.

Config.Projector.Calibration.Stepnumberdefault: 0.02

Meters per arrow nudge. Hold Shift for five times the step.

Config.Projector.Calibration.ScaleStepnumberdefault: 0.02

Zoom change per scroll notch.

Config.Projector.Camera.fovnumberdefault: 50.0

Field of view while the projection is focused.

Config.Projector.Camera.marginnumberdefault: 1.18

Framing margin around the projection.

Config.Projector.Camera.distancenumberdefault: nil

Camera distance. nil auto-frames the projection.

Config.Projector.Beam.Enabledbooleandefault: true

Whether the visible light cone renders.

Config.Projector.Beam.Colortabledefault: { r = 226, g = 233, b = 255 }

Base beam color.

Config.Projector.Beam.Brightnessnumberdefault: 0.12

Beam brightness.

Config.Projector.Beam.Hardnessnumberdefault: 0.17

Beam edge hardness.

Config.Projector.Beam.Falloffnumberdefault: 25.0

Beam falloff rate.

Config.Projector.Beam.TintFromScreennumberdefault: 0.7

How far the cone blends toward the average on-screen color.

Config.Projector.Beam.Shaft.Enabledbooleandefault: true

Whether the layered light shaft renders.

Config.Projector.Beam.Shaft.Alphanumberdefault: 10

Per-layer alpha from 0 to 255.

Config.Projector.Beam.Shaft.Layersnumberdefault: 3

Nested planes from full cone down to a hot core.

Config.Projector.Beam.Dust.Enabledbooleandefault: true

Whether 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: 4

Emitters spread along the beam.

Config.Projector.Beam.Dust.Scalenumberdefault: 2.0

Dust emitter scale.

Config.Projector.Fx.Additivebooleandefault: true

Additive blending for the projected image.

Config.Projector.Fx.Floornumberdefault: 0.8

Per-pixel alpha floor. 0 is physically pure, 1 is a flat screen.

Config.Projector.Fx.Blurnumberdefault: 0.6

Lens defocus in pixels.

Config.Projector.Fx.Chromanumberdefault: 0.8

RGB convergence error in pixels.

Config.Projector.Fx.Hotspotbooleandefault: true

Whether the center hotspot renders.

Config.Projector.Fx.Vignettenumberdefault: 0.34

Vignette strength.

Config.Projector.Fx.EdgeFeatherbooleandefault: true

Whether the image edges are feathered.

Config.Projector.Fx.Fringebooleandefault: true

Whether color fringing renders.

Config.Projector.Fx.PixelGridnumberdefault: 0.12

LCD screen-door structure opacity. 0 turns it off.

Config.Projector.Fx.Grainbooleandefault: true

Whether film grain renders.

Config.Projector.Fx.GrainOpacitynumberdefault: 0.12

Grain opacity.

Config.Projector.Fx.Flickerbooleandefault: true

Whether the image shimmers by about 1.5 percent.

Config.Projector.Glow.Pushnumberdefault: 0.27

Meters the wall glow sits in front of the surface.

Config.Projector.Glow.Rangenumberdefault: 2.4

Wall glow radius.

Config.Projector.Glow.Intensitynumberdefault: 1.7

Wall glow brightness.

Config.Projector.SyncForAllbooleandefault: true

Whether bystanders see the projected image, beam, and glow.

Config.Projector.SyncRadiusnumberdefault: 20.0

Meters 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: true

Master 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: 350

Camera glide time in milliseconds between displays. Lower is snappier.

Boot sequence

Config.Boot.Cinematicbooleandefault: true

Whether 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: 45000

Milliseconds 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: true

Master toggle for screen prewarm.

Config.Prewarm.Distancenumberdefault: 12.0

Meters 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: true

true mirrors the live screen to nearby players within SyncRadius. false keeps screen content private to the operator.

Config.Networking.SyncRadiusnumberdefault: 12.0

Meters 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: true

Master toggle for meetings.

Config.Meetings.MaxParticipantsnumberdefault: 6

Participants per meeting. 12 is the ceiling. Every extra participant costs every camera one more upload.

Config.Meetings.MaxMeetingsnumberdefault: 25

Live meetings server-wide.

Config.Meetings.MaxMinutesnumberdefault: 180

A meeting ends itself after this many minutes.

Config.Meetings.AwayGraceSecondsnumberdefault: 90

A 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.Sharetabledefault: { Width = 1280, Height = 720, Fps = 8, MaxKbps = 1500 }

Screen share resolution and frame rate. MaxKbps caps its upload.

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: true

Whether meetings carry voice.

Config.Meetings.Voice.ChannelBasenumberdefault: 900000

pma-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: true

Master toggle for the operator stance.

Config.Animation.FreezePedbooleandefault: true

Whether the operator is frozen while posed.

Config.Animation.BlendInnumberdefault: 4

Anim blend-in speed.

Config.Animation.BlendOutnumberdefault: -4

Anim blend-out speed.

Config.Animation.Align.Enabledbooleandefault: true

Whether the operator is aligned to the surface.

Config.Animation.Align.Headingbooleandefault: true

Whether heading is adjusted during alignment.

Config.Animation.Align.Slidebooleandefault: true

Whether the operator slides into position.

Config.Animation.Align.Lateralnumberdefault: 0

Lateral alignment offset.

Config.Animation.Align.PosTolerancenumberdefault: 0.3

Position tolerance in meters before a nudge is applied.

Config.Animation.Align.HeadingToleranceDegnumberdefault: 22

Heading tolerance in degrees before a turn is applied.

Config.Animation.Align.MaxNudgenumberdefault: 0.6

Maximum slide distance in meters.

Config.Animation.Align.SettleMsnumberdefault: 350

Settle time in milliseconds after alignment.

Config.Animation.Bandsarray

Ordered 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: true

Master 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: true

Whether the power-on chime plays from the laptop in 3D so bystanders hear it.

Config.Audio.Soundstable

Map 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: true

Master toggle for the screen glow.

Config.ScreenGlow.DayStartnumberdefault: 7

Hour at which daytime begins. Glow shows outside the daytime window or when inside an interior.

Config.ScreenGlow.DayEndnumberdefault: 19

Hour at which daytime ends.

Config.ScreenGlow.ForceAlwaysbooleandefault: false

true ignores the day and interior gate.

Config.ScreenGlow.Pushnumberdefault: 0.04

Meters the lights sit in front of the screen.

Config.ScreenGlow.Rangenumberdefault: 0.40

Per-light radius in meters.

Config.ScreenGlow.Intensitynumberdefault: 2.2

Per-light brightness.

Config.ScreenGlow.LerpRatenumberdefault: 6.0

Color easing per second. Higher is snappier.

Config.ScreenGlow.Flickernumberdefault: 0.04

Subtle screen flicker. 0 turns it off.

Config.ScreenGlow.Networkedbooleandefault: true

Whether the owner's zone colors broadcast so bystanders see the glow too.

Config.ScreenGlow.SyncRadiusnumberdefault: 14.0

Meters 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: true

Master toggle for the MDT.

Config.MDT.Agenciesarray

One 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.Retentiontable

Days a row is kept before the retention sweep removes it.

Config.MDT.Retention.AuditReadDaysnumberdefault: 14

Days audit rows for reads are kept. These are the bulk of the audit trail.

Config.MDT.Retention.AuditDaysnumberdefault: 180

Days audit rows for writes, decisions, and admin actions are kept.

Config.MDT.Retention.UnitTrackDaysnumberdefault: 30

Days of unit position history.

Config.MDT.Retention.BodycamDaysnumberdefault: 30

Days of bodycam clip metadata.

Config.MDT.ShiftAlerttable

Discord 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: true

Whether backup alerts are sent.

Config.MDT.ShiftAlert.CooldownMinutesnumberdefault: 30

Minimum gap between alerts per agency.

Config.MDT.ShiftAlert.DailyCapPerOfficernumberdefault: 3

Alerts one officer can trigger per day.

Config.MDT.JailAdaptertable

Hand-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: true

Whether live unit positions show on the tactical map.

Config.MDT.Tracks.Enabledbooleandefault: true

Whether route history and playback are recorded. Capped by Retention.UnitTrackDays.

Config.MDT.Trackers.Enabledbooleandefault: true

Master toggle for GPS trackers.

Config.MDT.Trackers.BatteryMinutesnumberdefault: 120

Tracker battery life in minutes. A random variation of plus or minus 10 percent is applied per tracker.

Config.MDT.Trackers.RequireWarrantbooleandefault: false

true refuses tracker attachment without an approved warrant.

Config.MDT.Bodycam.Enabledbooleandefault: true

Master 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: 60

Hard ceiling per clip in seconds, enforced server-side.

Config.MDT.LiveBodycamtable

A 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: true

Master toggle for live bodycam.

Config.MDT.LiveBodycam.MaxMinutesnumberdefault: 10

One 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: true

Seized phones, cell tower dumps and device traces in the MDT. Needs nx_phone running.

Config.MDT.External.Enabledbooleandefault: false

Whether 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.VehicleTablestable

Per-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: nil

Base 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: 50000

Money 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: false

The 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: false

Master 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: true

Lets 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.

NX Docs