Tiny Tarrasque

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

What to make where

ContentBest made
Feats, fighting styles, epic boonsWith an AI (this page)
SpellsWith an AI (this page)
Subclasses for the app's classesWith an AI (this page)
Backgrounds, species, magic items, whole classesIn the app: Settings → Homebrew has a form for each, then Export

Steps

  1. Copy the prompt below into your AI assistant.
  2. 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).
  3. Save the AI's answer as a file ending in .json.
  4. 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