CYE: Recipe Control
Change, add and disable any recipe — and have the last word over datapacks, KubeJS and mods that generate their own recipes.
⚠️ Early development (beta). The mod is still being developed and has so far been tested only on dedicated servers — singleplayer and most game versions have not been tested in game yet. It is not recommended for important worlds or public modpacks yet. Back up your world before using it, and please report any problems.
❗ Fabric / Quilt: Fabric API is required. Without it the mod does not load. (On Quilt, QFAPI works too.) Forge and NeoForge need nothing else.
One small jar for Fabric, Quilt, Forge and NeoForge. No scripting, no datapack per world: you describe the changes in one JSON file and the mod applies them directly to the game's recipe manager every time data is loaded.
Made for CYELauncher (its visual recipe editor writes the config for you), but works on its own on any client or server — the config is plain JSON.
Why
Datapacks are loaded together with everything else, so a mod or a KubeJS script can override them. Some mods (for example GregTech CEu) don't ship recipe files at all — they generate tens of thousands of recipes while the game loads, so there is nothing for a datapack to override.
CYE: Recipe Control runs after the recipe manager has been filled — after vanilla, datapacks, KubeJS scripts and generated recipes — and edits the final result. The changed recipes are then sent to players as usual, so recipe viewers that read the server's recipes (JEI / EMI / REI, the recipe book) should show them too — this part has not been tested in game yet.
Features
- Replace any recipe by its id — vanilla, modded or generated at runtime.
- Add new recipes.
- Disable recipes.
- Disable items: removes every recipe that produces the item. Optionally also removes recipes where the item is the
only way to satisfy an ingredient. Tags are expanded, so disabling
minecraft:stickalso removes recipes that use#c:rods/wooden(if sticks are the only thing in it), but disabling one kind of planks does not break every#minecraft:planksrecipe. - A bad recipe doesn't stop loading: a recipe that fails to parse is skipped and reported.
- Report after every load and
/reload—config/cye-recipe-control.report.txtsays what was changed, added, removed and what failed and why, plus a self-check that the changes really are in the recipe manager. - Full recipe list —
config/cye-recipe-control/recipes.txt(id<TAB>typeof every recipe in the game, including generated ones). Handy for finding the id of a recipe you want to replace.
Supported versions
Tested on dedicated servers (✅) — replacing, adding, disabling recipes, disabling items, /reload:
| Loader | Minecraft | Status |
|---|---|---|
| Forge | 1.20.1 | ✅ (also with GregTech CEu 7.5 and KubeJS 6) |
| NeoForge | 1.21.1 | ✅ |
| NeoForge | 26.1 | ✅ |
| Fabric / Quilt | 1.21.1 | ✅ |
| Fabric / Quilt | 1.21.4 | ✅ |
| Fabric / Quilt | 1.21.2 | ✅ |
| Fabric / Quilt | all other releases 1.20.1 – 1.21.11 | should work (name tables included), not tested in game |
| NeoForge | 1.20.5 – 1.21.x | should work, not tested in game |
- Fabric / Quilt — Fabric API is required (on Quilt — Fabric API or QFAPI).
- Java 17+.
- Older versions (1.19 and below) are not supported.
Installation
- Server: put the jar in
mods/(on Fabric / Quilt — together with Fabric API) and the config inconfig/cye-recipe-control.json. Players don't need the mod. - Singleplayer: put it in the client's
mods/(the integrated server does the work). - CYELauncher: nothing to do — the launcher downloads the latest compatible file from this project, keeps it updated and writes the config when you launch an instance that has recipe changes.
- Modpacks: you may include the mod in your modpack — while it is in beta, test it with your pack first.
Config — config/cye-recipe-control.json
{
"recipes": {
"minecraft:iron_pickaxe": {
"status": "edited",
"recipe": {
"type": "minecraft:crafting_shaped",
"pattern": ["ADA", " B ", " B "],
"key": {
"A": { "item": "minecraft:iron_ingot" },
"D": { "item": "minecraft:diamond" },
"B": { "item": "minecraft:stick" }
},
"result": { "id": "minecraft:iron_pickaxe", "count": 1 }
}
},
"mypack:sand_to_glass": {
"status": "new",
"recipe": {
"type": "minecraft:smelting",
"ingredient": { "item": "minecraft:sand" },
"experience": 0.1,
"cookingtime": 100,
"result": { "id": "minecraft:glass", "count": 4 }
}
},
"minecraft:golden_apple": { "status": "disabled" }
},
"disabled_items": {
"minecraft:tnt": { "ingredients": true },
"minecraft:diamond_sword": { "ingredients": false }
}
}
recipes— key is the recipe id.status:edited/new—recipeis the recipe JSON, exactly as in a datapack for your Minecraft version (the format changed in 1.20.5 and 1.21.2), including mod recipe types such asgtceu:macerator.status:disabled— the recipe is removed.
disabled_items— item id →{ "ingredients": true | false }.falseremoves the recipes that produce the item;truealso removes recipes that can no longer be crafted without it. Recipes listed inrecipesare never touched bydisabled_items.
Changes are applied at world/server start and on every /reload.
Report — config/cye-recipe-control.report.txt
# CYE: Recipe Control — 2026-10-21T18:24:11
changed 2, added 1, removed 329, errors 0, verified 4/4 (recipes before 39613, after 39285; reload)
N mypack:sand_to_glass
E minecraft:iron_pickaxe
- minecraft:golden_apple
x minecraft:stick — recipes removed: 327 (result and ingredient)
! mypack:broken — JsonParseException: Pattern references symbol 'X' but it's not defined in the key
(The report text is in Ukrainian in this version.)
Limitations
- Items are not removed from the game registry (that would break worlds) — a disabled item simply can't be crafted. It can still appear in loot, creative tabs, JEI's item list, etc.
- Mods that keep their own copy of recipes outside the vanilla recipe manager may still use the original recipe in their machines. Crafting-table / furnace / smithing / stonecutter recipes are always affected.
- On 1.20.1, machine recipes of mods like GregTech CEu can be disabled by id, but "disable item" can't detect their outputs (there is no recipe codec in 1.20.1).
- Recipe JSON must match the format of your Minecraft version — the mod does not convert between versions.
How it works (for the curious)
The mod has no compile-time dependency on Minecraft. It finds the game's classes by their official (Mojang) names via reflection; for environments with different runtime names (Fabric intermediary before 1.21.11, Forge 1.20.1 SRG) the jar contains small lookup tables generated from the official mappings. Hooks:
- Forge / NeoForge — a reload listener registered with the lowest priority, which runs after the recipe manager.
- Fabric / Quilt — Fabric API server lifecycle events (
SERVER_STARTING,END_DATA_PACK_RELOAD), then the recipes are re-sent to players.
Credits
- Name lookup tables are generated from Mojang's official mappings, Fabric Intermediary and Forge MCPConfig; only the few dozen names the mod uses are included.
License
MIT.

