This page shows how to add a homebrew subclass to one of RollQuest's classes, and how to add a feature or a new decision to a class level that already exists.

For: Game Masters · Plan: Pro · 20 minutes

A class, such as cleric or fighter, gives a character new abilities level by level, and at a set level each class asks for a subclass: a specialisation within the class, such as a cleric's divine domain. In RollQuest each level of a class is one row in the system's class features pack, and the subclass is a choice on one of those rows, such as Choose your Divine Domain at Cleric 3, with Life Domain as its option. A homebrew subclass adds your own option to that choice, and a class feature pack adds a feature, or a question of its own, to a level. You never copy or change RollQuest's classes: as the Game Master (GM), you write a pack that only adds, and you bind only your own pack to the game.

Plan: writing homebrew is on Pro. Your players don't need Pro to pick your subclass: it's offered at Level Up and in the character builder.

How a homebrew subclass works

Your pack holds one row that says where the subclass goes and what it is, plus a row for each feature it grants. When you bind the pack to a game, RollQuest adds your option to the class's choice at that game only, after the built-in option. A character who picks it gets each feature at the level you set.

flowchart LR
  K["RollQuest's class features pack<br/>Cleric 3: Choose your Divine Domain<br/>Life Domain"] --> M
  P["Your pack<br/>Hearth Domain and its features"] -->|"Bind to this table"| M["The choice at this game<br/>Life Domain, Hearth Domain"]
  M --> L["Level Up to Cleric 3"]
  M --> B["Character builder<br/>a cleric started at level 3 or higher"]
  L --> S["The sheet<br/>Hearth features arrive<br/>at levels 3, 6 and 17"]
  B --> S

Three words you'll meet on this page:

  • Class level row: the row for one level of one class, such as CLASS_CLER_L3 (Cleric 3). It holds what the level gives and the choices it asks.
  • Carrier: the row in your pack that carries your option to the class level row. Players never hold it.
  • Grant: a feature or spell that arrives on its own when the character reaches its level.

Where each class chooses its subclass

Point your subclass at the class level row and the choice below. The built-in option's ID is listed because yours must use a different one.

Class 5.5e row and choice 5e row and choice Built-in option ID
Barbarian CLASS_BARB_L3, barb_l3_subclass CLASS_BARB_L3, barb_l3_subclass berserker
Bard CLASS_BARD_L3, bard_l3_subclass CLASS_BARD_L3, bard_l3_subclass lore
Cleric CLASS_CLER_L3, cleric_l3_subclass CLASS_CLERIC_L1, cleric_subclass life
Druid CLASS_DRUID_L3, druid_l3_subclass CLASS_DRUID_L2, druid_l2_subclass land
Fighter CLASS_FIGHTER_L3, fighter_l3_subclass CLASS_FIGHTER_L3, fighter_l3_subclass champion
Monk CLASS_MONK_L3, monk_l3_subclass CLASS_MONK_L3, monk_l3_subclass open_hand
Paladin CLASS_PALA_L3, pala_l3_subclass CLASS_PALA_L3, pala_l3_subclass devotion
Ranger CLASS_RANGER_L3, ranger_l3_subclass CLASS_RANGER_L3, ranger_l3_subclass hunter
Rogue CLASS_ROGUE_L3, rogue_l3_subclass CLASS_ROGUE_L3, rogue_l3_subclass thief
Sorcerer CLASS_SORC_L3, sorc_l3_subclass CLASS_SORCERER_L1, sorc_subclass draconic
Warlock CLASS_WARL_L3, warl_l3_subclass CLASS_WARLOCK_L1, warl_l1_subclass fiend
Wizard CLASS_WIZ_L3, wiz_l3_subclass CLASS_WIZ_L2, wiz_l2_subclass evoker

The class features pack is 5-5e-srd-class-features for 5.5e (the 2024 rules, SRD 5.2.1) and 5e-srd-class-features for 5e (the 2014 rules, SRD 5.1). In 5.5e every class chooses at level 3. In 5e the cleric, sorcerer and warlock choose at level 1, the druid and wizard at level 2, and the rest at level 3.

A 5.5e subclass, complete: Hearth Domain

Hearth Domain is a cleric domain of home, warmth and shelter. It sits beside Life Domain in Choose your Divine Domain at Cleric 3.

Cleric level What the character gets
3 Proficiency with cook's utensils. Warding Flame: a reaction, twice per long rest. Channel Divinity: Kindle the Hearth: heals 2d8 plus the Wisdom modifier, spending a Channel Divinity use. Domain spells, always prepared: Sanctuary, Heroism, Aid, Warding Bond.
5 Domain spells: Create Food and Water, Protection from Energy.
6 Kindred Warmth: resistance to cold damage.
7 Domain spells: Guardian of Faith, Fire Shield.
9 Domain spells: Hallow, Greater Restoration.
17 Undying Flame: immunity to cold damage and resistance to fire damage.

A level 6 Hearth cleric's sheet, labelled: 1 Warding Flame with its 2 uses under Resources, 2 Channel Divinity: Kindle the Hearth, opened, with its Heal button, 3 Kindred Warmth, 4 the domain spells on the Spells tab: Sanctuary (opened), Heroism, Aid and Warding Bond.

Here is the whole pack. Paste it into Check and create as it is, or change the names and numbers to suit your game.

{
  "slug": "my-hearth-domain",
  "name": "Hearth Domain",
  "system": "5.5e Compatible",
  "derivedFrom": "5-5e-core",
  "category": "subclass",
  "version": "1.0.0",
  "license": "USER_HOMEBREW",
  "source": "My table's homebrew.",
  "description": "A Cleric domain of home, warmth and shelter, for 5.5e.",
  "items": [
    {
      "kind": "inventoryItem",
      "key": "HEARTH_DOMAIN",
      "spec": {
        "subType": "background",
        "id": "HEARTH_DOMAIN",
        "name": "Divine Domain: Hearth",
        "contributesTo": {
          "packSlug": "5-5e-srd-class-features",
          "itemKey": "CLASS_CLER_L3",
          "choiceId": "cleric_l3_subclass"
        },
        "option": {
          "id": "hearth",
          "label": "Hearth Domain",
          "description": "Your god keeps the fire in every home. Proficiency with Cook's Utensils. Warding Flame and Kindle the Hearth (L3), Kindred Warmth (L6), Undying Flame (L17). Hearth domain spells, always prepared.",
          "effects": [
            { "id": "HEARTH_COOKS_UTENSILS", "target": "T_COOK", "op": "setMin", "value": 1, "condition": "", "trigger": "" }
          ],
          "autoInclude": [
            { "packSlug": "my-hearth-domain", "itemKey": "FEATURE_HEARTH_WARDING_FLAME", "grantAtLevel": 3 },
            { "packSlug": "my-hearth-domain", "itemKey": "FEATURE_HEARTH_KINDLE", "grantAtLevel": 3 },
            { "packSlug": "my-hearth-domain", "itemKey": "FEATURE_HEARTH_KINDRED_WARMTH", "grantAtLevel": 6 },
            { "packSlug": "my-hearth-domain", "itemKey": "FEATURE_HEARTH_UNDYING_FLAME", "grantAtLevel": 17 },
            { "packSlug": "5-5e-srd-spells", "itemKey": "SPELL_SANCTUARY", "grantAtLevel": 3, "alwaysPrepared": true },
            { "packSlug": "5-5e-srd-spells", "itemKey": "SPELL_HEROISM", "grantAtLevel": 3, "alwaysPrepared": true },
            { "packSlug": "5-5e-srd-spells", "itemKey": "SPELL_AID", "grantAtLevel": 3, "alwaysPrepared": true },
            { "packSlug": "5-5e-srd-spells", "itemKey": "SPELL_WARDING_BOND", "grantAtLevel": 3, "alwaysPrepared": true },
            { "packSlug": "5-5e-srd-spells", "itemKey": "SPELL_CREATE_FOOD_AND_WATER", "grantAtLevel": 5, "alwaysPrepared": true },
            { "packSlug": "5-5e-srd-spells", "itemKey": "SPELL_PROTECTION_FROM_ENERGY", "grantAtLevel": 5, "alwaysPrepared": true },
            { "packSlug": "5-5e-srd-spells", "itemKey": "SPELL_GUARDIAN_OF_FAITH", "grantAtLevel": 7, "alwaysPrepared": true },
            { "packSlug": "5-5e-srd-spells", "itemKey": "SPELL_FIRE_SHIELD", "grantAtLevel": 7, "alwaysPrepared": true },
            { "packSlug": "5-5e-srd-spells", "itemKey": "SPELL_HALLOW", "grantAtLevel": 9, "alwaysPrepared": true },
            { "packSlug": "5-5e-srd-spells", "itemKey": "SPELL_GREATER_RESTORATION", "grantAtLevel": 9, "alwaysPrepared": true }
          ]
        },
        "meta": { "class": "Cleric" },
        "effects": []
      }
    },
    {
      "kind": "inventoryItem",
      "key": "FEATURE_HEARTH_WARDING_FLAME",
      "spec": {
        "subType": "background",
        "id": "FEATURE_HEARTH_WARDING_FLAME",
        "name": "Warding Flame",
        "maxUses": 2,
        "uses": 2,
        "meta": {
          "class": "Cleric (Hearth)",
          "passive": false,
          "description": "Level 3. When a creature you can see within 30 feet of you is attacked, you can take a Reaction to impose Disadvantage on the attack roll. Twice per Long Rest."
        },
        "actions": [
          { "id": "WARD", "label": "Ward", "formula": "", "damageType": "", "tag": "" }
        ],
        "effects": [
          { "id": "WARDING_FLAME_LR", "target": "SELF.uses", "op": "reset", "value": "", "condition": "", "trigger": "longRest" }
        ]
      }
    },
    {
      "kind": "inventoryItem",
      "key": "FEATURE_HEARTH_KINDLE",
      "spec": {
        "subType": "background",
        "id": "FEATURE_HEARTH_KINDLE",
        "name": "Channel Divinity: Kindle the Hearth",
        "meta": {
          "class": "Cleric (Hearth)",
          "passive": false,
          "description": "Level 3. As a Magic action, you expend a use of your Channel Divinity and touch a creature. It regains 2d8 plus your Wisdom modifier Hit Points.",
          "consumes": { "itemKey": "FEATURE_CHANNEL_DIVINITY", "amount": 1 },
          "targets": { "max": 1 },
          "applies": [ { "kind": "heal", "formula": "=2d8+WIS_MOD", "actionId": "HEAL" } ]
        },
        "actions": [
          { "id": "HEAL", "label": "Heal", "formula": "=2d8+WIS_MOD", "damageType": "healing", "tag": "HEAL_ROLL" }
        ],
        "effects": []
      }
    },
    {
      "kind": "inventoryItem",
      "key": "FEATURE_HEARTH_KINDRED_WARMTH",
      "spec": {
        "subType": "background",
        "id": "FEATURE_HEARTH_KINDRED_WARMTH",
        "name": "Kindred Warmth",
        "meta": {
          "class": "Cleric (Hearth)",
          "passive": true,
          "description": "Level 6. You have Resistance to Cold damage."
        },
        "effects": [
          { "id": "KINDRED_WARMTH_COLD", "target": "RESIST_COLD", "op": "setMin", "value": 1, "condition": "", "trigger": "" }
        ]
      }
    },
    {
      "kind": "inventoryItem",
      "key": "FEATURE_HEARTH_UNDYING_FLAME",
      "spec": {
        "subType": "background",
        "id": "FEATURE_HEARTH_UNDYING_FLAME",
        "name": "Undying Flame",
        "meta": {
          "class": "Cleric (Hearth)",
          "passive": true,
          "description": "Level 17. You have Immunity to Cold damage and Resistance to Fire damage."
        },
        "effects": [
          { "id": "UNDYING_FLAME_COLD", "target": "RESIST_COLD", "op": "setMin", "value": 2, "condition": "", "trigger": "" },
          { "id": "UNDYING_FLAME_FIRE", "target": "RESIST_FIRE", "op": "setMin", "value": 1, "condition": "", "trigger": "" }
        ]
      }
    }
  ]
}

The carrier row, field by field

The first row, HEARTH_DOMAIN, is the carrier.

Field What it does
kind inventoryItem, like any row a character could hold. RollQuest recognises it as a carrier by its contributesTo, and never offers it as an item.
key and spec.id The row's ID, HEARTH_DOMAIN. Any key your packs don't use yet.
spec.subType background, as for every class feature.
spec.name The carrier's name, Divine Domain: Hearth. It shows in messages about the carrier, such as the one a player gets if they try to add it as an item.
spec.contributesTo.packSlug The pack that owns the class: 5-5e-srd-class-features.
spec.contributesTo.itemKey The class level row: CLASS_CLER_L3, Cleric 3.
spec.contributesTo.choiceId The choice on that row: cleric_l3_subclass, Choose your Divine Domain.
spec.option Your option, in exactly the shape of a built-in one. The fields below.
spec.meta.class A label, Cleric. Nothing reads it for rules.
spec.effects Leave it empty. The carrier is never on a sheet, so its own effects never count.

The option, field by field:

Field What it does
id The option's ID, hearth. It must differ from the built-in option's ID (life here) and from any other homebrew option at the same game.
label What players see in the choice: Hearth Domain. It's saved on each character that picks it, so it still reads correctly if you unbind the pack later. Always give one.
description The text under the option in the choices window. Sum up every feature and its level, as the built-in domain does.
effects Effects that count from the moment the option is picked, for as long as the character has the class level. Here, proficiency with cook's utensils (T_COOK at least 1). See Effects.
autoInclude The grants: one entry per feature or spell, each with the level it arrives at.

Each grant in autoInclude:

Field What it does
packSlug The pack the row comes from: your own pack's slug for your features, 5-5e-srd-spells for RollQuest's spells.
itemKey The row's key in that pack.
grantAtLevel The class level it arrives at. Use the subclass's level (3 here) for the first features. A grant above the character's level waits, and arrives at the Level Up that reaches it.
alwaysPrepared true for domain spells: the spell is always prepared and doesn't count against the character's prepared spells.

The features

Each feature is an ordinary row in your pack, so anything an item can do, a feature can do. These four show the common patterns:

  • Warding Flame has maxUses and uses of 2, an effect that refills its uses on a long rest (SELF.uses, reset, longRest), and an action with an empty formula, which gives the player a button that spends a use without rolling anything. Always set uses equal to maxUses, or the feature arrives spent.
  • Kindle the Hearth spends a use of the cleric's own Channel Divinity feature instead of having uses of its own: meta.consumes names FEATURE_CHANNEL_DIVINITY. Its Heal action rolls 2d8+WIS_MOD, and meta.applies with meta.targets lets the player pick the creature to heal on the board.
  • Kindred Warmth has one always-on effect: RESIST_COLD at least 1, which is resistance. 2 would be immunity.
  • Undying Flame raises the same value to 2. The highest setMin wins, so the character is immune to cold from level 17 even though Kindred Warmth still says 1.

Rules for subclass features:

  • Start feature keys with FEATURE_. The Progression tab only lists grants whose key starts that way.
  • Use subType background. Its effects are always on.
  • Name the class in meta.class, such as Cleric (Hearth). RollQuest reads the class name before the brackets, and a character with no levels in that class can't add the feature on its own.
  • Never put meta.kitClass or meta.kitLevel on the carrier, the option or a feature. Those two fields mark a row as a class level, and a class level is given to every character of that class, whichever subclass they chose. Use grantAtLevel to time a feature instead. The checker doesn't catch this mistake.
  • Grant from your own pack or one of RollQuest's packs for your system. A grant can't come from another of your packs unless that pack is bound to the game too.

The envelope

Field Value here Why
slug my-hearth-domain Your pack's ID. The grants name it.
name Hearth Domain Shown in My Homebrew and in messages.
system 5.5e Compatible The system the subclass is for.
derivedFrom 5-5e-core The system's core pack, as for any homebrew. You don't need to derive from the class features pack to add to it: any of RollQuest's packs for your system can be added to. Deriving from 5-5e-srd-class-features also works.
category subclass A label for your list.
license USER_HOMEBREW Every homebrew pack has this.

The other fields are described in The pack file, field by field.

A 5e subclass, complete

In 5e (2014) a cleric picks a domain at level 1, inside Choose Your Class, and gets Channel Divinity at level 2. The same domain for 5e points at CLASS_CLERIC_L1 and cleric_subclass, takes its spells from 5e-srd-spells, and adds a weapon-strike feature at level 8, as the 5e Life Domain does.

Cleric level What the character gets
1 Proficiency with cook's utensils. Warding Flame. Domain spells: Sanctuary, Heroism.
2 Channel Divinity: Kindle the Hearth.
3 Domain spells: Aid, Warding Bond.
5 Domain spells: Create Food and Water, Protection from Energy.
6 Kindred Warmth.
7 Domain spells: Guardian of Faith, Fire Shield.
8 Hearthfire Strike: an extra 1d8 fire damage, 2d8 from level 14.
9 Domain spells: Hallow, Greater Restoration.
17 Undying Flame.
{
  "slug": "my-5e-hearth-domain",
  "name": "Hearth Domain (5e)",
  "system": "5e Compatible",
  "derivedFrom": "5e-core",
  "category": "subclass",
  "version": "1.0.0",
  "license": "USER_HOMEBREW",
  "source": "My table's homebrew.",
  "description": "A Cleric domain of home, warmth and shelter, for 5e.",
  "items": [
    {
      "kind": "inventoryItem",
      "key": "HEARTH_DOMAIN_5E",
      "spec": {
        "subType": "background",
        "id": "HEARTH_DOMAIN_5E",
        "name": "Divine Domain: Hearth",
        "contributesTo": {
          "packSlug": "5e-srd-class-features",
          "itemKey": "CLASS_CLERIC_L1",
          "choiceId": "cleric_subclass"
        },
        "option": {
          "id": "hearth",
          "label": "Hearth Domain",
          "description": "Your god keeps the fire in every home. Proficiency with cook's utensils. Warding Flame (L1), Channel Divinity: Kindle the Hearth (L2), Kindred Warmth (L6), Hearthfire Strike (L8; 1d8, 2d8 at L14), Undying Flame (L17). Hearth domain spells, always prepared.",
          "effects": [
            { "id": "HEARTH_5E_COOKS_UTENSILS", "target": "T_COOK", "op": "setMin", "value": 1, "condition": "", "trigger": "" }
          ],
          "autoInclude": [
            { "packSlug": "my-5e-hearth-domain", "itemKey": "FEATURE_HEARTH_WARDING_FLAME_5E", "grantAtLevel": 1 },
            { "packSlug": "my-5e-hearth-domain", "itemKey": "FEATURE_HEARTH_KINDLE_5E", "grantAtLevel": 2 },
            { "packSlug": "my-5e-hearth-domain", "itemKey": "FEATURE_HEARTH_KINDRED_WARMTH_5E", "grantAtLevel": 6 },
            { "packSlug": "my-5e-hearth-domain", "itemKey": "FEATURE_HEARTH_STRIKE_5E", "grantAtLevel": 8 },
            { "packSlug": "my-5e-hearth-domain", "itemKey": "FEATURE_HEARTH_UNDYING_FLAME_5E", "grantAtLevel": 17 },
            { "packSlug": "5e-srd-spells", "itemKey": "SPELL_SANCTUARY", "grantAtLevel": 1, "alwaysPrepared": true },
            { "packSlug": "5e-srd-spells", "itemKey": "SPELL_HEROISM", "grantAtLevel": 1, "alwaysPrepared": true },
            { "packSlug": "5e-srd-spells", "itemKey": "SPELL_AID", "grantAtLevel": 3, "alwaysPrepared": true },
            { "packSlug": "5e-srd-spells", "itemKey": "SPELL_WARDING_BOND", "grantAtLevel": 3, "alwaysPrepared": true },
            { "packSlug": "5e-srd-spells", "itemKey": "SPELL_CREATE_FOOD_AND_WATER", "grantAtLevel": 5, "alwaysPrepared": true },
            { "packSlug": "5e-srd-spells", "itemKey": "SPELL_PROTECTION_FROM_ENERGY", "grantAtLevel": 5, "alwaysPrepared": true },
            { "packSlug": "5e-srd-spells", "itemKey": "SPELL_GUARDIAN_OF_FAITH", "grantAtLevel": 7, "alwaysPrepared": true },
            { "packSlug": "5e-srd-spells", "itemKey": "SPELL_FIRE_SHIELD", "grantAtLevel": 7, "alwaysPrepared": true },
            { "packSlug": "5e-srd-spells", "itemKey": "SPELL_HALLOW", "grantAtLevel": 9, "alwaysPrepared": true },
            { "packSlug": "5e-srd-spells", "itemKey": "SPELL_GREATER_RESTORATION", "grantAtLevel": 9, "alwaysPrepared": true }
          ]
        },
        "meta": { "class": "Cleric" },
        "effects": []
      }
    },
    {
      "kind": "inventoryItem",
      "key": "FEATURE_HEARTH_WARDING_FLAME_5E",
      "spec": {
        "subType": "background",
        "id": "FEATURE_HEARTH_WARDING_FLAME_5E",
        "name": "Warding Flame",
        "maxUses": 2,
        "uses": 2,
        "meta": {
          "class": "Cleric (Hearth)",
          "passive": false,
          "description": "Level 1. When a creature you can see within 30 feet of you is attacked, you can use your reaction to impose disadvantage on the attack roll. Twice per long rest."
        },
        "actions": [
          { "id": "WARD", "label": "Ward", "formula": "", "damageType": "", "tag": "" }
        ],
        "effects": [
          { "id": "WARDING_FLAME_5E_LR", "target": "SELF.uses", "op": "reset", "value": "", "condition": "", "trigger": "longRest" }
        ]
      }
    },
    {
      "kind": "inventoryItem",
      "key": "FEATURE_HEARTH_KINDLE_5E",
      "spec": {
        "subType": "background",
        "id": "FEATURE_HEARTH_KINDLE_5E",
        "name": "Channel Divinity: Kindle the Hearth",
        "meta": {
          "class": "Cleric (Hearth)",
          "passive": false,
          "description": "Level 2. As an action, you use your Channel Divinity and touch a creature. It regains 2d8 + your Wisdom modifier hit points.",
          "consumes": { "itemKey": "FEATURE_CHANNEL_DIVINITY", "amount": 1 },
          "targets": { "max": 1 },
          "applies": [ { "kind": "heal", "formula": "=2d8+WIS_MOD", "actionId": "HEAL" } ]
        },
        "actions": [
          { "id": "HEAL", "label": "Heal", "formula": "=2d8+WIS_MOD", "damageType": "healing", "tag": "HEAL_ROLL" }
        ],
        "effects": []
      }
    },
    {
      "kind": "inventoryItem",
      "key": "FEATURE_HEARTH_KINDRED_WARMTH_5E",
      "spec": {
        "subType": "background",
        "id": "FEATURE_HEARTH_KINDRED_WARMTH_5E",
        "name": "Kindred Warmth",
        "meta": {
          "class": "Cleric (Hearth)",
          "passive": true,
          "description": "Level 6. You have resistance to cold damage."
        },
        "effects": [
          { "id": "KINDRED_WARMTH_5E_COLD", "target": "RESIST_COLD", "op": "setMin", "value": 1, "condition": "", "trigger": "" }
        ]
      }
    },
    {
      "kind": "inventoryItem",
      "key": "FEATURE_HEARTH_STRIKE_5E",
      "spec": {
        "subType": "background",
        "id": "FEATURE_HEARTH_STRIKE_5E",
        "name": "Hearthfire Strike",
        "meta": {
          "class": "Cleric (Hearth)",
          "passive": false,
          "levelSource": "Cleric",
          "description": "Level 8. Once on each of your turns when you hit a creature with a weapon attack, you can deal an extra 1d8 fire damage to it. At 14th level the extra damage becomes 2d8.",
          "targets": { "max": 1 },
          "applies": [
            { "kind": "damage", "formula": "=1d8", "damageType": "fire", "actionId": "FIRE_L8" },
            { "kind": "damage", "formula": "=2d8", "damageType": "fire", "actionId": "FIRE_L14" }
          ]
        },
        "actions": [
          { "id": "FIRE_L8", "label": "Fire (L8-13)", "formula": "=1d8", "damageType": "fire", "tag": "DMG_ROLL" },
          { "id": "FIRE_L14", "label": "Fire (L14+)", "formula": "=2d8", "damageType": "fire", "tag": "DMG_ROLL" }
        ],
        "effects": []
      }
    },
    {
      "kind": "inventoryItem",
      "key": "FEATURE_HEARTH_UNDYING_FLAME_5E",
      "spec": {
        "subType": "background",
        "id": "FEATURE_HEARTH_UNDYING_FLAME_5E",
        "name": "Undying Flame",
        "meta": {
          "class": "Cleric (Hearth)",
          "passive": true,
          "description": "Level 17. You have immunity to cold damage and resistance to fire damage."
        },
        "effects": [
          { "id": "UNDYING_FLAME_5E_COLD", "target": "RESIST_COLD", "op": "setMin", "value": 2, "condition": "", "trigger": "" },
          { "id": "UNDYING_FLAME_5E_FIRE", "target": "RESIST_FIRE", "op": "setMin", "value": 1, "condition": "", "trigger": "" }
        ]
      }
    }
  ]
}

What's different from the 5.5e pack:

  • system is 5e Compatible and derivedFrom is 5e-core.
  • contributesTo names 5e-srd-class-features, CLASS_CLERIC_L1 and cleric_subclass.
  • The spells come from 5e-srd-spells, and the first grants are at level 1.
  • Hearthfire Strike has two actions, FIRE_L8 and FIRE_L14, and meta.levelSource set to Cleric. An action whose ID ends _L and a number stays locked until the character's level in the class named by levelSource reaches that number, so the player rolls 1d8 from Cleric 8 and 2d8 from Cleric 14. It's a button the player presses when the strike applies, because an effect can't tell a weapon hit from a spell.
  • Keys end _5E. Keys only need to be unique within one system, so this is for your own clarity.

Check it, create it and bind it

  1. In your game, open the menu and choose Game Master tools > My Homebrew.

  2. Click + New homebrew, pick the system, and carry on to Check and create. Your first homebrew pack, step by step goes through these windows one by one.

  3. Paste the pack into the box and click Check this pack. The checker answers with no blocking problems.

  4. Click Create pack. The pack joins your list as revision 1.

  5. On the pack's row, click Bind to this table.

  6. Leave every step under Where should its items appear? unticked. A subclass doesn't need a builder step: it's offered inside the class.

  7. Click Bind pack. The message says what the pack adds:

    Hearth Domain is bound to this table. 4 items are now offered to its players. Adds "Hearth Domain" to "Choose your Divine Domain" (Cleric 3).

    The bind message after Bind pack: Hearth Domain is bound to this table. 4 items are now offered to its players. Adds "Hearth Domain" to "Choose your Divine Domain" (Cleric 3).

The 5e pack's message ends (Cleric 1).

Binding asks you to confirm nothing. The domain choice still takes one answer, so a character who picks Hearth Domain doesn't get Life Domain too, but nothing is deleted: characters who chose a domain before you bound the pack keep it.

You bind only your own pack. RollQuest's class features pack is always part of a game of its system, so it doesn't need binding.

The 4 items in the message are the four features. RollQuest counts them, but never lists them in + From pack: a class or subclass feature arrives only with the level or the choice that grants it. A feature names its class in meta.class (Cleric (Hearth) here), and adding one directly to a character without levels in that class is refused, with a message such as "Warding Flame" is a Cleric feature, and this character has no Cleric levels. It arrives with the class level, subclass or feature choice that grants it. The carrier is never listed either: adding it directly is refused with "Divine Domain: Hearth" is not something a character holds: it adds "Hearth Domain" as an option of the "cleric_l3_subclass" choice on "CLASS_CLER_L3". Pick "Hearth Domain" there instead, at Level Up or in the character builder.

When binding is refused

  • The game plays another system. A 5.5e subclass can't go on a 5e game, or the other way round. The message names both: "Hearth Domain" adds an option to the "cleric_l3_subclass" choice on item "CLASS_CLER_L3" in pack "5-5e-srd-class-features", and this table plays "5e Compatible", while "5-5e-srd-class-features" is curated content for "5.5e Compatible". Nothing has been bound. Bind the pack in a game of the right system, or write the subclass for this one.
  • Another homebrew pack at the game already adds an option with the same ID. "…" contributes an option with id "hearth" to the "cleric_l3_subclass" choice, and another pack already bound to this table ("my-hearth-domain") already contributes one with that id. Give one of them a different option id.
  • The class level row is in one of your own packs that isn't bound to this game. Bind that pack first. The message ends Bind that pack first (or, if it is bound at an older revision that predates the target, move its pin) and then bind this one.

Where players meet the subclass

At Level Up

A cleric reaching the subclass level meets your domain beside the built-in one.

  1. On the character's sheet, click Level Up, then the class row, such as Cleric · Lv 2 → 3. On a Canvas sheet, drawn on artwork, the character's player sees Level Up in the top row straight away, and the GM clicks Edit first. In the Form View, the sheet's standard tabbed layout, click Edit first (see Form and Canvas views): Level Up is in the Edit toolbar.

  2. The What you gain step lists the level's features. Click Next.

  3. In the Choices step, click Make these choices →.

  4. Under Choose your Divine Domain, click Hearth Domain. Life Domain is listed first, and homebrew options after it. The same window may ask for the level's other choices too, such as Prepare 1 new Cleric spell: Confirm stays greyed out until every question is answered.

  5. Click Confirm, then carry on to Hit Points and click Finish level-up.

    A level 2 cleric levels to 3: Make these choices, Hearth Domain beside Life Domain with its description, Confirm, Finish level-up. Warding Flame, Kindle the Hearth and the four domain spells appear on the sheet.

The level 3 features and spells arrive with the level. Each later feature arrives on its own at the Level Up that reaches its level, with nothing to choose: the domain spells at 5, 7 and 9, Kindred Warmth at 6 and Undying Flame at 17. The Progression tab shows the domain on the level it was chosen and lists the features to come. See Level up.

In the character builder

  • A 5.5e character started at level 3 or higher. The builder adds a step for each level with a choice, such as Level 3 · Cleric 3. Click Make these choices → on it: Choose your Divine Domain lists Hearth Domain. Every feature and spell up to the starting level arrives at once, so a cleric started at level 7 gets Warding Flame, Kindle the Hearth, Kindred Warmth and the domain spells up to level 7.
  • A 5e cleric, at level 1. On Choose Your Class, click the Cleric card. The choices window opens with Choose your Divine Domain, listing Life Domain and Hearth Domain. Pick one, answer the cleric's other choices and click Confirm.

See Create a character.

On the sheet, and later

  • The features sit on the sheet with the class's own, locked to your pack. A feature with uses shows them under Resources, and its button spends one.
  • The choice is saved with the option's label. If you unbind the pack, characters keep their domain and its features.
  • Editing the pack later doesn't change characters who already have the features, until you move the game to the new revision and re-stamp. See Put your pack on a table.

Add a feature or a decision to an existing class level

The second kind of class homebrew changes a class itself, for everyone who plays it at your game: every fighter gets a battle cry at level 2, say, or every cleric is asked a new question at level 5. It's a row of kind classContribution, and like a subclass it only adds: it can't change or remove what the level already gives.

This pack gives every fighter Battle Cry at Fighter 2, Rallying Shout at Fighter 3, and asks a new question at Fighter 2, Choose a War Cry, with two answers.

{
  "slug": "my-fighter-extras",
  "name": "Fighter extras",
  "system": "5.5e Compatible",
  "derivedFrom": "5-5e-core",
  "category": "addon",
  "version": "1.0.0",
  "license": "USER_HOMEBREW",
  "source": "My table's homebrew.",
  "description": "Adds a feature, a later feature and a decision to the Fighter's level 2.",
  "items": [
    {
      "kind": "classContribution",
      "key": "FIGHTER_L2_EXTRA",
      "spec": {
        "contributesTo": {
          "packSlug": "5-5e-srd-class-features",
          "itemKey": "CLASS_FIGHTER_L2"
        },
        "autoInclude": [
          { "packSlug": "my-fighter-extras", "itemKey": "FEATURE_BATTLE_CRY" },
          { "packSlug": "my-fighter-extras", "itemKey": "FEATURE_RALLYING_SHOUT", "grantAtLevel": 3 }
        ],
        "choices": [
          {
            "id": "fighter_l2_war_cry",
            "kind": "feature",
            "prompt": "Choose a War Cry",
            "pick": 1,
            "options": [
              {
                "id": "iron_voice",
                "label": "Iron Voice",
                "description": "You have Advantage on Charisma (Intimidation) checks.",
                "effects": [
                  { "id": "IRON_VOICE_INTIM", "target": "INTIM_ROLL", "op": "advantage", "value": 1, "condition": "", "trigger": "" }
                ],
                "autoInclude": []
              },
              {
                "id": "steady_voice",
                "label": "Steady Voice",
                "description": "You gain proficiency in the Persuasion skill.",
                "effects": [
                  { "id": "STEADY_VOICE_PERSUA", "target": "P_PERSUA", "op": "setMin", "value": 1, "condition": "", "trigger": "" }
                ],
                "autoInclude": []
              }
            ]
          }
        ]
      }
    },
    {
      "kind": "inventoryItem",
      "key": "FEATURE_BATTLE_CRY",
      "spec": {
        "subType": "background",
        "id": "FEATURE_BATTLE_CRY",
        "name": "Battle Cry",
        "maxUses": 1,
        "uses": 1,
        "meta": {
          "class": "Fighter",
          "passive": false,
          "description": "Level 2. As a Bonus Action you shout a battle cry. Allies within 30 feet who can hear you have Advantage on their next attack roll before the start of your next turn. Once per Short or Long Rest."
        },
        "actions": [
          { "id": "CRY", "label": "Shout", "formula": "", "damageType": "", "tag": "" }
        ],
        "effects": [
          { "id": "BATTLE_CRY_SR", "target": "SELF.uses", "op": "reset", "value": "", "condition": "", "trigger": "shortRest" },
          { "id": "BATTLE_CRY_LR", "target": "SELF.uses", "op": "reset", "value": "", "condition": "", "trigger": "longRest" }
        ]
      }
    },
    {
      "kind": "inventoryItem",
      "key": "FEATURE_RALLYING_SHOUT",
      "spec": {
        "subType": "background",
        "id": "FEATURE_RALLYING_SHOUT",
        "name": "Rallying Shout",
        "meta": {
          "class": "Fighter",
          "passive": true,
          "description": "Level 3. When you use Battle Cry, each ally who can hear you also gains Temporary Hit Points equal to your Fighter level."
        },
        "effects": []
      }
    }
  ]
}

The classContribution row, field by field

Field What it does
kind classContribution.
key The row's ID, FIGHTER_L2_EXTRA.
spec.contributesTo.packSlug The pack that owns the class: 5-5e-srd-class-features.
spec.contributesTo.itemKey The class level row to add to: CLASS_FIGHTER_L2, Fighter 2. The level comes from this row, so the contribution has no level of its own.
spec.autoInclude Features every character of the class gets at this level. An entry with grantAtLevel arrives at that class level instead, which may be higher than the row's own (Rallying Shout at 3) but never lower.
spec.choices New questions to ask at this level, in the same shape as a class's own choices. Here a feature choice: the player picks one option, its effects count from then on, and its own autoInclude would be granted. See Choices and grants.

spec takes those three fields and nothing else: at least one of autoInclude and choices, and no effects, meta, kitClass or kitLevel. A choice ID or a grant that the level already has is refused, because a contribution can't replace what's there.

The features themselves, FEATURE_BATTLE_CRY and FEATURE_RALLYING_SHOUT, are ordinary rows like the subclass features above. Battle Cry refills on either rest, with one reset effect for each.

Which row is which level

Each class has one row per level, 1 to 20, in both editions:

Class Level 1 Levels 2 to 20
Barbarian CLASS_BARBARIAN_L1 CLASS_BARB_L2 … CLASS_BARB_L20
Bard CLASS_BARD_L1 CLASS_BARD_L2 … CLASS_BARD_L20
Cleric CLASS_CLERIC_L1 CLASS_CLER_L2 … CLASS_CLER_L20
Druid CLASS_DRUID_L1 CLASS_DRUID_L2 … CLASS_DRUID_L20
Fighter CLASS_FIGHTER_L1 CLASS_FIGHTER_L2 … CLASS_FIGHTER_L20
Monk CLASS_MONK_L1 CLASS_MONK_L2 … CLASS_MONK_L20
Paladin CLASS_PALADIN_L1 CLASS_PALA_L2 … CLASS_PALA_L20
Ranger CLASS_RANGER_L1 CLASS_RANGER_L2 … CLASS_RANGER_L20
Rogue CLASS_ROGUE_L1 CLASS_ROGUE_L2 … CLASS_ROGUE_L20
Sorcerer CLASS_SORCERER_L1 CLASS_SORC_L2 … CLASS_SORC_L20
Warlock CLASS_WARLOCK_L1 CLASS_WARL_L2 … CLASS_WARL_L20
Wizard CLASS_WIZARD_L1 CLASS_WIZ_L2 … CLASS_WIZ_L20

The 5.5e rows are in 5-5e-srd-class-features and the 5e rows in 5e-srd-class-features. The same key exists in both, which is why contributesTo always names the pack.

Bind it

Bind it as above, with no step ticked. The message names the level, each grant and each question:

Fighter extras is bound to this table. 2 items are now offered to its players. At Fighter 2: adds Battle Cry and Rallying Shout (at Fighter 3) and asks "Choose a War Cry".

The 2 items are the two features: counted, as for a subclass, but never listed in + From pack. A grant that arrives later than the row's level has its level in brackets. Like a subclass, a class contribution asks for no confirmation, and binding it to a game of the other system is refused with the same kind of message.

Where players meet it

  • At Level Up. A fighter going from 1 to 2 is asked Choose a War Cry in the Choices step, beside anything the level already asks, and gets Battle Cry. The answer's effects go on the Fighter 2 row: Iron Voice gives advantage on Intimidation checks. Rallying Shout arrives at the Level Up to Fighter 3.
  • In the character builder. A fighter started at level 2 or higher is asked the new question in the builder's step for that level, and gets every grant up to the starting level. A question added to a level 1 row is asked in Choose Your Class, when the player clicks the class card.
  • A character already past the level when you bind. Binding alone gives them the features at their next Level Up, all at once: a fighter at level 5 gets Battle Cry and Rallying Shout on reaching 6, and isn't asked the new question. The features aren't in + From pack: like every class feature, they only arrive with the level.

Bring existing characters up to date

To give characters who are past the level the features and the question now, use the pack's row in My Homebrew (see Put your pack on a table):

  1. Click Preview applying to sheets without this pack for characters who have nothing from the pack yet, or Preview re-stamp from r1 (with the pack's revision) for characters who do. The preview says what would change, and counts the class features it would add.
  2. When the run would also give characters a new question, the preview lists it before anything changes. A sentence such as Re-stamping adds a new decision for 1 character to answer. Each will see it on their sheet as a choice they have not made yet; nothing they already chose is changed. sits above each question, its class level, and the characters who'd be asked it, such as “Choose a War Cry” (Fighter 2) followed by the fighter's name.
  3. Tick Add these decisions to their sheets. Apply to N sheets or Re-stamp N sheets (with the real count) stays greyed out until you do.
  4. Click it. Each character gets the features, and the question waits on their sheet as a choice they haven't made yet. Nothing they already chose changes.

The Fighter extras row in My Homebrew after Preview applying to sheets without this pack: the preview line, the new-decision box that starts Applying this pack adds a new decision for 1 character to answer, the question "Choose a War Cry" (Fighter 2) with the character, Pell Marsh, and the tick box Add these decisions to their sheets ticked, so Apply to 1 sheet is no longer greyed out.

Mistakes the checker refuses

Code What's wrong Fix
CONTRIBUTION_UNKNOWN_PACK contributesTo.packSlug isn't a pack of your system: a typo, another system's pack, or a pack that isn't yours. Use your system's class features pack, 5-5e-srd-class-features or 5e-srd-class-features.
CONTRIBUTION_UNKNOWN_ITEM That pack has no row with that itemKey. Copy the key from the tables above. 5.5e and 5e choose subclasses at different levels.
CONTRIBUTION_UNKNOWN_CHOICE The row has no choice with that choiceId, or the choice has no list of options to join, such as a spell choice. Use the subclass choice from the table above.
CONTRIBUTION_OPTION_ID_COLLISION Your option.id is the built-in option's ID. Pick another ID, such as hearth.
CONTRIBUTION_OPTION_MALFORMED The option has no id or no label, contributesTo has no choiceId, or there's no option at all. Fill in all three.
CLASS_CONTRIBUTION_UNKNOWN_PACK, CLASS_CONTRIBUTION_UNKNOWN_ITEM As above, for a classContribution. As above.
CLASS_CONTRIBUTION_TARGET_NOT_KIT itemKey names a row that isn't a class level, such as a feature. Name a class level row, CLASS_…_L and a number.
CLASS_CONTRIBUTION_MALFORMED Both autoInclude and choices are empty, or spec has another field, such as effects, meta, kitClass or kitLevel. Keep to contributesTo, autoInclude and choices. Put effects on a feature or a choice's option.
CLASS_CONTRIBUTION_GRANT_COLLISION The level already grants that row. Remove the entry.
CLASS_CONTRIBUTION_CHOICE_ID_COLLISION The level already has a choice with that ID. Give your choice its own ID.
CLASS_CONTRIBUTION_GRANT_LEVEL_INVALID A grantAtLevel is below the row's level or above 20. Use a level from the row's level to 20.

Each one names the row and the field. When a pack is refused lists every message.

A whole new class · Choices and grants · Effects · Put your pack on a table · Level up