How-to
Porting a Fabric mod to Minecraft 26.3
What broke moving a Fabric mod from Minecraft 26.1.2 to 26.3: 56 compile errors from ten API changes, the Loom 1.18 and Gradle 9.7.1 bump, and the fixes.
In short Porting a Fabric mod from Minecraft 26.1.2 to 26.3 is mostly mechanical renaming. In the Araz mod the compiler produced 56 errors from ten patterns: entity type constants moved to EntityTypes, blocksMotion became isSolid, SignText is built from lists, coloured blocks come from a colour collection, and loot number providers now take a Holder.
I ported Araz, my Fabric horror mod, from Minecraft 26.1.2 to 26.3 in a single afternoon in September 2026. The compiler produced 56 errors. All of them came from ten repeated API patterns, and not one of them forced a design change.
This post is the list I wanted when I started. What got renamed, what moved package, and which build tool versions the new Loom demands. The mod itself did not change: the 26.3 build of Araz 1.0.0-beta.2 plays exactly like the 26.1.2 build.
Everything below comes from that one real port. I checked each line against the compiled source rather than a changelog. Your mod touches a different slice of the API, so verify every row against your own build before you trust it.
What changed between Minecraft 26.1.2 and 26.3 for Fabric mods?
Most of the breakage falls into four areas: entity type constants, sign text, coloured blocks and loot tables. Several of these landed in 26.2, which I skipped entirely, so a jump straight from 26.1.2 to 26.3 collects two versions of churn at once.
| Minecraft 26.1.2 | Minecraft 26.3 | What to do |
|---|---|---|
EntityType.VILLAGER | EntityTypes.VILLAGER | Every vanilla entity type constant moved to net.minecraft.world.entity.EntityTypes. EntityType keeps only the codecs. The villager class also sits at entity.npc.villager.Villager. |
state.blocksMotion() | state.isSolid() | A straight rename on BlockState. Mechanical, but it was the single most repeated error in my build. |
entity.hurtMarked = true | ClientboundSetEntityMotionPacket | The field is gone. For a player, send new ClientboundSetEntityMotionPacket(player) after you change the delta movement. For mobs, delete the line; the entity tracker already sends it. |
entity.invulnerableTime = 0 | entity.setInvulnerableTime(0) | The field went private. There is a getter and a setter. |
player.swing(hand, true) | player.swing(hand, SwingAnimation.DEFAULT, true) | A new middle argument from net.minecraft.world.item.component.SwingAnimation. |
new SignText().setMessage(i, line) | new SignText(front, filtered, DyeColor, boolean) | The chained setter is gone. You build it from two lists of four components each, matching SignText.LINES. |
sign.setText(text, true) | sign.setText(text, SignTextSlot.FRONT) | The front/back boolean became a SignTextSlot enum. |
Blocks.WHITE_CARPET | Blocks.CARPET.white() | Coloured blocks are reached through a colour collection with white(), lightGray() and pick(DyeColor). Wool and wool stairs work the same way. |
inventory.placeItemBackInInventory(stack) | placeItemBackInInventory(stack, Prediction.SERVER_ONLY) | A new prediction argument from net.minecraft.util.Prediction. |
providers.number.ConstantValue | providers.number.ints.ConstantValue, wrapped in Holder.direct(...) | Loot number providers changed package and are passed as holders: setRolls(Holder.direct(new ConstantValue(1))). |
gameRenderer.displayItemActivation(stack) | player.displayItemActivation(stack) | Client side only. The call moved onto the player, in client.player.ItemActivation. |
Two rows deserve extra attention. Removing hurtMarked is silent on mobs, because the entity tracker sends velocity anyway, but a player will simply not move unless you send the packet yourself. The colour collection, on the other hand, is a small win once you are past the rename: picking a random carpet is now Blocks.CARPET.white() or Blocks.CARPET.lightGray() instead of a switch over block constants.
Which Gradle and Loom versions does Minecraft 26.3 need?
Fabric Loom 1.18-SNAPSHOT is the plugin version for Minecraft 26.3, and it requires Gradle 9.7 or newer. I lost more time here than on any API rename, because the failure message points at plugin variants rather than at the wrapper.
| Minecraft | Loom plugin | Gradle wrapper | JDK | Fabric API |
|---|---|---|---|---|
| 26.3 | fabric-loom 1.18-SNAPSHOT | 9.7.1 | 25 | 0.161.0+26.3 |
| 26.1.2 | fabric-loom 1.17-SNAPSHOT | 9.5.1 | 25 | 0.154.0+26.1.2 |
| 1.21.10 | fabric-loom-remap 1.17-SNAPSHOT | 9.5.1 | 21 | 0.138.4+1.21.10 |
| 1.20.1 | fabric-loom 1.7.4 | 8.8 | 21 | 0.92.12+1.20.1 |
The 1.21.10 backport is a different build entirely. It uses the net.fabricmc.fabric-loom-remap plugin with loom.officialMojangMappings(), every mod dependency declared as modImplementation, and Gradle run on JDK 21. If you keep several branches alive, keep the build files separate rather than trying to make one script cover all of them.
How I ported the mod in an afternoon
Copy the project, then bump the build
I copied the 26.1.2 folder to a new one and left the old folder untouched as a working fallback. Then I set
minecraft_version,loader_version,loom_versionandfabric_api_versioningradle.propertiesand pointed the Gradle wrapper at 9.7.1.Compile once and read the whole error list
Do not fix the first error. Run the build, let it fail, and read all 56 lines. Almost every error repeats, so the list tells you how many distinct patterns you are really dealing with before you touch anything.
Fix by category, not by file
I handled one pattern at a time across the whole source tree: every
EntityType.constant, then everyblocksMotion()call, then sign text, then carpets. One find and replace per pattern is faster and far less error prone than walking the file list.Check what the compiler cannot see
A change the compiler accepts can still be wrong at runtime. I checked loot table building, the mixin targets and the GeckoLib asset paths by hand, because a broken resource path stays quiet until the game actually loads it.
Run the client, then diff the data
I launched the dev client, walked to a rebuilt abandoned camp to confirm sign text still renders on all four lines, and compared the generated loot against the 26.1.2 build. That last step is the only thing that catches a wrong
Holderin the loot number providers.
What did not change in 26.3
The list of things that survived is much longer than the list that broke, which is why this was an afternoon and not a weekend. If your mod leans on these, you are mostly fine.
ValueInputandValueOutputfor reading and writing NBT- Custom network payloads and
StreamCodec SavedDataTypewith anIdentifier, so persistent world data kept working untouched- The entity render state architecture,
GuiGraphicsExtractorandHudElementRegistry CreativeModeTabEventsfor adding items to creative tabs- Mixins targeting Java 25
How do you check a port did not quietly break something?
A clean compile proves nothing about resources or runtime behaviour. Three things in Araz can pass the compiler and still be broken in game, so I check them by hand on every port.
- Signs.
SignTextnow wants two lists of four lines. A wrong list length shows up as blank lines on the record signs the creature plants near your bed, not as a compile error. - Loot. The number providers moved package and take a
Holder, so I compare what actually drops against the 26.1.2 build instead of trusting that it compiled. - Client-only code. Item activation moved from the game renderer onto the player, and with split source sets a client mixin has to be declared as
{"config": ..., "environment": "client"}infabric.mod.jsonor a dev server crashes on startup.
Which Minecraft versions does Araz support?
As of September 2026, Araz 1.0.0-beta.2 ships for Minecraft 26.3, 26.1.2, 1.21.10 and 1.20.1. All four are Fabric only. There is no Forge or NeoForge build and none is planned. Fabric API and GeckoLib are required; Simple Voice Chat, Mod Menu and Cloth Config are optional. The mod page is at spicesfire.com/araz.
Keeping four branches alive is affordable because the gameplay code is identical across them. The 26.3 release notes for Araz list one user-facing fix, a spawn egg texture that was missing from the mod file, and the rest is internals. Builds are on Modrinth and CurseForge, and I answer porting questions on Discord.
What this port does not tell you
These notes come from one port of one mod in September 2026. Araz uses a custom entity, block entities, items, loot, mixins and a GeckoLib renderer, so it hits a wide slice of the API. It touches world generation nowhere: the abandoned camp and the portal ruin are built when a player approaches, not during chunk generation. If your mod generates terrain, biomes or features, nothing in this post covers you.
Frequently asked questions
Do Minecraft 26.1.2 mods work on 26.3?
No. A 26.1.2 Fabric mod will not load on Minecraft 26.3 without a recompile. Porting Araz needed ten API changes, including every entity type constant moving to EntityTypes and BlockState.blocksMotion() becoming isSolid().
Which Gradle version does Fabric Loom 1.18 need?
Gradle 9.7 or newer. There is no gradle-9.7-bin.zip distribution, so point the wrapper at gradle-9.7.1-bin.zip. On Gradle 9.5.1 the build fails with a No matching variant error that mentions plugin.api-version 9.7.0.
Where did EntityType.VILLAGER go in Minecraft 26.3?
It moved to net.minecraft.world.entity.EntityTypes. All vanilla entity type constants live there now, and EntityType keeps only the codecs. The villager class also moved, to entity.npc.villager.Villager.
How do I set a player's velocity now that hurtMarked is gone?
Send the packet yourself. After changing the delta movement, call player.connection.send(new ClientboundSetEntityMotionPacket(player)). For mobs you can simply delete the old hurtMarked = true line, because the entity tracker already sends the velocity.
How long does porting a Fabric mod to 26.3 take?
Araz took one afternoon in September 2026: 56 compile errors from ten repeated patterns, fixed one pattern at a time across the whole source tree. A mod that touches world generation or rendering internals will take longer.
Is there a Forge or NeoForge version of Araz?
No. As of September 2026 Araz is Fabric only on all four supported versions, which are Minecraft 26.3, 26.1.2, 1.21.10 and 1.20.1. Fabric API and GeckoLib are required on every one of them.