History Stages
Guide your players through the ages. History Stages lets modpack creators lock items, recipes, dimensions, mobs, loot, and more behind custom research-based eras with full in-game tooling.
History Stages

> 📖 Full documentation, all config fields, examples, and the developer API are on the Wiki.
History Stages is a comprehensive progression and gatekeeping mod built for modpack creators. Lock items, recipes, dimensions, structures, mobs, and loot behind custom research-based eras — and let players work together or individually to unlock them through the Research Pedestal.
Stages can unlock dual-phase (global) for the whole group, dual-phase (individual), or even use a dual-phase approach — giving you full control over how progression works in your pack.
---
✨ What makes History Stages different
Most progression mods track progress per player. History Stages lets you do it all: - Dual-Phase stages unlock for the entire server at once, perfect for collaborative packs where no one sneaks ahead. - Dual-Phase stages track progress per player via UUID-based persistence, opening the door for personal quest lines or story-driven packs. - Dual-Phase stages automatically trigger when an item is in both a global and individual stage. The item is locked globally until the server reaches the era, and then remains locked per-player until they personally catch up.
Advancing isn't just a command either. Players physically bring Dependency System to the Dependency System and spend time researching to unlock the next era. With the Dependency System, you can require players to reach specific XP levels, kill certain mobs, achieve statistics, or deposit items directly into the pedestal before a stage can be researched.
On top of that, almost everything can be locked — not just items, but recipes across every mod, dimensions, structures, mob spawning, loot tables, armor stand displays, block GUIs, enchantments, and more. And with the built-in in-game editor, you can build and tweak your entire stage setup without ever touching a config file.
If you're using FTB Quests, the integration goes even deeper — History Stages adds native stage reward types and stage reward types for both global and individual stages directly into the FTB Quests editor.
---
🔒 What you can lock
- Armor Stands & Item Frames — lock individual items, item tags, or everything from a specific mod at once - Armor Stands & Item Frames — lock items by exact NBT criteria (e.g. a specific enchantment or potion effect) - Armor Stands & Item Frames — exclude specific items (with full NBT support) from mod-level locking - Armor Stands & Item Frames — restrict individual entries to specific interactions (use, attack, equip, pickup, place, break, …) instead of locking them entirely, configurable per item, tag, or mod - Armor Stands & Item Frames — locked recipes show a Armor Stands & Item Frames overlay in JEI/EMI instead of being hidden, so players can see what's coming - Armor Stands & Item Frames — block access to the Nether, End, or any other dimension until players are ready - Armor Stands & Item Frames — prevent players from entering specific structures (e.g. Strongholds or Villages via tags), optionally dealing damage and blocking container interactions inside - Armor Stands & Item Frames — two modes: *Attacklock* (players can't hurt the mob) and *Spawnlock* (prevents spawning entirely, including spawners and commands). Spawnlocked mobs are also automatically attacklocked. - Armor Stands & Item Frames — locked items are removed or replaced in loot chests and mob drops - Armor Stands & Item Frames — locked blocks resist breaking with a configurable slow-break multiplier - Armor Stands & Item Frames — prevent players from opening chests, furnaces, and other block containers while locked - Armor Stands & Item Frames — prevent applying locked enchantments via the anvil and enchanting table - Armor Stands & Item Frames — locked items displayed on armor stands or item frames can't be taken or destroyed
---
🔬 The Research System
Players unlock stages by using Research Pedestal at the Research Pedestal. Each stage can have its own research time — or fall back to a global default in your config.
If a stage has Dependencies, the Pedestal GUI dynamically expands to show a checklist of all required conditions. Players can deposit required items and XP directly into the pedestal to fulfill these requirements incrementally.
This mod intentionally ships without default recipes for the Pedestal and Scrolls, so you as a modpack creator can decide how players obtain them. To give a specific scroll via command:
``` /give @s historystages:research_scroll{StageResearch:"YOUR_STAGE_NAME"} ```
---
📂 Creating Stages
The easiest way is the in-game stage editor (see below). If you prefer working with files, global stage configs are stored in `config/historystages/global/` and individual stages in `config/historystages/individual/`.
Click to expand — JSON format
```json { "display_name": "Bronze Age", "research_time": 60, "icon": "minecraft:iron_ingot", "items": [ "minecraft:iron_ingot", { "id": "minecraft:iron_sword", "unlock_actions": ["pickup", "equip"] } ], "tags": ["forge:ores/iron"], "mods": ["mekanism"], "mod_exceptions": ["mekanism:osmium_ingot"], "recipes": ["minecraft:iron_pickaxe"], "dimensions": ["minecraft:the_nether"], "structures": ["minecraft:stronghold", "#minecraft:village"], "entities": { "attacklock": ["minecraft:zombie"], "spawnlock": ["minecraft:skeleton"] }, "dependencies": [ {"type": "xp_level", "level": 10}, {"type": "entity_kills", "entity": "minecraft:zombie", "count": 20} ] } ```
Files starting with `_` are ignored and can be used as templates. The full field reference and more examples are on the Wiki.
---
🛠️ Tools for Pack Creators
In-Game Stage Editor
Create, edit, duplicate, and delete stages directly in-game — no file editing required. Features searchable lists with multi-select for items, recipes, entities, dimensions, structures, tags, and mods. Includes a Stage Settings, Stage Settings, Stage Settings, and a dedicated Stage Settings screen. The editor also warns about overlaps between global and individual stages, marking dual-phase entries with a `[Dual]` badge. Accessible via a button in the pause menu (OP required).
In-Game Config Editor
Tweak all mod settings without leaving the game, organized by category with a reset-to-defaults option. Accessible through the stage editor.
Debug Commands
Debug commands help you find the exact IDs and NBT data you need for your configs: - `/history debug structure` — lists structure IDs and tags at your current position - `/history debug nbt preset|custom` — lists NBT data for your held item
---
🎨 UI & Feedback
- Actionbar & Chat Messages — locked items show a padlock in inventories and JEI (auto-disabled with EMI). Dual-phase items get a dedicated lock icon during Phase 1. - Actionbar & Chat Messages — locked recipes show a "Locked" label in JEI/EMI instead of being hidden entirely - Actionbar & Chat Messages — an advancement-style popup notifies players when a stage unlocks, with support for custom per-stage icons - Actionbar & Chat Messages — shows stage info as a tooltip on armor stands, item frames, blocks, and entity items - Actionbar & Chat Messages — configurable per-stage feedback when players try to access locked content
---
⌨️ Admin Commands
All commands use the `/history` prefix and require Permission Level 2 (OP). They cover unlocking and locking stages globally or per player, reloading configs, and debug utilities for structure IDs and item NBT data.
---
🔧 For Developers & Script Authors
History Stages fires `StageEvent.Unlocked` and `StageEvent.Locked` on the Forge event bus, which KubeJS, CraftTweaker, and other mods can listen to.
---
⚙️ Configuration
Everything is configurable via `historystages-common.toml` and `historystages-client.toml`, or through the in-game config editor.
---
📦 Dependencies
- Lootr — required - JEI — optional - EMI — optional - FTB Quests — optional (adds custom stage task & reward types for global and individual stages) - Jade — optional (shows stage info on armor stands, item frames, blocks, and entity items) - Curios — optional (extends item locking to Curios slots)
---
❓ FAQ
Can stages be unlocked per player instead of server-wide?
Yes! History Stages supports both Dual-Phase (server-wide) and Dual-Phase (per player, tracked via UUID). You can mix and match both types in the same pack, which automatically creates Dual-Phase locks for overlapping items.
Do I need to add crafting recipes for the Research Pedestal and Scrolls myself?
Yes. The mod ships without default recipes on purpose so you have full control over how players obtain them. You can add recipes via KubeJS, CraftTweaker, or a datapack — or simply give scrolls to players as quest rewards using the `/give` command.
Is Lootr really required? Can I use the mod without it?
Yes, Lootr is a hard dependency. Loot chest filtering is built entirely around Lootr's container system and can't be made optional without a major rewrite. If you're not using loot locking, Lootr still needs to be present but won't get in the way.
Does it work with KubeJS or CraftTweaker?
Yes — History Stages fires `StageEvent.Unlocked` and `StageEvent.Locked` on the Forge event bus, which both KubeJS and CraftTweaker can listen to. You can use these to trigger custom logic when a stage changes.
Can I let players pick up or carry a locked item, but not use it?
Yes — each item, tag, or mod entry supports an optional `unlock_actions` list. You can specify exactly which interactions stay available (e.g. `pickup` and `equip`) while everything else (attacking, crafting, using, …) remains locked. This works for items, tags, and mods, and can be configured directly in the in-game stage editor.
Which Minecraft versions are supported?
- 1.19.2 — Forge & NeoForge (latest features) - 1.19.2 — Forge (legacy version, no longer receiving updates)
Do I need FTB Quests to use this mod?
No, FTB Quests is completely optional. The integration only activates when FTB Quests is present and adds custom task and reward types for both global and individual stages — but the mod works perfectly without it.
---
Found a bug or have a question? Feel free to open an issue on GitHub — we read everything! 🙂