Guide
How to make custom crafting recipes
Updated October 18, 2026
Custom recipes are the easiest way to change a survival server: craft saddles, uncraft wool, smelt rotten flesh into leather. You can add them with a datapack, which works in vanilla and singleplayer, or with a plugin, which can do more, such as requiring a specific custom item as an ingredient.
Replace these with your own recipes.
Generate this with CodexeStep by step
1.Choose datapack or plugin
A datapack for recipes made of normal items on any server or world. A plugin when ingredients must be exact items (with a name or tag), or the recipe needs permissions or other conditions.
2.Write down each recipe
The type (shaped, shapeless, furnace, smoking, blasting, campfire, stonecutter, smithing), the grid pattern, the ingredients and the result with its count.
3.Write it in the right format
For a datapack, one JSON file per recipe in
data/<namespace>/recipe/(recipes/before 1.21). For a plugin, aShapedRecipeorShapelessRecipewith aNamespacedKey, added withBukkit.addRecipe.4.Decide if it appears in the recipe book
Recipes craft as soon as they are loaded. To show them in the recipe book, unlock them with an advancement (datapack) or
player.discoverRecipe(key)(plugin).5.Install it
Datapack: into
<world>/datapacks/and/reload. Plugin: the .jar intoplugins/and a restart.6.Craft every recipe
Put the ingredients in a crafting table (or furnace) and check the result, including wrong arrangements that should not work.
Datapack or plugin
| Feature | Datapack | Plugin |
|---|---|---|
| Runs on | Vanilla, singleplayer, any server | Spigot, Paper and forks |
| Ingredients | Items or item tags | Items, tags or exact items with name, lore or data |
| Result | Any item, with components from 1.20.5 | Any item, including your plugin's custom items |
| Conditions | None while crafting | Permissions, worlds, cooldowns through events |
The JSON format changed between versions
A shaped recipe in a 1.21.4 datapack looks like this: {"type": "minecraft:crafting_shaped", "pattern": ["GGG", "GHG", "GGG"], "key": {"G": "minecraft:gold_ingot", "H": "minecraft:heart_of_the_sea"}, "result": {"id": "minecraft:totem_of_undying", "count": 1}}.
Older versions write it differently: before 1.21.2 each key is an object such as {"item": "minecraft:gold_ingot"}, and before 1.20.5 the result uses "item" instead of "id". A recipe copied from a tutorial for another version is the most common reason a recipe does not load. Say your version, and Codexe writes the format and folder names that version expects.
Example description
"A datapack for Minecraft 1.21.4, namespace extras. Shaped: 3 leather on top, string and iron in the middle row = saddle. Shapeless: 1 white wool = 4 string. Furnace: rotten flesh = leather, 0.1 experience. Stonecutter: 1 stone = 4 stone bricks. An advancement that unlocks all of them in the recipe book when the player picks up leather."
Codexe loads datapacks on a real Minecraft server before marking them Ready, so a JSON or folder mistake is caught and repaired. With Try it now you can then join a server with the pack installed and craft every recipe yourself.
Questions
Can a datapack recipe require a renamed or custom item?
No: datapack ingredients match the item type or an item tag, not names or data. Use a plugin with RecipeChoice.ExactChoice for that.
Can I remove a vanilla recipe?
Yes. A datapack can replace the vanilla recipe file in the minecraft namespace, and a plugin can remove it with Bukkit.removeRecipe.
Why does my recipe not show in the recipe book?
It is not unlocked for that player yet. It still crafts in the grid; unlock it with an advancement or discoverRecipe to show it.
Make your recipes
This prompt opens ready to send:
“A datapack for Minecraft 1.21.4, namespace extras: shaped recipe for a saddle (3 leather on top, string, iron, string in the middle), shapeless 1 white wool = 4 string, furnace rotten flesh = leather, stonecutter 1 stone = 4 stone bricks, and an advancement that unlocks them all when the player picks up leather.”
Generate this with Codexe