eoml — External Override Model Library
Render-time layering for Minecraft item icons. Stack extra sprites on top of any item's icon — driven by resource packs and item properties, without writing any code. Cross-loader library for 1.20.1 (Forge), 1.21.1 (NeoForge) and 26.1.2 (NeoForge).
This is a library, not a content mod. Installing it alone changes nothing. It is a dependency for resource packs and mods that want layered item icons. See "What it does" for one-paste examples that work right away.
What it does
Give any item an additional icon layer that appears only when a condition is true.
// assets/mymod/eoml/layers/runeblade.json — just drop this into a resource pack
{
"targets": ["mymod:runeblade", "#minecraft:swords"],
"layers": [
{ "sprite": "mymod:runes/base_glow" },
{ "sprite": "mymod:runes/drawn_crown",
"when": { "type": "eoml:item_property", "property": "minecraft:pull", "min": 0.65 } },
{ "sprite": "mymod:runes/cracked",
"when": { "type": "eoml:variable_range", "name": "property:minecraft:damage", "min": 0.5 } }
]
}
Layers are accumulative — list order is draw order. Each layer can carry its own
condition, and conditions can be combined with all_of / any_of / none_of.
That is the whole feature. No Java, no datapack, no server-side install.
Features
| Layer rules | Arbitrary extra layers on any item icon, condition-gated, multi-layer |
| Pattern trims | Take over a vanilla armor trim pattern and give it your own sprite layer, expanded per slot / material / base model |
| Item overrides | Predicate-based model switching (assets/<ns>/overrides/item/) |
| Model overrides | Feed external model JSON to vanilla's own model loader |
| Plugin API | Other mods register their own variables and condition types; eoml exposes the layer system as a general extension platform |
Built-in conditions: always, variable_equals, variable_range,
item_property (vanilla and modded item properties), item_in,
all_of / any_of / none_of.
Built-in variables: the item id, any item tag, and any vanilla/modded item property — so a pack can already gate layers on damage, stack size, pull progress, trim material and more.
Supported versions
| Minecraft | Loader | Status |
|---|---|---|
| 1.20.1 | Forge 47.x | ✅ |
| 1.21.1 | NeoForge 21.1.x | ✅ |
| 26.1.2 | NeoForge 26.1.x | ✅ |
The same rule JSON works across all three versions. The only version-specific part is
property: — for example minecraft:pulling exists on 1.20.1 / 1.21.1 but not on
26.1.2, where the crossbow/pull axis is used instead.
Client / server
Client-side only in practice. All data is read from the resource stack, so the definitions live on the client and work on vanilla servers — no server-side install, no datapack required. The mod itself loads on both sides and is safe on dedicated servers.
Modpacks
You are free to include eoml in any modpack. No permission needed.

