Make a pack from your own book
Feats, spells and subclasses from a book you own, in the app, with the help of any AI assistant.
A pack is one .json file that adds content to the app. Import it in Settings → Homebrew → Packs → Import. The app checks the file and lists anything it can't use, so a broken pack never touches your characters. Packs work offline and stay on your device. I publish these instructions; I never host, list or share packs.
The rules
- Only from books you own. A pack made from a book is for your own play.
- Sharing. You can export any pack. You're responsible for what you share: don't share text copied from a book unless its license allows it. A pack marked as not shareable shows a warning before export.
- Openly licensed books (CC-BY 4.0, ORC) may be shared with their license notice in the pack.
What to make where
| Content | Best made |
|---|---|
| Feats, fighting styles, epic boons | With an AI (this page) |
| Spells | With an AI (this page) |
| Subclasses for the app's classes | With an AI (this page) |
| Backgrounds, species, magic items, whole classes | In the app: Settings → Homebrew has a form for each, then Export |
Steps
- Copy the prompt below into your AI assistant.
- Paste the example pack after it, then the book text of the entries you want (a chapter or a few entries at a time works best).
- Save the AI's answer as a file ending in
.json. - Import it in the app. If the app lists problems, paste them back to the AI and ask it to fix the file. Keep the same file and ids when you fix or add to it.
The prompt
You are making a content pack for a tabletop RPG character sheet app (fifth-edition rules). Output
ONE JSON object and nothing else, in exactly the shape of the example pack I paste below
(format 1, systemId "dnd-5.5e").
Rules:
- Keep every key name and structure from the example. Only change values, and repeat entries.
- Ids: lowercase letters, digits and "_" only, starting with a short prefix for this book
(like "mb_"). Spells start with "spell_<prefix>". Never change an id once made.
- Feats go in "choiceOptions" with "list": "feats" ("fighting_style_feats" for fighting styles,
"epic_boons" for epic boons). Use "increase" only when the feat raises an ability by 1;
"targets" are the ability ids it can raise (str, dex, con, int, wis, cha).
- Spells go in "catalogEntries" with "catalog": "spells". "classes" lists the class ids whose
spell list has it (bard, cleric, druid, paladin, ranger, sorcerer, warlock, wizard). Add
"mechanics" only for a single attack or saving throw with damage or healing dice; otherwise leave
"mechanics" out.
- A subclass of a class (barbarian, bard, cleric, druid, fighter, monk, paladin, ranger, rogue,
sorcerer, warlock, wizard) needs four parts, like the example's Frost Knight: a "choiceOptions"
entry with "list": "subclass_<class>", two "nodes" (<id> and <id>_level, with the formula
"<id> ? class_<class>_level : 0"), and one "levelFeatures" entry per feature at its level,
with "levelNode": "<id>_level". Every part has "partOf": "<id>".
- A feature usable a number of times per rest has "kind": "limited", "used": 0, "max", "recovery"
("short_rest" or "long_rest") and "actionType": "free". Every other feature has
"kind": "passive". Extra damage on a hit goes in "onHitDamage" like the example.
- Put the full rules text in each "description". Never invent rules or numbers the book doesn't
state; when something can't be expressed, leave it as text in the description.
- Set "source": { "book": "<title>", "page": <page> } on each entry when you know the page.
- "licence": for a book you own, use { "id": "personal", "name": "Personal use",
"attribution": "Made from <title> for personal use.", "shareable": false }. Only for a CC-BY or
ORC book, put its exact licence notice in "attribution" and "shareable": true.
- Don't use the words "Dungeons & Dragons" or "D&D".
Here is the example pack, then the book text:
Example pack
The app's own checks pass this exact file.
{
"format": 1,
"id": "example-book",
"name": "Example Book",
"version": "1.0.0",
"systemId": "dnd-5.5e",
"source": "Example Book",
"description": "Made from my copy of Example Book.",
"licence": {
"id": "personal",
"name": "Personal use",
"attribution": "Made from Example Book for personal use.",
"shareable": false
},
"choiceOptions": [
{
"list": "feats",
"option": {
"id": "ex_steady_hands",
"label": "Steady Hands",
"description": "+1 Dexterity or Wisdom. Your aim is true.",
"feature": {
"name": "Steady Hands",
"description": "Increase your Dexterity or Wisdom by 1 (max 20). Your aim is true.",
"category": "feat"
},
"unlessFeatures": ["Steady Hands"],
"increase": {
"targets": ["dex", "wis"],
"increases": [1],
"max": 20
}
},
"source": { "book": "Example Book", "page": 12 }
},
{
"list": "subclass_fighter",
"option": {
"id": "ex_frost_knight",
"label": "Frost Knight",
"description": "Knights of the north.",
"feature": {
"name": "Fighter Subclass: Frost Knight",
"description": "Knights of the north.",
"category": "subclass"
},
"modifiers": [
{
"id": "ex_frost_knight_on",
"targetNodeId": "ex_frost_knight",
"operation": "override",
"value": true,
"label": "Frost Knight"
}
]
}
}
],
"catalogEntries": [
{
"catalog": "spells",
"entry": {
"id": "spell_ex_frost_bolt",
"name": "Frost Bolt",
"level": 1,
"school": "Evocation",
"castingTime": "Action",
"range": "60 feet",
"components": "V, S",
"duration": "Instantaneous",
"concentration": false,
"ritual": false,
"classes": ["wizard", "sorcerer"],
"description": "A bolt of ice.",
"higherLevel": "Using a Higher-Level Spell Slot. +1d8 per slot level above 1.",
"mechanics": {
"attack": "ranged",
"damage": {
"dice": { "kind": "dice", "count": 2, "die": 8 },
"type": "Cold"
},
"upcast": { "dice": 1 }
}
}
}
],
"nodes": [
{
"node": {
"id": "ex_frost_knight",
"name": "Frost Knight",
"type": "boolean",
"defaultValue": false,
"description": "The Fighter subclass is Frost Knight."
},
"partOf": "ex_frost_knight"
},
{
"node": {
"id": "ex_frost_knight_level",
"name": "Frost Knight Level",
"type": "number",
"formula": "ex_frost_knight ? class_fighter_level : 0",
"description": "The Fighter level, for Frost Knight; 0 otherwise."
},
"partOf": "ex_frost_knight"
}
],
"levelFeatures": [
{
"grant": {
"id": "ex_frost_knight_1",
"levelNode": "ex_frost_knight_level",
"level": 3,
"feature": {
"name": "Cold Steel",
"description": "Your weapon hits deal 1d6 extra Cold damage once per turn.",
"category": "subclass",
"sourceName": "Frost Knight",
"kind": "passive",
"onHitDamage": {
"count": 1,
"die": 6,
"on": "weapon",
"damageType": "Cold",
"when": "Once per turn"
}
}
},
"partOf": "ex_frost_knight"
},
{
"grant": {
"id": "ex_frost_knight_2",
"levelNode": "ex_frost_knight_level",
"level": 7,
"feature": {
"name": "Frozen Resolve",
"description": "Twice per Long Rest you can shake off a condition.",
"category": "subclass",
"sourceName": "Frost Knight",
"kind": "limited",
"used": 0,
"max": 2,
"recovery": "long_rest",
"actionType": "free"
}
},
"partOf": "ex_frost_knight"
}
]
}
Notes
- Raise
version("1.0.1") each time you change the pack, so the app offers to update it. - A feat's or subclass's
descriptionis what the app shows in its list;feature.descriptionis what the sheet shows once it's picked. - The app keeps fields it doesn't know, so a pack made for a newer app still imports.