Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/universeclouddev/Universe/llms.txt

Use this file to discover all available pages before exploring further.

Every Universe node reads ./config.json on startup to determine its identity in the cluster, which address and port to bind Hazelcast on, where the Master lives, and how many resources it may allocate to instances. The same JAR acts as either a Master or a Wrapper depending on the isMasterNode flag; all other fields follow from that role.
If config.json does not exist when you first launch the JAR, Universe creates it automatically alongside the other required directories. Edit the generated file and restart to apply your values.

First-Run Directory Structure

On first launch Universe initialises the following layout next to the JAR:
./
├── config.json          ← node identity & cluster settings
├── database.json        ← database backend settings
├── configuration/       ← instance configuration files (.json)
├── templates/           ← template storage (<group>/<name>/)
├── running/             ← active instance working directories
└── extensions/          ← extension JARs and their configs

Full Configuration Example

{
  "address": "127.0.0.1",
  "port": 6000,
  "apiPort": 7000,
  "nodeId": "node-1",
  "clusterName": "universe-cluster",
  "isMasterNode": true,
  "masterAddress": "127.0.0.1",
  "masterPort": 6000,
  "masterApiPort": 7000,
  "debug": false,
  "maxRamMB": 8192,
  "maxCpu": 400,
  "updateSources": [],
  "nodeSpecificVariables": {
    "region": "us-east-1"
  },
  "bindAddress": "127.0.0.1",
  "publicAddress": "127.0.0.1"
}

Field Reference

FieldTypeDefaultDescription
addressstring"127.0.0.1"The IP address this node advertises to the cluster. Used as the default for bindAddress and publicAddress.
portinteger6000Hazelcast member port.
apiPortinteger7000Ktor REST API port (Master only; Wrappers do not expose an API).
nodeIdstring"node-1"Unique identifier for this node within the cluster. Appears in instance metadata and console output.
clusterNamestring"universe-cluster"Hazelcast cluster group name. All members in the same cluster must share this value.
isMasterNodebooleantrueWhen true this node acts as the Master: it hosts the REST API and dispatches tasks. When false it is a Wrapper.
masterAddressstring"127.0.0.1"Hostname or IP of the Master node’s Hazelcast interface. Wrappers use this to join the cluster.
masterPortinteger6000Hazelcast port of the Master node.
masterApiPortinteger7000REST API port of the Master node (used by plugins and clients to reach the API).
debugbooleanfalseEnables verbose DEBUG logging in the console and raises Logback to INFO for framework loggers.
maxRamMBinteger8192Maximum RAM in megabytes this node is allowed to allocate across all running instances.
maxCpuinteger400Maximum CPU units this node may allocate. 100 units equals one physical core.
updateSourcesarray[]List of auto-update source definitions. Each entry polls a remote URL on a schedule and writes the result to a local path. See the sub-fields table below.
nodeSpecificVariablesobject{"region":"us-east-1"}Arbitrary key/value pairs exposed as template variables on this node only. Each key k becomes %k% in template variable replacement.
bindAddressstringaddressAddress Hazelcast binds its server socket to. Set to "0.0.0.0" inside Docker to accept connections on all interfaces.
publicAddressstringaddressAddress advertised to other Hazelcast members. Use your Tailscale IP when running behind Docker NAT.

updateSources Entry Fields

Each object in the updateSources array controls one auto-update source:
Sub-fieldTypeDefaultDescription
urlstringRemote file URL to download.
targetPathstringLocal path to write the file (e.g. "./configuration/lobby.json"). Use a trailing slash for template directories (e.g. "./templates/global/server/").
hashUrlstring | nullnullOptional URL of a hash file (.sha256, .sha1, or .md5). If omitted, Universe tries common suffixes automatically.
intervalMsinteger60000Polling interval in milliseconds. Default is 60 seconds.
enabledbooleantrueWhether this source is active. Set to false to pause polling without removing the entry.
syncToStoragestring | nullnullOptional storage provider key (e.g. "s3") to sync to after a successful download. When set and targetPath is under ./templates/, the file is also uploaded to that storage provider.

Master vs Wrapper Configuration

The Master exposes the REST API, hosts the Hazelcast cluster, and routes deploy/stop tasks to Wrappers. Its isMasterNode must be true and masterAddress/masterPort should point back to itself.
{
  "address": "10.0.0.1",
  "port": 6000,
  "apiPort": 7000,
  "nodeId": "master-1",
  "clusterName": "universe-cluster",
  "isMasterNode": true,
  "masterAddress": "10.0.0.1",
  "masterPort": 6000,
  "masterApiPort": 7000,
  "debug": false,
  "maxRamMB": 16384,
  "maxCpu": 800
}
When running in Docker, set bindAddress to "0.0.0.0" so Hazelcast accepts inbound connections from Wrapper containers, and set publicAddress to the container’s reachable IP or Tailscale address.

Debug Logging

The debug field controls the verbosity of both the user-facing console and the SLF4J/Logback file logger:
debug valueConsole outputLogback consoleLog file
falseINFO+ operational messagesWARN+ onlyFull detail
trueINFO+ and DEBUG messagesINFO+ for all loggers including Hazelcast, NettyFull detail
Log files are written to ./logs/universe.log, rotated daily, and retained for 30 days.

Build docs developers (and LLMs) love