# Configuration > Configuration reference for ML Board Category: BOARDS · Source: https://miciomods.it/docs/ml-board-configuration · Last updated: 2026-07-28 ## Overview Config is split into files: - `shared/config.lua`: General settings, board types, dynamic boards, camera - `shared/config_notes.lua`: Note variants and item requirements - `shared/config_locations.lua`: Static board placements - `server/config_server.lua`: Discord webhook URLs ## General **shared/config.lua** ```lua Config.Locale = 'en' Config.Theme = 'default' Config.Debug = false ``` - `Locale`: Language code for translations - `Theme`: UI theme - `Debug`: Console output. Keep off in production. - `BoardRenderScale`: Board surface sharpness, documented under Board Toolbar ## Defaults Global defaults applied to all boards unless overridden per-location. **shared/config.lua** ```lua Config.Defaults = { RenderDistance = 30.0, ViewDistance = 4.0, EditDistance = 2.0, MaxItems = 15, MaxNotesPerPlayer = 3, CleanupInterval = 30, } ``` - `RenderDistance`: Prop spawn distance (meters) - `ViewDistance`: Distance to read notes - `EditDistance`: Distance to add/remove notes - `MaxItems`: Max notes on a board - `MaxNotesPerPlayer`: Per-player note limit - `CleanupInterval`: Auto-cleanup for expired notes (minutes) ## Note Duration **shared/config.lua** ```lua Config.Duration = { Min = 1, Max = 72, Default = 24, } ``` Notes expire automatically after the configured duration (in hours). ## Items **shared/config.lua** ```lua Config.UseItems = true Config.UseMLCamera = false Config.MLCameraPhotoItem = 'photo' ``` - `UseItems`: If `true`, players need the correct item to place a note (consumed on use) - `UseMLCamera`: Enables photo capture integration - `MLCameraPhotoItem`: Item name for photo notes ## Note Editor Styles offered while a note is being written. **shared/config.lua** ```lua Config.AllowTape = true Config.EditorFonts = { 'hand1', 'hand2', 'marker' } Config.EditorColors = { '#d32f2f', '#222222', '#1565c0', '#2e7d32', '#f9a825', '#6a1b9a' } ``` - `AllowTape`: Offers tape as an alternative to the pushpin when a note is placed - `EditorFonts`: Handwriting styles in the editor. Available: 'hand1' (Caveat), 'hand2' (Shadows Into Light), 'marker' (Permanent Marker), 'hand3' (Patrick Hand) - `EditorColors`: Ink colours in the editor. Any list of hex colours ## Board Toolbar Tools available while looking at a board: move, wire, pen, pen eraser, stamp and eraser. **shared/config.lua** ```lua Config.ToolbarKey = { control = 29, label = 'B' } Config.WireColors = { '#c62828', '#141414', '#1565c0', '#2e7d32' } Config.MaxConnections = 30 Config.PenColors = { '#141414', '#c62828', '#1565c0', '#2e7d32' } Config.AllowNoteDrawing = true Config.BoardRenderScale = 1.5 ``` - `ToolbarKey`: Control id that opens the toolbar and the label shown in the on-screen hint - `WireColors`: Wire colours offered by the wire tool. The first entry is pre-selected - `MaxConnections`: Maximum wires strung on a single board - `PenColors`: Pen colours offered by the drawing tool. The first entry is pre-selected - `AllowNoteDrawing`: Lets anyone who may pin a note also draw on a note. Drawing on the board surface itself follows the 'draw' permission - `BoardRenderScale`: Board surface sharpness, 1.0 to 1.5. Higher is crisper and costs VRAM while a board is open ## Stamps Stamps are pressed onto a note from the toolbar. **shared/config.lua** ```lua Config.Stamps = { { id = 'evidence', label = 'EVIDENCE', color = '#c62828', size = 'medium' }, { id = 'urgent', label = 'URGENT', color = '#c62828', size = 'medium' }, { id = 'verified', label = 'VERIFIED', color = '#2e7d32', size = 'medium' }, { id = 'closed', label = 'CLOSED', color = '#37474f', size = 'medium' }, } Config.StampsRequireItem = false Config.EvidenceTags = true ``` - `id`: Internal key, also stored on the placed stamp - `label`: Text printed on the stamp - `color`: Ink colour - `image`: Optional image URL. Replaces the inked text when set - `size`: Starting size: 'small', 'medium' or 'large'. Resized in game with Shift and the mouse wheel - `StampsRequireItem`: Requires an inventory item to press a stamp - `EvidenceTags`: Numbers every 'evidence' stamp in placement order ## Command **shared/config.lua** ```lua Config.Command = { Enabled = false, Name = 'postit', SkipItemCheck = true, } ``` - `Enabled`: Turns the chat command on - `Name`: Chat command to place a note without targeting a board - `SkipItemCheck`: If `true`, the command bypasses item requirements ## Dynamic Boards Players can place boards from inventory items. **shared/config.lua** ```lua Config.EnableDynamicBoards = true Config.MaxBoardsPerPlayer = 30 Config.BoardPickupPolicy = 'owner' Config.PlacementRaycastDistance = 8.0 ``` - `EnableDynamicBoards`: Lets players place boards from inventory items - `MaxBoardsPerPlayer`: Max boards a player can place - `BoardPickupPolicy`: `'owner'` (only the placer) or `'anyone'` - `PlacementRaycastDistance`: Max placement distance (anti-abuse) ## Board Types Each board type maps an inventory item to a prop model. **shared/config.lua** ```lua Config.BoardTypes = { ['whiteboard_large'] = { item = 'whiteboard_large', prop = 'hei_prop_hei_muster_01', label = 'Large Board', texture = 'trucciolato', replaceTexture = { dict = 'script_rt_planning', name = 'hei_prop_hei_muster_01' }, maxItems = 20, spawnDistance = 75.0, interactionDistance = 3.0, zOffset = -0.5, permissions = { place = 'all', draw = 'own' }, }, ['corkboard'] = { item = 'corkboard', prop = 'prop_cork_board', label = 'Cork Board', texture = 'cork', replaceTexture = { dict = 'prop_cork_01', name = 'prop_cork_board' }, maxItems = 20, spawnDistance = 75.0, interactionDistance = 3.0, zOffset = -0.5, }, } ``` - `prop`: model spawned when a player places the item - `texture`: background key from Config.BoardTextures, so the same prop can read as cork or as a whiteboard - `replaceTexture`: the surface the board is drawn on. `name` is the texture dictionary, which on a stock prop matches the model, and `dict` is the texture inside it. A prop only works as a board if it has one of its own ## Board Textures Selectable backgrounds for board surfaces. **shared/config.lua** ```lua Config.BoardTextures = { { label = 'Cork', value = 'cork', url = '...' }, { label = 'Trucciolato', value = 'trucciolato', url = '...' }, } ``` ## Note Variants Defined in `shared/config_notes.lua`. Each variant specifies a type, required items, and background image. **shared/config_notes.lua** ```lua Config.NoteVariants = { { id = 1, type = 'postit', label = 'Standard Yellow', items = { 'sticky_note', 'sticky_note_yellow' }, image = { 'url1', 'url2' }, }, { id = 2, type = 'photo', label = 'Evidence Photo', items = { 'photo' }, image = 'url', }, { id = 3, type = 'photo', label = 'Wanted Poster', items = { 'photo' }, frame = 'poster_url', ratio = 1.4, window = { x = 18, y = 26, w = 64, h = 42 }, caption = { x = 14, y = 74, w = 72, h = 14 }, }, } ``` - `type`: `'postit'` for text notes, `'photo'` for image notes - `items`: Player needs ANY ONE of these items to place (consumed) - `image`: Background texture. String or array (random selection) - `frame`: Poster artwork drawn around the photo - `window`: Where the photo shows through the artwork, in percent - `caption`: Where the caption is written on the artwork, in percent ## Static Locations Boards placed permanently in the world via `shared/config_locations.lua`. **shared/config_locations.lua** ```lua Config.Locations = { { id = 'police_main_board', model = 'hei_prop_hei_muster_01', coords = vec4(450.30, -979.7, 30.4, 90.0), currentBackground = 'cork', replaceTexture = { dict = 'script_rt_planning', name = 'hei_prop_hei_muster_01' }, -- jobView = nil, -- jobWrite = { 'police', 'sheriff' }, -- jobClear = { 'police' }, permissions = { place = { 'police' }, draw = { 'police' }, clear = { 'police' } }, maxItems = 30, maxPerPlayer = 5, allowedVariants = { 1, 2 }, }, } ``` - `jobView`: `nil` = everyone can read. Table of job names to restrict. - `jobWrite`: Jobs allowed to post notes - `jobClear`: Jobs allowed to clear the board - `allowedVariants`: Restrict which note types are available (by id from `config_notes`) ## Board Permissions Each board sets its own rule per action. Staff with the admin permission bypass every rule. **shared/config_locations.lua** ```lua permissions = { place = 'all', move = 'own', delete = 'own', clear = { 'police' }, connect = 'all', erase_connect = 'own', draw = 'none', erase_draw = 'own', stamp = 'all', }, ``` - `all`: Anyone who can reach the board - `own`: Only the player who put that note, wire or drawing there. On clear, only the board owner - `none`: Staff only - `{ }`: A job list, for example { 'police', 'sheriff' } Actions left out of the table fall back to: place, connect and stamp open to everyone; move, delete, erase_connect and erase_draw limited to your own work; clear reserved to the board owner; draw staff only. The same table is accepted on a board type in Config.BoardTypes, so player-placed boards can be gated the same way. ## Camera Camera framing applied when a player opens a board. `CameraOverrides` is keyed by prop model for per-model adjustments. **shared/config.lua** ```lua Config.CameraDefaults = { offset = vec3(0.0, -1.8, 0.0), yawOffset = 0.0, } Config.CameraOverrides = {} ``` - `offset`: vec3 camera position relative to the board face - `yawOffset`: extra rotation applied to the camera - `CameraOverrides`: per-model overrides keyed by prop model name (empty by default) ## Discord Webhooks **server/config_server.lua** ```lua Config.Log = { NotePlaced = 'INSERT_WEBHOOK_LINK_HERE', NoteDeleted = 'INSERT_WEBHOOK_LINK_HERE', BoardCleared = 'INSERT_WEBHOOK_LINK_HERE', Exploits = 'INSERT_WEBHOOK_LINK_HERE', } ``` Replace each placeholder with a Discord webhook URL. Set to `false` to disable that log entirely. **server/config_server.lua** ```lua Exploits = false, -- disabled, no log sent ```