{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.

This page was rewritten from scratch. An earlier version of this page described a query/filter API ({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=:

{monster:Goblin} {monster:Shadow Acolyte}

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)
No filtering parameters exist. There is no 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

{ "readAloud": "<div class='read-aloud'><p>A {monster:Goblin} emerges from the shadows!</p></div>" }

Displays the Goblin stat block from the active game system's bundled bestiary.

Multiple Copies

{ "readAloud": "<div class='read-aloud'><p>{monster:Goblin|count=3} block your path.</p></div>" }

Displays the Goblin stat block with a "×3" badge.

Named Variant

{ "readAloud": "<div class='read-aloud'><p>The crypt's guardian rises: {monster:Wight|variant=elite}</p></div>" }

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

{monster:Shadow Acolyte|count=3|variant=elite}

Stat Block Display

When a monster is found, formatStatblockHTML() renders it directly from the bestiary JSON's statblock object:

Not found: If the name doesn't match anything in the active bestiary (checked by name and by 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:

{ "dmNotes": { "setup": "2x {monster:Goblin}, 1x {monster:Goblin Boss} ambush from the treeline." } }

Best Practices

Use Exact Bestiary Names

✓ Good: {monster:Goblin} (matches bestiary entry exactly, or via aliases)
✗ 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: Crypt encounter: {monster:Wight}
✓ Good: Forest encounter: {monster:Dire Wolf}

Combine with Dungeon Placeholders

{ "readAloud": "<div class='read-aloud'><p>Deep within {nearestDungeon:type=Cave}, you encounter {monster:Ogre}.</p></div>" }

See Also