Crafting Recipe Configuration
Define crafting recipes that turn ingredients into a result item — a server-only config.
Crafting recipes turn a set of ingredients into a result item. They’re server-only config — the client never reads this file, it just receives the resolved recipe list from the server over the network.
File Location
Register the file in your mod’s manifest (mods/<YourMod>/<YourMod>.yaml):
crafting-config: crafting-config.yaml
Then create the file it points to, relative to your mod’s folder:
mods/<YourMod>/crafting-config.yaml
The file is a single list of recipes:
recipes:
- crafting-station:
type: crafting
result:
item: my_item
amount: 1
ingredients:
- item: dirt
amount: 1
Minimal Example
recipes:
- crafting-station:
type: crafting
result:
item: oak_planks
amount: 4
ingredients:
- item: oak_log
amount: 1
Fields
| Field | Default | Description |
|---|---|---|
crafting-station.type | (required) | The crafting category this recipe belongs to — an open, case-insensitive tag. Crafting is the built-in baseline (craftable by hand, no station); Smelting is used by the base game’s furnace. Any other tag (e.g. Anvil, Loom) is valid too, as long as a station provides it — see Custom station types. |
crafting-station.power | 1 | The minimum power tier a crafting station must provide for this recipe to be available there (e.g. a furnace granting a higher tier than a basic crafting bench). |
name | (none) | Optional stable identifier for the recipe, enabling override and removal — see Overriding and removing recipes. Anonymous recipes (no name) are additive-only. |
result | (required) | The item produced — see Result and Ingredients. |
ingredients | (required) | A list of required inputs — see Result and Ingredients. |
Every amount and crafting-station.power shown in the examples defaults to 1, so you can omit them when that’s the value you want.
Result and Ingredients
result is a single entry; ingredients is a list. Each entry is one of these shapes:
By item name
- item: wooden_stick
amount: 2
item is mod-prefixed automatically if you don’t include a colon yourself. amount defaults to 1. This is the same item: key that loot-table-config.yaml and block/mob drop tables use to reference an item.
By item name (shorthand)
When the amount is 1, an entry can be written as a plain string instead of a map — for both ingredients and result:
result: grass
ingredients:
- dirt
- coal
This is exactly equivalent to { item: dirt, amount: 1 }. For any amount above 1, use the map form.
By material type
- material-type: PLANKS
amount: 3
Matches any item carrying the given tag in its material-types (set in item-config.yaml) — useful for recipes that should accept several interchangeable items (any plank, any log, etc.) instead of one specific item. The match is case-insensitive. amount defaults to 1. This shape can’t be used for result, only for ingredients.
Advanced: overriding item properties
An entry can optionally override that item’s own catalog properties, using the same fields documented in item-config.md. This advanced form is a full inline item definition, so it identifies the item with the item catalog’s own name field (not item):
Two different
names, at two different levels. Anamedirectly on a recipe is the recipe’s own identifier (used for override and removal). Anameinside aningredients:orresult:entry names the item, and only in this full inline form — the ordinary shorthand for an item isitem:. They never appear at the same level, so there’s no ambiguity in practice, but they are unrelated fields.
- name: wooden_short_sword
amount: 1
max-stack-size: 1
tool-types: [shears]
interact-range: 5
type-override: weapon
weapon-info:
type: short_sword
damage: 999.0
type-override (plus a matching *-info block sitting directly alongside it) replaces the item’s behavior entirely for this specific recipe result/ingredient — a rarely-needed escape hatch for a one-off variant. Everything else on this entry still falls back to the item’s normal catalog values if omitted. Use the plain item: form above for the common case; reach for name: + overrides only when you need a one-off variant.
The keys this form accepts are exactly name, amount, max-stack-size, tool-types, interact-range, type-override, damage (for type-override: empty), and one *-info block. Anything else — including a misspelling of one of those — fails the recipe at load, the same as any other unknown field. The same rule and the same key set apply wherever this form appears: a drop table entry’s item: block and a loot table entry’s item: block are the identical shape.
tool-types here takes a single value or a list, matching the item catalog entry it overrides. Note that name: is what marks an entry as this full form; an entry without it is read as the item: shorthand.
Overriding and removing recipes
By default recipes are additive — loading another mod’s crafting config adds its recipes alongside yours. To let a recipe be changed or deleted later (by your own mod or by a mod that loads after yours), give it a name:
recipes:
- name: iron_pickaxe # becomes YourMod:iron_pickaxe
crafting-station:
type: crafting
power: 2
result: Creation:iron_pickaxe
ingredients:
- item: Creation:iron_bar
amount: 3
- item: Creation:wooden_stick
amount: 2
A name is mod-prefixed just like an item name, so a bare iron_pickaxe becomes YourMod:iron_pickaxe; use an explicit Mod:name to reference a recipe from a different mod.
Override — define a recipe with a name that already exists (from an earlier-loaded mod, or earlier in the same file). The later definition wins, keeping the original’s slot and identity. This is how you rebalance a base-game recipe:
recipes:
# Make iron pickaxes cheaper than Creation's default.
- name: Creation:iron_pickaxe
crafting-station:
type: crafting
power: 2
result: Creation:iron_pickaxe
ingredients:
- item: Creation:iron_bar
amount: 2
Remove — list ids under a top-level remove-recipes key to delete them outright, no replacement:
remove-recipes:
- Creation:iron_pickaxe
recipes:
- ...
Removals are applied before this file’s own recipes are added, so a mod can clear out recipes it doesn’t want and then define its own. Only recipes that declared a name can be overridden or removed — anonymous recipes have no handle to reference.
Every recipe
Creationships is named after the item it produces —Creation:oak_planks,Creation:iron_pickaxe, and so on — so any of them can be overridden or removed by name. The two that produce a bulk debug stack are suffixed_bulk(Creation:torch_bulk,Creation:grass_bulk), since a name has to be unique: define a second recipe with an existing name and it replaces the first rather than adding to it. Name your own recipes for the same reason — an anonymous recipe can never be patched by anyone, including you.
Custom station types
crafting-station.type is an open registry, so a mod can invent its own crafting categories rather than being limited to Crafting/Smelting. A recipe tagged with a custom type only becomes craftable when the player is near an interactable whose crafting-station provides that same type:
# In crafting-config.yaml
recipes:
- crafting-station:
type: anvil
power: 2
result: reinforced_plate
ingredients:
- item: iron_bar
amount: 4
# In the station's interactable-config, so an ANVIL block grants the Anvil type at power 2
crafting-station:
type: anvil
power: 2
Type matching is case-insensitive. The Crafting type is special only in that it needs no station (baseline hand-crafting); every other type — including Smelting — requires a station in range that provides it. See interactable-config.md for the crafting-station block.
Validation
Recipes are checked as they load. A recipe that fails a hard check is skipped (with a warning naming the recipe by its name or result), and the rest of the file still loads:
- Empty or missing
ingredients— a recipe must consume at least one item; one that produces its result from nothing is rejected. - An
amountof0on any ingredient or on the result — rejected (usually a forgotten or mistyped amount). material-typeused for aresult— rejected, since a tag matches many items and can’t name one output.
Note the ingredient key stays singular (material-type): a recipe requires one tag, while an item declares the several it carries via material-types. Same relationship as a block’s tool-break-types (what it requires) against an item’s tool-types (what it has).
- Unknown item names on an ingredient or result — rejected, with the offending name in the message.
Some things load but emit a warning to look at:
- A recipe whose result is the same item it consumes (e.g.
DIRT → DIRT) — almost always a mistake or a duplication exploit. - A
remove-recipesentry naming an id that doesn’t exist (already removed, undeclared, or misspelled).
Complete Example
recipes:
# Simple recipe, by-name ingredient
- name: oak_planks
crafting-station:
type: crafting
result:
item: oak_planks
amount: 4
ingredients:
- item: oak_log
amount: 1
# Material-type ingredient — any PLANKS-tagged item works
- name: wooden_stick
crafting-station:
type: crafting
result:
item: wooden_stick
amount: 4
ingredients:
- material-type: PLANKS
amount: 2
# Mixed ingredients, higher power requirement
- name: stone_pickaxe
crafting-station:
type: crafting
power: 2
result:
item: stone_pickaxe
amount: 1
ingredients:
- item: stone
amount: 3
- item: wooden_stick
amount: 2
# Smelting recipe
- name: iron_bar
crafting-station:
type: smelting
power: 2
result:
item: iron_bar
amount: 1
ingredients:
- item: raw_iron
amount: 1
- item: coal
amount: 1