A datapack is a folder you create that the game loads automatically to add new content. You write structured JSON files that describe what you want to add β€” no code required.

Step 1 β€” Choose a Pack Name

Your pack name is a short, lowercase, no-spaces identifier that becomes the namespace for every registry key you create.

Good examples: stellar_forge, deep_space_mod, nova_pack

Rules: lowercase alphanumeric and underscores only. No spaces, hyphens, or special characters. Must match the datapack folder name exactly.

Step 2 β€” Create the Folder Structure

At minimum, your datapack folder looks like this:

mypack/
β”œβ”€β”€ assets/
β”‚   └── languages/
β”‚       └── en_US.json        ← Required: at least one language file
β”œβ”€β”€ data/                     ← Only add sub-folders for content you are adding
└── manifest.json             ← Required: registers your pack

See the Folder Structure Reference for the complete tree.

Step 3 β€” Write manifest.json

The manifest is the first file the game reads. It declares your pack name, version, and every category of content you are registering. See the Manifest Reference.

Step 4 β€” Write a Language File

Even if you only support one language, you must have en_US.json. This is the base language all others fall back to. See the Localization Guide.

Step 5 β€” Add Your Content

Want to add…Guide
Raw materials (ores, ingots, alloys, circuits, crystals)Materials Guide
Wearable gear for playersPersonal Equipment Guide
Ship componentsShip Equipment Guide
Crafting formulasRecipes Guide
Enemy unitsHostiles Guide
Enemy encounter roomsRooms Guide
Full dungeon runsDungeons Guide
Skill treesSkills Guide
QuestsQuests Guide

Key Concepts

Registry Keys

Every object in the game is addressed by a dot-separated registry key:

<namespace>.<packname>.<group>.<id>

For example: items.materials.mypack.ores.iron, enemies.mypack.pirate.raider_frigate. The namespace prefix varies by content type β€” see the Naming & IDs page for the full table.

Translation Keys

JSON data files never contain raw display text. Instead, fields like displayName and description store a registry key that the game resolves against the active language file at runtime:

"displayName": "items.materials.mypack.ores.iron"

Different languages show different text for the same item without changing the item JSON file.

Sub-Folders Are Optional

The game scans recursively inside each mandatory top-level folder. You can organize files into whatever sub-folder structure makes sense for your pack.