Getting Started with Datapacks
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 ID
Your pack ID is a short, lowercase, no-spaces name that identifies your datapack uniquely. It becomes a prefix for every item, enemy, and recipe you create.
Good examples: stellar_forge, deep_space_mod, nova_pack
Avoid: spaces or special characters (my pack, my-pack!), and names that conflict with other packs (original is reserved by the base game).
Step 2 — Create the Folder Structure
At minimum, your datapack folder looks like this:
my_pack/
├── assets/
│ └── languages/
│ └── en_US.json ← Required: at least one language file
├── data/
│ ├── dungeons/ ← Only needed if your pack adds dungeons
│ ├── enemies/
│ │ ├── hostiles/ ← Only needed if your pack adds enemies
│ │ └── rooms/ ← Only needed if your pack adds rooms
│ ├── items/ ← Only needed if your pack adds items
│ ├── recipes/ ← Only needed if your pack adds recipes
│ └── skills/ ← Only needed if your pack adds skills
└── manifest.json ← Required: registers your pack
Only create folders for content you are actually adding. The game only reads what is there.
Step 3 — Write manifest.json
The manifest is the first file the game reads. It tells the game your pack name, version, and what categories of content you are adding. See the Manifest Reference.
Step 4 — Write a Language File
Even if you only support one language, you need at least one language file. This is where all display text for your items, enemies, and skills lives. See the Localization Guide.
Step 5 — Add Your Content
| Want to add… | Guide |
|---|---|
| Raw materials (ores, ingots) | Materials Guide |
| Wearable gear for players | Personal Equipment Guide |
| Ship components | Ship Equipment Guide |
| Crafting formulas | Recipes Guide |
| Enemy units | Hostiles Guide |
| Enemy encounter rooms | Rooms Guide |
| Full dungeon runs | Dungeons Guide |
| Skill trees | Skills Guide |
Key Concepts
Namespaced IDs
Every object in the game has an ID that looks like this:
my_pack:some_item_name
The part before the : is your pack ID (namespace). The part after is the item name. This guarantees that two different packs can both have an item called iron_ore without conflicting.
Translation Keys
Whenever a JSON file has a field like displayName or description, the value is a dotted string like:
"displayName": "items.materials.my_pack.ores.uranium"
This is a translation key — a pointer to the actual text in your language file. Different languages can show different text for the same item without changing the item JSON file.
Sub-Folders Are Optional
The game does not care how you organize files inside data/dungeons/, data/enemies/, etc. You can put all enemy JSON files directly in data/enemies/hostiles/ or create sub-folders to group them. The game scans recursively and does not care about folder names.