Skip to content

Configuration ​

All configuration lives in configs/, split by who may see it:

  • configs/config.lua - the config root: locale and debug switches
  • configs/shared/ - read by the client and the server
  • configs/server/ - server only. It is left out of the files the client downloads, so PINs, breach rewards and banking settings never reach a player

The full default files are on the Full Config Files pages in the sidebar. The sections below explain every setting.

General ​

configs/config.lua

SettingDefaultDescription
Locale'en'Loads locales/<Locale>.json, falling back to English key by key
DebugfalseDebug lines in the server and client console, the box zones drawn, and the /computer_pos and /computer_cam helpers. Leave off in production
DebugPrintsfalseEvery framework, inventory and target bridge call printed - only for tracking down an integration problem
DebugCategories-With DebugPrints, only these categories, e.g. { ['bridge:target'] = true }

Computers ​

configs/shared/computers.lua

Every computer the config makes. Each entry is either a location (a box zone at fixed coordinates) or a prop model (every prop of that model in the world). Computers placed or picked in the admin panel are kept in the database instead, and never need this file.

lua
-- A location computer: the MRPD front desk, locked to police, managing the police department
{
    id = 'mrpd_frontdesk',
    label = 'MRPD Front Desk',
    hostname = 'LSPD-MRPD-FD01',
    coords = vec3(441.62, -979.52, 30.68),
    size = vec3(1.0, 0.6, 0.6),
    rotation = 0.0,
    groups = { police = 0 },
    boss = 'police',
    style = 'modern',
    apps = { 'mail', 'files', 'browser', 'bank', 'logs', 'cmd', 'notepad', 'calculator', 'settings' },
},

-- A model computer: every business laptop in the world, managing whoever signs in's own job
{
    id = 'business_laptop',
    label = 'Business Laptop',
    hostname = 'BIZ-LAPTOP',
    model = { 'prop_laptop_01a', 'p_laptop_02_s', 'prop_laptop_lester' },
    boss = true,
    style = 'mac',
},
FieldTypeDescription
idstringUnique. Keys the computer's System Logs, its PIN and the breach targets reachable from it. A model computer keeps one log per prop: '<id>@x,y,z'
labelstringShown on the target option and in the OS (Start menu, systeminfo)
hostnamestringThe machine name in Command Prompt and the logs. Model computers add a short suffix per prop
coordsvector3Location computer: the centre of the box zone. The option only shows while the player is looking at a spot inside the box, so the box has to hold the monitor, keyboard or desk top
sizevector3?Box size. Default vec3(0.8, 0.8, 0.8)
rotationnumber?Box heading. Default 0.0
modelstring | string[]Model computer: prop model name(s). Every prop of these models becomes this computer, once model computers are switched on (see the warning below)
groupstable?Job or gang lock, ox_target style: { police = 0, sheriff = 2 } (name = lowest grade). nil = anyone. Checked by the server on open and on every action
bossstring | true?Business Manager. A job name manages that job; true manages whatever job the signed-in player has. Only that job's bosses ever see the app
stylestring?'modern', 'retro' or 'mac'. nil = Desktop.DefaultStyle. A script can choose another per open (OpenComputer)
appsstring[]?The apps it has (ids from Desktop.Apps). nil = Desktop.DefaultApps. boss is added by itself when boss is set
boardfalse?No Company Board on this computer
camerasfalse?No Security Cameras on this computer
photosfalse?No Photos on this computer, and no pictures in documents written there
phonefalse?None of sd-phone's apps on this computer, and no Phone Link (a police terminal, say)

The Company Board, Security Cameras, Photos and the phone apps are for a player, not a computer: they appear wherever that player qualifies for them, so they need no place in apps. List one only to choose where it sits.

Model computers are off out of the box

Until they are switched on, no prop in the world is a computer on its own: a computer is a location here, or one placed or picked in the panel. Switch them on at the top of the panel's Automatic tab, or with Automatic = true in configs/shared/admin.lua. The same tab switches single model computers, or single models of them, on and off and gives them a style. What the panel sets is kept in the database and wins over this file.

TIP

PINs are not set here: they are sensitive, and live in configs/server/security.lua.

Desktop and Styles ​

configs/shared/desktop.lua

SettingDefaultDescription
DefaultStyle'modern'The look of a computer whose entry has no style: 'modern' (SD OS Pro), 'retro' (SD Desktop 3.11) or 'mac' (SD OS Harbor)
BoottruePlay the style's boot sequence before the lock screen on every open
Clock24falsetrue = 18:05, false = 6:05 PM
Apps-Every app the OS knows: its label and default window size. A new app needs an entry here and in web/src/apps/registry.tsx
DefaultAppsmail, files, browser, bank, logs, cmd, notepad, calculator, games, settingsThe apps of a computer whose entry has no apps
Pinned-Taskbar (modern) and dock (mac) pins, in order, out of the apps the computer has
DesktopIcons-Desktop icons, in order, out of the apps the computer has

The app ids are mail, logs (Event Viewer), cmd (Command Prompt), boss (Business Manager), notepad, calculator, settings, files, browser, bank, games, board (Company Board), cameras, photos, and, with sd-phone, messages, notes, contacts and phonelink.

Styles ​

Styles gives each look its identity. Every character's wallpaper, accent and light or dark choice is kept per style, so a retro desk and a modern laptop keep their own.

SettingDescription
OsName / OsBuildWhat ver, systeminfo and Settings > About show
Wallpapers{ id, label } list. The built-in ids are drawn by the interface; any other id is used as an image address (https://...)
DefaultWallpaperThe wallpaper a character starts with
AccentsThe accent colours offered in Settings (on retro: the active title bar colour)
DefaultTheme'dark' or 'light'
Soundstrue = the style's synthesized system sounds (start-up, sign-in, windows, clicks, notifications). There are no audio files
Monitorretro only. true = draw the desktop inside a beige CRT, false = full screen. At a prop's screen the CRT is always left off: the prop is the monitor

Interaction and the Camera ​

configs/shared/interact.lua

SettingDefaultDescription
Target.label / icon / distance'Use Computer' / 'fas fa-desktop' / 1.8The target option on every computer
MaxDistance2.5Metres the player may drift from the computer before it closes. The server re-checks it on every action
View'screen''screen' = the camera goes up to the prop and the desktop sits inside its screen. 'fullscreen' = the desktop covers the game window. A computer with no screen to go to is fullscreen either way
Camera.Fill0.76How much of the window's height the prop's screen takes (0.3 - 0.95). The rest is bezel and room
Camera.Fov40.0Field of view: the wider, the more of the room is in the picture
Camera.Ease600Milliseconds the camera takes to get to the screen, and back
Camera.HideRadartruePut the minimap away while at the screen
Animtyping idle{ dict, clip } played while the computer is open. false = none
PosCommand'computer_pos'With Debug: copies the coordinates you aim at as a coords = vec3(...) line
CamCommand'computer_cam'With Debug: copies your view as a security camera's coords, rot and fov

Admin Panel ​

configs/shared/admin.lua

SettingDefaultDescription
Command'computeradmin'Opens the panel. The ace it grants is command.computeradmin
Group'group.admin'Ace principal with full access
ViewGroupfalseAce principal (e.g. 'group.mod') that can open the panel and look, but not change anything
EditAce'sd_computers.edit'The ace every change needs. Granted to Group by itself
PlaceReach6.0A new placement starts on the desk, counter or floor you look at within this many metres, otherwise a step in front of you
Placement.SnapMove / SnapTurn0.25 / 15.0Metres and degrees per step while snapping is on
Placement.Nudge0.05Metres per frame the arrow keys move a placement (Shift x5)
Placement.TurnStep5.0Degrees per mouse-wheel notch (Shift: 15, Ctrl: 1)
RefreshMs5000How often the open panel refreshes
SpawnDistance60.0Metres from a placed computer its prop is spawned at
MaxLabel48Longest name a placed computer can have
MaxCustomProps64Most props that can be added from the panel
AutomaticfalseWhether the model computers of computers.lua are on. Where the panel's Automatic switch starts; once flipped there, the database wins
Props25 propsThe props a computer can be placed as, and picked from the world as. See Props & Screens

Screens ​

configs/shared/screens.lua

What a computer shows on its prop, out in the world: its lock face while nobody is using it, and a live copy of the desktop while somebody is. See Props & Screens.

SettingDefaultDescription
Enabledtruefalse = no screens: props keep their stock look and nothing of a session is shared
Distance12.0Metres a screen is drawn from. The server checks the same distance before it shares a session
MaxScreens12Most screens drawn at once, nearest first
MaxLive3Most computers in use mirrored at once, nearest first
Resolution1024 x 576The texture every screen is drawn at: lower is cheaper, higher is sharper up close
Idle'lock'What an unused computer shows: 'lock' (its style's lock face) or 'off' (the prop's stock texture)
Mirror.Enabledtruefalse = a computer in use keeps its lock face: nothing of a session leaves the player's game
Mirror.CanvasFps3Frames a second the hacking minigames are copied at (0 = their window shows, the game inside it does not)
Mirror.MaxWatchers12Most players one session is shared with at a time
Mirror.SelffalseAlso draw your own session on the prop, for testing alone (needs View = 'fullscreen')
Models-Where the screen is on each prop model. See Props & Screens > Drawing a prop's screen

Mail ​

configs/shared/mail.lua and configs/server/mail.lua

SettingDefaultDescription
Domain'lsmail.com'Every address is <username>@<Domain>. Pick it before players sign up: changing it later orphans existing accounts
MaxSignedIn5Addresses one character can be signed into at once
MaxCreatedPerCharacter3Addresses one character may ever create
MaxRecipients / MaxSubject / MaxBody20 / 200 / 10000Compose limits. The interface enforces them and the server re-checks every one
MinPassword / MaxDisplayName6 / 40Account limits
BouncetrueMail to an address that does not exist bounces back to the sender. false = dropped silently
NotifyOffComputertrueRecipients who are not at a computer also get a normal notification
RateLimit.Send / SignUp / SignIn2 / 30 / 2Server: seconds between sends, account creations and sign-in attempts, per character
MaxMailbox500Server: messages kept per address per folder; the oldest are trimmed
BounceFromMail Delivery SubsystemServer: who bounces come from

Accounts are shared, not per character: anyone who knows an address's password can sign in to it from any computer. That makes company inboxes and stolen-password roleplay work. With sd-phone linked, Mail uses the phone's accounts instead (see sd-phone Link).

configs/shared/phone.lua

SettingDefaultDescription
Enabled'auto''auto' = link whenever sd-phone is started. false = never
Resource'sd-phone'sd-phone's resource name, if you renamed it
MailtrueMail uses the phone's mail accounts
Messages / Notes / ContactstrueAdd those apps (the phone's texts, notes and address book)
Files / Photos / BanktrueFiles also lists the phone's documents, Photos its gallery, and Bank takes its statement from the phone
RequireLinktrueThe phone's apps wait until the character links their phone to that machine with a code (Phone Link). false = they are simply there
LinkCodeMinutes5How long a code works
RequirePhonetrueThe phone's apps only for players carrying a phone

See sd-phone Link for what each part does.

Files, Photos, Bank and Company Board ​

FileSettingDefaultDescription
files.luaMaxFiles100Most documents one character keeps
MaxName80Longest file name
MaxBody20000Longest document, in characters of its text
photos.luaEnabledtruefalse = no Photos, and no pictures in documents
MaxPhotos200Most pictures one character keeps
Hostsimgur, fivemanage, discord, ...The hosts a picture may be linked from (a host covers its subdomains). false = any https address
bank.luaEnabledtruefalse = the Bank app shows nothing
TransactionLimit50Recent transactions shown and charted (100 at most)
board.luaEnabledtruefalse = no Company Board
NoBoard{ 'unemployed' }Jobs that are not a company: nobody in one gets the app
MaxPosts / MaxTitle / MaxBody50 / 80 / 2000Announcements kept per job, longest headline, longest announcement

Keep Hosts to image hosts you trust

A picture is fetched by the game of everyone who looks at it, and a document with a picture can be printed and handed to anybody. An open list would let a player learn another player's IP address by handing them a page. See Security.

Browser ​

configs/shared/browser.lua

The Browser is a closed network: only the sites listed here exist. Each site is sd-phone's public app shown live, a page written in the file, or your own web page embedded. See Browser Sites for every field.

SettingDefaultDescription
Home'home'The address a new window and tab open on. 'home' = the built-in start page
Sites8 sitesEvery site a computer can open

Security Cameras ​

configs/shared/cameras.lua

SettingDefaultDescription
Enabledtruefalse = the Security Cameras app never appears
Pan60.0Degrees a camera turns either way from how it was set up
Tilt25.0Degrees it tips up or down
Zoom3.0Times it zooms in at most
Filter'cctv'The picture: 'cctv' (black and white, grain, scan lines), 'colour' (colour, scan lines) or 'none' (clean)
Cameras3 camerasCameras written in the config. Most servers put them up from the admin panel instead

Each camera in Cameras:

FieldDescription
idUnique string
labelWhat it is called in the list ("Lobby")
areaThe heading it is listed under ("Mission Row Police Station"). Optional
coordsvector3: where the camera is
rotvector3: pitch, roll, yaw, as GetGameplayCamRot(2) gives them. With Debug, stand where it goes and run /computer_cam
fovDegrees it sees (default 60)
groupsJob or gang lock, like a computer's. nil = anyone at a computer with the app
computersComputer ids it can be watched from. nil = any

Printers ​

configs/shared/printers.lua

SettingDefaultDescription
Enabledtruefalse = nothing prints: no Print in the apps, nothing to take from a printer
Item'printed_document'The inventory item a printout is (Installation)
Range30.0Metres from a computer a printer may stand and still be printed to
MaxCopies5Most copies of a page in one go
PageSeconds2.5Seconds each copy takes to come out
TrayLimit25Copies a printer holds uncollected; a full one prints nothing more
TrayMinutes60Minutes an uncollected copy waits before it is thrown away (0 = for ever)
OwnOnlyfalsetrue = only whoever printed a page may take it from the tray
MaxChars20000Longest text a page holds
KeepDays0Days a page can still be read after it was printed (0 = for ever). Past that the item opens faded
ReadAnimationtrueThe character looks down at a clipboard while a page is open
SignaturestrueLines on a document can be signed. false = the lines print, but nobody can sign them
Target'Take printouts'The option on a printer
Props4 printersThe props a printer can be placed as and picked from the world as. See Props & Screens

Hacking ​

configs/shared/hacks.lua, configs/server/hacks.lua and configs/server/targets.lua

SettingDefaultDescription
Practicetruehack <game> practice runs in Command Prompt (logged, no reward). false = only real targets
DefaultDifficulty'medium'The difficulty when none is given
Games10 gamesThe minigames: the key players type, the program it "launches", the window title. Removing one hides it from practice and from StartHack
Presets-Each game's settings for easy, medium and hard. The server works out each run's anti-cheat floor from the same numbers
Proof.MinFloor3.0Server: no run is ever accepted faster than this many seconds
Proof.Grace2.0Server: survival games (cipher, evasion) must run for their time limit minus this
Proof.Safety0.85Server: margin on the throughput floors, so lag never rejects a genuinely fast run
TokenTTL600Server: seconds a started run stays redeemable
StartGap1.0Server: seconds between two run starts by the same player
ProofTTL120Server: seconds a StartHack proof waits to be redeemed

The breach targets in targets.lua, their steps and their rewards are on Hacking & Breach Targets.

Business Manager ​

configs/shared/boss.lua and configs/server/boss.lua

SettingDefaultDescription
Enabledtruefalse = the Business Manager never appears, whatever computers.lua says
HireRadius10.0Players within this many metres of the computer are listed to hire. They get a prompt and join at the lowest grade
HireByIdtrueBosses can also send the offer to any player online by their server id. Nobody joins without accepting, and the boss does not see their name until they do
FundstrueSociety funds. Hidden by itself when no supported banking resource runs
DepositFrom{ 'bank', 'cash' }Where a boss may deposit from
WithdrawTo'bank'Where withdrawals land: 'bank' or 'cash'
TransactionLimit50Recent society transactions shown and charted
Banking'auto'Server: the society banking resource. 'auto' = the first started of sd-banking and Renewed-Banking; a resource name forces one; false = no society funds
MaxTransfer1000000Server: largest single deposit or withdrawal

PINs and Lockout ​

configs/server/security.lua

lua
Pins = {
    mrpd_frontdesk = '1031',
},
MaxAttempts = 3,
Lockout = 60,
SettingDefaultDescription
PinsnoneA PIN per computer, keyed by its id. A computer listed here shows a PIN box on its sign-in screen; the rest sign straight in. PINs are compared on the server and the client never learns them
MaxAttempts3Wrong PINs in a row before that player is locked out of that computer
Lockout60Seconds the lockout lasts. Every failure is written to the computer's System Logs

System Logs ​

configs/server/logs.lua

SettingDefaultDescription
RetentionDays14Entries older than this are purged at boot and every 6 hours (0 = keep for ever)
PageSize200Entries per Event Viewer page
AllowCleartrueWhether a log can be cleared at all. A clear is itself logged (event 1102), so a wiped log always shows who wiped it
ClearGroupsnilOnly these jobs may clear, e.g. { police = 3 }. nil = everyone signed in
AppLaunchtrueWrite "Application started" each time an app opens
MailSenttrueWrite the sender, recipients and subject of every mail sent from that computer

Sign-ins, sign-outs, hacks and Business Manager actions are always written. Other resources can write their own entries with AddLog.