v3.5.8 Stable Release

Define a block in Python.
Get the whole datapack.

StewBeet is a Beet framework for Minecraft datapacks. Describe your content once. Models, recipes, loot tables, translations and an in-game manual are all built from it on every compile.

Get Started

MIT licensed ยท Python 3.14+ ยท no account needed

definitions/additions/equipments.py
Block(
    id="life_crystal_block",
    vanilla_block=VanillaBlock(id="minecraft:glass"),
    manual_category="equipment",
    components={
        "item_name": {"text": "Life Crystal Block"},
        "lore": [{"text": "Break it to get the crystal back"}],
    },
    # Broken without Silk Touch, it hands the crystal back
    no_silk_touch_drop=NoSilkTouchDrop(
        id="life_crystal", count=1,
    ),
    recipes=[CraftingShapelessRecipe(
        category="equipment", result_count=1,
        ingredients=8 * [Ingr("minecraft:glass")]
            + [Ingr("life_crystal")],
    )],
)
# Single-block veins, deep in the overworld, carved into stone
CustomOreGeneration.all_with_config({
    "life_crystal_block": [CustomOreGeneration(
    dimensions=["minecraft:overworld"],
    minimum_height=-32, maximum_height=50,
    veins_per_region=2.5,
    provider=["#minecraft:overworld_carver_replaceables"],
)]})
build/
15 files generated
โ””place_main.mcfunction
โ””place_secondary.mcfunction
โ””destroy.mcfunction
โ””replace_item.mcfunctionsilk touch, else the crystal
โ””calls/smithed_crafter/shapeless_recipes.mcfunctionthe recipe, NBT-aware
โ””calls/smart_ore_generation/veins/life_crystal_block.mcfunctionworld gen
โ””calls/smart_ore_generation/veins/retry/life_crystal_block.mcfunction
โ””tags/block/smart_ore_generation/life_crystal_block_provider.json
โ””loot_table/i/life_crystal_block.json
โ””items/life_crystal_block.json
โ””models/item/life_crystal_block.json
โ””textures/item/life_crystal_block.png
โ””textures/item/life_crystal_block.png.mcmeta
โ””textures/item/dialog_sprite/life_crystal_block.png
โ””textures/font/high_res/life_crystal_block.png
โ””textures/font/wiki_icons/life_crystal_block_crafting_shapeless.png

Placement, destruction, the Silk Touch branch, the recipe and its drawn crafting grid, world generation, models and textures. The manual page and the translation keys come with it.

v3.5.8

released 9 days ago

1.4k

PyPI downloads / month

23

public projects built with it

44

GitHub stars

Why this exists

One custom block, written by hand, is at least eight files across two packs in four formats. Miss one and nothing errors. The block just quietly never drops.

By hand

8files to keep in sync
  • function/place.mcfunctionplacement
  • function/destroy.mcfunctiondestruction
  • loot_table/block.jsondrops
  • recipe/block.jsonvanilla recipe
  • function/calls/crafter.mcfunctionNBT recipe
  • items/block.jsonitem definition
  • models/item/block.jsonmodel
  • lang/en_us.jsontranslation key

With StewBeet

1definition to maintain
  • definitions/blocks.py

The other eight are derived from it on every build, so they cannot drift apart.

A definition is a name, some values and a list of recipes. If you can read datapack JSON, you can read one.

Your datapack documents itself

Every item you define gets a manual page: its recipe drawn from the ingredients you declared, its description, and clickable navigation between categories. Players craft the book in-game and it is already up to date.

  • Recipes rendered from your definitions, not screenshotted by hand
  • New item today, new manual page on the next build
  • Custom pages, hooks and button layouts when you need them
How the manual works

What you stop writing

Six things StewBeet generates from definitions you already wrote.

definitions/ores.py
One ingot texture, and the tools and armour registered from it

the whole tier from one entry

DIAMOND_PICKAXE = VanillaEquipments.PICKAXE.value[DefaultOre.DIAMOND]

ORES_CONFIGS: dict[str, EquipmentsConfig | None] = {
    "solarium_ingot": EquipmentsConfig(
        # Solarium behaves like diamond,
        equivalent_to=DefaultOre.DIAMOND,
        # but the pickaxe lasts three times longer,
        pickaxe_durability=3 * DIAMOND_PICKAXE["durability"],
        # and it hits harder, protects more, mines faster
        attributes={"attack_damage": 1, "armor": 0.5},
    ),
}
generate_everything_about_these_materials(ORES_CONFIGS)

23 public projects are built with StewBeet

Two of them at scale, with the source you can read.

Every item in Stardust Fragment, drawn from its build

A large progression pack: custom ore tiers, blocks, paintings and a full in-game manual.

5,738lines of Python (no comments) produce

774

.mcfunction

1,331

.json

971

textures

Every item in SimplEnergy, drawn from its build

An energy and machine library other packs depend on, with cables, generators and machines.

1,422lines of Python (no comments) produce

270

.mcfunction

805

.json

434

textures

See the full list on GitHub

From nothing to a built pack in four commands

terminal: bash
1 / 4
user@stewbeet:~$python --version
Python 3.14.7
user@stewbeet:~$

Start from a template

Three starting points. The Basic template is the one to pick if you are unsure.

๐Ÿ’ก

Which one?

Take the Basic template. It wires up every plugin with commented configuration and no example content, so you add only what your project needs.

Define a block. Build the pack.

The Basic template wires up every plugin with commented configuration and no example content to delete.

Read the getting started guide

MIT licensed ยท Python 3.14+ ยท no account needed