All Bark

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": { … }
}
  • id is what heroes remember the pack by, so keep it once you've shared it.
  • version is your content's version. formatVersion is this format's, and is 1.
  • namespace is a short prefix that goes in front of every ID in your pack, so two packs can never clash. srd is taken.
  • license says how others may use your work, and attribution, 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.