This skill should be used when creating or extending ActorSheet/ItemSheet classes, implementing getData or _prepareContext, binding events with activateListeners, handling drag/drop, or migrating from ApplicationV1 to ApplicationV2. Covers both legacy V1 and modern V2 patterns.
View on GitHubImproperSubset/hh-agentics
fvtt-dev
fvtt-dev/skills/fvtt-sheets/SKILL.md
January 21, 2026
Select agents to install to:
npx add-skill https://github.com/ImproperSubset/hh-agentics/blob/main/fvtt-dev/skills/fvtt-sheets/SKILL.md -a claude-code --skill fvtt-sheetsInstallation paths:
.claude/skills/fvtt-sheets/# Foundry VTT Sheets
**Domain:** Foundry VTT Module/System Development
**Status:** Production-Ready
**Last Updated:** 2026-01-04
## Overview
Document sheets (ActorSheet, ItemSheet) are the primary UI for interacting with game entities. Foundry supports two patterns: legacy ApplicationV1 (until V16) and modern ApplicationV2 (V12+).
### When to Use This Skill
- Creating custom character or item sheets
- Extending existing sheet classes
- Adding interactivity (rolls, item management)
- Implementing drag/drop functionality
- Migrating V1 sheets to V2
### V1 vs V2 Quick Comparison
| Aspect | V1 (Legacy) | V2 (Modern) |
|--------|-------------|-------------|
| Config | `static get defaultOptions()` | `static DEFAULT_OPTIONS` |
| Data | `getData()` | `async _prepareContext()` |
| Events | `activateListeners(html)` | `static actions` + `_onRender()` |
| Templates | Single template | Multi-part PARTS system |
| Re-render | Full sheet | Partial by part |
| Support | Until V16 | Current standard |
## ApplicationV1 Sheets
### Basic Structure
```javascript
export class MyActorSheet extends ActorSheet {
static get defaultOptions() {
return foundry.utils.mergeObject(super.defaultOptions, {
classes: ["my-system", "sheet", "actor"],
template: "systems/my-system/templates/actor-sheet.hbs",
width: 600,
height: 600,
tabs: [{
navSelector: ".sheet-tabs",
contentSelector: ".sheet-body",
initial: "description"
}],
dragDrop: [{
dragSelector: ".item-list .item",
dropSelector: null
}]
});
}
// Dynamic template based on actor type
get template() {
return `systems/my-system/templates/actor-${this.actor.type}-sheet.hbs`;
}
}
```
### getData() - Preparing Template Context
```javascript
getData() {
const context = super.getData();
const actorData = this.actor.toObject(false);
// Add data to context
context.system = actorData.system;
context.flags = actorData.flags;