Configuration
All configuration lives in configs/, split by who may see it:
configs/config.lua- the config root: locale and debug switchesconfigs/shared/- read by the client and the serverconfigs/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
| Setting | Default | Description |
|---|---|---|
Locale | 'en' | Loads locales/<Locale>.json, falling back to English key by key |
Debug | false | Debug lines in the server and client console, the box zones drawn, and the /computer_pos and /computer_cam helpers. Leave off in production |
DebugPrints | false | Every 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.
-- 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',
},| Field | Type | Description |
|---|---|---|
id | string | Unique. 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' |
label | string | Shown on the target option and in the OS (Start menu, systeminfo) |
hostname | string | The machine name in Command Prompt and the logs. Model computers add a short suffix per prop |
coords | vector3 | Location 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 |
size | vector3? | Box size. Default vec3(0.8, 0.8, 0.8) |
rotation | number? | Box heading. Default 0.0 |
model | string | 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) |
groups | table? | 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 |
boss | string | 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 |
style | string? | 'modern', 'retro' or 'mac'. nil = Desktop.DefaultStyle. A script can choose another per open (OpenComputer) |
apps | string[]? | The apps it has (ids from Desktop.Apps). nil = Desktop.DefaultApps. boss is added by itself when boss is set |
board | false? | No Company Board on this computer |
cameras | false? | No Security Cameras on this computer |
photos | false? | No Photos on this computer, and no pictures in documents written there |
phone | false? | 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
| Setting | Default | Description |
|---|---|---|
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) |
Boot | true | Play the style's boot sequence before the lock screen on every open |
Clock24 | false | true = 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 |
DefaultApps | mail, files, browser, bank, logs, cmd, notepad, calculator, games, settings | The 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.
| Setting | Description |
|---|---|
OsName / OsBuild | What 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://...) |
DefaultWallpaper | The wallpaper a character starts with |
Accents | The accent colours offered in Settings (on retro: the active title bar colour) |
DefaultTheme | 'dark' or 'light' |
Sounds | true = the style's synthesized system sounds (start-up, sign-in, windows, clicks, notifications). There are no audio files |
Monitor | retro 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
| Setting | Default | Description |
|---|---|---|
Target.label / icon / distance | 'Use Computer' / 'fas fa-desktop' / 1.8 | The target option on every computer |
MaxDistance | 2.5 | Metres 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.Fill | 0.76 | How much of the window's height the prop's screen takes (0.3 - 0.95). The rest is bezel and room |
Camera.Fov | 40.0 | Field of view: the wider, the more of the room is in the picture |
Camera.Ease | 600 | Milliseconds the camera takes to get to the screen, and back |
Camera.HideRadar | true | Put the minimap away while at the screen |
Anim | typing 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
| Setting | Default | Description |
|---|---|---|
Command | 'computeradmin' | Opens the panel. The ace it grants is command.computeradmin |
Group | 'group.admin' | Ace principal with full access |
ViewGroup | false | Ace 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 |
PlaceReach | 6.0 | A 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 / SnapTurn | 0.25 / 15.0 | Metres and degrees per step while snapping is on |
Placement.Nudge | 0.05 | Metres per frame the arrow keys move a placement (Shift x5) |
Placement.TurnStep | 5.0 | Degrees per mouse-wheel notch (Shift: 15, Ctrl: 1) |
RefreshMs | 5000 | How often the open panel refreshes |
SpawnDistance | 60.0 | Metres from a placed computer its prop is spawned at |
MaxLabel | 48 | Longest name a placed computer can have |
MaxCustomProps | 64 | Most props that can be added from the panel |
Automatic | false | Whether the model computers of computers.lua are on. Where the panel's Automatic switch starts; once flipped there, the database wins |
Props | 25 props | The 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.
| Setting | Default | Description |
|---|---|---|
Enabled | true | false = no screens: props keep their stock look and nothing of a session is shared |
Distance | 12.0 | Metres a screen is drawn from. The server checks the same distance before it shares a session |
MaxScreens | 12 | Most screens drawn at once, nearest first |
MaxLive | 3 | Most computers in use mirrored at once, nearest first |
Resolution | 1024 x 576 | The 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.Enabled | true | false = a computer in use keeps its lock face: nothing of a session leaves the player's game |
Mirror.CanvasFps | 3 | Frames a second the hacking minigames are copied at (0 = their window shows, the game inside it does not) |
Mirror.MaxWatchers | 12 | Most players one session is shared with at a time |
Mirror.Self | false | Also 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
| Setting | Default | Description |
|---|---|---|
Domain | 'lsmail.com' | Every address is <username>@<Domain>. Pick it before players sign up: changing it later orphans existing accounts |
MaxSignedIn | 5 | Addresses one character can be signed into at once |
MaxCreatedPerCharacter | 3 | Addresses one character may ever create |
MaxRecipients / MaxSubject / MaxBody | 20 / 200 / 10000 | Compose limits. The interface enforces them and the server re-checks every one |
MinPassword / MaxDisplayName | 6 / 40 | Account limits |
Bounce | true | Mail to an address that does not exist bounces back to the sender. false = dropped silently |
NotifyOffComputer | true | Recipients who are not at a computer also get a normal notification |
RateLimit.Send / SignUp / SignIn | 2 / 30 / 2 | Server: seconds between sends, account creations and sign-in attempts, per character |
MaxMailbox | 500 | Server: messages kept per address per folder; the oldest are trimmed |
BounceFrom | Mail Delivery Subsystem | Server: 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).
sd-phone Link
configs/shared/phone.lua
| Setting | Default | Description |
|---|---|---|
Enabled | 'auto' | 'auto' = link whenever sd-phone is started. false = never |
Resource | 'sd-phone' | sd-phone's resource name, if you renamed it |
Mail | true | Mail uses the phone's mail accounts |
Messages / Notes / Contacts | true | Add those apps (the phone's texts, notes and address book) |
Files / Photos / Bank | true | Files also lists the phone's documents, Photos its gallery, and Bank takes its statement from the phone |
RequireLink | true | The phone's apps wait until the character links their phone to that machine with a code (Phone Link). false = they are simply there |
LinkCodeMinutes | 5 | How long a code works |
RequirePhone | true | The phone's apps only for players carrying a phone |
See sd-phone Link for what each part does.
Files, Photos, Bank and Company Board
| File | Setting | Default | Description |
|---|---|---|---|
files.lua | MaxFiles | 100 | Most documents one character keeps |
MaxName | 80 | Longest file name | |
MaxBody | 20000 | Longest document, in characters of its text | |
photos.lua | Enabled | true | false = no Photos, and no pictures in documents |
MaxPhotos | 200 | Most pictures one character keeps | |
Hosts | imgur, fivemanage, discord, ... | The hosts a picture may be linked from (a host covers its subdomains). false = any https address | |
bank.lua | Enabled | true | false = the Bank app shows nothing |
TransactionLimit | 50 | Recent transactions shown and charted (100 at most) | |
board.lua | Enabled | true | false = no Company Board |
NoBoard | { 'unemployed' } | Jobs that are not a company: nobody in one gets the app | |
MaxPosts / MaxTitle / MaxBody | 50 / 80 / 2000 | Announcements 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.
| Setting | Default | Description |
|---|---|---|
Home | 'home' | The address a new window and tab open on. 'home' = the built-in start page |
Sites | 8 sites | Every site a computer can open |
Security Cameras
configs/shared/cameras.lua
| Setting | Default | Description |
|---|---|---|
Enabled | true | false = the Security Cameras app never appears |
Pan | 60.0 | Degrees a camera turns either way from how it was set up |
Tilt | 25.0 | Degrees it tips up or down |
Zoom | 3.0 | Times it zooms in at most |
Filter | 'cctv' | The picture: 'cctv' (black and white, grain, scan lines), 'colour' (colour, scan lines) or 'none' (clean) |
Cameras | 3 cameras | Cameras written in the config. Most servers put them up from the admin panel instead |
Each camera in Cameras:
| Field | Description |
|---|---|
id | Unique string |
label | What it is called in the list ("Lobby") |
area | The heading it is listed under ("Mission Row Police Station"). Optional |
coords | vector3: where the camera is |
rot | vector3: pitch, roll, yaw, as GetGameplayCamRot(2) gives them. With Debug, stand where it goes and run /computer_cam |
fov | Degrees it sees (default 60) |
groups | Job or gang lock, like a computer's. nil = anyone at a computer with the app |
computers | Computer ids it can be watched from. nil = any |
Printers
configs/shared/printers.lua
| Setting | Default | Description |
|---|---|---|
Enabled | true | false = nothing prints: no Print in the apps, nothing to take from a printer |
Item | 'printed_document' | The inventory item a printout is (Installation) |
Range | 30.0 | Metres from a computer a printer may stand and still be printed to |
MaxCopies | 5 | Most copies of a page in one go |
PageSeconds | 2.5 | Seconds each copy takes to come out |
TrayLimit | 25 | Copies a printer holds uncollected; a full one prints nothing more |
TrayMinutes | 60 | Minutes an uncollected copy waits before it is thrown away (0 = for ever) |
OwnOnly | false | true = only whoever printed a page may take it from the tray |
MaxChars | 20000 | Longest text a page holds |
KeepDays | 0 | Days a page can still be read after it was printed (0 = for ever). Past that the item opens faded |
ReadAnimation | true | The character looks down at a clipboard while a page is open |
Signatures | true | Lines on a document can be signed. false = the lines print, but nobody can sign them |
Target | 'Take printouts' | The option on a printer |
Props | 4 printers | The 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
| Setting | Default | Description |
|---|---|---|
Practice | true | hack <game> practice runs in Command Prompt (logged, no reward). false = only real targets |
DefaultDifficulty | 'medium' | The difficulty when none is given |
Games | 10 games | The 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.MinFloor | 3.0 | Server: no run is ever accepted faster than this many seconds |
Proof.Grace | 2.0 | Server: survival games (cipher, evasion) must run for their time limit minus this |
Proof.Safety | 0.85 | Server: margin on the throughput floors, so lag never rejects a genuinely fast run |
TokenTTL | 600 | Server: seconds a started run stays redeemable |
StartGap | 1.0 | Server: seconds between two run starts by the same player |
ProofTTL | 120 | Server: 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
| Setting | Default | Description |
|---|---|---|
Enabled | true | false = the Business Manager never appears, whatever computers.lua says |
HireRadius | 10.0 | Players within this many metres of the computer are listed to hire. They get a prompt and join at the lowest grade |
HireById | true | Bosses 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 |
Funds | true | Society 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' |
TransactionLimit | 50 | Recent 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 |
MaxTransfer | 1000000 | Server: largest single deposit or withdrawal |
PINs and Lockout
configs/server/security.lua
Pins = {
mrpd_frontdesk = '1031',
},
MaxAttempts = 3,
Lockout = 60,| Setting | Default | Description |
|---|---|---|
Pins | none | A 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 |
MaxAttempts | 3 | Wrong PINs in a row before that player is locked out of that computer |
Lockout | 60 | Seconds the lockout lasts. Every failure is written to the computer's System Logs |
System Logs
configs/server/logs.lua
| Setting | Default | Description |
|---|---|---|
RetentionDays | 14 | Entries older than this are purged at boot and every 6 hours (0 = keep for ever) |
PageSize | 200 | Entries per Event Viewer page |
AllowClear | true | Whether a log can be cleared at all. A clear is itself logged (event 1102), so a wiped log always shows who wiped it |
ClearGroups | nil | Only these jobs may clear, e.g. { police = 3 }. nil = everyone signed in |
AppLaunch | true | Write "Application started" each time an app opens |
MailSent | true | Write 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.
