Skip to main content
Everything you configure lives in ug-core/config/. ug-core generates each file on first boot from the defaults in code, and never edits it again.

How values resolve

Each option resolves from three sources. Later sources win: ug config <name> shows the resolved value of every option and where it came from:

Config files

A generated file documents every option:
config/core.lua
You can delete options you don’t change. Missing options use their default.
When an update adds an option, ug-core tells you once: accounts.maxLoans is new. Using default 3. Add it to config/accounts.lua to change it. Your file stays untouched.

Two kinds of config

Most configs are settings: a table of named options. Your file merges per key, so you only write what you change.
config/characters.lua

Convars

Every setting has a convar. Use them for values that differ per environment:
server.cfg
Names follow ug-core:<Key> for config/core.lua and ug-core:<Config>:<Key> for every other file. Booleans accept true, false, 1 and 0. Tables and vectors cannot be set by convar. See the full list in Convars.

What config files can use

Config files run in a sandbox. They can use vector2, vector3, vector4 (and the vec aliases), math, string, table, json, tonumber, tostring, type, pairs and ipairs. Nothing else: no os, no io, no natives.

Validation

ug-core validates every file on every boot: Unknown keys only warn. Everything else is collected, printed together, and stops boot with Boot aborted: N error(s).

Client values

Options marked shared or client replicate to clients. Clients never see server-only values, and config/ itself is never sent to clients.

Every config file

The full reference of every option in every file.