Recipes
There are two ways a recipe ends up gated, and they are worth keeping apart:
- The item is locked. Every recipe producing it disappears, because the
recipeaction is one of the actions an item entry locks by default. This is the common case, and you get it for free. - The recipe is named.
recipeslists individual recipe ids. Use it when only one of several ways to make something should be gated, or when the output itself should stay available.
{
"items": ["minecraft:iron_ingot"],
"recipes": ["minecraft:iron_pickaxe", "minecraft:iron_sword"]
}
In the editor
The Recipes tab. Its picker is two columns: everything recipes produce on the left, that item's actual recipes as cards on the right, drawn in the recipe's real shape — which is the only way to tell apart two recipes that use the same ingredients differently.
Left-clicking a card in the list of a stage opens it read-only, so you can check what a recipe id actually makes without leaving the tab.
In the picker, selection survives moving between items, so several recipes across several items can be gathered before pressing Add. On an individual stage the picker offers only the recipe types that can be gated per player, and says so under the grid. → The Recipe Picker
What it actually does depends on the scope
This is the single biggest source of confusion in the mod, so it is worth stating plainly:
| Global stage | Individual stage | |
|---|---|---|
| The recipe itself | filtered out of the recipe manager — nobody can craft it | stays in the registry; everyone can still craft it |
| Where the gate bites | everywhere: furnace, autocrafter, hopper, mod machines, all of it | only at stations that know who is standing at them |
| Two players at one table | same result — neither can craft it | different results — one crafts, the other cannot |
The four vanilla stations an individual stage reaches are the crafting table, the 2×2 grid in the player's inventory, the stonecutter and the smithing table. Furnaces, brewing stands, the crafter block, hoppers and mod autocrafters resolve recipes with nobody there and stay global-only.
A recipe locked by an individual stage can still be produced in an autocrafter. That is fine for progression design and is not cheat protection. If something must be genuinely unobtainable, put it in a global stage.
Another mod can add its own station to that list by declaring one of its recipe types per-player-gateable; the editor then offers it like the built-in ones. → Addon Development · Global vs Individual
Anvil, loom and cartography table are on neither list — they are not recipe-driven at all, so there is no recipe id to write down.
The master switch for per-player recipe gating is lockRecipes in
gameplay.toml, on by default.
What players see
In JEI and EMI, a locked recipe gets a padlock overlay rather than vanishing — the point being that players can see progression exists. Two settings change that:
| Setting | Default | Effect |
|---|---|---|
hideLockedItemsInJei | false | Removes locked items from the ingredient panel entirely. |
hideLockedRecipesInJei | false | Hides recipes whose output is locked. |
lockedItemMultiStagePolicy | STRICT | For items in several stages: STRICT keeps them locked while any assigned stage is; LENIENT frees them as soon as any one is. |
In the vanilla recipe book, locked recipes are hidden by default (hideLockedRecipesInBook).
Before 6.0.0 they stayed visible and simply refused to craft; turning the setting off restores that
behaviour. The book belongs to one player and is filtered per player, so an individual stage reaches
it. → visual.toml
The message a player gets when clicking a locked recipe in the book is recipeLocked under
[lock_messages].
Finding recipe ids
The in-game editor's recipe picker is the reliable route: it lists real, loaded recipes, shows the inputs and output of each, and cannot produce an id that does not exist. On an individual stage it offers only the recipe types that can be gated per player, and says so under the grid.
Writing ids by hand works too — they are the ids datapacks and mods register, such as
minecraft:iron_pickaxe.
Script-generated recipes move
kubejs:crafting_shaped_7 is the seventh shaped recipe in your scripts. Reorder a script and the
numbering shifts, which silently breaks every stage that gated the old id.
Since 6.0.0 History Stages checks for this. After every world load and every /reload it compares
the recipe ids in your stages against the recipes that actually loaded, and writes a warning for
each one that is missing. Those entries show in red on the stage's Recipes tab in the editor.
Nothing is removed — a recipe can be legitimately absent for a while — but you find out the same day rather than when a player asks why they can craft something they should not.
The way to avoid it entirely is to give your recipes explicit ids:
ServerEvents.recipes(event => {
event.shaped('4x minecraft:stick', ['A', 'A'], { A: 'minecraft:oak_planks' })
.id('mypack:sticks')
})
Then the id is yours, it never moves, and picking it in the editor sticks. → Scripting
Gating a recipe without gating its output
Leave recipe out of the item's lock. unlock_actions lists what stays free, so:
"items": [
{ "id": "minecraft:iron_ingot", "unlock_actions": ["recipe"] }
]
keeps the ingot craftable while everything else about it stays gated. The reverse — gating only the
recipe and nothing else — is what the recipes field is for. →
Unlock Actions
Fluids gate recipes too, and further than you expect
A fluid entry has two recipe actions, not one: recipe
for the recipes that produce it, ingredient for the ones that consume it. Both are on unless
narrowed away, so gating minecraft:water unnarrowed removes every recipe that touches water — a
four-digit number in a large pack.
That is also the answer when recipes disappear that nobody listed.
See also
- Items, Tags & Mods
- Obtaining Scrolls & Pedestals — writing recipes for History Stages' own items, which is a different job entirely.
- Mod Compatibility — JEI, EMI and the recipe viewers.