# Item Authoring


> **Documentation baseline:** VoxelCore `main` at `452b569` ยท 14 September 2026.  
> **Repository:** [https://github.com/VoxelHorizons/VoxelCore](https://github.com/VoxelHorizons/VoxelCore)


Items are declared below an `items:` mapping in any YAML file beneath a pack's `content/` directory.

```yaml
items:
  gem_base:
    material: minecraft:paper
    bound: false
    lore:
      - A VoxelCore item

  ruby:
    extends: gem_base
    display_name: Ruby
    bound: true
    render:
      model: mypack:item/ruby
      unbreakable: true
      durability: 0
      attributes:
        hide_attributes: true
      custom_model_data: 1001
    properties:
      category: gemstone
```

## Supported fields

The current item schema accepts:

- `extends`
- `type`
- `material`
- `display_name`
- `lore`
- `bound`
- `render`
- `properties`

Unknown keys are errors.

## ContentID

The key is combined with the pack namespace to form a stable ID:

```text
mypack:ruby
```

IDs are normalised to lowercase and namespace/value segments use `[a-z0-9._-]+`. File paths do not become part of the ID.

## `bound`

`bound` is a compiled boolean field and defaults to `false` when it is not supplied/inherited. As of PR #16, `/voxelcore admin item list` only shows definitions with `bound: true`. This makes `bound: false` useful for inheritance-only/base definitions without losing them from the compiled registry.

Do not infer more from this flag than the implementation guarantees: unbound definitions still exist in the registry and can be referenced/inspected.

## `properties`

`properties` is a structured author-owned map. Parent/child maps deep-merge and compiled nested structures are deep-frozen so runtime definitions do not expose mutable nested state.

## Rendering fields

Rendering is deliberately separate from ContentID and is covered in [[Products/Voxel-Horizons/VoxelCore/Rendering-and-Models]].
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9