This is the abridged developer documentation for DH-Forge # Artifacts > Artifacts are items that can be used in a campaign. ## Ancestry [Section titled “Ancestry”](#ancestry) ID: `Ancestry` The ancestry of a character ```json { "$schema": "https://json-schema.org/draft/2020-12/schema", "id": "Ancestry", "type": "object", "properties": { "_type": { "const": "ancestry" }, "name": { "type": "string" }, "description": { "type": "string" }, "primaryFeature": { "type": "object", "properties": { "name": { "type": "string" }, "description": { "type": "string" } }, "required": [ "name", "description" ], "additionalProperties": false }, "secondaryFeature": { "type": "object", "properties": { "name": { "type": "string" }, "description": { "type": "string" } }, "required": [ "name", "description" ], "additionalProperties": false } }, "required": [ "_type", "name", "primaryFeature", "secondaryFeature" ], "additionalProperties": false } ``` *** ## Reference to an Ancestry [Section titled “Reference to an Ancestry”](#reference-to-an-ancestry) ID: `ReferenceAncestry` ```json { "$schema": "https://json-schema.org/draft/2020-12/schema", "id": "ReferenceAncestry", "type": "object", "properties": { "_type": { "const": "reference" }, "_key": { "const": "heritage/ancestry" }, "value": { "type": "string" } }, "required": [ "_type", "_key", "value" ], "additionalProperties": false } ``` *** ## Community [Section titled “Community”](#community) ID: `Community` A community that shaped a characters backstory ```json { "$schema": "https://json-schema.org/draft/2020-12/schema", "id": "Community", "type": "object", "properties": { "_type": { "const": "community" }, "name": { "type": "string" }, "description": { "type": "string" }, "feature": { "type": "object", "properties": { "name": { "type": "string" }, "description": { "type": "string" } }, "required": [ "name", "description" ], "additionalProperties": false } }, "required": [ "_type", "name", "feature" ], "additionalProperties": false } ``` *** ## Reference to a Community [Section titled “Reference to a Community”](#reference-to-a-community) ID: `ReferenceCommunity` ```json { "$schema": "https://json-schema.org/draft/2020-12/schema", "id": "ReferenceCommunity", "type": "object", "properties": { "_type": { "const": "reference" }, "_key": { "const": "heritage/community" }, "value": { "type": "string" } }, "required": [ "_type", "_key", "value" ], "additionalProperties": false } ``` *** ## Domain [Section titled “Domain”](#domain) ID: `Domain` A domain of a character class ```json { "$schema": "https://json-schema.org/draft/2020-12/schema", "id": "Domain", "type": "object", "properties": { "_type": { "const": "domain" }, "name": { "type": "string" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ] } }, "required": [ "_type", "name", "description" ], "additionalProperties": false } ``` *** ## Reference to a Domain [Section titled “Reference to a Domain”](#reference-to-a-domain) ID: `ReferenceDomain` ```json { "$schema": "https://json-schema.org/draft/2020-12/schema", "id": "ReferenceDomain", "type": "object", "properties": { "_type": { "const": "reference" }, "_key": { "const": "role/domain" }, "value": { "type": "string" } }, "required": [ "_type", "_key", "value" ], "additionalProperties": false } ``` *** ## Armor [Section titled “Armor”](#armor) ID: `Armor` A set of armor that can be equipped by a character ```json { "$schema": "https://json-schema.org/draft/2020-12/schema", "id": "Armor", "type": "object", "properties": { "_type": { "default": "inventoryArmor", "const": "inventoryArmor" }, "name": { "type": "string" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "baseThresholds": { "$ref": "#/$defs/DamageThresholds" }, "baseScore": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "features": { "anyOf": [ { "type": "array", "items": { "type": "string" } }, { "type": "null" } ] } }, "required": [ "_type", "name", "description", "baseThresholds", "baseScore", "features" ], "additionalProperties": false, "$defs": { "DamageThresholds": { "id": "DamageThresholds", "title": "Damage Thresholds", "description": "The damage thresholds of a character", "type": "object", "properties": { "_type": { "default": "damageThresholds", "const": "damageThresholds" }, "major": { "type": "integer", "minimum": 0, "maximum": 100 }, "severe": { "type": "integer", "minimum": 0, "maximum": 100 } }, "required": [ "_type", "major", "severe" ], "additionalProperties": false } } } ``` *** ## Reference to a piece of Armor [Section titled “Reference to a piece of Armor”](#reference-to-a-piece-of-armor) ID: `ReferenceArmor` ```json { "$schema": "https://json-schema.org/draft/2020-12/schema", "id": "ReferenceArmor", "type": "object", "properties": { "_type": { "const": "reference" }, "_key": { "const": "item/armor" }, "value": { "type": "string" } }, "required": [ "_type", "_key", "value" ], "additionalProperties": false } ``` *** ## Thing [Section titled “Thing”](#thing) ID: `Thing` A thing that can be added to a character’s inventory ```json { "$schema": "https://json-schema.org/draft/2020-12/schema", "id": "Thing", "type": "object", "properties": { "_type": { "default": "inventoryThing", "const": "inventoryThing" }, "name": { "type": "string" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ] } }, "required": [ "_type", "name", "description" ], "additionalProperties": false } ``` *** ## Reference to a Thing [Section titled “Reference to a Thing”](#reference-to-a-thing) ID: `ReferenceThing` ```json { "$schema": "https://json-schema.org/draft/2020-12/schema", "id": "ReferenceThing", "type": "object", "properties": { "_type": { "const": "reference" }, "_key": { "const": "item/thing" }, "value": { "type": "string" } }, "required": [ "_type", "_key", "value" ], "additionalProperties": false } ``` *** ## Weapon [Section titled “Weapon”](#weapon) ID: `Weapon` A weapon that can be equipped by a character ```json { "$schema": "https://json-schema.org/draft/2020-12/schema", "id": "Weapon", "type": "object", "properties": { "_type": { "default": "inventoryWeapon", "const": "inventoryWeapon" }, "name": { "type": "string" }, "trait": { "$ref": "#/$defs/TraitName" }, "range": { "$ref": "#/$defs/Range" }, "damageDice": { "$ref": "#/$defs/DiceType" }, "damageType": { "$ref": "#/$defs/DamageType" }, "features": { "anyOf": [ { "type": "array", "items": { "type": "string" } }, { "type": "null" } ] }, "burden": { "anyOf": [ { "const": "One-Handed" }, { "const": "Two-Handed" } ] } }, "required": [ "_type", "name", "trait", "range", "damageDice", "damageType", "features", "burden" ], "additionalProperties": false, "$defs": { "TraitName": { "id": "TraitName", "title": "Trait Name", "description": "The name of a character trait", "examples": [ "Agility", "Strength", "Finesse", "Instinct", "Presence", "Knowledge" ], "anyOf": [ { "const": "Agility" }, { "const": "Strength" }, { "const": "Finesse" }, { "const": "Instinct" }, { "const": "Presence" }, { "const": "Knowledge" } ] }, "Range": { "id": "Range", "title": "Range", "description": "The range of a weapon or ability", "examples": [ "Melee", "Very Close", "Close", "Far", "Very Far" ], "anyOf": [ { "const": "Melee" }, { "const": "Very Close" }, { "const": "Close" }, { "const": "Far" }, { "const": "Very Far" } ] }, "DiceType": { "id": "DiceType", "title": "Dice Type", "description": "The type of dice to roll", "examples": [ "d4", "d6", "d8", "d10", "d12", "d20" ], "anyOf": [ { "const": "d4" }, { "const": "d6" }, { "const": "d8" }, { "const": "d10" }, { "const": "d12" }, { "const": "d20" } ] }, "DamageType": { "id": "DamageType", "title": "Damage Type", "description": "The type of damage a weapon or ability deals", "examples": [ "Physical", "Magical" ], "anyOf": [ { "const": "Physical" }, { "const": "Magical" } ] } } } ``` *** ## Reference to a Weapon [Section titled “Reference to a Weapon”](#reference-to-a-weapon) ID: `ReferenceWeapon` ```json { "$schema": "https://json-schema.org/draft/2020-12/schema", "id": "ReferenceWeapon", "type": "object", "properties": { "_type": { "const": "reference" }, "_key": { "const": "item/weapon" }, "value": { "type": "string" } }, "required": [ "_type", "_key", "value" ], "additionalProperties": false } ``` *** ## Class [Section titled “Class”](#class) ID: `Class` A class of a character ```json { "$schema": "https://json-schema.org/draft/2020-12/schema", "id": "Class", "type": "object", "properties": { "_type": { "const": "class" }, "name": { "type": "string" }, "domain": { "$ref": "#/$defs/ReferenceDomain" }, "initialEvasion": { "type": "integer", "minimum": 0, "maximum": 100 }, "initialHitPoints": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "initialInventory": { "type": "array", "items": { "anyOf": [ { "$ref": "#/$defs/Thing" }, { "$ref": "#/$defs/Weapon" }, { "$ref": "#/$defs/Armor" } ] } }, "features": { "type": "array", "items": { "type": "object", "properties": { "name": { "type": "string" }, "description": { "type": "string" } }, "required": [ "name", "description" ], "additionalProperties": false } }, "hopeFeature": { "type": "object", "properties": { "name": { "type": "string" }, "description": { "type": "string" } }, "required": [ "name", "description" ], "additionalProperties": false }, "subclasses": { "type": "array", "items": { "$ref": "#/$defs/ReferenceSubclass" } } }, "required": [ "_type", "name", "domain", "initialEvasion", "initialHitPoints", "initialInventory", "features", "hopeFeature", "subclasses" ], "additionalProperties": false, "$defs": { "ReferenceDomain": { "id": "ReferenceDomain", "title": "Reference to a Domain", "type": "object", "properties": { "_type": { "const": "reference" }, "_key": { "const": "role/domain" }, "value": { "type": "string" } }, "required": [ "_type", "_key", "value" ], "additionalProperties": false }, "Thing": { "id": "Thing", "title": "Thing", "description": "A thing that can be added to a character's inventory", "type": "object", "properties": { "_type": { "default": "inventoryThing", "const": "inventoryThing" }, "name": { "type": "string" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ] } }, "required": [ "_type", "name", "description" ], "additionalProperties": false }, "Weapon": { "id": "Weapon", "title": "Weapon", "description": "A weapon that can be equipped by a character", "type": "object", "properties": { "_type": { "default": "inventoryWeapon", "const": "inventoryWeapon" }, "name": { "type": "string" }, "trait": { "$ref": "#/$defs/TraitName" }, "range": { "$ref": "#/$defs/Range" }, "damageDice": { "$ref": "#/$defs/DiceType" }, "damageType": { "$ref": "#/$defs/DamageType" }, "features": { "anyOf": [ { "type": "array", "items": { "type": "string" } }, { "type": "null" } ] }, "burden": { "anyOf": [ { "const": "One-Handed" }, { "const": "Two-Handed" } ] } }, "required": [ "_type", "name", "trait", "range", "damageDice", "damageType", "features", "burden" ], "additionalProperties": false }, "TraitName": { "id": "TraitName", "title": "Trait Name", "description": "The name of a character trait", "examples": [ "Agility", "Strength", "Finesse", "Instinct", "Presence", "Knowledge" ], "anyOf": [ { "const": "Agility" }, { "const": "Strength" }, { "const": "Finesse" }, { "const": "Instinct" }, { "const": "Presence" }, { "const": "Knowledge" } ] }, "Range": { "id": "Range", "title": "Range", "description": "The range of a weapon or ability", "examples": [ "Melee", "Very Close", "Close", "Far", "Very Far" ], "anyOf": [ { "const": "Melee" }, { "const": "Very Close" }, { "const": "Close" }, { "const": "Far" }, { "const": "Very Far" } ] }, "DiceType": { "id": "DiceType", "title": "Dice Type", "description": "The type of dice to roll", "examples": [ "d4", "d6", "d8", "d10", "d12", "d20" ], "anyOf": [ { "const": "d4" }, { "const": "d6" }, { "const": "d8" }, { "const": "d10" }, { "const": "d12" }, { "const": "d20" } ] }, "DamageType": { "id": "DamageType", "title": "Damage Type", "description": "The type of damage a weapon or ability deals", "examples": [ "Physical", "Magical" ], "anyOf": [ { "const": "Physical" }, { "const": "Magical" } ] }, "Armor": { "id": "Armor", "title": "Armor", "description": "A set of armor that can be equipped by a character", "type": "object", "properties": { "_type": { "default": "inventoryArmor", "const": "inventoryArmor" }, "name": { "type": "string" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "baseThresholds": { "$ref": "#/$defs/DamageThresholds" }, "baseScore": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "features": { "anyOf": [ { "type": "array", "items": { "type": "string" } }, { "type": "null" } ] } }, "required": [ "_type", "name", "description", "baseThresholds", "baseScore", "features" ], "additionalProperties": false }, "DamageThresholds": { "id": "DamageThresholds", "title": "Damage Thresholds", "description": "The damage thresholds of a character", "type": "object", "properties": { "_type": { "default": "damageThresholds", "const": "damageThresholds" }, "major": { "type": "integer", "minimum": 0, "maximum": 100 }, "severe": { "type": "integer", "minimum": 0, "maximum": 100 } }, "required": [ "_type", "major", "severe" ], "additionalProperties": false }, "ReferenceSubclass": { "id": "ReferenceSubclass", "title": "Reference to a Subclass", "type": "object", "properties": { "_type": { "const": "reference" }, "_key": { "const": "role/subclass" }, "value": { "type": "string" } }, "required": [ "_type", "_key", "value" ], "additionalProperties": false } } } ``` *** ## Reference to a Class [Section titled “Reference to a Class”](#reference-to-a-class) ID: `ReferenceClass` ```json { "$schema": "https://json-schema.org/draft/2020-12/schema", "id": "ReferenceClass", "type": "object", "properties": { "_type": { "const": "reference" }, "_key": { "const": "role/class" }, "value": { "type": "string" } }, "required": [ "_type", "_key", "value" ], "additionalProperties": false } ``` *** ## Subclass [Section titled “Subclass”](#subclass) ID: `Subclass` A subclass of a class ```json { "$schema": "https://json-schema.org/draft/2020-12/schema", "id": "Subclass", "type": "object", "properties": { "_type": { "const": "subclass" }, "name": { "type": "string" }, "description": { "type": "string" }, "spellTrait": { "default": null, "anyOf": [ { "$ref": "#/$defs/TraitName" }, { "type": "null" } ] }, "foundationFeatures": { "type": "array", "items": { "$ref": "#/$defs/Feature" } }, "specializationFeatures": { "type": "array", "items": { "$ref": "#/$defs/Feature" } }, "masteryFeatures": { "type": "array", "items": { "$ref": "#/$defs/Feature" } } }, "required": [ "_type", "name", "description", "spellTrait", "foundationFeatures", "specializationFeatures", "masteryFeatures" ], "additionalProperties": false, "$defs": { "TraitName": { "id": "TraitName", "title": "Trait Name", "description": "The name of a character trait", "examples": [ "Agility", "Strength", "Finesse", "Instinct", "Presence", "Knowledge" ], "anyOf": [ { "const": "Agility" }, { "const": "Strength" }, { "const": "Finesse" }, { "const": "Instinct" }, { "const": "Presence" }, { "const": "Knowledge" } ] }, "Feature": { "id": "Feature", "title": "Feature", "description": "A feature for a character to use", "type": "object", "properties": { "_type": { "const": "feature" }, "name": { "type": "string" }, "description": { "type": "string" }, "notes": { "default": null, "anyOf": [ { "type": "array", "items": { "type": "string" } }, { "type": "null" } ] }, "modifiers": { "default": null, "type": "null" } }, "required": [ "_type", "name", "description", "notes", "modifiers" ], "additionalProperties": false } } } ``` *** ## Reference to a Subclass [Section titled “Reference to a Subclass”](#reference-to-a-subclass) ID: `ReferenceSubclass` ```json { "$schema": "https://json-schema.org/draft/2020-12/schema", "id": "ReferenceSubclass", "type": "object", "properties": { "_type": { "const": "reference" }, "_key": { "const": "role/subclass" }, "value": { "type": "string" } }, "required": [ "_type", "_key", "value" ], "additionalProperties": false } ``` # Campaign > A campaign is a collection of characters and rulesets. ## Campaign [Section titled “Campaign”](#campaign) ID: `Campaign` A campaign configuration and homebrew ruleset ```json { "$schema": "https://json-schema.org/draft/2020-12/schema", "id": "Campaign", "examples": [ { "_type": "campaign", "_meta": { "rulesetUrl": "https://dh-forge.com/schema.json", "rulesetVersion": "0.1.0", "dateCreated": "2025-05-30T12:00:00.000Z", "dateUpdated": "2025-05-30T12:00:00.000Z" }, "homebrew": { "item/armor": {}, "item/weapon": {}, "item/thing": {}, "role/class": {}, "role/subclass": {}, "heritage/ancestry": {}, "heritage/community": {} } } ], "type": "object", "properties": { "$schema": { "type": "string", "format": "uri" }, "_type": { "const": "campaign" }, "_meta": { "type": "object", "properties": { "rulesetVersion": { "$ref": "#/$defs/SchemaVersion" }, "dateCreated": { "type": "string", "format": "date-time", "pattern": "^((\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\d|30)|(02)-(0[1-9]|1\\d|2[0-8])))T([01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(\\.\\d+)?(Z)$" }, "dateUpdated": { "type": "string", "format": "date-time", "pattern": "^((\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\d|30)|(02)-(0[1-9]|1\\d|2[0-8])))T([01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(\\.\\d+)?(Z)$" }, "rulesetUrl": { "$ref": "#/$defs/RulesetUrl" } }, "required": [ "rulesetVersion", "dateCreated", "dateUpdated", "rulesetUrl" ], "additionalProperties": false }, "homebrew": { "type": "object", "properties": { "$schema": { "type": "string", "format": "uri" }, "item/armor": { "type": "object", "propertyNames": { "type": "string" }, "additionalProperties": { "$ref": "#/$defs/Armor" } }, "item/thing": { "type": "object", "propertyNames": { "type": "string" }, "additionalProperties": { "$ref": "#/$defs/Thing" } }, "item/weapon": { "type": "object", "propertyNames": { "type": "string" }, "additionalProperties": { "$ref": "#/$defs/Weapon" } }, "role/class": { "type": "object", "propertyNames": { "type": "string" }, "additionalProperties": { "$ref": "#/$defs/Class" } }, "role/subclass": { "type": "object", "propertyNames": { "type": "string" }, "additionalProperties": { "$ref": "#/$defs/Subclass" } }, "heritage/ancestry": { "type": "object", "propertyNames": { "type": "string" }, "additionalProperties": { "$ref": "#/$defs/Ancestry" } }, "heritage/community": { "type": "object", "propertyNames": { "type": "string" }, "additionalProperties": { "$ref": "#/$defs/Community" } } }, "additionalProperties": false } }, "required": [ "_type", "_meta", "homebrew" ], "additionalProperties": false, "$defs": { "SchemaVersion": { "id": "SchemaVersion", "title": "Schema Version", "description": "A version number", "examples": [ "0.0.0" ], "type": "string", "pattern": "^\\d+\\.\\d+\\.\\d+$" }, "RulesetUrl": { "id": "RulesetUrl", "title": "Ruleset URL", "description": "The URL of the ruleset", "examples": [ "https://docs.dh-forge.com/schema/0.0.0/ruleset.json", "https://docs.dh-forge.com/schema/1.0.0/ruleset.json" ], "type": "string", "format": "uri" }, "Armor": { "id": "Armor", "title": "Armor", "description": "A set of armor that can be equipped by a character", "type": "object", "properties": { "_type": { "default": "inventoryArmor", "const": "inventoryArmor" }, "name": { "type": "string" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "baseThresholds": { "$ref": "#/$defs/DamageThresholds" }, "baseScore": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "features": { "anyOf": [ { "type": "array", "items": { "type": "string" } }, { "type": "null" } ] } }, "required": [ "_type", "name", "description", "baseThresholds", "baseScore", "features" ], "additionalProperties": false }, "DamageThresholds": { "id": "DamageThresholds", "title": "Damage Thresholds", "description": "The damage thresholds of a character", "type": "object", "properties": { "_type": { "default": "damageThresholds", "const": "damageThresholds" }, "major": { "type": "integer", "minimum": 0, "maximum": 100 }, "severe": { "type": "integer", "minimum": 0, "maximum": 100 } }, "required": [ "_type", "major", "severe" ], "additionalProperties": false }, "Thing": { "id": "Thing", "title": "Thing", "description": "A thing that can be added to a character's inventory", "type": "object", "properties": { "_type": { "default": "inventoryThing", "const": "inventoryThing" }, "name": { "type": "string" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ] } }, "required": [ "_type", "name", "description" ], "additionalProperties": false }, "Weapon": { "id": "Weapon", "title": "Weapon", "description": "A weapon that can be equipped by a character", "type": "object", "properties": { "_type": { "default": "inventoryWeapon", "const": "inventoryWeapon" }, "name": { "type": "string" }, "trait": { "$ref": "#/$defs/TraitName" }, "range": { "$ref": "#/$defs/Range" }, "damageDice": { "$ref": "#/$defs/DiceType" }, "damageType": { "$ref": "#/$defs/DamageType" }, "features": { "anyOf": [ { "type": "array", "items": { "type": "string" } }, { "type": "null" } ] }, "burden": { "anyOf": [ { "const": "One-Handed" }, { "const": "Two-Handed" } ] } }, "required": [ "_type", "name", "trait", "range", "damageDice", "damageType", "features", "burden" ], "additionalProperties": false }, "TraitName": { "id": "TraitName", "title": "Trait Name", "description": "The name of a character trait", "examples": [ "Agility", "Strength", "Finesse", "Instinct", "Presence", "Knowledge" ], "anyOf": [ { "const": "Agility" }, { "const": "Strength" }, { "const": "Finesse" }, { "const": "Instinct" }, { "const": "Presence" }, { "const": "Knowledge" } ] }, "Range": { "id": "Range", "title": "Range", "description": "The range of a weapon or ability", "examples": [ "Melee", "Very Close", "Close", "Far", "Very Far" ], "anyOf": [ { "const": "Melee" }, { "const": "Very Close" }, { "const": "Close" }, { "const": "Far" }, { "const": "Very Far" } ] }, "DiceType": { "id": "DiceType", "title": "Dice Type", "description": "The type of dice to roll", "examples": [ "d4", "d6", "d8", "d10", "d12", "d20" ], "anyOf": [ { "const": "d4" }, { "const": "d6" }, { "const": "d8" }, { "const": "d10" }, { "const": "d12" }, { "const": "d20" } ] }, "DamageType": { "id": "DamageType", "title": "Damage Type", "description": "The type of damage a weapon or ability deals", "examples": [ "Physical", "Magical" ], "anyOf": [ { "const": "Physical" }, { "const": "Magical" } ] }, "Class": { "id": "Class", "title": "Class", "description": "A class of a character", "type": "object", "properties": { "_type": { "const": "class" }, "name": { "type": "string" }, "domain": { "$ref": "#/$defs/ReferenceDomain" }, "initialEvasion": { "type": "integer", "minimum": 0, "maximum": 100 }, "initialHitPoints": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "initialInventory": { "type": "array", "items": { "anyOf": [ { "$ref": "#/$defs/Thing" }, { "$ref": "#/$defs/Weapon" }, { "$ref": "#/$defs/Armor" } ] } }, "features": { "type": "array", "items": { "type": "object", "properties": { "name": { "type": "string" }, "description": { "type": "string" } }, "required": [ "name", "description" ], "additionalProperties": false } }, "hopeFeature": { "type": "object", "properties": { "name": { "type": "string" }, "description": { "type": "string" } }, "required": [ "name", "description" ], "additionalProperties": false }, "subclasses": { "type": "array", "items": { "$ref": "#/$defs/ReferenceSubclass" } } }, "required": [ "_type", "name", "domain", "initialEvasion", "initialHitPoints", "initialInventory", "features", "hopeFeature", "subclasses" ], "additionalProperties": false }, "ReferenceDomain": { "id": "ReferenceDomain", "title": "Reference to a Domain", "type": "object", "properties": { "_type": { "const": "reference" }, "_key": { "const": "role/domain" }, "value": { "type": "string" } }, "required": [ "_type", "_key", "value" ], "additionalProperties": false }, "ReferenceSubclass": { "id": "ReferenceSubclass", "title": "Reference to a Subclass", "type": "object", "properties": { "_type": { "const": "reference" }, "_key": { "const": "role/subclass" }, "value": { "type": "string" } }, "required": [ "_type", "_key", "value" ], "additionalProperties": false }, "Subclass": { "id": "Subclass", "title": "Subclass", "description": "A subclass of a class", "type": "object", "properties": { "_type": { "const": "subclass" }, "name": { "type": "string" }, "description": { "type": "string" }, "spellTrait": { "default": null, "anyOf": [ { "$ref": "#/$defs/TraitName" }, { "type": "null" } ] }, "foundationFeatures": { "type": "array", "items": { "$ref": "#/$defs/Feature" } }, "specializationFeatures": { "type": "array", "items": { "$ref": "#/$defs/Feature" } }, "masteryFeatures": { "type": "array", "items": { "$ref": "#/$defs/Feature" } } }, "required": [ "_type", "name", "description", "spellTrait", "foundationFeatures", "specializationFeatures", "masteryFeatures" ], "additionalProperties": false }, "Feature": { "id": "Feature", "title": "Feature", "description": "A feature for a character to use", "type": "object", "properties": { "_type": { "const": "feature" }, "name": { "type": "string" }, "description": { "type": "string" }, "notes": { "default": null, "anyOf": [ { "type": "array", "items": { "type": "string" } }, { "type": "null" } ] }, "modifiers": { "default": null, "type": "null" } }, "required": [ "_type", "name", "description", "notes", "modifiers" ], "additionalProperties": false }, "Ancestry": { "id": "Ancestry", "title": "Ancestry", "description": "The ancestry of a character", "type": "object", "properties": { "_type": { "const": "ancestry" }, "name": { "type": "string" }, "description": { "type": "string" }, "primaryFeature": { "type": "object", "properties": { "name": { "type": "string" }, "description": { "type": "string" } }, "required": [ "name", "description" ], "additionalProperties": false }, "secondaryFeature": { "type": "object", "properties": { "name": { "type": "string" }, "description": { "type": "string" } }, "required": [ "name", "description" ], "additionalProperties": false } }, "required": [ "_type", "name", "primaryFeature", "secondaryFeature" ], "additionalProperties": false }, "Community": { "id": "Community", "title": "Community", "description": "A community that shaped a characters backstory", "type": "object", "properties": { "_type": { "const": "community" }, "name": { "type": "string" }, "description": { "type": "string" }, "feature": { "type": "object", "properties": { "name": { "type": "string" }, "description": { "type": "string" } }, "required": [ "name", "description" ], "additionalProperties": false } }, "required": [ "_type", "name", "feature" ], "additionalProperties": false } } } ``` # Character > A character is a player or non-player character in a campaign. ## Character Sheet [Section titled “Character Sheet”](#character-sheet) ID: `Character` A character sheet ```json { "$schema": "https://json-schema.org/draft/2020-12/schema", "id": "Character", "examples": [ { "_type": "character", "_meta": { "campaignUrl": "https://dh-forge.com/schema.json", "rulesetVersion": "1.0.0", "dateCreated": "2025-05-30T12:00:00.000Z", "dateUpdated": "2025-05-30T12:00:00.000Z" }, "name": "Elara Meadowlight", "nameAlternate": "Ela", "pronouns": { "_type": "pronouns", "subject": "she", "object": "her", "possessive": "hers", "reflexive": "herself" }, "heritage": { "_type": "heritage", "community": { "_type": "reference", "_key": "heritage/community", "value": "seaborne" }, "ancestry": { "_type": "dualAncestry", "primary": { "_type": "reference", "_key": "heritage/ancestry", "value": "elf" }, "secondary": { "_type": "reference", "_key": "heritage/ancestry", "value": "faun" } } }, "roles": [ { "_type": "characterRole", "class": { "_type": "reference", "_key": "role/class", "value": "bard" }, "subclass": { "_type": "reference", "_key": "role/subclass", "value": "troubadour" } }, { "_type": "characterRole", "class": { "_type": "reference", "_key": "role/class", "value": "sorcerer" }, "subclass": { "_type": "reference", "_key": "role/subclass", "value": "pyromancer" } } ], "experiences": [ { "_type": "experience", "name": "Loremaster of the Ancient Texts", "description": "Years spent deciphering forgotten scrolls." }, { "_type": "experience", "name": "Survivor of the Whispering Woods", "description": null } ], "level": 5, "evasion": 14, "armorSlots": { "_type": "dynamicResource", "max": 5, "current": 3 }, "hitPoints": { "_type": "dynamicResource", "max": 8, "current": 7 }, "damageThresholds": { "_type": "damageThresholds", "major": 10, "severe": 15 }, "hope": { "_type": "dynamicResource", "max": 8, "current": 4 }, "stress": { "_type": "dynamicResource", "max": 5, "current": 1 }, "traits": { "Agility": { "_type": "trait", "value": 2, "locked": false }, "Strength": { "_type": "trait", "value": 0, "locked": false }, "Finesse": { "_type": "trait", "value": 3, "locked": true }, "Instinct": { "_type": "trait", "value": 1, "locked": false }, "Presence": { "_type": "trait", "value": 4, "locked": false }, "Knowledge": { "_type": "trait", "value": 1, "locked": true } }, "gold": { "_type": "gold", "handfuls": 15, "bags": 2, "chests": 0 }, "equippedArmor": { "primary": { "_type": "reference", "_key": "item/armor", "value": "enchanted_leather" }, "notes": "Glows faintly in moonlight" }, "equippedWeapon": { "primary": { "_type": "reference", "_key": "item/weapon", "value": "singing_shortbow" }, "secondary": null, "notes": null }, "inventory": [ { "_type": "reference", "_key": "item/weapon", "value": "silvered_dagger" }, { "_type": "reference", "_key": "item/thing", "value": "healing_potion_greater" }, { "_type": "inventoryThing", "name": "Bundle of Strange Herbs", "description": "Found near the Shadowfen, smells of sulfur and roses." }, { "_type": "inventoryThing", "name": "Tarnished Silver Locket", "description": "Opens, but is empty inside." } ] } ], "type": "object", "properties": { "$schema": { "type": "string", "format": "uri" }, "_type": { "const": "character" }, "_meta": { "type": "object", "properties": { "rulesetVersion": { "$ref": "#/$defs/SchemaVersion" }, "dateCreated": { "type": "string", "format": "date-time", "pattern": "^((\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\d|30)|(02)-(0[1-9]|1\\d|2[0-8])))T([01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(\\.\\d+)?(Z)$" }, "dateUpdated": { "type": "string", "format": "date-time", "pattern": "^((\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\d|30)|(02)-(0[1-9]|1\\d|2[0-8])))T([01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(\\.\\d+)?(Z)$" }, "campaignUrl": { "$ref": "#/$defs/CampaignUrl" } }, "required": [ "rulesetVersion", "dateCreated", "dateUpdated", "campaignUrl" ], "additionalProperties": false }, "name": { "type": "string" }, "nameAlternate": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "pronouns": { "$ref": "#/$defs/Pronouns" }, "heritage": { "$ref": "#/$defs/Heritage" }, "roles": { "type": "array", "items": { "$ref": "#/$defs/CharacterRole" } }, "experiences": { "type": "array", "items": { "$ref": "#/$defs/Experience" } }, "level": { "$ref": "#/$defs/Level" }, "evasion": { "type": "integer", "minimum": 0, "maximum": 100 }, "armorSlots": { "$ref": "#/$defs/DynamicResource" }, "hitPoints": { "$ref": "#/$defs/DynamicResource" }, "damageThresholds": { "$ref": "#/$defs/DamageThresholds" }, "hope": { "$ref": "#/$defs/DynamicResource" }, "stress": { "$ref": "#/$defs/DynamicResource" }, "traits": { "type": "object", "propertyNames": { "$ref": "#/$defs/TraitName" }, "additionalProperties": { "$ref": "#/$defs/Trait" } }, "gold": { "$ref": "#/$defs/Gold" }, "equippedArmor": { "type": "object", "properties": { "primary": { "anyOf": [ { "$ref": "#/$defs/ReferenceArmor" }, { "type": "null" } ] }, "notes": { "anyOf": [ { "type": "string" }, { "type": "null" } ] } }, "required": [ "primary", "notes" ], "additionalProperties": false }, "equippedWeapon": { "type": "object", "properties": { "primary": { "anyOf": [ { "$ref": "#/$defs/ReferenceWeapon" }, { "type": "null" } ] }, "secondary": { "anyOf": [ { "$ref": "#/$defs/ReferenceWeapon" }, { "type": "null" } ] }, "notes": { "anyOf": [ { "type": "string" }, { "type": "null" } ] } }, "required": [ "primary", "secondary", "notes" ], "additionalProperties": false }, "inventory": { "type": "array", "items": { "anyOf": [ { "$ref": "#/$defs/ReferenceArmor" }, { "$ref": "#/$defs/ReferenceWeapon" }, { "$ref": "#/$defs/ReferenceThing" }, { "$ref": "#/$defs/Thing" } ] } } }, "required": [ "_type", "_meta", "name", "nameAlternate", "pronouns", "heritage", "roles", "experiences", "level", "evasion", "armorSlots", "hitPoints", "damageThresholds", "hope", "stress", "traits", "gold", "equippedArmor", "equippedWeapon", "inventory" ], "additionalProperties": false, "$defs": { "SchemaVersion": { "id": "SchemaVersion", "title": "Schema Version", "description": "A version number", "examples": [ "0.0.0" ], "type": "string", "pattern": "^\\d+\\.\\d+\\.\\d+$" }, "CampaignUrl": { "id": "CampaignUrl", "title": "Campaign URL", "description": "The URL of the campaign", "examples": [ "https://docs.dh-forge.com/schema/0.0.0/campaign.json", "https://docs.dh-forge.com/schema/1.0.0/campaign.json" ], "type": "string", "format": "uri" }, "Pronouns": { "id": "Pronouns", "title": "Pronouns", "description": "The pronouns of a character", "type": "object", "properties": { "_type": { "const": "pronouns" }, "subject": { "$ref": "#/$defs/PronounsSubject" }, "object": { "$ref": "#/$defs/PronounsObject" }, "possessive": { "$ref": "#/$defs/PronounsPossessive" }, "reflexive": { "$ref": "#/$defs/PronounsReflexive" } }, "required": [ "_type", "subject", "object", "possessive", "reflexive" ], "additionalProperties": false }, "PronounsSubject": { "id": "PronounsSubject", "title": "Subject Pronoun", "description": "A pronoun form used when it performs the verb’s action.", "examples": [ "she", "he", "they" ], "type": "string" }, "PronounsObject": { "id": "PronounsObject", "title": "Object Pronoun", "description": "A pronoun form used when it receives the action or follows a preposition.", "examples": [ "her", "him", "them" ], "type": "string" }, "PronounsPossessive": { "id": "PronounsPossessive", "title": "Possessive Pronoun", "description": "A pronoun form that replaces a noun to show ownership or relationship.", "examples": [ "hers", "his", "theirs" ], "type": "string" }, "PronounsReflexive": { "id": "PronounsReflexive", "title": "Reflexive Pronoun", "description": "A pronoun form ending in “-self” or “-selves” that refers back to the clause’s subject.", "examples": [ "herself", "himself", "themselves" ], "type": "string" }, "Heritage": { "id": "Heritage", "title": "Character Heritage", "description": "A character's heritage", "type": "object", "properties": { "_type": { "default": "heritage", "const": "heritage" }, "community": { "$ref": "#/$defs/ReferenceCommunity" }, "ancestry": { "$ref": "#/$defs/CharacterAncestry" } }, "required": [ "_type", "community", "ancestry" ], "additionalProperties": false }, "ReferenceCommunity": { "id": "ReferenceCommunity", "title": "Reference to a Community", "type": "object", "properties": { "_type": { "const": "reference" }, "_key": { "const": "heritage/community" }, "value": { "type": "string" } }, "required": [ "_type", "_key", "value" ], "additionalProperties": false }, "CharacterAncestry": { "id": "CharacterAncestry", "title": "Character Ancestry", "description": "A character's ancestry", "anyOf": [ { "type": "object", "properties": { "_type": { "default": "singleAncestry", "const": "singleAncestry" }, "ancestry": { "$ref": "#/$defs/ReferenceAncestry" } }, "required": [ "_type", "ancestry" ], "additionalProperties": false }, { "type": "object", "properties": { "_type": { "default": "dualAncestry", "const": "dualAncestry" }, "primary": { "$ref": "#/$defs/ReferenceAncestry" }, "secondary": { "$ref": "#/$defs/ReferenceAncestry" } }, "required": [ "_type", "primary", "secondary" ], "additionalProperties": false } ] }, "ReferenceAncestry": { "id": "ReferenceAncestry", "title": "Reference to an Ancestry", "type": "object", "properties": { "_type": { "const": "reference" }, "_key": { "const": "heritage/ancestry" }, "value": { "type": "string" } }, "required": [ "_type", "_key", "value" ], "additionalProperties": false }, "CharacterRole": { "id": "CharacterRole", "title": "Character Role", "description": "Ruleset references to the class and subclass of a character", "type": "object", "properties": { "_type": { "default": "characterRole", "const": "characterRole" }, "class": { "$ref": "#/$defs/ReferenceClass" }, "subclass": { "$ref": "#/$defs/ReferenceSubclass" } }, "required": [ "_type", "class", "subclass" ], "additionalProperties": false }, "ReferenceClass": { "id": "ReferenceClass", "title": "Reference to a Class", "type": "object", "properties": { "_type": { "const": "reference" }, "_key": { "const": "role/class" }, "value": { "type": "string" } }, "required": [ "_type", "_key", "value" ], "additionalProperties": false }, "ReferenceSubclass": { "id": "ReferenceSubclass", "title": "Reference to a Subclass", "type": "object", "properties": { "_type": { "const": "reference" }, "_key": { "const": "role/subclass" }, "value": { "type": "string" } }, "required": [ "_type", "_key", "value" ], "additionalProperties": false }, "Experience": { "id": "Experience", "title": "Character Experience", "description": "Experience represents a character specialization.", "type": "object", "properties": { "_type": { "default": "experience", "const": "experience" }, "name": { "type": "string" }, "description": { "default": null, "anyOf": [ { "type": "string" }, { "type": "null" } ] } }, "required": [ "_type", "name", "description" ], "additionalProperties": false }, "Level": { "id": "Level", "title": "Level", "description": "The level of the character", "examples": [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], "type": "integer", "minimum": 1, "maximum": 10 }, "DynamicResource": { "id": "DynamicResource", "title": "Dynamic Resource", "description": "A dynamic resource used by a character", "type": "object", "properties": { "_type": { "const": "dynamicResource" }, "max": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "current": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 } }, "required": [ "_type", "max", "current" ], "additionalProperties": false }, "DamageThresholds": { "id": "DamageThresholds", "title": "Damage Thresholds", "description": "The damage thresholds of a character", "type": "object", "properties": { "_type": { "default": "damageThresholds", "const": "damageThresholds" }, "major": { "type": "integer", "minimum": 0, "maximum": 100 }, "severe": { "type": "integer", "minimum": 0, "maximum": 100 } }, "required": [ "_type", "major", "severe" ], "additionalProperties": false }, "TraitName": { "id": "TraitName", "title": "Trait Name", "description": "The name of a character trait", "examples": [ "Agility", "Strength", "Finesse", "Instinct", "Presence", "Knowledge" ], "anyOf": [ { "const": "Agility" }, { "const": "Strength" }, { "const": "Finesse" }, { "const": "Instinct" }, { "const": "Presence" }, { "const": "Knowledge" } ] }, "Trait": { "id": "Trait", "title": "Trait", "description": "The details of a character trait", "examples": [ { "_type": "trait", "value": 2, "locked": true }, { "_type": "trait", "value": -1, "locked": false } ], "type": "object", "properties": { "_type": { "default": "trait", "const": "trait" }, "value": { "default": 0, "type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991 }, "locked": { "default": false, "type": "boolean" } }, "required": [ "_type", "value", "locked" ], "additionalProperties": false }, "Gold": { "id": "Gold", "title": "Gold", "description": "The amount of gold held by a character", "type": "object", "properties": { "_type": { "const": "gold" }, "handfuls": { "default": 0, "type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991 }, "bags": { "default": 0, "type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991 }, "chests": { "default": 0, "type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991 } }, "required": [ "_type", "handfuls", "bags", "chests" ], "additionalProperties": false }, "ReferenceArmor": { "id": "ReferenceArmor", "title": "Reference to a piece of Armor", "type": "object", "properties": { "_type": { "const": "reference" }, "_key": { "const": "item/armor" }, "value": { "type": "string" } }, "required": [ "_type", "_key", "value" ], "additionalProperties": false }, "ReferenceWeapon": { "id": "ReferenceWeapon", "title": "Reference to a Weapon", "type": "object", "properties": { "_type": { "const": "reference" }, "_key": { "const": "item/weapon" }, "value": { "type": "string" } }, "required": [ "_type", "_key", "value" ], "additionalProperties": false }, "ReferenceThing": { "id": "ReferenceThing", "title": "Reference to a Thing", "type": "object", "properties": { "_type": { "const": "reference" }, "_key": { "const": "item/thing" }, "value": { "type": "string" } }, "required": [ "_type", "_key", "value" ], "additionalProperties": false }, "Thing": { "id": "Thing", "title": "Thing", "description": "A thing that can be added to a character's inventory", "type": "object", "properties": { "_type": { "default": "inventoryThing", "const": "inventoryThing" }, "name": { "type": "string" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ] } }, "required": [ "_type", "name", "description" ], "additionalProperties": false } } } ``` # Common > Common schemas are used in multiple models. ## Character Ancestry [Section titled “Character Ancestry”](#character-ancestry) ID: `CharacterAncestry` A character’s ancestry ```json { "$schema": "https://json-schema.org/draft/2020-12/schema", "id": "CharacterAncestry", "anyOf": [ { "type": "object", "properties": { "_type": { "default": "singleAncestry", "const": "singleAncestry" }, "ancestry": { "$ref": "#/$defs/ReferenceAncestry" } }, "required": [ "_type", "ancestry" ], "additionalProperties": false }, { "type": "object", "properties": { "_type": { "default": "dualAncestry", "const": "dualAncestry" }, "primary": { "$ref": "#/$defs/ReferenceAncestry" }, "secondary": { "$ref": "#/$defs/ReferenceAncestry" } }, "required": [ "_type", "primary", "secondary" ], "additionalProperties": false } ], "$defs": { "ReferenceAncestry": { "id": "ReferenceAncestry", "title": "Reference to an Ancestry", "type": "object", "properties": { "_type": { "const": "reference" }, "_key": { "const": "heritage/ancestry" }, "value": { "type": "string" } }, "required": [ "_type", "_key", "value" ], "additionalProperties": false } } } ``` *** ## Character Role [Section titled “Character Role”](#character-role) ID: `CharacterRole` Ruleset references to the class and subclass of a character ```json { "$schema": "https://json-schema.org/draft/2020-12/schema", "id": "CharacterRole", "type": "object", "properties": { "_type": { "default": "characterRole", "const": "characterRole" }, "class": { "$ref": "#/$defs/ReferenceClass" }, "subclass": { "$ref": "#/$defs/ReferenceSubclass" } }, "required": [ "_type", "class", "subclass" ], "additionalProperties": false, "$defs": { "ReferenceClass": { "id": "ReferenceClass", "title": "Reference to a Class", "type": "object", "properties": { "_type": { "const": "reference" }, "_key": { "const": "role/class" }, "value": { "type": "string" } }, "required": [ "_type", "_key", "value" ], "additionalProperties": false }, "ReferenceSubclass": { "id": "ReferenceSubclass", "title": "Reference to a Subclass", "type": "object", "properties": { "_type": { "const": "reference" }, "_key": { "const": "role/subclass" }, "value": { "type": "string" } }, "required": [ "_type", "_key", "value" ], "additionalProperties": false } } } ``` *** ## Damage Thresholds [Section titled “Damage Thresholds”](#damage-thresholds) ID: `DamageThresholds` The damage thresholds of a character ```json { "$schema": "https://json-schema.org/draft/2020-12/schema", "id": "DamageThresholds", "type": "object", "properties": { "_type": { "default": "damageThresholds", "const": "damageThresholds" }, "major": { "type": "integer", "minimum": 0, "maximum": 100 }, "severe": { "type": "integer", "minimum": 0, "maximum": 100 } }, "required": [ "_type", "major", "severe" ], "additionalProperties": false } ``` *** ## Damage Type [Section titled “Damage Type”](#damage-type) ID: `DamageType` The type of damage a weapon or ability deals ```json { "$schema": "https://json-schema.org/draft/2020-12/schema", "id": "DamageType", "examples": [ "Physical", "Magical" ], "anyOf": [ { "const": "Physical" }, { "const": "Magical" } ] } ``` *** ## Dice Type [Section titled “Dice Type”](#dice-type) ID: `DiceType` The type of dice to roll ```json { "$schema": "https://json-schema.org/draft/2020-12/schema", "id": "DiceType", "examples": [ "d4", "d6", "d8", "d10", "d12", "d20" ], "anyOf": [ { "const": "d4" }, { "const": "d6" }, { "const": "d8" }, { "const": "d10" }, { "const": "d12" }, { "const": "d20" } ] } ``` *** ## Dynamic Resource [Section titled “Dynamic Resource”](#dynamic-resource) ID: `DynamicResource` A dynamic resource used by a character ```json { "$schema": "https://json-schema.org/draft/2020-12/schema", "id": "DynamicResource", "type": "object", "properties": { "_type": { "const": "dynamicResource" }, "max": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "current": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 } }, "required": [ "_type", "max", "current" ], "additionalProperties": false } ``` *** ## Character Experience [Section titled “Character Experience”](#character-experience) ID: `Experience` Experience represents a character specialization. ```json { "$schema": "https://json-schema.org/draft/2020-12/schema", "id": "Experience", "type": "object", "properties": { "_type": { "default": "experience", "const": "experience" }, "name": { "type": "string" }, "description": { "default": null, "anyOf": [ { "type": "string" }, { "type": "null" } ] } }, "required": [ "_type", "name", "description" ], "additionalProperties": false } ``` *** ## Gold [Section titled “Gold”](#gold) ID: `Gold` The amount of gold held by a character ```json { "$schema": "https://json-schema.org/draft/2020-12/schema", "id": "Gold", "type": "object", "properties": { "_type": { "const": "gold" }, "handfuls": { "default": 0, "type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991 }, "bags": { "default": 0, "type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991 }, "chests": { "default": 0, "type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991 } }, "required": [ "_type", "handfuls", "bags", "chests" ], "additionalProperties": false } ``` *** ## Character Heritage [Section titled “Character Heritage”](#character-heritage) ID: `Heritage` A character’s heritage ```json { "$schema": "https://json-schema.org/draft/2020-12/schema", "id": "Heritage", "type": "object", "properties": { "_type": { "default": "heritage", "const": "heritage" }, "community": { "$ref": "#/$defs/ReferenceCommunity" }, "ancestry": { "$ref": "#/$defs/CharacterAncestry" } }, "required": [ "_type", "community", "ancestry" ], "additionalProperties": false, "$defs": { "ReferenceCommunity": { "id": "ReferenceCommunity", "title": "Reference to a Community", "type": "object", "properties": { "_type": { "const": "reference" }, "_key": { "const": "heritage/community" }, "value": { "type": "string" } }, "required": [ "_type", "_key", "value" ], "additionalProperties": false }, "CharacterAncestry": { "id": "CharacterAncestry", "title": "Character Ancestry", "description": "A character's ancestry", "anyOf": [ { "type": "object", "properties": { "_type": { "default": "singleAncestry", "const": "singleAncestry" }, "ancestry": { "$ref": "#/$defs/ReferenceAncestry" } }, "required": [ "_type", "ancestry" ], "additionalProperties": false }, { "type": "object", "properties": { "_type": { "default": "dualAncestry", "const": "dualAncestry" }, "primary": { "$ref": "#/$defs/ReferenceAncestry" }, "secondary": { "$ref": "#/$defs/ReferenceAncestry" } }, "required": [ "_type", "primary", "secondary" ], "additionalProperties": false } ] }, "ReferenceAncestry": { "id": "ReferenceAncestry", "title": "Reference to an Ancestry", "type": "object", "properties": { "_type": { "const": "reference" }, "_key": { "const": "heritage/ancestry" }, "value": { "type": "string" } }, "required": [ "_type", "_key", "value" ], "additionalProperties": false } } } ``` *** ## Inventory Item [Section titled “Inventory Item”](#inventory-item) ID: `InventoryItem` An item in a character’s inventory ```json { "$schema": "https://json-schema.org/draft/2020-12/schema", "id": "InventoryItem", "anyOf": [ { "$ref": "#/$defs/ReferenceArmor" }, { "$ref": "#/$defs/ReferenceWeapon" }, { "$ref": "#/$defs/ReferenceThing" }, { "$ref": "#/$defs/Thing" } ], "$defs": { "ReferenceArmor": { "id": "ReferenceArmor", "title": "Reference to a piece of Armor", "type": "object", "properties": { "_type": { "const": "reference" }, "_key": { "const": "item/armor" }, "value": { "type": "string" } }, "required": [ "_type", "_key", "value" ], "additionalProperties": false }, "ReferenceWeapon": { "id": "ReferenceWeapon", "title": "Reference to a Weapon", "type": "object", "properties": { "_type": { "const": "reference" }, "_key": { "const": "item/weapon" }, "value": { "type": "string" } }, "required": [ "_type", "_key", "value" ], "additionalProperties": false }, "ReferenceThing": { "id": "ReferenceThing", "title": "Reference to a Thing", "type": "object", "properties": { "_type": { "const": "reference" }, "_key": { "const": "item/thing" }, "value": { "type": "string" } }, "required": [ "_type", "_key", "value" ], "additionalProperties": false }, "Thing": { "id": "Thing", "title": "Thing", "description": "A thing that can be added to a character's inventory", "type": "object", "properties": { "_type": { "default": "inventoryThing", "const": "inventoryThing" }, "name": { "type": "string" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ] } }, "required": [ "_type", "name", "description" ], "additionalProperties": false } } } ``` *** ## Pronouns [Section titled “Pronouns”](#pronouns) ID: `Pronouns` The pronouns of a character ```json { "$schema": "https://json-schema.org/draft/2020-12/schema", "id": "Pronouns", "type": "object", "properties": { "_type": { "const": "pronouns" }, "subject": { "$ref": "#/$defs/PronounsSubject" }, "object": { "$ref": "#/$defs/PronounsObject" }, "possessive": { "$ref": "#/$defs/PronounsPossessive" }, "reflexive": { "$ref": "#/$defs/PronounsReflexive" } }, "required": [ "_type", "subject", "object", "possessive", "reflexive" ], "additionalProperties": false, "$defs": { "PronounsSubject": { "id": "PronounsSubject", "title": "Subject Pronoun", "description": "A pronoun form used when it performs the verb’s action.", "examples": [ "she", "he", "they" ], "type": "string" }, "PronounsObject": { "id": "PronounsObject", "title": "Object Pronoun", "description": "A pronoun form used when it receives the action or follows a preposition.", "examples": [ "her", "him", "them" ], "type": "string" }, "PronounsPossessive": { "id": "PronounsPossessive", "title": "Possessive Pronoun", "description": "A pronoun form that replaces a noun to show ownership or relationship.", "examples": [ "hers", "his", "theirs" ], "type": "string" }, "PronounsReflexive": { "id": "PronounsReflexive", "title": "Reflexive Pronoun", "description": "A pronoun form ending in “-self” or “-selves” that refers back to the clause’s subject.", "examples": [ "herself", "himself", "themselves" ], "type": "string" } } } ``` *** ## Range [Section titled “Range”](#range) ID: `Range` The range of a weapon or ability ```json { "$schema": "https://json-schema.org/draft/2020-12/schema", "id": "Range", "examples": [ "Melee", "Very Close", "Close", "Far", "Very Far" ], "anyOf": [ { "const": "Melee" }, { "const": "Very Close" }, { "const": "Close" }, { "const": "Far" }, { "const": "Very Far" } ] } ``` *** ## Trait [Section titled “Trait”](#trait) ID: `Trait` The details of a character trait ```json { "$schema": "https://json-schema.org/draft/2020-12/schema", "id": "Trait", "examples": [ { "_type": "trait", "value": 2, "locked": true }, { "_type": "trait", "value": -1, "locked": false } ], "type": "object", "properties": { "_type": { "default": "trait", "const": "trait" }, "value": { "default": 0, "type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991 }, "locked": { "default": false, "type": "boolean" } }, "required": [ "_type", "value", "locked" ], "additionalProperties": false } ``` *** ## Trait Name [Section titled “Trait Name”](#trait-name) ID: `TraitName` The name of a character trait ```json { "$schema": "https://json-schema.org/draft/2020-12/schema", "id": "TraitName", "examples": [ "Agility", "Strength", "Finesse", "Instinct", "Presence", "Knowledge" ], "anyOf": [ { "const": "Agility" }, { "const": "Strength" }, { "const": "Finesse" }, { "const": "Instinct" }, { "const": "Presence" }, { "const": "Knowledge" } ] } ``` # Ruleset > A ruleset is a collection of rules for a campaign. ## Ruleset [Section titled “Ruleset”](#ruleset) ID: `Ruleset` A ruleset of all the things that can be used in the game ```json { "$schema": "https://json-schema.org/draft/2020-12/schema", "id": "Ruleset", "examples": [ { "_type": "ruleset", "_meta": { "rulesetUrl": "https://dh-forge.com/schema.json", "rulesetVersion": "0.2.0", "minVersion": "0.0.1", "dateCreated": "2025-05-30T12:00:00.000Z", "dateUpdated": "2025-05-30T12:00:00.000Z" }, "item/armor": {}, "item/weapon": {}, "item/thing": {}, "role/class": {}, "role/subclass": {}, "heritage/ancestry": {}, "heritage/community": {} } ], "type": "object", "properties": { "$schema": { "type": "string", "format": "uri" }, "_type": { "const": "ruleset" }, "_meta": { "type": "object", "properties": { "rulesetVersion": { "$ref": "#/$defs/SchemaVersion" }, "dateCreated": { "type": "string", "format": "date-time", "pattern": "^((\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\d|30)|(02)-(0[1-9]|1\\d|2[0-8])))T([01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(\\.\\d+)?(Z)$" }, "dateUpdated": { "type": "string", "format": "date-time", "pattern": "^((\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\d|30)|(02)-(0[1-9]|1\\d|2[0-8])))T([01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(\\.\\d+)?(Z)$" }, "rulesetUrl": { "$ref": "#/$defs/RulesetUrl" }, "minVersion": { "$ref": "#/$defs/SchemaVersion" } }, "required": [ "rulesetVersion", "dateCreated", "dateUpdated", "rulesetUrl", "minVersion" ], "additionalProperties": false }, "item/armor": { "type": "object", "propertyNames": { "type": "string" }, "additionalProperties": { "$ref": "#/$defs/Armor" } }, "item/thing": { "type": "object", "propertyNames": { "type": "string" }, "additionalProperties": { "$ref": "#/$defs/Thing" } }, "item/weapon": { "type": "object", "propertyNames": { "type": "string" }, "additionalProperties": { "$ref": "#/$defs/Weapon" } }, "role/class": { "type": "object", "propertyNames": { "type": "string" }, "additionalProperties": { "$ref": "#/$defs/Class" } }, "role/subclass": { "type": "object", "propertyNames": { "type": "string" }, "additionalProperties": { "$ref": "#/$defs/Subclass" } }, "heritage/ancestry": { "type": "object", "propertyNames": { "type": "string" }, "additionalProperties": { "$ref": "#/$defs/Ancestry" } }, "heritage/community": { "type": "object", "propertyNames": { "type": "string" }, "additionalProperties": { "$ref": "#/$defs/Community" } } }, "required": [ "_type", "_meta", "item/armor", "item/thing", "item/weapon", "role/class", "role/subclass", "heritage/ancestry", "heritage/community" ], "additionalProperties": false, "$defs": { "SchemaVersion": { "id": "SchemaVersion", "title": "Schema Version", "description": "A version number", "examples": [ "0.0.0" ], "type": "string", "pattern": "^\\d+\\.\\d+\\.\\d+$" }, "RulesetUrl": { "id": "RulesetUrl", "title": "Ruleset URL", "description": "The URL of the ruleset", "examples": [ "https://docs.dh-forge.com/schema/0.0.0/ruleset.json", "https://docs.dh-forge.com/schema/1.0.0/ruleset.json" ], "type": "string", "format": "uri" }, "Armor": { "id": "Armor", "title": "Armor", "description": "A set of armor that can be equipped by a character", "type": "object", "properties": { "_type": { "default": "inventoryArmor", "const": "inventoryArmor" }, "name": { "type": "string" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "baseThresholds": { "$ref": "#/$defs/DamageThresholds" }, "baseScore": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "features": { "anyOf": [ { "type": "array", "items": { "type": "string" } }, { "type": "null" } ] } }, "required": [ "_type", "name", "description", "baseThresholds", "baseScore", "features" ], "additionalProperties": false }, "DamageThresholds": { "id": "DamageThresholds", "title": "Damage Thresholds", "description": "The damage thresholds of a character", "type": "object", "properties": { "_type": { "default": "damageThresholds", "const": "damageThresholds" }, "major": { "type": "integer", "minimum": 0, "maximum": 100 }, "severe": { "type": "integer", "minimum": 0, "maximum": 100 } }, "required": [ "_type", "major", "severe" ], "additionalProperties": false }, "Thing": { "id": "Thing", "title": "Thing", "description": "A thing that can be added to a character's inventory", "type": "object", "properties": { "_type": { "default": "inventoryThing", "const": "inventoryThing" }, "name": { "type": "string" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ] } }, "required": [ "_type", "name", "description" ], "additionalProperties": false }, "Weapon": { "id": "Weapon", "title": "Weapon", "description": "A weapon that can be equipped by a character", "type": "object", "properties": { "_type": { "default": "inventoryWeapon", "const": "inventoryWeapon" }, "name": { "type": "string" }, "trait": { "$ref": "#/$defs/TraitName" }, "range": { "$ref": "#/$defs/Range" }, "damageDice": { "$ref": "#/$defs/DiceType" }, "damageType": { "$ref": "#/$defs/DamageType" }, "features": { "anyOf": [ { "type": "array", "items": { "type": "string" } }, { "type": "null" } ] }, "burden": { "anyOf": [ { "const": "One-Handed" }, { "const": "Two-Handed" } ] } }, "required": [ "_type", "name", "trait", "range", "damageDice", "damageType", "features", "burden" ], "additionalProperties": false }, "TraitName": { "id": "TraitName", "title": "Trait Name", "description": "The name of a character trait", "examples": [ "Agility", "Strength", "Finesse", "Instinct", "Presence", "Knowledge" ], "anyOf": [ { "const": "Agility" }, { "const": "Strength" }, { "const": "Finesse" }, { "const": "Instinct" }, { "const": "Presence" }, { "const": "Knowledge" } ] }, "Range": { "id": "Range", "title": "Range", "description": "The range of a weapon or ability", "examples": [ "Melee", "Very Close", "Close", "Far", "Very Far" ], "anyOf": [ { "const": "Melee" }, { "const": "Very Close" }, { "const": "Close" }, { "const": "Far" }, { "const": "Very Far" } ] }, "DiceType": { "id": "DiceType", "title": "Dice Type", "description": "The type of dice to roll", "examples": [ "d4", "d6", "d8", "d10", "d12", "d20" ], "anyOf": [ { "const": "d4" }, { "const": "d6" }, { "const": "d8" }, { "const": "d10" }, { "const": "d12" }, { "const": "d20" } ] }, "DamageType": { "id": "DamageType", "title": "Damage Type", "description": "The type of damage a weapon or ability deals", "examples": [ "Physical", "Magical" ], "anyOf": [ { "const": "Physical" }, { "const": "Magical" } ] }, "Class": { "id": "Class", "title": "Class", "description": "A class of a character", "type": "object", "properties": { "_type": { "const": "class" }, "name": { "type": "string" }, "domain": { "$ref": "#/$defs/ReferenceDomain" }, "initialEvasion": { "type": "integer", "minimum": 0, "maximum": 100 }, "initialHitPoints": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "initialInventory": { "type": "array", "items": { "anyOf": [ { "$ref": "#/$defs/Thing" }, { "$ref": "#/$defs/Weapon" }, { "$ref": "#/$defs/Armor" } ] } }, "features": { "type": "array", "items": { "type": "object", "properties": { "name": { "type": "string" }, "description": { "type": "string" } }, "required": [ "name", "description" ], "additionalProperties": false } }, "hopeFeature": { "type": "object", "properties": { "name": { "type": "string" }, "description": { "type": "string" } }, "required": [ "name", "description" ], "additionalProperties": false }, "subclasses": { "type": "array", "items": { "$ref": "#/$defs/ReferenceSubclass" } } }, "required": [ "_type", "name", "domain", "initialEvasion", "initialHitPoints", "initialInventory", "features", "hopeFeature", "subclasses" ], "additionalProperties": false }, "ReferenceDomain": { "id": "ReferenceDomain", "title": "Reference to a Domain", "type": "object", "properties": { "_type": { "const": "reference" }, "_key": { "const": "role/domain" }, "value": { "type": "string" } }, "required": [ "_type", "_key", "value" ], "additionalProperties": false }, "ReferenceSubclass": { "id": "ReferenceSubclass", "title": "Reference to a Subclass", "type": "object", "properties": { "_type": { "const": "reference" }, "_key": { "const": "role/subclass" }, "value": { "type": "string" } }, "required": [ "_type", "_key", "value" ], "additionalProperties": false }, "Subclass": { "id": "Subclass", "title": "Subclass", "description": "A subclass of a class", "type": "object", "properties": { "_type": { "const": "subclass" }, "name": { "type": "string" }, "description": { "type": "string" }, "spellTrait": { "default": null, "anyOf": [ { "$ref": "#/$defs/TraitName" }, { "type": "null" } ] }, "foundationFeatures": { "type": "array", "items": { "$ref": "#/$defs/Feature" } }, "specializationFeatures": { "type": "array", "items": { "$ref": "#/$defs/Feature" } }, "masteryFeatures": { "type": "array", "items": { "$ref": "#/$defs/Feature" } } }, "required": [ "_type", "name", "description", "spellTrait", "foundationFeatures", "specializationFeatures", "masteryFeatures" ], "additionalProperties": false }, "Feature": { "id": "Feature", "title": "Feature", "description": "A feature for a character to use", "type": "object", "properties": { "_type": { "const": "feature" }, "name": { "type": "string" }, "description": { "type": "string" }, "notes": { "default": null, "anyOf": [ { "type": "array", "items": { "type": "string" } }, { "type": "null" } ] }, "modifiers": { "default": null, "type": "null" } }, "required": [ "_type", "name", "description", "notes", "modifiers" ], "additionalProperties": false }, "Ancestry": { "id": "Ancestry", "title": "Ancestry", "description": "The ancestry of a character", "type": "object", "properties": { "_type": { "const": "ancestry" }, "name": { "type": "string" }, "description": { "type": "string" }, "primaryFeature": { "type": "object", "properties": { "name": { "type": "string" }, "description": { "type": "string" } }, "required": [ "name", "description" ], "additionalProperties": false }, "secondaryFeature": { "type": "object", "properties": { "name": { "type": "string" }, "description": { "type": "string" } }, "required": [ "name", "description" ], "additionalProperties": false } }, "required": [ "_type", "name", "primaryFeature", "secondaryFeature" ], "additionalProperties": false }, "Community": { "id": "Community", "title": "Community", "description": "A community that shaped a characters backstory", "type": "object", "properties": { "_type": { "const": "community" }, "name": { "type": "string" }, "description": { "type": "string" }, "feature": { "type": "object", "properties": { "name": { "type": "string" }, "description": { "type": "string" } }, "required": [ "name", "description" ], "additionalProperties": false } }, "required": [ "_type", "name", "feature" ], "additionalProperties": false } } } ``` # DHF Data Specification Work in Progress # DHF Dereference Specification Work in Progress # DHF Typescript API Reference ## The Challenge: [Section titled “The Challenge:”](#the-challenge) You still need to *use* these schemas effectively in your project. This means figuring out how to validate data against the schemas, manage any references or connections between different parts of the schemas (a process often called ‘resolving’), and ensure any new game data you create is correctly structured. Setting all this up is often boilerplate work that can slow you down before you even get to building the unique parts of your tool. ## Why Solve It? [Section titled “Why Solve It?”](#why-solve-it) We want you to hit the ground running when you’re building Daggerheart™ tools with TypeScript or JavaScript! By providing ready-made solutions for common schema-related tasks, we can save you time, reduce initial setup headaches, and let you focus your energy on crafting the unique features and user experiences that will make your application stand out. ## Our Solution: [Section titled “Our Solution:”](#our-solution) To give TypeScript and JavaScript developers this boost, DH-F offers dedicated [TypeScript](https://www.typescriptlang.org/) packages that go well beyond just providing the raw schema files. Think of them as a specialized toolkit for working with DH-F data. Inside, you’ll find: * **Pre-generated TypeScript Types:** Jump-start your project with strong typing and autocompletion in your editor. No need to manually define interfaces to match the schemas – we’ve handled that, helping you catch errors early and understand data structures intuitively. * **Validation Tools:** Easily check if character data, homebrew content, or any other game information conforms to the DH-F schemas directly within your JavaScript or TypeScript code. This helps ensure data integrity throughout your application. * **Schema Resolution Utilities:** If you’re working with more complex data that references other parts of the Daggerheart™ schemas (using `$ref` for example), these tools will help manage and correctly interpret those relationships. * **Data Creation Helpers:** Functions and utilities to simplify the creation of new, schema-compliant data instances (like new characters, items, or other game elements). This makes it easier to build data that you know will be valid. * **Other Handy Utilities:** A collection of smaller tools and functions to streamline common tasks when working with DH-F data. Essentially, if you’re building with TypeScript or JavaScript, these packages are designed to handle a lot of the foundational schema plumbing for you. This means a faster, more robust start, allowing you to focus on building something amazing for the Daggerheart™ community. # Schema Versions > View a complete list of all published DH-F JSON Schema versions for Daggerheart™. ## Version 0 * ### 0.0.x * ##### 0.0.0 * [**campaign**.json](/schema/0.0.0/campaign.json) * [**character**.json](/schema/0.0.0/character.json) * [**ruleset**.json](/schema/0.0.0/ruleset.json)