---
title: Creating Static (No Animations) Items
hide_meta: true
---

<Callout variant="info">
    This page assumes you have exported the assets properly as per [How to Export Your Project](../blockbench/exporting_assets)

    You can find working examples [here](https://github.com/AzureDoom/Azurelib-Rewrite-Examples/tree/1.21.1/common/src/main/java/mod/azure/azexamples/items)
</Callout>

## Creating your Renderer

This renderer is responsible for how your custom item is displayed in the game.

It connects the item with the following:
1. **Geometry file (`geo.json`)**: Defines the 3D model of the item.
2. **Texture file (`.png`)**: The visual appearance of the item (applies over the geometry).

<Callout variant="info">
    See [AzRendererConfigs 101](../misc/rendering/azrenderer_config#azitemrendererconfig) for all AzItemRendererConfig#builder options.
</Callout>
<Callout variant="warning">
    There is currently a bug in the plugin which exports the displays with an offset applied, please use useNewOffset(true) in your AzItemRendererConfig builder to fix this.
</Callout>

```java
public class ExampleItemRenderer extends AzItemRenderer {
    private static final ResourceLocation GEO = ResourceLocation.fromNamespaceAndPath(
        YOUR_MOD_ID,
        "geo/item/exampleitem.geo.json"
    );

    private static final ResourceLocation TEX = ResourceLocation.fromNamespaceAndPath(
        YOUR_MOD_ID,
        "textures/item/exampleitem.png"
    );

    public ExampleItemRenderer() {
        super(
            AzItemRendererConfig.builder(GEO, TEX).build()
        );
    }
}
```

## Registering your Renderer

Call `AzItemRendererRegistry#register()` in your `onInitializeClient` for Fabric, or inside `event.enqueueWork(...)` in your `FMLClientSetupEvent` handler for NeoForge.

<Callout variant="warning">
    On NeoForge, setup events fire for every mod **at the same time** on parallel worker threads. Always register inside `event.enqueueWork(...)`, which runs your code on the main thread after every mod's handler has finished, so your registrations can't race another mod's. Registering directly in the event handler can cause renderers to go missing at random between launches. Fabric runs its initializers one after another on a single thread, so no wrapper is needed there.
</Callout>

Fabric:

```java
@Override
public void onInitializeClient() {
    AzItemRendererRegistry.register(ExampleItemRenderer::new, YourItemRegistry.YOUR_ITEM);
}
```

NeoForge:

```java
private void onClientSetup(FMLClientSetupEvent event) {
    event.enqueueWork(() -> {
        AzItemRendererRegistry.register(ExampleItemRenderer::new, YourItemRegistry.YOUR_ITEM);
    });
}
```