| Latest version | 0.0.4 |
|---|---|
| Minimum Core | 14 |
| Compatible Core | 14 |
| Last updated | 1 week ago |
| Created | 2 months ago |
| Authors | |
| Languages |
|
| Systems |
Daggerheart |
| Project source | Project URL |
Daggerheart: Art Mapper puts your own images on the Daggerheart compendiums. You drop image files named after the entries into Data/dh-assets/, click Regenerate Art Mappings, and the matching adversaries, environments, classes, subclasses, ancestries, communities and domain cards show your art. Druid beastforms get a gallery the player picks from when transforming, and compendiums from other modules can be included too.
The module ships no artwork. The folders start empty and you fill them with images you own or made.
Data/dh-assets/ and asks you to reload.Repeat steps 2 to 4 whenever you add or rename images.
Put each image in the folder for its category. The folder structure is in the next section.
The filename must start with the entry's name. All of these match an adversary called Dread Knight:
dread-knight.webp dread_knight.webp Dread Knight.webp
dread-knight-1.webp Dread-Knight2.webp dread knight 03.webp
Matching is lenient: spaces, hyphens and underscores all work, and capitalisation is ignored. The safest choice is the recommended convention:
Dread-Knight_1.webp ← hyphens between words, "_" before the number
Use the English names, even when the Daggerheart system runs in another language. Translation modules rename the compendium entries on screen, but the module matches files against the original names, so the same files work in every language.
The _ before the number matters when one entry's name is the start of another's. "Merchant" and "Merchant Baron" are both adversaries, and so are "Tangle Bramble" and "Tangle Bramble Swarm". A number placed straight after the name makes the shorter entry's wildcard also take the longer entry's images, because Merchant* also matches Merchant-Baron1.webp. A separator that never appears between words fixes it:
Merchant_1.webp Merchant_2.webp ← "Merchant_*" stops here
Merchant-Baron_1.webp ← never reached by "Merchant_*"
If two such entries share a plain prefix anyway, the module does not guess: the shorter entry gets a single fixed image, and a warning naming both entries appears in the console (F12). Only these prefix pairs can break, but using _ everywhere means you never have to check which names start others.
Every image format Foundry supports works: PNG, JPG, WebP and so on.
In token/ folders you can add more than one file for the same entry (dread-knight_1.webp, dread-knight_2.webp). The module then builds a wildcard path and turns on Foundry's own Randomize Wildcard Images option on that entry's prototype token. Each time you drop the actor on a scene, Foundry picks one of the matching images for that token.
Keep capitalisation the same inside one entry's set. Zumbi_1.png and zumbi_2.png are matched to the same entry, but Foundry's server resolves the wildcard case-sensitively, so no single pattern covers both. The module falls back to one fixed image and says so in the console. Pick one casing per entry.
Click Regenerate Art Mappings to apply any change.
Your files are safe. Everything lives in Data/dh-assets/, a folder that belongs to no module. Updating, reinstalling or uninstalling Daggerheart: Art Mapper never touches it, and the module never deletes or rewrites images you added.
Everything sits in your Foundry Data folder, the one holding worlds/, modules/ and systems/, in a folder named dh-assets:
Data/dh-assets/
├── core-mapping.json ← generated by the module, do not edit
├── beastform-art.json ← generated by the module, do not edit
├── assets/
│ ├── adversary/
│ │ ├── portrait/ → daggerheart.adversaries (actor portraits)
│ │ └── token/ → daggerheart.adversaries (token images)
│ ├── ancestry/ → daggerheart.ancestries (item art)
│ ├── class/ → daggerheart.classes (item art)
│ ├── community/ → daggerheart.communities (item art)
│ ├── domain-card/ → daggerheart.domains (item art)
│ ├── environment/
│ │ ├── portrait/ → daggerheart.environments (actor portraits)
│ │ └── token/ → daggerheart.environments (token images)
│ ├── subclass/ → daggerheart.subclasses (item art)
│ └── druid-transformation/ → beastform galleries, by tier
│ ├── tier1/
│ │ ├── agile-scout/ ├── tier3/
│ │ ├── aquatic-scout/ │ ├── aquatic-predator/
│ │ ├── household-friend/ │ ├── great-predator/
│ │ ├── nimble-grazer/ │ ├── great-winged-beast/
│ │ ├── pack-predator/ │ ├── legendary-beast/
│ │ └── stalking-arachnid/ │ ├── legendary-hybrid/
│ ├── tier2/ │ └── mighty-lizard/
│ │ ├── armored-sentry/ └── tier4/
│ │ ├── mighty-strider/ ├── epic-aquatic-beast/
│ │ ├── pouncing-predator/ ├── massive-behemoth/
│ │ ├── powerful-beast/ ├── mythic-aerial-hunter/
│ │ ├── striking-serpent/ ├── mythic-beast/
│ │ └── winged-beast/ ├── mythic-hybrid/
│ │ └── terrible-lizard/
└── custom/ → folders for compendiums from other modules
Every folder is kebab-case. Beastform folders are the form's English name lowercased with spaces turned into hyphens: "Agile Scout" becomes agile-scout, "Great Winged Beast" becomes great-winged-beast.
Each beastform has its own folder. Put any number of images in it, and when a druid transforms into that form the module shows Daggerheart's image picker with your images, so the player chooses which one their token becomes.
druid-transformation/tier1/agile-scout/.Some details:
The standard folders cover the Daggerheart system's own compendiums. Manage Custom Compendiums applies the same workflow (drop an image, the name matches, the art is applied) to Actor or Item compendiums from any other active module.
Data/dh-assets/custom/, and the dialog shows the exact folder name. The module generates that name and it cannot be renamed. This keeps names short and makes sure two compendiums never point at the same folder by mistake.Actor compendiums get portrait/ and token/ subfolders, like Adversaries and Environments. Item compendiums get one flat folder. This works even when a pack mixes several item subtypes, because matching is by name, not by subtype, so nothing extra needs configuring.
Unchecking a compendium only stops the module from scanning it. It never deletes the folder or your images. If the source module is later disabled, its entry stays listed as Unavailable instead of disappearing, so you keep the configuration and can remove it deliberately.
Compendium art applies to compendium entries. Items already on an actor keep the image they had when they were added. Sync Actor Images closes that gap: it scans every world actor and updates only the img field of eligible embedded items. No other field is ever touched.
Only images that are still the system default are replaced. Anything you or a player set deliberately is left alone. Running it again is safe: once everything is current, nothing changes.
It covers Classes, Subclasses, Ancestries, Communities and Domain Cards, plus any item type found in a custom Item compendium you added. Items with no compendium counterpart are untouched.
Click Sync Now in the module settings. GM only. Generate the art mappings first if you have just added images.
Found under Game Settings → Configure Settings → Daggerheart: Art Mapper.
| Setting | What it does |
|---|---|
| Open Instructions | In-app version of this guide, with the folder list. |
| Manage Custom Compendiums | Pick compendiums from other modules to include. |
| Regenerate Art Mappings | Rescans every folder and rebuilds the mapping. Run after adding images. |
| Sync Now | Applies module art to items already on world actors. |
| Include Adversaries | When off, adversary portraits and tokens are skipped on the next regeneration. |
| Include Environments | When off, environment portraits and tokens are skipped on the next regeneration. |
The two Include options take effect the next time you regenerate. They do not change an existing mapping.
This module registers through Foundry's own compendium art system, so it appears on the core Compendium Art screen (Configure Settings → Core, palette icon) next to any other art module you have installed. There you can:
The module only appears on that screen once a mapping has been generated.
Run these from a script macro or the browser console (F12, Console tab). They are also reachable as game.modules.get("dh-assets").api.
// Apply module art to items on world actors. GM only.
// Returns { actorsAffected, itemsUpdated }.
await dhAssets.syncActorImages();
// Rescan the beastform folders and republish the galleries. GM only.
await dhAssets.generateBeastformArt();
// Re-read the published galleries on this client, without reloading.
await dhAssets.loadBeastformArt();
// Inspect what this client currently has: Map of "tier1/agile-scout" → [file paths].
dhAssets.getBeastformArt();
My art did not appear. Click Regenerate Art Mappings and reload. If a specific entry is missing, check that the filename starts with that entry's exact English name.
One entry always shows the same token instead of a random one. Open the console (F12): the warning says which of the two causes applies. Either its name is the start of another entry's name and the files share a plain prefix, or the files for that entry disagree on capitalisation. Both are covered in Naming and organizing your images.
A druid transformation shows no gallery. That form's folder is empty, or the GM has not regenerated since the images were added. Ask the GM to click Regenerate Art Mappings. Players can then run dhAssets.loadBeastformArt() to pick it up without reloading.
Art from another module wins over mine, or the other way around. Change the order on the core Compendium Art screen, described in Compendium art priority.
| Module | Description |
|---|---|
| 💀 Adversary Manager | Scale adversaries instantly and build balanced encounters. |
| 🖼️ Art Mapper | Automatically assigns artwork to system compendiums, actors, tokens, and custom module content — keeping your visuals organized and up to date. |
| 🐉 Colossus | Manage massive multi-part boss encounters with independent HP per part and a single shared stress pool. |
| 📦 Containers | Group inventory items into collapsible containers — pouches, chests, backpacks — to declutter character sheets. |
| 💥 Critical | Animated criticals. |
| 💠 Custom Stat Tracker | Add custom trackers to actors. |
| ☠️ Death Moves | Enhances the Death Move moment with a dramatic interface and full automation. |
| 📏 Distances | Visualizes combat ranges with customizable rings and hover calculations. |
| 📦 Extra Content | Homebrew content pack. |
| 😱 Fear Tracker | Adds an animated slider bar with configurable fear tokens to the UI. |
| 🧟 Horde | Explode single horde tokens into dozens of individual tokens and manage their movement and stats automatically. |
| 🎁 Mystery Box | Introduces mystery box mechanics for random loot and surprises. |
| ⚡ Quick Actions | Quick access to common mechanics like Falling Damage, Downtime, etc. |
| 📜 Quick Rules | Fast and accessible reference guide for the core rules. |
| 🤖 Resource Macros | Automatically executes macros when the Fear or Hope resources change. |
| 🎲 Stats | Tracks dice rolls from GM and Players. |
| 🧠 Stats Toolbox | Import actors using a statblock. |
| 🛒 Store | A dynamic, interactive, and fully configurable in-game store. |
| 🔍 Unidentified | Obfuscates item names and descriptions until they are identified by the players. |
| 🌌 Void | Unofficial module that brings The Void playtesting content — experimental classes, subclasses, ancestries, communities, adversaries, loot, weapons, and more. |
| Adventure | Description |
|---|---|
| ✨ I Wish | A wealthy merchant is cursed; one final expedition may be the only hope. |
| 💣 Suicide Squad | Criminals forced to serve a ruthless master in a land on the brink of war. |
To install this package, open your Foundry Setup screen and navigate to your Module tab and click the Install Module button.
From there, you can either search for the package unique name: dh-assets or copy its manifest URL:
And paste it to the input box at the bottom of your window.

You can install this package directly to your Forge account.