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

PropertyUsed InTypeEffect
idall contenttextStable identifier used by URLs, JSON data, character saves, and lookups. Do not change once characters might reference it.
nameall contenttextDisplay name in the wiki and character sheet.
typemost contenttextContent type marker, mainly for organisation and wiki display.
categorymost contenttextGrouping/filtering field. For abilities this defaults to general.
tagsall contentlistSearch/filter labels. Spells also use combat and non-combat to decide where they appear.
descriptionmost contenttextShort summary used in indexes and character sheet summaries.

Classes

Class files live in content/classes.

Class Frontmatter

PropertyTypeEffect
hit_dietextDisplayed for the class.
weaponTraining_choosenumberNumber of starting weapons the class selects.
weaponTraining_optionslistWeapon list shown during character creation and level 1 setup.
weaponTraining_trainedAttackBonusnumberAttack bonus for trained class weapons. Usually 1.
weaponTraining_trainedDamageStepsnumberBase damage step increase for trained class weapons. Usually 1.
weaponTraining_untrainedAttackBonusnumberAttack penalty for weapons outside the class list. Usually -1.
weaponTraining_untrainedProvokestextWarning text for untrained attacks, such as threat/reaction.
weaponTraining_proficientUnselectedbooleanIf true, unselected weapons from the class list are proficient.
weaponTraining_allWeaponsbooleanIf true, all weapons are treated as trained. Used by Warwager-style rules.
weaponTraining_shieldDeflectBonusnumberExtra shield deflect bonus when shield training applies.
weaponTraining_unarmedClassDamageStepsnumberExtra 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 PatternTypeEffect
levelBonus_weaponMastery_levelslist of numbersLevels where the class gains a free weapon mastery/rank.
levelBonus_matrix_levelslist of numbersLevels where the class gains a free matrix ability/rank.
levelBonus_armour_levelslist of numbersLevels where armour abilities are granted.
levelBonus_armour_abilitieslist of idsAbility ids granted by the armour bonus.
levelBonus_checkBonus_levelslist of numbersLevels where check bonuses are granted.
levelBonus_bloodline_levelslist of numbersLevels 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.

ColumnTypeEffect
LevelnumberCharacter level.
HPtext/numberHP value or gain used by level-up.
AbilitiesnumberMaximum new class abilities available at this level. If unchanged from the previous level, no new ability is gained.
Total RanksnumberTotal class ability ranks available. Increases become rank-up choices. Level 0 inherited abilities do not count against this.
XPnumberXP threshold for the level-up button.
DeflectnumberBase deflect value at that level.
CON, AGL, MAG, WIL, SDF, LIFnumberClass stat/check bonuses at that level.

Abilities

Ability files live in content/abilities.

PropertyTypeEffect
allowedClasseslist of class idsRestricts ability selection to matching classes after level 0. Level 0 rolled abilities can still remain on a character.
maxRanknumberHighest rank the ability can reach. Defaults to 3 if omitted.
rollnumberNumber used by random level 0 ability tables.
baseEffecttextDisplayed before rank text.
rank1, rank2, etc.textDisplayed rank effect. For most abilities ranks are cumulative; for Weapon Mastery the sheet displays only the current rank text.
rank1_requires, rank2_requires, etc.textRequirement 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 PatternTypeEffect
mechanic_mixedAbility-wide mechanic data. Used for choice setup or as the default scope for rank mechanics.
rank1_mechanic_, rank2_mechanic_, etc.mixedMechanic data for a specific ability rank.

Current recognised mechanic names:

MechanicTypeEffect
appliesTotextScope for a bonus. Current weapon scopes: unarmed, unarmed-deflect, deflect, melee-and-unarmed, melee. Current spell scopes: spell-form, chosen-spell-form.
attackBonusnumberAdds to weapon attack bonus when scope matches. Also used by structured Weapon Mastery ranks.
damageStepsnumberAdds weapon damage steps when scope matches. Also used by structured Weapon Mastery ranks.
damageBonusnumberAdds flat weapon damage when scope matches. Also used by structured Weapon Mastery ranks.
armourPiercingnumberAdds AP when scope matches. Also used by structured Weapon Mastery ranks.
deflectBonusnumberAdds weapon/shield deflect where supported.
attackBonusMinLevelnumberMinimum character level before attackBonus applies.
damageStepsMinLevelnumberMinimum character level before damageSteps applies.
damageBonusMinLevelnumberMinimum character level before damageBonus applies.
armourPiercingMinLevelnumberMinimum character level before armourPiercing applies.
deflectBonusMinLevelnumberMinimum character level before deflectBonus applies.
spellAttackBonusnumberAdds to spell attack bonus when the selected spell form matches.
spellDamageStepsnumberAdds spell damage steps. Used by matrices, spell-form masteries, and Matrix Master-style abilities.
spellDamageBonusnumberAdds flat spell damage when spell-form matching applies.
spellFormtextFixed spell form for an ability, such as Bolt. If omitted, the character's selected choice may provide the form.
choiceTypetextCreates a choice dropdown when the ability is selected. See Choice Mechanics.
choiceLabeltextOptional label for a generated choice dropdown.
choicePlaceholdertextOptional placeholder/default prompt text for a generated choice.
choiceRequiredbooleanWhether 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.

choiceTypeDropdown SourceTypical Use
weapon-categoryWeapon table Group values, filtered to trained categories where possibleWeapon Mastery (Power), Weapon Mastery (Precision).
weaponAll weapon names from equipment tablesAbilities tied to a specific weapon.
class-weaponCurrent class weapon-training optionsWeapon Training style abilities.
spell-formBuilt-in spell formsForm Focus, spell bolt/ray/sphere style abilities.
tattooFree text for nowTattoo-flavoured abilities.
expertiseFree text for nowKnowledge/expertise choices.
lucky-charmFree text for nowOptional 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/.

PropertyTypeEffect
classclass idDetermines which class can select the skill.
levelnumberMinimum class level for selection.
grants_abilityability idInformational hook for skills that grant an ability.
mechanic_mixedSame 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/.

PropertyTypeEffect
classclass idGroups spells for Mage, Varlock, or Zealot spell lists.
levelnumberSpell level used for level-up filtering.
actiontextDisplayed on spell cards and spell attack panel.
provokesboolean/textDisplayed on spell cards and spell attack panel.
rangetextDisplayed and used in spell attack panel.
durationtextDisplayed and used in spell attack panel.
tohittext/numberOlder fallback for spell attack bonus/check if no combat_ block exists.
damagetextOlder fallback for spell damage if no combat_ block exists.
damagetypetextOlder fallback for spell damage type if no combat_ block exists.

Spell Combat Blocks

Combat spell fields use the combat_ prefix.

PropertyTypeEffect
combat_isCombatbooleanIf true, spell appears in combat spell selectors. If false or tagged non-combat, it stays out.
combat_attackTypetextDescribes attack type, such as ranged, melee, save, check, or none.
combat_formtextSpell form, such as Bolt, Ray, Cone, Sphere, Blast, Burst, or Touch. Used by spell-form abilities.
combat_attackChecktextDisplay/check text, such as ranged attack, MAG check, or Target AGL Check.
combat_attackBonusnumberBase spell attack bonus. If omitted or not numeric, attack displays as a check instead of a flat bonus.
combat_damagedice/textBase damage, such as D6, 2D4+1, or 1 HP.
combat_damageBonusnumberExtra flat damage. Also parsed from combat_damage if written as D4+1.
combat_damageStepsnumberBase spell damage step adjustment before matrix and ability bonuses.
combat_damageTypetextDamage type shown in the spell attack panel.
combat_targetsnumber/textTarget count or target description.
combat_scalingtextInformational 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.

PropertyTypeEffect
typetextUsually condition.
categorytextOptional grouping.
severitytextOptional 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.

ColumnTypeEffect
LevelnumberFatigue level.
ConditiontextDisplay name.
Attack PenaltynumberApplied to weapon and spell attack bonuses.
MovetextMovement adjustment. Supports -5', -10', Half movement, 0', and Dead. Five feet equals one square.
ThreatensbooleanWhether the character threatens.
ReactionsbooleanWhether reactions are available.
DeflectbooleanWhether deflect is available.
Primary ActionbooleanWhether primary actions are available.
StatustextShort status label.
EffectstextSummary shown in tooltips.

Fear Levels Table

The fear file must include a table under ## Fear Levels.

ColumnTypeEffect
LevelnumberFear level.
ConditiontextDisplay name.
Attack PenaltynumberApplied to weapon and spell attack bonuses.
MovetextMovement adjustment.
ReactionsbooleanWhether reactions are available.
Primary ActionbooleanWhether primary actions are available.
StatustextShort status label.
EffectstextSummary shown in tooltips.

Petrification Levels Table

The petrified file must include a table under ## Petrification Levels.

ColumnTypeEffect
LevelnumberPetrification level.
ConditiontextDisplay name.
Attack PenaltynumberApplied to weapon and spell attack bonuses.
Damage PenaltynumberApplied to weapon and spell flat damage.
MovetextMovement adjustment.
ReactionsbooleanWhether reactions are available.
Primary ActionbooleanWhether primary actions are available.
StatustextShort status label.
EffectstextSummary 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.

ColumnTypeEffect
WeapontextEquipment name. Used for inventory, equip matching, and weapon training lookup.
GrouptextWeapon category. Used by Weapon Mastery (Power/Precision) category choices.
HandstextDisplayed in Attack & Defense.
Damagedice/textBase weapon damage. Adjusted by damage steps and flat bonuses.
TypetextDamage type and ranged detection. Ranged in traits/range also helps determine ranged attack mode.
RangetextDisplayed in Attack & Defense; presence of a range can mark a weapon as ranged.
TraitstextDisplayed, and Ranged helps determine ranged attack mode.
Attack Bonussigned numberAdded directly to attack bonus.
Damage Bonussigned numberAdded as flat damage.
Damage Stepssigned numberAdjusts the damage dice through the damage step table.
APsigned numberAdded to Armour Piercing.
Deflect Bonussigned numberAdded to weapon deflect display.
ReloadtextDisplayed in Attack & Defense.
NotestextDisplayed below weapon stats.
WeighttextDisplayed in item lists.

Armour Table Columns

Armour tables are read from Light Armour, Medium Armour, and Heavy Armour.

ColumnTypeEffect
ArmourtextEquipment name.
Armour CategorytextDisplayed in Attack & Defense.
Incoming Hit Bonussigned numberDisplayed as the attacker's hit bonus against the wearer.
Slashsigned number/diceArmour protection against slashing damage.
Crushsigned number/diceArmour protection against crushing damage.
Piercesigned number/diceArmour protection against piercing damage.
Awrysigned numberSpell awry modifier display.
FatiguetextArmour fatigue note/display.
Move Modifiersigned numberAdded to movement in squares.
CosttextDisplay only.
WeighttextDisplay only.
NotestextDisplayed below armour stats.

Shield Table Columns

Shield tables are read from content/equipment/shields.md.

ColumnTypeEffect
ShieldtextEquipment name.
Deflect Meleesigned numberBase melee deflect bonus. Shield training can add to this.
Deflect Rangedsigned numberBase ranged deflect bonus. Shield training can add to this.
Awrysigned numberSpell awry modifier display.
Move Modifiersigned numberAdded to movement in squares.
Damage Stepdice/textShield damage if used as a weapon.
CosttextDisplay only.
WeighttextDisplay only.
Free Deflectsnumber/textDisplay only.
NotestextDisplayed 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.

PropertyTypeEffect
idtextStable magic item id.
nametextTrue item name, revealed when attuned.
unidentified_nametextName shown before attunement.
categorytextUse weapon, armour, shield, or magic. Weapons, armour, and shields can use base equipment stats.
base_equipmenttextName of the normal equipment item to copy before attunement, such as Longsword.
visible_descriptiontextDescription shown before attunement.
attuned_descriptiontextDescription shown after attunement.
effectslistRevealed effect bullets.
cursedbooleanMarks item as cursed.
curse_effectslistCurse effect bullets.
discoveredbooleanIf true, appears in the GM/player magic item list.
tagslistSearch/filter/display tags.

GM Magic Item Mechanics

These only apply after the item is attuned.

PropertyApplies ToEffect
attack_bonusweaponAdds to weapon Attack Bonus.
damage_bonusweaponAdds to weapon Damage Bonus.
damage_stepsweaponAdds to weapon Damage Steps.
deflect_bonusweapon/shieldAdds to weapon Deflect Bonus, or to both shield deflect values if specific shield bonuses are absent.
deflect_melee_bonusshieldAdds to Deflect Melee.
deflect_ranged_bonusshieldAdds to Deflect Ranged.
slash_bonusarmourAdds to Slash.
crush_bonusarmourAdds to Crush.
pierce_bonusarmourAdds to Pierce.
energy_bonusarmourAdds to an Energy armour value shown on the sheet.
fire_resistancearmourAdds fire resistance text/value after attunement.
cold_resistancearmourAdds cold resistance text/value after attunement.
lightning_resistancearmourAdds lightning resistance text/value after attunement.
acid_resistancearmourAdds acid resistance text/value after attunement.
poison_resistancearmourAdds poison resistance text/value after attunement.
spectral_resistancearmourAdds spectral resistance text/value after attunement.
necrotic_resistancearmourAdds necrotic resistance text/value after attunement.
radiant_resistancearmourAdds radiant resistance text/value after attunement.
energy_resistancesarmourFreeform list for uncommon resistances, such as Thunder +2 or Void +1.
move_modifierarmourAdds to armour Move Modifier.
spell_attack_bonusspell itemAdds to matching spell attack bonuses while the item is attuned.
spell_damage_bonusspell itemAdds flat damage to matching spells while the item is attuned.
spell_damage_stepsspell itemAdds damage steps to matching spells while the item is attuned.
granted_spellsspell itemList of spell ids added to the character's usable spell list while attuned.
cast_spellswand/scroll/potion/itemList of spell ids the item can cast or release. These appear as item-sourced spell attacks if combat-capable.
empower_spell_formsspell itemFilters spell bonuses to forms such as Bolt, Ray, Sphere, Touch, or Blast.
empower_spell_tagsspell itemFilters spell bonuses to spells with matching tags, such as fire or healing.
empower_spell_classesspell itemFilters spell bonuses to class spell lists, such as mage, varlock, or zealot.
free_spell_slotsspell itemNumber of extra free spell slots the item grants. Currently displayed as a mechanic note.
stored_spell_slotsspell itemNumber of spells the item can store. Currently displayed as a mechanic note.
chargeswand/charged itemNumber of charges available. Currently displayed as a mechanic note.
potion_effectspotionRevealed potion effect list.
consumes_on_usescroll/potion/charged itemMarks the item as consumed when the character uses it from inventory.
identify_on_drinkpotion/consumableReveals 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, and charges are stored and displayed, but detailed slot/charge spending is still a future workflow.