Skip to content

Profession Files

A profession file extends one Minecraft profession into a Townstead career. The resource ID of the file is the career ID.

This also applies to vanilla professions. data/minecraft/profession/butcher/ is the complete Townstead extension of minecraft:butcher. Minecraft supplies the registry entry. The directory supplies Townstead’s data, and the work, progression, feedback, trade, Path, and Skill files next to it.

These pages describe the files of a profession:

Use the directory form for new packs. Each file has one purpose:

data/<namespace>/profession/<career>/
├─ profession.json
├─ progression.json
├─ work.json
├─ compatibility/
│ └─ <contribution>.json
├─ trade/
│ └─ <contribution>.json
├─ path/
│ └─ <path>/
│ ├─ path.json
│ ├─ skill/
│ │ └─ <skill>.json
│ └─ trade/
│ └─ <contribution>.json
└─ skill/
└─ <profession-wide-skill>.json

For example, this file defines example:beekeeper:

data/example/profession/beekeeper/profession.json

Use a namespace that identifies the pack or its author, and that does not change. Players do not see it. A name such as yourstudio_careers or yourstudio_beekeeping keeps resource IDs easy to recognise. Put the names that players see in language entries.

The profession ID must already be in the Minecraft registry when a data pack extends it.

{
"schema": "townstead:profession/v2",
"display_name": { "text": "Beekeeper" },
"description": { "text": "Tend hives and gather their produce." },
"icon": "minecraft:honeycomb"
}
FieldRequiredDescription
schemaYesUse townstead:profession/v2 for the current layout.
display_nameNoMinecraft text component. The default is the resource path.
descriptionNoMinecraft text component. The Career record shows it.
iconNoResource ID for the Career record. Usually an item ID.
work_soundNoSound-event ID for a new villager profession that the pack registers. A vanilla profession already has its registry sound, but you can still declare it here.
modsNoTownstead loads the definition only when the mod expression passes.
daily_capNoThe Career XP that a character can earn at the full rate in one Minecraft day. After the cap, XP continues at a lower rate. See Progression. Use a positive value for a career that must progress.
skillsNoProfession-wide Skill references from the root skill/ directory. Do not list Path Skills here. Townstead gets them from their Path.
requirementsNoPheno condition that a character must meet to acquire the career.
acquisition_routesNoA list with at least one route. It makes the career gated.
aliasesNoRoot aliases with no condition. For an optional mod, or for a meaning that applies to one Path, use a gated compatibility contribution.
clothingNoOne clothing identity, or an ordered list of fallback identities. An object entry can also set how the outfit covers hair. See Profession Clothing.
titlesNoNames that a character gets for complete skill builds.
retrainingNofree, costly, or locked. The default is free.
unlock_modelNopoints, experiential, or hybrid. Currently, the Career record uses the same rules for all three. Townstead reserves the field for later use.
hiddenNoReserved for later use. Currently, the Career record still shows careers that a character cannot take yet, with their requirement hints.
storageNoStorage preference. You usually declare it in work.json. See Storage.

The Career record counts completed work from the tasks of the Profession. A data-defined Job counts under its resource ID. A task engine in code counts under its task ID, or under the ID of the exact operation that it does. A Profession cannot declare or rename these counters.

An optional file, data/<namespace>/chronicle_work_history/<name>.json, can estimate how many of those operations an existing villager did before Chronicle started to record events. This file is Chronicle data, not a Profession file. See Generated Work History.

Each path has a directory under the profession. A character gets a title for a complete skill build. For path.json and titles, see Paths And Titles. For the skill files, see Skills And Paths.

mods uses Townstead’s shared expression grammar:

"mods": "example"
"mods": ["example", "farmersdelight"]
"mods": { "any": ["example_a", "example_b"] }
"mods": { "not": "example_conflict" }

When the gate is not met, Townstead removes the Profession for that session, with its progression, Path, work, trade, and Skill files. When the gate is malformed, Townstead also rejects the definition and reports a diagnostic.

Run /pheno validate after a data-pack reload. It reports unknown job-site providers, unknown work tasks, malformed conditions, missing profession or skill references, skill tiers that nobody can reach, prerequisites that conflict, and prerequisite cycles.

Townstead reloads all definitions at once. It prepares the new registries first, and then replaces the old ones. It does not change entries one at a time.