Universe ships as a single fat JAR produced by theDocumentation 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.
loader module. The loader bootstraps a custom classloader, extracts the embedded app.jarinjar, resolves and downloads runtime dependencies listed in dependencies.txt, and then invokes the orchestrator. Everything — Master API, Wrapper runtime, and console — lives in that one file, so getting a node running takes only a few minutes once the JAR is built.
Prerequisites
- JDK 25+ and Gradle 9.5+ (required to build from source)
- Linux or macOS recommended for the built-in
screenandtmuxruntimes - Docker (optional) if you prefer the container quick-start
Build the JAR
Clone the repository and run the Gradle build. Compiled artifacts are automatically copied to After a successful build you will find:
.built/ by the build script.Run the JAR for the first time
Navigate to the directory where you want Universe to store its data, then launch the loader:On first run, Universe detects missing configuration and creates the following directory structure:The node will start in Master mode by default (
isMasterNode: true in the generated config.json). Stop the process (Ctrl+C or type stop) and edit the generated files before running again.Edit ./config.json
The main node configuration controls the node’s identity, cluster membership, and which role it assumes. Open
./config.json and review every field:| Field | Description |
|---|---|
address | IP address this node advertises to the Hazelcast cluster |
port | Hazelcast cluster port (default 6000) |
apiPort | Ktor REST API port — only used when isMasterNode: true (default 7000) |
nodeId | Unique string identifier for this node, used in instance assignment and template sync |
clusterName | Hazelcast cluster group name — all nodes in the same cluster must share this value |
isMasterNode | true → start REST API and run InstanceCountEnforcer; false → join as Wrapper only |
masterAddress | IP or hostname of the Master node (used by Wrapper nodes to join the Hazelcast cluster) |
masterPort | Hazelcast port on the Master |
masterApiPort | REST API port on the Master (used by Minecraft plugins and tooling) |
debug | true → enables DEBUG-level console and INFO-level framework logging; false → WARN+ only (default false) |
A Master node can also run instances locally. You do not need a separate Wrapper node for a single-machine deployment.
Create your first template directory
Templates are file trees stored under A minimal Built-in template variables replaced at deploy time:
./templates/<group>/<name>/. Universe copies the resolved tree into ./running/<instance-id>/ before launching the process, replacing any variables it finds in files listed under fileModifications.Create a minimal template for a server:server.properties that uses built-in variables might look like:| Variable | Value |
|---|---|
%PORT% | Allocated instance port |
%INSTANCE_ID% | 6-character alphanumeric instance ID |
%MASTER_IP% / %MASTER_ADDRESS% | Master node address |
%MASTER_PORT% | Master Hazelcast port |
%MASTER_API_PORT% | Master REST API port |
%NODE_ID% | Local node ID |
%HOST_ADDRESS% | Local host address (or runtime-specific override) |
%CONFIGURATION_NAME% | Configuration name |
Create your first instance configuration
Instance configurations live in
./configuration/ as JSON files. Create ./configuration/default.json:| Field | Description |
|---|---|
runtime | Runtime provider key: screen, tmux, process, docker, k8s |
command | Shell command executed inside the instance working directory |
static | true → working directory is preserved between restarts |
nodes | List of nodeId values eligible to host this configuration |
availablePorts | Port range Universe scans when allocating the instance port |
minimumServiceCount | InstanceCountEnforcer ensures at least this many instances are always running |
templateInstallationConfig.allOf | Templates always copied, in priority order (ascending) |
fileModifications | Files scanned for %VARIABLE% replacement after template copy |
properties | Custom key→value pairs exposed as %KEY% template variables |
Deploy an instance
Start the node:You can create an instance either through the REST API or the console.The response contains the new
- REST API
- Console command
InstanceInfo object including the assigned id, allocatedPort, and initial state of CREATING.Docker Compose Quick-Start
Docker Compose is the fastest way to get a Master node running without building from source. The image is available at
git.lunarlabs.dev/scala/universe:latest.docker-compose.yml in your working directory:
./wrapper-data/config.json, set isMasterNode: false and point to the Master: