Manual · Content and homebrew
Structured content
Which fields become mechanics, which sentences remain text, and what the engine deliberately leaves on the card.
Fields, not sentences
- Every class, species, feat, item, spell and condition is a compendium entry: an id, a ruleset and a list of effects. One function derives the sheet from whatever entries a character holds. There is no separate homebrew engine.
- A feature's
entriesis card text, read as written. "You have Advantage on saves against being frightened" with nothing beside it prints the sentence and does nothing. - Structured fields derive on their own: a species'
speed,darkvisionandresist; a background'sskillProficiencies; a spell's damage and its scaling; an item's AC bonus; a class's slot table, when it sits underrowsSpellProgression. - Everything past that is a
_sheetlingblock: a tracker, a toggle, a bonus, a rider, a button, a pick. - Two rules pick the effect kind.
modifieswhen the number already exists with a base (AC, a save, speed, attunement slots). A granting kind when the thing does not exist until something grants it (grants_movement,grants_resource,grants_action).
The formats
| File | Recognised by | Lands |
|---|---|---|
| Sheetling export | JSON with "app": "sheetling" | one character on your roster, portrait inlined; sourceRefs names the library files it needs |
| 5eTools homebrew | JSON with _meta.sources | your Library |
| Fight Club 5 compendium or backup | .xml or .backup | the compendium to your Library, each embedded character to your roster |
| Game Master 5 campaign | the same | creatures to your Library, the campaign to a party you run |
| Game Master 5 PC or NPC file | the same | one creature to seat, never a playable character |
- One Import a file… button reads all of them. The preview lists each part with a checkbox and a destination; a part with nowhere to go is greyed with the reason.
- The ruleset boxes: Offer to 2014 characters and Offer to 2024 characters. The one the file declares is pre-ticked. Ticking the other is allowed, and the dialog warns when the file argues against it: fixed ability increases on a species, an Origin feat on a background, a subclass feature at level 1.
- Two files defining the same name resolve to whichever the library registered first, and that order is not yours. A shipped entry always wins over homebrew of the same name. Name your own things something new.

Reading the preview
- "N of M spells derive something" counts produced entries with at least one mechanic. Not imported is a raw entry that produced nothing, with its reason. Imported with a detail dropped is an entry that exists with one field the importer could not carry.
- A produced entry is not a reachable one. A subclass no class's subclass level names is invisible on every sheet. Build a character with the file; the preview alone cannot tell you this.
- With Node, from a checkout of the repository, in
packages/rules:
npm run probe:5etools -- <file.json>
npm run probe:fc5 -- <file or folder> [--ruleset=2024] [--derive]
- The 5eTools probe builds a character of the parent class at levels 3, 10 and 20 for every subclass in the file and says which trackers and toggles reached the sheet. It exits non-zero on any drop.
- A spell pick's
{@filter}can holdlevel,class, a Ritual restriction and a spell-attack restriction.school,subclass,source,searchor a negated value drop the pick with a row. A filter the importer cannot hold never widens the pick.
Private, shared, never published
- What you import lives in your account only. A manager shares a file with a party from its Homebrew tab; members get a synced copy under the same id, and only that party sees it. Stash keeps a shared file's items out of players' compendiums until handed over at the item counter.
- "Why can't I see this option" is almost always a library question: whose account holds the file, and is it still shared.
What stays on the card, on purpose
- Never derived: what happens to the creature you hit, turn structure, cover, a Reaction that reduces damage after a hit, suppressing an attacker's roll, a spell's range or a change to it, a random chance to skip a cost, and any duration. The round counter counts what the DM typed.
- Looks missing, ships already: a cap above 20 (
modifiestakes amax), a rider's die count growing by level (extraDice.countscales), charges that recharge at dawn (a tracker with a rolled reset), a condition granting Advantage (most already do). - For the stated half of "attacks against you",
incoming_attack_factprints the sentence on the Combat section, gated on a toggle if you like. Otherwise the card's text, or atextoverride, is the whole implementation. - Three misreadings that give too much. "Regain up to 4" is a choice from zero to four, not a grant of four. "If you have no uses left" fires at zero; it does not refill early. "Unlimited" is no
maxat all, not 99.