A questing framework for Minecraft, built for Fabric and NeoForge. Quests can be written in Java or dropped in as datapack JSON, objectives track real game state instead of a bolted-on tracker, and the persistence and networking layers are already done for you.
Drop a file in data/<namespace>/questapi/quests/ and it loads at server start, in the same shape the Java API produces:
{
"id": "mypack:first_diamond",
"title": { "text": "First Diamond" },
"description": { "text": "Every miner's proudest moment." },
"icon": { "id": "minecraft:diamond" },
"category": "mypack:main",
"objectives": [
{ "type": "questapi:collect_item", "item": "minecraft:diamond", "amount": 1 }
],
"rewards": [
{ "type": "questapi:experience", "points": 50 }
],
"auto_activate": true
}
Java-defined and JSON-defined quests sit in the same registry, so a modpack can add its own quests without writing a mod.
The registry, the manager, and the GUI are three separate layers. Build your own screen against the same synced data if the default one doesn't fit, or register a new objective, reward, or condition type without touching this module's code.
QuestApi.registry().registerQuest(Quest.builder(id)
.title(Component.literal("First Diamond"))
.objective(new CollectItemObjective(Items.DIAMOND, 1))
.reward(new ExperienceReward(50))
.autoActivate(true)
.build());
The GitHub README has the full API reference and a Java/JSON walkthrough: github.com/ryankshah/questapi
Setting dev=true in config/questapi.properties loads an example quest tree (Java and JSON both) and the /quests reset|unlock|progress debug commands. Leave it false for a normal install; none of that content or those commands touch production quests.
Fabric and NeoForge, both targeting Minecraft 26.3 on Java 25. The multiloader split only touches networking registration and platform hooks; quest logic runs the same on both.
CC0-1.0. Do whatever you want with it.