Why an old give command stops working
You copy a command from a two-year-old video, spell everything correctly, and it still turns red. Item syntax has been reworked twice, and an old command is not merely dated — it simply does not parse
Three eras of item syntax
| Version range | Known as | What it looks like |
|---|---|---|
| 1.13 – 1.20.4 | Legacy NBT | Data in curly braces after the item id, with the name and lore nested inside display |
| 1.20.5 – 1.21.4 | First-generation components | Data in square brackets, each part named, with text still a quoted JSON string |
| 1.21.5 and up | Current components | Square brackets as before, but text is now native NBT rather than a quoted JSON string |
The second change trips up the most people, because both forms use square brackets. At a glance it looks fine — but the text parts are written differently
Compared using real commands
Below is one and the same enchanted diamond sword — named, with lore, unbreakable — built by our give generator on every version range. None of it was typed by hand
/give @p minecraft:diamond_sword[custom_name={text:"ดาบผู้พิทักษ์"},lore=[{text:"ตีแรงกว่าปกติ"},{text:"ของหายาก"}],enchantments={sharpness:5,unbreaking:3},unbreakable={}] 1
/give @p minecraft:diamond_sword[minecraft:custom_name='{"text":"ดาบผู้พิทักษ์"}',minecraft:lore=['{"text":"ตีแรงกว่าปกติ"}','{"text":"ของหายาก"}'],minecraft:enchantments={"minecraft:sharpness":5,"minecraft:unbreaking":3},minecraft:unbreakable={}] 1
/give @p minecraft:diamond_sword{display:{Name:'"ดาบผู้พิทักษ์"',Lore:['"ตีแรงกว่าปกติ"','"ของหายาก"']},Enchantments:[{id:sharpness,lvl:5s},{id:unbreaking,lvl:3s}],Unbreakable:1b} 1
/give @p minecraft:diamond_sword 1
- Bedrock item ids don't always match Java's — double-check this item actually exists on Bedrock
- A custom name isn't supported in the selected edition/version, so it was left out of the command
- Lore isn't supported in the selected edition/version, so it was left out of the command
- Enchantments aren't supported in the selected edition/version, so they were left out of the command
What actually changed
| Aspect | 1.13 – 1.20.4 | 1.20.5 – 1.21.4 | 1.21.5+ |
|---|---|---|---|
| Wrapper | { } |
[ ] |
[ ] |
| Item name | display:{Name:...} |
custom_name='...' |
custom_name={...} |
| Enchantments | Enchantments:[{id:...,lvl:...}] |
enchantments={...} |
enchantments={...} |
| Text is written as | A quoted string | A quoted JSON string | Native NBT, with no quotes around it |
That last row is the whole point of the 1.21.5 change. Feed the wrong form in and the game does not error — it names the item with the raw text instead, so you end up with an item literally called {"text":"..."}
Does this apply to /summon too?
Yes. The 1.21.5 rule about text being native NBT applies everywhere text sits inside NBT, and that includes an entity’s name in a summon command
It does not apply to commands that take text as a direct argument — Commands like /tellraw, /title, /bossbar add, and /team modify prefix still take JSON, because the text is not inside NBT there. This distinction confuses a lot of people
How to convert an old command
The honest answer is: do not convert it by hand. Doing so means walking bracket by bracket, and it goes wrong more easily than you would expect
- Read the old command for intent: which item, what name, which enchantments
- Open the give tool and pick the version range you actually play on
- Fill the form in with what you want, then copy the command it builds
The tool picks the syntax for the version you chose, and where an option is unavailable it tells you exactly what was dropped instead of quietly handing you something that only looks right
How to tell which version you are on
- Java Edition — check the corner of the title screen, or the selected profile in the launcher
- Bedrock Edition — check the bottom corner of the title screen
- On someone else’s server — the version that matters is the server’s, not your client’s. Ask an admin
Other guides to read next
- Minecraft command basics — Start from zero: how to enable cheats, where commands can be typed, and enough about selectors and coordinates to get going
- Target selectors in depth — A deep look at the square-bracket arguments, from type and distance through limit and sort, plus how to work out why a command matched nobody
- Coordinates: numbers, ~, and ^ — Why ~ and ^ cannot be mixed, why blocks end up in the wrong place, and which form to reach for in which situation
- Command blocks — Take the commands you generated and run them automatically — once, on repeat, or chained one after another
- Scoreboard basics — Create an objective the game tracks for you — or track it yourself from a command block — then use the score as a condition elsewhere
- The execute command — The most powerful command in the game, taken apart piece by piece — how as differs from at, and why reordering changes the result
- My command does not work — Work back from the error the game shows you, with the usual cause behind each one