← All articles

Components instead of NBT: Everything about items in modern Minecraft

Understand the difference between old NBT tags and the new Data Components system in Minecraft 1.20.5+.

Need a calmer way to work with components?

The builder keeps the new command syntax readable, and the pack generator handles the visual layer when the item needs a custom model.

Why this migration feels bigger than a syntax tweak

For years, Minecraft item editing had one familiar backbone: NBT. Server owners, datapack authors, map builders, and RP admins all learned to squeeze names, lore, model hooks, potion data, and weird edge cases into nested tag structures. It was not pretty, but it was familiar. Then Minecraft 1.20.5 replaced item NBT with Data Components, and suddenly even simple /give commands started looking foreign.

That is why the migration feels larger than "curly braces became square brackets". The change is structural. Mojang moved item data from a loose tag dictionary to a stricter system with named components. The result is cleaner in the long run, but it breaks habits, old tutorials, copied Reddit snippets, and entire libraries of admin notes.

What Mojang actually changed

Under the old system, item data lived inside one NBT blob. You could keep stacking fields into it, and as long as the syntax held together, the command often worked. Under the new system, each piece of item behavior lives in a named component. A custom name is its own component. Lore is another component. Potion contents are another. Custom model data is another. That separation is what makes the new syntax more readable for the game engine, but harder for humans at first glance.

Area Before 1.20.5 1.20.5+ Why it matters
General item syntax {...} [...] Most old commands fail immediately if you keep the old wrapper.
Visible name display.Name minecraft:custom_name Name editing moved into an explicit item component.
Lore display.Lore minecraft:lore You now think in separate slots, not in one display bundle.
Model hook CustomModelData minecraft:custom_model_data The idea stays, but the syntax and future workflow change.
Potion data Mixed into NBT minecraft:potion_contents Potions become much clearer, but old snippets stop matching.

Old command versus modern command

Here is the same basic idea, a named paper item with a model hook, shown in both systems:

/give @p minecraft:paper{CustomModelData:2047,display:{Name:'{"text":"Guild Pass","italic":false}'}}
/give @p minecraft:paper[minecraft:custom_model_data=2047,minecraft:custom_name='{"text":"Guild Pass","italic":false}']

At a glance, the new line can feel harsher. But the logic is actually more explicit:

What usually breaks first on a live server

When a server updates and old knowledge collides with the new item system, the failures are usually boring but expensive:

That is why the transition hurts most on practical server work. It is not one big dramatic rewrite. It is twenty little places where old snippets stop being trustworthy.

Where our tools remove the worst friction

If you are hand-writing everything, the migration forces you to think about syntax and game design at the same time. That is the part we try to separate. The Custom Item Builder helps when you need a give command with visible text, hidden identity, and model hooks. The Custom Potions Builder handles potion contents without forcing you to memorize every component field. The Villager Trades Builder keeps version differences visible, so you do not accidentally copy a legacy trade into a modern command block.

The point is not to avoid learning forever. The point is to stop losing time to punctuation while you are still designing the item itself.

A practical migration order that wastes less time

  1. Start with one real item, not your whole archive. Pick something simple like a token, pass, or named book.
  2. Confirm the base item, visible name, and lore in the modern syntax.
  3. Reconnect the model hook, either through minecraft:custom_model_data or your newer item model flow.
  4. Only after that, move on to potions, trades, and more nested logic.
  5. Keep the old and new versions side by side while you test. It is much easier to see what moved when you compare one item at a time.

Common mistakes when moving from NBT to components

Practical conclusion

Mojang did not just repaint item syntax. They changed the mental model. Old NBT invited one giant bag of tags. Components ask you to think in separate responsibilities: name, lore, visuals, potion behavior, stats, and logic. Once that clicks, the system stops feeling hostile. It starts feeling strict, which is annoying at first, but far easier to maintain when your server grows.

If you are migrating a no-mod RP workflow, that clarity matters. It means your items become easier to reason about, easier to document, and easier to reuse across pack generation, villager trades, quest rewards, and command blocks.

Frequently Asked Questions

Are older versions of Minecraft still supported?

Yes. Versions up to 1.20.4 still use traditional item NBT. That is why our builders expose explicit version modes instead of pretending one command works everywhere.

Do I have to rewrite every old command by hand?

Not every single one, but anything complex usually needs attention. Simple items may auto-convert when the world updates, but command blocks and admin workflows still need deliberate cleanup.

Did CustomModelData disappear?

No. The idea is still there, but it now lives in component syntax. On modern versions it also sits next to newer flows like item_model and richer custom model data slots.

Why do so many old tutorials still confuse people?

Because many of them were correct when they were written. The problem is that Minecraft 1.20.5 changed the foundation, while search results still surface older advice with no warning.

What is the safest first tool to use during migration?

Usually the Custom Item Builder. It is the fastest way to compare old and new command eras without dragging potion logic, villager syntax, and pack structure into the same test at once.