{monster} Placeholder
The {monster:MonsterName} placeholder looks up a creature by name in the bundled bestiary for the active game system and displays its stat block directly in the Campaign Cookbook.
{monster:name=Goblin,cr=3,type=undead,environment=forest,random=true}) that was never built and does not work. There is no cr, type, environment, or random filtering, and the monster name is never passed as name=. The real syntax, verified against resolvePlaceholdersSimple() and renderMonsterPlaceholder(), is below.
Basic Syntax
The monster name goes directly after the colon - not name=:
Lookup is case-insensitive and checks both the creature's name and its aliases in the bundled bestiary JSON for the active game system (D&D 5e by default in this app). If no match is found, the placeholder renders "Not found in compendium" rather than erroring.
Parameters
Optional parameters are pipe (|) separated after the monster name - not comma-separated like location placeholders. Only two parameters exist:
| Parameter | Type | Description |
|---|---|---|
count |
number | Shows a "×N" badge next to the monster name (display only - does not change the stat block) |
variant |
string | Shows a variant badge next to the monster name (display only - the stat block itself is always the base creature's) |
cr, type, environment, or random - the monster is always looked up by the exact name you give it. If you want a specific CR or type of creature, pick the monster name yourself from the bestiary and reference it directly.
Usage Examples
Specific Monster by Name
Displays the Goblin stat block from the active game system's bundled bestiary.
Multiple Copies
Displays the Goblin stat block with a "×3" badge.
Named Variant
Displays the Wight stat block with an "elite" badge. The stat block itself is still the base Wight - variant is a label for you, the DM, not a mechanical modifier.
Count and Variant Together
Stat Block Display
When a monster is found, formatStatblockHTML() renders it directly from the bestiary JSON's statblock object:
- Monster name and type/size/alignment
- Armor Class, Hit Points, Speed
- Ability scores (STR, DEX, CON, INT, WIS, CHA) with modifiers
- Skills, senses, languages
- Challenge rating
- Actions and bonus actions
aliases), the placeholder shows "Not found in compendium" instead of a stat block.
Compendium Coverage
This standalone app ships with data/compendium/D&D5e/bestiary/ (~14MB of monster JSON, one file per creature type, e.g. beast.json, undead.json). Only D&D 5e is bundled by default; other systems' compendiums can be copied in from the parent project if needed.
DM Notes Integration
{monster:...} also resolves inside dmNotes string fields (e.g. inside a skillChecks or enemies entry's text), not just readAloud:
Best Practices
Use Exact Bestiary Names
✗ Risk: {monster:Goblin Warrior} (only works if that's a real name or alias in the bestiary)
Pick the Right Creature Yourself
Since there's no CR/type filtering, choose an appropriate creature by name when writing the scene - check data/compendium/D&D5e/bestiary/ for what's available:
✓ Good: Forest encounter: {monster:Dire Wolf}
Combine with Dungeon Placeholders
See Also
- Placeholders Overview
- {nearestDungeon} - Combine with dungeon locations
- Best Practices - Encounter design tips