The homebrew pack format
Everything in Cerberus, the SRD included, is a pack: a JSON file with a short manifest and a list of entries. Write your own to add subclasses, feats, items and more, then check it here before you share it.
Example: a subclass Example: magic items JSON Schema
The manifest
{
"id": "my-hound-pack",
"name": "Hound Master",
"version": "1.0.0",
"formatVersion": 1,
"namespace": "hound",
"publisher": "Your name",
"license": { "name": "CC-BY-4.0", "url": "https://creativecommons.org/licenses/by/4.0/" },
"dependencies": [{ "id": "srd-5.2" }],
"extensions": [
{ "choice": "srd:class.fighter.subclass", "add": ["hound:subclass.fighter.hound-master"] }
],
"entries": { … }
} idis what heroes remember the pack by, so keep it once you've shared it.versionis your content's version.formatVersionis this format's, and is1.namespaceis a short prefix that goes in front of every ID in your pack, so two packs can never clash.srdis taken.licensesays how others may use your work, andattribution, if your license needs one, is shown on the app's About screen.
Building on the SRD
A pack can use its own entries and those of the packs it lists in dependencies,
nothing else. List srd-5.2 to point at SRD classes, spells, items and features by
their IDs, like srd:class.fighter or srd:spell.fireball.
To add an option to a choice another pack offers, such as a new Fighter subclass, use extensions. The new option only shows up for heroes using your pack.
Entries
"hound:feature.hound-master.loyal-companion": {
"id": "hound:feature.hound-master.loyal-companion",
"type": "feature",
"name": "Loyal Companion",
"description": "A hound fights at your side.",
"effects": [
{ "kind": "grant", "target": "advantage", "value": "skill.perception", "level": 3 }
]
} Each entry has an id (your namespace, a colon, then a type and a name in
kebab-case), a type, a name, an optional one-line description, and its effects. The types are class, subclass, species, background, feature, feat, spell, item, package and creature. The key in entries must match the id.
Effects
Effects say what an entry does, in plain data. Cerberus applies them in order and does the math,
so you never write a number the app could work out. Any effect can take level to switch on from that character level.
{ "kind": "grant", "target": "proficiency.skill", "value": "athletics" }
{ "kind": "grant", "target": "feature", "value": "hound:feature.keen-nose", "level": 3 }
{ "kind": "modify", "target": "speed", "amount": 5 }
{ "kind": "modify", "target": "hp.max", "amount": "level" }
{ "kind": "choice", "id": "hound:feat.pack-tactics.skill", "label": "Pick a skill",
"choose": 1, "target": "proficiency.skill", "from": ["perception", "survival"] } - grant adds something: a proficiency, a feature, a spell, a language, advantage on a roll.
- modify changes a number like Speed, max HP or AC. Amounts can be a number,
"proficiency"or"level". - choice asks the player to pick, and grants each pick.
Features and feats can also carry limited uses per rest, with their own rolls. The JSON
Schema lists every target and option, and the examples show most of them in use. Editors that read
JSON Schemas, like VS Code, can check a pack as you type once you map the schema to your pack files
in their settings.
A few rules
- Write your own words. Only the SRD 5.2 is free to copy; other books are not.
- Homebrew is labeled as homebrew in the builder and on the sheet.
- Pack files stay yours. Cerberus reads them and never uploads them.