Datapack Groups
Timber Frames groups are datapack resources used to generate recipes from tags. They let a target block tag and one or more input item tags share recipes without defining every block individually.
Place group files in the recipe resource folder for the Minecraft version:
data/<namespace>/recipe/timber_frame_groups/<group>.jsonon 1.21.1data/<namespace>/recipes/timber_frame_groups/<group>.jsonon 1.20.1
Schema
{
"target": {
"any": [
{ "block_tag": "c:stripped_logs" }
]
},
"inputs": {
"any": [
{ "item_tag": "minecraft:logs" },
{ "item_tag": "c:stripped_logs" }
]
},
"match": {
"target": [
"stripped_*_log"
],
"inputs": [
"stripped_*_log",
"*_log",
"*_wood"
]
},
"display": {
"name_profile": "example_mod:oak",
"background_texture": "example_mod:stone"
}
}
target.any expands block tags into possible timber targets. inputs.any expands item tags into possible recipe inputs. A target and an input belong to the same timber family when their namespace and resource paths match the same captured wildcard value. Log, wood, stem, hyphae, block, and bundle variants in one namespace/material family share one recipe; matching families from different namespaces remain separate.
Patterns are ordered and use one * wildcard. The namespace plus wildcard becomes the family key:
stripped_oak_log -> oak
oak_log -> oak
oak_wood -> oak
dark_oak_log -> dark_oak
Patterns should be listed from most specific to least specific. The first matching target pattern is used for a family, with every matching input item accepted by that recipe.
Patterns match the resource path while retaining the namespace in the family key. Tags that do not exist on a particular loader are ignored, which allows a group to list compatible Forge, Common, and vanilla tags together.
Variant names are calculated from the localized hover names of the accepted input items. The longest common word sequence is used, so Oak Log plus Oak Wood becomes Oak, while Stripped Oak Log plus Stripped Oak Wood becomes Stripped Oak. If no useful common name is found, the target block name is used.
display.name_profile selects a server-owned localized name profile. If omitted, it defaults to the group ID. Name profiles are discovered from:
data/<namespace>/timber_frame_names/<locale>/<profile>.json
For example, example_mod:oak uses data/example_mod/timber_frame_names/en_us/oak.json. A profile may contain a localized suffix and noise terms used during common-name extraction:
{
"suffix": "Timber Frame",
"noise": ["block", "of", "log", "logs", "wood"]
}
The selected client language is preferred, with en_us as fallback. If no profile exists, the automatic name is still used with the normal Timber Frame suffix.
display.background_texture is optional. It can reference an existing client texture such as timber_frames:block/plaster_white, or a PNG in the server-owned background asset folder, relative to the namespace:
data/<namespace>/timber_frame_backgrounds/<texture>.png
For example, "background_texture": "example_mod:stone" refers to data/example_mod/timber_frame_backgrounds/stone.png. The texture is synchronized to clients through Runeweaver Rosetta and shared by every variant generated by the group. If it is omitted, missing, invalid, or too large, the existing plaster texture is used.
Background textures are static PNGs with a maximum dimension of 256x256 pixels. Name profiles and background textures are refreshed on login and datapack reload.