Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/ohemilyy/universe/llms.txt

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

Universe ships as a single fat JAR produced by the loader module. On first launch it writes a config.json with sane defaults, creates the required directories, and is ready to accept commands. This guide walks through the full path from binary to running instance, with a Docker Compose alternative for container-based setups.
Prerequisites:
  • JDK 25 or higher (required to run the JAR)
  • Gradle 9.5 or higher (required only if building from source)
1

Get the JAR

Option A — download a release:Grab the latest universe-loader-*.jar from the GitHub releases page.Option B — build from source:Clone the repository and run the Gradle build. Artifacts are copied to .built/ on success.
git clone https://github.com/ohemilyy/universe.git
cd universe
./gradlew build
The fat JAR will be at .built/universe-loader-0.0.1.jar.
2

Run for the first time

Launch the JAR. If no config.json is found, Universe writes one with defaults and exits — or continues running as a master node.
java -jar universe-loader-0.0.1.jar
The following files and directories are created on first run:
PathPurpose
./config.jsonNode identity and cluster settings
./configuration/Instance configuration files (.json)
./templates/Template storage (<group>/<name>/)
./running/Active instance working directories
./extensions/Extension JARs and their configs
3

Configure config.json

Open ./config.json and set your node’s identity, cluster name, and role. The full set of fields with their defaults:
config.json
{
  "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
}
FieldDescription
addressThis node’s bind address for Hazelcast
portHazelcast cluster port
apiPortKtor REST API port (Master only)
nodeIdUnique identifier for this node
clusterNameHazelcast cluster name — must match across all nodes
isMasterNodetrue to start the Ktor API and act as cluster coordinator
masterAddressHazelcast address of the Master (used by Wrapper nodes)
masterPortHazelcast port of the Master
masterApiPortREST API port of the Master
On a single-machine setup, the defaults work without any changes. For a multi-node cluster, set a unique nodeId on each node and point masterAddress / masterPort to the Master.
Restart the JAR after editing config.json.
4

Add an instance configuration

Instance configurations live in ./configuration/. Create ./configuration/default.json:
configuration/default.json
{
  "name": "default",
  "runtime": "screen",
  "command": "java -jar server.jar",
  "static": false,
  "instanceGroups": [],
  "nodes": ["node-1"],
  "hostAddress": "127.0.0.1",
  "availablePorts": { "min": 25565, "max": 25570 },
  "minimumServiceCount": 1,
  "environmentVariables": {},
  "templateInstallationConfig": {
    "allOf": [{ "name": "base", "group": "server", "storage": "local", "priority": 0 }],
    "allInGroups": [],
    "oneOf": [],
    "oneInGroups": [],
    "onTemplatePasteOverridePresentFiles": false
  },
  "fileModifications": ["server.properties"],
  "properties": {}
}
Key fields to adjust for your application:
FieldDescription
runtimeRuntime to use: screen, tmux, process, or a custom extension runtime
commandShell command to start the instance process
nodesList of nodeId values that can host this instance type
availablePortsPort range Universe scans when allocating a port for the instance
templateInstallationConfig.allOfTemplates that are always applied, in priority order
fileModificationsFiles scanned for variable replacement (%PORT%, %INSTANCE_ID%, etc.)
Reload configurations without restarting:
config reload
5

Create your first instance

With the node running and default.json in place, create an instance from the console or the REST API.Console:
instance create default
REST API:
curl -X POST http://localhost:7000/api/instances \
  -H "Content-Type: application/json" \
  -d '{"configurationName": "default"}'
Verify it started:
instance list
Or via REST:
curl http://localhost:7000/api/instances

Next steps

Architecture

Understand how the Master, Wrappers, Hazelcast task dispatch, and the extension system fit together.

Instance configuration

Full reference for every field in configuration/<name>.json.

Templates

Learn how templates are structured, resolved, and how variable replacement works.

Extensions

Add Docker runtime support, S3 template storage, or build a custom extension.

Build docs developers (and LLMs) love