Manual · Content and homebrew
Effect kinds
Every effect the engine can run, grouped by what it changes on the sheet, with the fields each one takes and a real example of each.
An effect is one JSON object with a kind. This list is read from the engine when the manual is built, so it cannot fall behind.
modifieswhen the number already exists with a base: AC, a save, a skill, speed, hit points, attunement slots.- A granting kind when the thing does not exist until something grants it: a fly speed is
grants_movement, a tracker isgrants_resource, a button isgrants_action. - Any effect may carry
"condition": { "toggleActive": "<id>" }. A toggle the engine cannot find refuses the whole entry, with a row saying why. - Ids you mint need a prefix of your own (
show_below). Ids naming shipped content are spelled as the engine spells them.
Numbers on the sheet
The kinds that change a number the sheet already has. Every changed number says which feature changed it.
modifies
Adds to, sets, or caps a number the sheet already derives: AC, a save, a skill, speed, hit points, a whole family of ability checks. The +N shows on that number, labelled with the feature’s name. Use this whenever the number already exists with a base.
Fields — required: target, operation, value; optional: max, alternativeBase, condition, stackKey, note.
{
"kind": "modifies",
"target": {
"type": "save",
"ability": "con"
},
"operation": "add",
"value": 1
}
A condition on any effect gates it: { "toggleActive": "<toggle id>" } applies it only while that switch is on.
feature_dc
A save DC of the feature’s own (8 + proficiency + the named ability’s modifier), printed on the card and available to a grants_action by its dcId.
Fields — required: label, ability; optional: id, condition.
{
"kind": "feature_dc",
"id": "show_breath_dc",
"label": "Breath Weapon",
"ability": "con"
}
crit_threshold
A critical hit on a lower roll (19, or 18) for the weapons named, or for every attack.
Fields — required: value; optional: weapons, condition.
{
"kind": "crit_threshold",
"value": 19
}
death_save_threshold
A death save counts as a natural 20 from the number named, so a lower roll gets the character up.
Fields — required: nat20At; optional: condition, note.
{
"kind": "death_save_threshold",
"nat20At": 18
}
ignores_armor_speed_penalty
Heavy armor whose Strength requirement the character misses no longer slows them.
Fields — required: none; optional: note, condition.
{
"kind": "ignores_armor_speed_penalty"
}
grants_base_ac
A way of working out base armor class that competes with armor and with Unarmored Defense instead of adding to them: the sheet takes whichever is best. dex says how Dexterity joins (fully, not at all, or up to a cap); ignoresArmor is for natural armor that gives no benefit from worn armor.
Fields — required: id, name, base; optional: dex, ignoresArmor, usableInArmor, condition, note.
{
"kind": "grants_base_ac",
"id": "show_shell",
"name": "Natural Armor",
"base": 17,
"dex": "none",
"ignoresArmor": true
}
Resources and toggles
Trackers, switches and what they gate. A tracker is declared once and spent by anything that names its id.
grants_resource
A tracker: pips or a counter on the card, with a maximum that may scale by level and a list of reset rules the rest preview honours. Everything else that spends a resource names this tracker’s id.
Fields — required: id, name, max, reset; optional: display, die, note, poolOf, condition.
{
"kind": "grants_resource",
"id": "show_ashwing_charge",
"name": "Ashwing Charge",
"max": 1,
"reset": [
{
"on": "long_rest",
"amount": "all"
}
],
"display": "counter"
}
max and die take a number or a formula such as { "op": "level_lookup", "byLevel": { "3": 3, "7": 4 } }. reset is a list: on is short_rest, long_rest or dawn; amount is all, a number or a dice string rolled once when the rest is planned.
grants_toggle
A switch on the feature card: a stance, a rage, a surge. Any effect with condition.toggleActive set to this id applies only while it is on. A costTrackerId spends one use each time it is switched on; persists keeps it on through a rest.
Fields — required: id, name; optional: costTrackerId, cost, persists, condition, exclusiveGroup, requiresToggle.
{
"kind": "grants_toggle",
"id": "show_ashwing_on",
"name": "Ashwing Surge",
"costTrackerId": "show_ashwing_charge"
}
resource_exchange
One button that spends a spell slot to restore a tracker: the “expend a slot to regain a use” shape. A slot is the only cost the kind takes; onlyWhenEmpty allows it only while the tracker is empty. The numbers are on the button, so there is no preview.
Fields — required: id, name, cost; optional: onlyWhenEmpty, restores, restoresSlot, useGate, condition.
{
"kind": "resource_exchange",
"id": "show_kindle",
"name": "Kindle",
"cost": {
"kind": "spell_slot"
},
"restores": {
"trackerId": "show_ashwing_charge",
"amount": 1
}
}
blocks_recovery
Stops one kind of recovery while the condition holds: healing (no hit points regained from any source), long_rest (a long rest restores nothing), or max_hp (a reduced maximum is not restored). The rest preview shows the line as blocked and says why.
Fields — required: what; optional: condition, note.
{
"kind": "blocks_recovery",
"what": "healing",
"condition": {
"toggleActive": "show_cursed"
}
}
slot_conversion
Turns a tracker into spell slots and back: the sorcery-point shape. createCosts prices each slot level; the slot is a real slot until it is spent.
Fields — required: trackerId, createCosts; optional: useGate.
{
"kind": "slot_conversion",
"trackerId": "sorcery_points",
"createCosts": {
"1": 2,
"2": 3,
"3": 5,
"4": 6,
"5": 7
}
}
slot_recovery
Regains expended slots up to a budget of total slot levels, none above maxSlotLevel, by spending the tracker: the arcane-recovery shape, offered on the short rest preview.
Fields — required: trackerId, budget, maxSlotLevel.
{
"kind": "slot_recovery",
"trackerId": "show_recovery_uses",
"budget": {
"op": "level_lookup",
"byLevel": {
"1": 1,
"3": 2,
"5": 3,
"7": 4,
"9": 5
}
},
"maxSlotLevel": 5
}
There is no “half your level” formula op; a budget that scales is written as a level_lookup table, exactly as the shipped Arcane Recovery is.
Actions and attacks
Buttons on a card, riders on an attack roll, and triggers that watch hit points.
grants_action
A button on the card that does one thing: rolls damage against a save, heals, grants temporary hit points, or spends a use. costTrackerId spends from a tracker; useGate withholds the button until a condition holds.
Fields — required: id, name; optional: save, dcId, dc, damage, halfOnSave, heal, tempHp, exhaustion, area, costTrackerId, costAmount, useGate, consumesItem, condition, actionCost, note.
{
"kind": "grants_action",
"id": "show_wards_mercy_heal",
"name": "Ward’s Mercy",
"heal": {
"dice": "2d8",
"bonus": {
"op": "ability_mod",
"ability": "int"
}
},
"costTrackerId": "show_ward_energy"
}
attack_rider
Something that rides on an attack roll: extra dice of a damage type, a bonus to hit or to damage, a minimum on the damage die, or a reroll of low dice. Offered on the attack when optional, applied always when not; cost spends a tracker per use.
Fields — required: id, name; optional: weapons, attackBonus, damageBonus, damageBonusType, extraDice, cost, minDamageDie, rerollDamageDieAtOrBelow, optional, drain, condition, note.
{
"kind": "attack_rider",
"id": "show_warded_strike_rider",
"name": "Warded Strike",
"extraDice": {
"count": 1,
"die": 6,
"damageType": "force"
},
"cost": {
"trackerId": "show_ward_energy"
},
"optional": true
}
damage_reroll
Lets the player reroll a weapon’s damage dice and take either result, once per turn or without limit, for the weapons named.
Fields — required: id, name; optional: weapons, limit, condition, note.
{
"kind": "damage_reroll",
"id": "show_savage",
"name": "Savage Strikes",
"limit": "once_per_turn"
}
unarmed_strike
Gives the unarmed strike a die instead of 1 damage, lets it use another ability, and can change its damage type: the martial-arts shape. A condition makes the upgrade apply only while it holds.
Fields — required: die; optional: abilities, damageType, condition.
{
"kind": "unarmed_strike",
"die": 6,
"abilities": [
"str",
"dex"
]
}
grants_attack
A weapon the feature itself creates, such as a blade of psychic energy or natural claws. It appears as an attack row beside your equipped weapons, attacking with the best of the abilities listed, and condition hides it while a form is off.
Fields — required: id, name, abilities, die, damageType; optional: count, properties, ranged, rangeFt, reachFt, condition, note.
{
"kind": "grants_attack",
"id": "show_psi_blade",
"name": "Psi Blade",
"abilities": [
"str",
"dex"
],
"die": 6,
"damageType": "psychic",
"properties": [
"finesse",
"thrown"
],
"rangeFt": {
"normal": 60
}
}
weapon_style
Rules for a family of weapons: which abilities they may use, a die that replaces theirs, and whether the style only applies when nothing else is held.
Fields — required: name, weapons; optional: useAbilities, dieSubstitute, requireExclusive, condition.
{
"kind": "weapon_style",
"name": "Monk weapons",
"weapons": [
{
"melee": true,
"weaponClass": "simple"
},
{
"melee": true,
"weaponClass": "martial",
"properties": [
"light"
]
}
],
"useAbilities": [
"str",
"dex"
]
}
weapons is a list of matchers, never bare names: melee/ranged, weaponClass (simple/martial), properties the row must have, notProperties it must not, itemId for one item, includeUnarmed.
hp_trigger
Watches hit points and fires when they cross the line it names (reduced to zero, or below half), then does what then says: stay at 1, heal, gain temporary hit points. uses spends a tracker each time.
Fields — required: id, name, on, then; optional: uses, condition, note.
{
"kind": "hp_trigger",
"id": "show_ashwing_trigger",
"name": "Ashwing Surge",
"on": "reduced_to_zero",
"then": {
"kind": "stay_at",
"hp": 1
},
"uses": {
"trackerId": "show_ashwing_charge"
}
}
Rolls
Advantage, and revisions to a d20 after it is rolled.
grants_advantage
Advantage or Disadvantage on a scope of rolls: saves, saves against spells, a skill, initiative, attacks. Offered on the roll, never applied silently: the player sees the offer with the feature’s name and when text, and takes it or not. A costTrackerId makes each use spend.
Fields — required: id, mode, scope; optional: when, condition, costTrackerId, note.
{
"kind": "grants_advantage",
"id": "show_warding_instincts_saves",
"mode": "advantage",
"scope": {
"type": "save",
"vsSpells": true
}
}
grants_d20_revision
Changes a d20 after it lands (the lucky, indomitable and portent shapes): add a flat bonus, reroll, or set a minimum. Offered on the roll; costTrackerId spends per use.
Fields — required: id, name, scope, revision; optional: trigger, costTrackerId, costAmount, when, condition, note.
{
"kind": "grants_d20_revision",
"id": "show_wards_mercy_revision",
"name": "Ward’s Steadying Pulse",
"scope": {
"type": "attack"
},
"revision": {
"kind": "add_bonus",
"flat": 10
},
"costTrackerId": "show_ward_energy"
}
Spells
Spells granted, picked, added to a list, or made stronger.
grants_spells
Named spells the character can cast: innate (without a slot, with uses or at will), or prepared (always prepared, cast with slots). castingAbility names the ability; costTrackerId and costAmount make each cast spend a tracker; castLevel fixes the slot level.
Fields — required: mode, spells; optional: uses, ritualOnly, casting, selfOnly, castingAbility, useClassSpellDc, costTrackerId, costAmount, castLevel, note, condition.
{
"kind": "grants_spells",
"mode": "innate",
"spells": [
"misty_step"
],
"uses": {
"id": "show_step_charge",
"max": 1,
"reset": [
{
"on": "long_rest",
"amount": "all"
}
]
},
"castingAbility": "cha"
}
grants_spell_pick
A pick the sheet keeps asking for until it is made: one spell from a list (from a class list or any_list), at or below spellLevel, optionally filtered to rituals or attack spells. mode says how it is then cast; swapOn lets it be changed at a rest; uses gives it a free cast from a tracker.
Fields — required: id, name, from, spellLevel; optional: ritual, attack, schools, mode, additions, castingAbilityFromFeat, uses, swapOn, note, castingAbility, castingAbilityChoice, castingAbilityByList, alwaysPrepared, condition.
{
"kind": "grants_spell_pick",
"id": "show_hearthbound_rite_1",
"name": "Hearthbound Rites — first rite",
"from": "any_list",
"spellLevel": 1,
"ritual": true,
"mode": "prepared",
"swapOn": "long_rest"
}
grants_ritual_casting
Lets the character cast any known spell with the ritual tag as a ritual, spending no slot.
Fields — required: none; optional: condition.
{
"kind": "grants_ritual_casting"
}
extends_spell_list
Widens the list the character prepares from: another class’s list up to the levels named, or a set of spells. Nothing is handed to the character; they may now choose these.
Fields — required: none; optional: lists, spells, levels, condition.
{
"kind": "extends_spell_list",
"lists": [
"cleric"
],
"levels": [
1,
2,
3,
4
]
}
cast_heal_bonus
Adds to every healing spell the character casts: a flat amount plus an amount per slot level, the disciple-of-life shape.
Fields — required: flat, perSlotLevel.
{
"kind": "cast_heal_bonus",
"flat": 2,
"perSlotLevel": 1
}
cast_damage_bonus
Adds an ability modifier or a flat amount to a spell’s damage, for one damage type or for all, the elemental-affinity shape. Offered on the cast.
Fields — required: id, name; optional: ability, flat, scope, note, condition.
{
"kind": "cast_damage_bonus",
"id": "show_affinity",
"name": "Elemental Affinity",
"ability": "cha",
"scope": {
"kind": "damageType",
"damageTypes": [
"fire"
]
}
}
Proficiency and training
What the character knows how to use.
grants_training
Proficiency with weapons, armor, tools and skills. The bonus lands on the right rolls; armor stops penalising; the inventory shows what is usable.
Fields — required: none; optional: weapons, armor, tools, skills.
{
"kind": "grants_training",
"weapons": [
"martial"
],
"armor": [
"heavy"
],
"skills": [
"athletics"
]
}
grants_save_proficiency
Proficiency in the saving throws of the abilities named.
Fields — required: abilities; optional: condition.
{
"kind": "grants_save_proficiency",
"abilities": [
"wis"
]
}
grants_expertise
A pick of that many skills the character is proficient in; each doubles its proficiency bonus.
Fields — required: count.
{
"kind": "grants_expertise",
"count": 2
}
grants_skill_choice
A pick of that many skills or tools, from a list or from all of them, made in the wizard or on level-up.
Fields — required: count; optional: skills, tools.
{
"kind": "grants_skill_choice",
"count": 1,
"skills": [
"arcana",
"history",
"religion"
]
}
grants_language
Languages on the sheet.
Fields — required: languages.
{
"kind": "grants_language",
"languages": [
"Common",
"Primordial"
]
}
grants_weapon_mastery
The 2024 mastery property on that many weapons the character is proficient with, chosen from the list or from all of them; the attack row shows the property.
Fields — required: count; optional: from.
{
"kind": "grants_weapon_mastery",
"count": 2
}
grants_weapon_choice
A pick of that many weapons to be proficient with, from a weapon class or from all of them. The sheet asks for it under Choices you still owe.
Fields — required: count; optional: from.
{
"kind": "grants_weapon_choice",
"count": 4,
"from": [
{
"weaponClass": "martial"
}
]
}
Senses, movement and defences
Senses, speeds, resistances and immunities.
grants_sense
A sense with a range (Darkvision, Blindsight, Tremorsense) in the senses row. increaseFt extends a sense the character already has instead of setting it.
Fields — required: name; optional: rangeFt, condition, increaseFt.
{
"kind": "grants_sense",
"name": "Darkvision",
"rangeFt": 60,
"increaseFt": 60
}
grants_movement
A speed the character did not have (fly, swim, climb, burrow) as a number, equal to the walking speed, or a multiple of it. Use modifies for a speed that already exists.
Fields — required: mode, distance; optional: condition, note.
{
"kind": "grants_movement",
"mode": "fly",
"distance": {
"equalToWalk": true
},
"condition": {
"toggleActive": "show_ashwing_on"
}
}
grants_resistance
Resistance to the damage types named, or to all but the exceptions. Shown on the sheet and applied when that damage is taken.
Fields — required: none; optional: damageTypes, exceptTypes, condition, note.
{
"kind": "grants_resistance",
"damageTypes": [
"acid"
]
}
grants_condition_immunity
Immunity to the conditions named; the condition picker says so when one is offered.
Fields — required: conditions; optional: condition, note.
{
"kind": "grants_condition_immunity",
"conditions": [
"poisoned"
]
}
grants_damage_immunity
Immunity to the damage types named; damage of that type is zeroed when taken.
Fields — required: damageTypes; optional: condition, note.
{
"kind": "grants_damage_immunity",
"damageTypes": [
"poison"
]
}
incoming_attack_fact
A sentence about attacks made against the character (“attacks against you have Disadvantage while…”) shown on the Combat section where the player will read it when it matters. The sheet does not roll for the attacker, so it states the fact rather than applying it.
Fields — required: text; optional: condition.
{
"kind": "incoming_attack_fact",
"text": "Ranged attacks against you have Disadvantage while your ward is up.",
"condition": {
"toggleActive": "show_ward_up"
}
}
Companions
A creature the character brings along.
grants_companion
A creature the character commands (a familiar, a steed, a beast companion) seated under the character with its own stat block, hit points and actions. options offers a choice of forms; scaled and overrides adjust the block by the character’s level.
Fields — required: id, name; optional: options, scaled, overrides, note, condition.
{
"kind": "grants_companion",
"id": "show_ember_hound",
"name": "Ember Hound",
"options": [
"show_ember_hound_form"
]
}