This page lists the markdown properties that are read by build.py and the character sheet. These fields are the current source-of-truth hooks for automation. Normal body text still appears in the wiki, but these properties are what the app can reliably calculate from.
Use YAML frontmatter at the top of a markdown file:
`yaml
---
id: example-id
name: Example Name
tags: [combat, magic]
---
`
Lists may be written inline, such as [mage, avowed], or as YAML lists.
Common Frontmatter
| Property | Used In | Type | Effect |
id | all content | text | Stable identifier used by URLs, JSON data, character saves, and lookups. Do not change once characters might reference it. |
name | all content | text | Display name in the wiki and character sheet. |
type | most content | text | Content type marker, mainly for organisation and wiki display. |
category | most content | text | Grouping/filtering field. For abilities this defaults to general. |
tags | all content | list | Search/filter labels. Spells also use combat and non-combat to decide where they appear. |
description | most content | text | Short summary used in indexes and character sheet summaries. |
Classes
Class files live in content/classes.
Class Frontmatter
| Property | Type | Effect |
hit_die | text | Displayed for the class. |
weaponTraining_choose | number | Number of starting weapons the class selects. |
weaponTraining_options | list | Weapon list shown during character creation and level 1 setup. |
weaponTraining_trainedAttackBonus | number | Attack bonus for trained class weapons. Usually 1. |
weaponTraining_trainedDamageSteps | number | Base damage step increase for trained class weapons. Usually 1. |
weaponTraining_untrainedAttackBonus | number | Attack penalty for weapons outside the class list. Usually -1. |
weaponTraining_untrainedProvokes | text | Warning text for untrained attacks, such as threat/reaction. |
weaponTraining_proficientUnselected | boolean | If true, unselected weapons from the class list are proficient. |
weaponTraining_allWeapons | boolean | If true, all weapons are treated as trained. Used by Warwager-style rules. |
weaponTraining_shieldDeflectBonus | number | Extra shield deflect bonus when shield training applies. |
weaponTraining_unarmedClassDamageSteps | number | Extra damage steps that apply to unarmed attacks before weapon training. Used by Avowed. |
Class Level Bonuses
These fields become rules.levelBonuses in classes.json.
| Property Pattern | Type | Effect |
levelBonus_weaponMastery_levels | list of numbers | Levels where the class gains a free weapon mastery/rank. |
levelBonus_matrix_levels | list of numbers | Levels where the class gains a free matrix ability/rank. |
levelBonus_armour_levels | list of numbers | Levels where armour abilities are granted. |
levelBonus_armour_abilities | list of ids | Ability ids granted by the armour bonus. |
levelBonus_checkBonus_levels | list of numbers | Levels where check bonuses are granted. |
levelBonus_bloodline_levels | list of numbers | Levels where bloodline powers are gained. |
Other fields following levelBonus_ are copied into the class rules data, but the sheet only acts on fields it has been coded to understand.
Level Progression Table
The build script looks for a markdown table under a heading named Level Progression.
| Column | Type | Effect |
Level | number | Character level. |
HP | text/number | HP value or gain used by level-up. |
Abilities | number | Maximum new class abilities available at this level. If unchanged from the previous level, no new ability is gained. |
Total Ranks | number | Total class ability ranks available. Increases become rank-up choices. Level 0 inherited abilities do not count against this. |
XP | number | XP threshold for the level-up button. |
Deflect | number | Base deflect value at that level. |
CON, AGL, MAG, WIL, SDF, LIF | number | Class stat/check bonuses at that level. |
Abilities
Ability files live in content/abilities.
| Property | Type | Effect |
allowedClasses | list of class ids | Restricts ability selection to matching classes after level 0. Level 0 rolled abilities can still remain on a character. |
maxRank | number | Highest rank the ability can reach. Defaults to 3 if omitted. |
roll | number | Number used by random level 0 ability tables. |
baseEffect | text | Displayed before rank text. |
rank1, rank2, etc. | text | Displayed rank effect. For most abilities ranks are cumulative; for Weapon Mastery the sheet displays only the current rank text. |
rank1_requires, rank2_requires, etc. | text | Requirement text shown with a rank. This is informational unless code is added to enforce it. |
Ability Mechanics
Mechanic fields are copied into JSON and used by the sheet when recognised.
| Property Pattern | Type | Effect |
mechanic_ | mixed | Ability-wide mechanic data. Used for choice setup or as the default scope for rank mechanics. |
rank1_mechanic_, rank2_mechanic_, etc. | mixed | Mechanic data for a specific ability rank. |
Current recognised mechanic names:
| Mechanic | Type | Effect |
appliesTo | text | Scope for a bonus. Current weapon scopes: unarmed, unarmed-deflect, deflect, melee-and-unarmed, melee. Current spell scopes: spell-form, chosen-spell-form. |
attackBonus | number | Adds to weapon attack bonus when scope matches. Also used by structured Weapon Mastery ranks. |
damageSteps | number | Adds weapon damage steps when scope matches. Also used by structured Weapon Mastery ranks. |
damageBonus | number | Adds flat weapon damage when scope matches. Also used by structured Weapon Mastery ranks. |
armourPiercing | number | Adds AP when scope matches. Also used by structured Weapon Mastery ranks. |
deflectBonus | number | Adds weapon/shield deflect where supported. |
attackBonusMinLevel | number | Minimum character level before attackBonus applies. |
damageStepsMinLevel | number | Minimum character level before damageSteps applies. |
damageBonusMinLevel | number | Minimum character level before damageBonus applies. |
armourPiercingMinLevel | number | Minimum character level before armourPiercing applies. |
deflectBonusMinLevel | number | Minimum character level before deflectBonus applies. |
spellAttackBonus | number | Adds to spell attack bonus when the selected spell form matches. |
spellDamageSteps | number | Adds spell damage steps. Used by matrices, spell-form masteries, and Matrix Master-style abilities. |
spellDamageBonus | number | Adds flat spell damage when spell-form matching applies. |
spellForm | text | Fixed spell form for an ability, such as Bolt. If omitted, the character's selected choice may provide the form. |
choiceType | text | Creates a choice dropdown when the ability is selected. See Choice Mechanics. |
choiceLabel | text | Optional label for a generated choice dropdown. |
choicePlaceholder | text | Optional placeholder/default prompt text for a generated choice. |
choiceRequired | boolean | Whether the generated choice must be filled. Defaults depend on choiceType. |
Choice Mechanics
Use these when an ability requires a selected weapon, category, spell form, tattoo, etc.
choiceType | Dropdown Source | Typical Use |
weapon-category | Weapon table Group values, filtered to trained categories where possible | Weapon Mastery (Power), Weapon Mastery (Precision). |
weapon | All weapon names from equipment tables | Abilities tied to a specific weapon. |
class-weapon | Current class weapon-training options | Weapon Training style abilities. |
spell-form | Built-in spell forms | Form Focus, spell bolt/ray/sphere style abilities. |
tattoo | Free text for now | Tattoo-flavoured abilities. |
expertise | Free text for now | Knowledge/expertise choices. |
lucky-charm | Free text for now | Optional charm/flavour choices. |
Example:
`yaml
mechanic_choiceType: weapon-category
mechanic_appliesTo: chosen-weapon-category
`
Note: chosen-weapon-category is useful as descriptive data, but weapon-category bonuses currently apply through ability-specific code for weapon-mastery-power and weapon-mastery-precision.
Skills
Skill files live in content/skills/.
| Property | Type | Effect |
class | class id | Determines which class can select the skill. |
level | number | Minimum class level for selection. |
grants_ability | ability id | Informational hook for skills that grant an ability. |
mechanic_ | mixed | Same passive weapon mechanic format as abilities, but without rank prefixes. |
Skill text is shown on the character sheet for selected skills. Passive skill mechanics only apply when explicitly represented with mechanic_ fields.
Example:
`yaml
mechanic_appliesTo: unarmed
mechanic_attackBonus: 3
mechanic_damageSteps: 1
`
Spells
Spell files live in content/spells/.
| Property | Type | Effect |
class | class id | Groups spells for Mage, Varlock, or Zealot spell lists. |
level | number | Spell level used for level-up filtering. |
action | text | Displayed on spell cards and spell attack panel. |
provokes | boolean/text | Displayed on spell cards and spell attack panel. |
range | text | Displayed and used in spell attack panel. |
duration | text | Displayed and used in spell attack panel. |
tohit | text/number | Older fallback for spell attack bonus/check if no combat_ block exists. |
damage | text | Older fallback for spell damage if no combat_ block exists. |
damagetype | text | Older fallback for spell damage type if no combat_ block exists. |
Spell Combat Blocks
Combat spell fields use the combat_ prefix.
| Property | Type | Effect |
combat_isCombat | boolean | If true, spell appears in combat spell selectors. If false or tagged non-combat, it stays out. |
combat_attackType | text | Describes attack type, such as ranged, melee, save, check, or none. |
combat_form | text | Spell form, such as Bolt, Ray, Cone, Sphere, Blast, Burst, or Touch. Used by spell-form abilities. |
combat_attackCheck | text | Display/check text, such as ranged attack, MAG check, or Target AGL Check. |
combat_attackBonus | number | Base spell attack bonus. If omitted or not numeric, attack displays as a check instead of a flat bonus. |
combat_damage | dice/text | Base damage, such as D6, 2D4+1, or 1 HP. |
combat_damageBonus | number | Extra flat damage. Also parsed from combat_damage if written as D4+1. |
combat_damageSteps | number | Base spell damage step adjustment before matrix and ability bonuses. |
combat_damageType | text | Damage type shown in the spell attack panel. |
combat_targets | number/text | Target count or target description. |
combat_scaling | text | Informational scaling note. |
If no combat_ block exists, the sheet guesses from tags and body text. For reliable future spells, add a combat block.
Conditions
Condition files live in content/conditions.
| Property | Type | Effect |
type | text | Usually condition. |
category | text | Optional grouping. |
severity | text | Optional severity label. |
Fatigue, Fear, and Petrified are special because the sheet reads their level tables.
Fatigue Levels Table
The fatigue file must include a table under ## Fatigue Levels.
| Column | Type | Effect |
Level | number | Fatigue level. |
Condition | text | Display name. |
Attack Penalty | number | Applied to weapon and spell attack bonuses. |
Move | text | Movement adjustment. Supports -5', -10', Half movement, 0', and Dead. Five feet equals one square. |
Threatens | boolean | Whether the character threatens. |
Reactions | boolean | Whether reactions are available. |
Deflect | boolean | Whether deflect is available. |
Primary Action | boolean | Whether primary actions are available. |
Status | text | Short status label. |
Effects | text | Summary shown in tooltips. |
Fear Levels Table
The fear file must include a table under ## Fear Levels.
| Column | Type | Effect |
Level | number | Fear level. |
Condition | text | Display name. |
Attack Penalty | number | Applied to weapon and spell attack bonuses. |
Move | text | Movement adjustment. |
Reactions | boolean | Whether reactions are available. |
Primary Action | boolean | Whether primary actions are available. |
Status | text | Short status label. |
Effects | text | Summary shown in tooltips. |
Petrification Levels Table
The petrified file must include a table under ## Petrification Levels.
| Column | Type | Effect |
Level | number | Petrification level. |
Condition | text | Display name. |
Attack Penalty | number | Applied to weapon and spell attack bonuses. |
Damage Penalty | number | Applied to weapon and spell flat damage. |
Move | text | Movement adjustment. |
Reactions | boolean | Whether reactions are available. |
Primary Action | boolean | Whether primary actions are available. |
Status | text | Short status label. |
Effects | text | Summary shown in tooltips. |
Equipment Tables
Equipment is mostly read from markdown tables, not frontmatter. The exact column names matter.
Weapon Table Columns
Weapon tables are read from these headings in content/equipment/weapons.md: Weapon Table, Polearms, Other Two-Handed Weapons, and Arcane Weapons.
| Column | Type | Effect |
Weapon | text | Equipment name. Used for inventory, equip matching, and weapon training lookup. |
Group | text | Weapon category. Used by Weapon Mastery (Power/Precision) category choices. |
Hands | text | Displayed in Attack & Defense. |
Damage | dice/text | Base weapon damage. Adjusted by damage steps and flat bonuses. |
Type | text | Damage type and ranged detection. Ranged in traits/range also helps determine ranged attack mode. |
Range | text | Displayed in Attack & Defense; presence of a range can mark a weapon as ranged. |
Traits | text | Displayed, and Ranged helps determine ranged attack mode. |
Attack Bonus | signed number | Added directly to attack bonus. |
Damage Bonus | signed number | Added as flat damage. |
Damage Steps | signed number | Adjusts the damage dice through the damage step table. |
AP | signed number | Added to Armour Piercing. |
Deflect Bonus | signed number | Added to weapon deflect display. |
Reload | text | Displayed in Attack & Defense. |
Notes | text | Displayed below weapon stats. |
Weight | text | Displayed in item lists. |
Armour Table Columns
Armour tables are read from Light Armour, Medium Armour, and Heavy Armour.
| Column | Type | Effect |
Armour | text | Equipment name. |
Armour Category | text | Displayed in Attack & Defense. |
Incoming Hit Bonus | signed number | Displayed as the attacker's hit bonus against the wearer. |
Slash | signed number/dice | Armour protection against slashing damage. |
Crush | signed number/dice | Armour protection against crushing damage. |
Pierce | signed number/dice | Armour protection against piercing damage. |
Awry | signed number | Spell awry modifier display. |
Fatigue | text | Armour fatigue note/display. |
Move Modifier | signed number | Added to movement in squares. |
Cost | text | Display only. |
Weight | text | Display only. |
Notes | text | Displayed below armour stats. |
Shield Table Columns
Shield tables are read from content/equipment/shields.md.
| Column | Type | Effect |
Shield | text | Equipment name. |
Deflect Melee | signed number | Base melee deflect bonus. Shield training can add to this. |
Deflect Ranged | signed number | Base ranged deflect bonus. Shield training can add to this. |
Awry | signed number | Spell awry modifier display. |
Move Modifier | signed number | Added to movement in squares. |
Damage Step | dice/text | Shield damage if used as a weapon. |
Cost | text | Display only. |
Weight | text | Display only. |
Free Deflects | number/text | Display only. |
Notes | text | Displayed below shield stats. |
GM Magic Items
GM magic item markdown lives in gm-content/magic-items. These files are not rendered into the public wiki.
| Property | Type | Effect |
id | text | Stable magic item id. |
name | text | True item name, revealed when attuned. |
unidentified_name | text | Name shown before attunement. |
category | text | Use weapon, armour, shield, or magic. Weapons, armour, and shields can use base equipment stats. |
base_equipment | text | Name of the normal equipment item to copy before attunement, such as Longsword. |
visible_description | text | Description shown before attunement. |
attuned_description | text | Description shown after attunement. |
effects | list | Revealed effect bullets. |
cursed | boolean | Marks item as cursed. |
curse_effects | list | Curse effect bullets. |
discovered | boolean | If true, appears in the GM/player magic item list. |
tags | list | Search/filter/display tags. |
GM Magic Item Mechanics
These only apply after the item is attuned.
| Property | Applies To | Effect |
attack_bonus | weapon | Adds to weapon Attack Bonus. |
damage_bonus | weapon | Adds to weapon Damage Bonus. |
damage_steps | weapon | Adds to weapon Damage Steps. |
deflect_bonus | weapon/shield | Adds to weapon Deflect Bonus, or to both shield deflect values if specific shield bonuses are absent. |
deflect_melee_bonus | shield | Adds to Deflect Melee. |
deflect_ranged_bonus | shield | Adds to Deflect Ranged. |
slash_bonus | armour | Adds to Slash. |
crush_bonus | armour | Adds to Crush. |
pierce_bonus | armour | Adds to Pierce. |
energy_bonus | armour | Adds to an Energy armour value shown on the sheet. |
fire_resistance | armour | Adds fire resistance text/value after attunement. |
cold_resistance | armour | Adds cold resistance text/value after attunement. |
lightning_resistance | armour | Adds lightning resistance text/value after attunement. |
acid_resistance | armour | Adds acid resistance text/value after attunement. |
poison_resistance | armour | Adds poison resistance text/value after attunement. |
spectral_resistance | armour | Adds spectral resistance text/value after attunement. |
necrotic_resistance | armour | Adds necrotic resistance text/value after attunement. |
radiant_resistance | armour | Adds radiant resistance text/value after attunement. |
energy_resistances | armour | Freeform list for uncommon resistances, such as Thunder +2 or Void +1. |
move_modifier | armour | Adds to armour Move Modifier. |
spell_attack_bonus | spell item | Adds to matching spell attack bonuses while the item is attuned. |
spell_damage_bonus | spell item | Adds flat damage to matching spells while the item is attuned. |
spell_damage_steps | spell item | Adds damage steps to matching spells while the item is attuned. |
granted_spells | spell item | List of spell ids added to the character's usable spell list while attuned. |
cast_spells | wand/scroll/potion/item | List of spell ids the item can cast or release. These appear as item-sourced spell attacks if combat-capable. |
empower_spell_forms | spell item | Filters spell bonuses to forms such as Bolt, Ray, Sphere, Touch, or Blast. |
empower_spell_tags | spell item | Filters spell bonuses to spells with matching tags, such as fire or healing. |
empower_spell_classes | spell item | Filters spell bonuses to class spell lists, such as mage, varlock, or zealot. |
free_spell_slots | spell item | Number of extra free spell slots the item grants. Currently displayed as a mechanic note. |
stored_spell_slots | spell item | Number of spells the item can store. Currently displayed as a mechanic note. |
charges | wand/charged item | Number of charges available. Currently displayed as a mechanic note. |
potion_effects | potion | Revealed potion effect list. |
consumes_on_use | scroll/potion/charged item | Marks the item as consumed when the character uses it from inventory. |
identify_on_drink | potion/consumable | Reveals the item when used before identification, then applies normal use behaviour. |
Recommended category values now include weapon, armour, shield, magic, ring, wand, scroll, potion, wondrous, and consumable.
Examples:
`yaml
category: wand
cast_spells: [crystal-bolt]
charges: 7
spell_attack_bonus: 1
empower_spell_forms: [Bolt]
`
`yaml
category: potion
unidentified_name: Cloudy blue vial
name: Potion of Cold Breath
cast_spells: [flame-breath]
potion_effects:
- Drink to exhale freezing mist as the listed spell effect.
consumes_on_use: true
identify_on_drink: true
`
Current Limits
- Body text is visible to humans, but only structured fields are reliable for calculations.
- Ability and skill passive bonuses should only be added when always-on. Temporary buffs, one-round effects, reactions, or conditional effects should remain in body text unless the app gains an active toggle system.
- Equipment table column names are case-sensitive in practice because the sheet reads exact labels.
- The damage dice step adjustment depends on the damage step table and the sheet's damage stepping code. Use standard dice strings such as
D6,D8,D10,D12, or recognised multi-die values already in the table. free_spell_slots,stored_spell_slots, andchargesare stored and displayed, but detailed slot/charge spending is still a future workflow.