Assessed 2026-09-29, at 0.1.4-beta. Short version: it's not a quick refactor, but it splits into steps, and the first can be done before any 26.x work.
1. Mappings: Yarn → Mojang (the biggest change, can be done now)
26.1 and later ship unobfuscated, so mods use Mojang's names. 1.21.11 has the last Yarn mappings, and Fabric no longer supports Yarn.
Our 1.21.4–1.21.11 builds use Yarn. For one shared src/, every version has to be on Mojang mappings, which Loom also supports on 1.21.x (the emotes library already works this way).
Scope: only the version modules change, 50 files (about 4,900 lines) with 129 distinct Minecraft imports and 24 mixins. The 132 common files have no Minecraft dependency and don't change.
Tools: Loom's migrateMappings (./gradlew migrateMappings --mappings "net.minecraft:mappings:1.21.11" --overrideInputsIHaveABackup) or the Ravel IntelliJ plugin. Mixins still need checking by hand.
Stonecutter catch: code for versions other than the active one is inside /* */ comments, which the tools can't see. The migration has to run with each version active in turn, and each version-specific block needs checking afterwards.
2. Build: a second buildscript for 26.x
26.x needs the net.fabricmc.fabric-loom plugin (no remapping) and no mappings line, while 1.21.x keeps net.fabricmc.fabric-loom-remap. A plugins {} block can't choose per version, so other Stonecutter projects use two buildscripts over the same src/.
For 26.x: modImplementation → implementation, remapJar → jar, and a Java 25 toolchain. It also needs Loom 1.15+ and Gradle 9.4+, which we already have (Loom 1.17, Gradle 9.8).
The release workflow sets up Java 21, so it needs Java 25 for the 26.x jars.
3. Fabric API renames
Fabric API renamed its classes to Mojang's names, and the renames aren't backwards compatible. We only use four:
ClientTickEvents: the world tick events are now level tick events.
ClientLifecycleEvents.
RenderStateDataKey.
KeyBindingHelper, which looks to be KeyMappingHelper now.
These go behind //? if conditions.
4. The emotes library comes first
Saturn uses emotes-fabric built for each Minecraft version. The library needs the same two-buildscript setup and a 26.x release before Saturn can build for 26.x. It's already on Mojang mappings, so for the library this is mostly build work.
5. Rendering changes per drop
Every drop changes rendering, as 1.21.5, 1.21.6 and 1.21.9 did. The compiler will show where for 26.1–26.3. Raw OpenGL is only in GlassRenderer's framebuffer copy on the 1.21.4 path; from 1.21.5 up we already use Blaze3D (render pipelines, GpuTexture, CommandEncoder), which Fabric requires on 26.x.
6. 26.4 isn't out yet
Its first snapshot (22 September 2026) makes Vulkan the default renderer, and the release is expected around December. Our glass, rounded-corner and cloak shaders go through Blaze3D, so they may carry over, but they need testing on Vulkan.
Suggested order
Move the 1.21.x builds to Mojang mappings with no behaviour change, in one PR with commits by area (build, refs, mixins, rendering), checked on versions we already play.
Give the emotes library 26.1–26.3 builds and publish.
Add the 26.x buildscript and versions to Saturn, and fix what doesn't compile.
Do 26.4 once it's released, with a Vulkan test pass.
## What supporting 26.x involves
Assessed 2026-09-29, at 0.1.4-beta. Short version: it's not a quick refactor, but it splits into steps, and the first can be done before any 26.x work.
### 1. Mappings: Yarn → Mojang (the biggest change, can be done now)
- 26.1 and later ship unobfuscated, so mods use Mojang's names. 1.21.11 has the last Yarn mappings, and Fabric no longer supports Yarn.
- Our 1.21.4–1.21.11 builds use Yarn. For one shared `src/`, every version has to be on Mojang mappings, which Loom also supports on 1.21.x (the emotes library already works this way).
- Scope: only the version modules change, 50 files (about 4,900 lines) with 129 distinct Minecraft imports and 24 mixins. The 132 `common` files have no Minecraft dependency and don't change.
- Tools: Loom's `migrateMappings` (`./gradlew migrateMappings --mappings "net.minecraft:mappings:1.21.11" --overrideInputsIHaveABackup`) or the Ravel IntelliJ plugin. Mixins still need checking by hand.
- **Stonecutter catch:** code for versions other than the active one is inside `/* */` comments, which the tools can't see. The migration has to run with each version active in turn, and each version-specific block needs checking afterwards.
### 2. Build: a second buildscript for 26.x
- 26.x needs the `net.fabricmc.fabric-loom` plugin (no remapping) and no mappings line, while 1.21.x keeps `net.fabricmc.fabric-loom-remap`. A `plugins {}` block can't choose per version, so other Stonecutter projects use two buildscripts over the same `src/`.
- For 26.x: `modImplementation` → `implementation`, `remapJar` → `jar`, and a **Java 25** toolchain. It also needs Loom 1.15+ and Gradle 9.4+, which we already have (Loom 1.17, Gradle 9.8).
- The release workflow sets up Java 21, so it needs Java 25 for the 26.x jars.
### 3. Fabric API renames
Fabric API renamed its classes to Mojang's names, and the renames aren't backwards compatible. We only use four:
- `ClientTickEvents`: the world tick events are now level tick events.
- `ClientLifecycleEvents`.
- `RenderStateDataKey`.
- `KeyBindingHelper`, which looks to be `KeyMappingHelper` now.
These go behind `//? if` conditions.
### 4. The emotes library comes first
Saturn uses `emotes-fabric` built for each Minecraft version. The library needs the same two-buildscript setup and a 26.x release before Saturn can build for 26.x. It's already on Mojang mappings, so for the library this is mostly build work.
### 5. Rendering changes per drop
Every drop changes rendering, as 1.21.5, 1.21.6 and 1.21.9 did. The compiler will show where for 26.1–26.3. Raw OpenGL is only in `GlassRenderer`'s framebuffer copy on the 1.21.4 path; from 1.21.5 up we already use Blaze3D (render pipelines, `GpuTexture`, `CommandEncoder`), which Fabric requires on 26.x.
### 6. 26.4 isn't out yet
Its first snapshot (22 September 2026) makes **Vulkan** the default renderer, and the release is expected around December. Our glass, rounded-corner and cloak shaders go through Blaze3D, so they may carry over, but they need testing on Vulkan.
### Suggested order
1. Move the 1.21.x builds to Mojang mappings with no behaviour change, in one PR with commits by area (build, refs, mixins, rendering), checked on versions we already play.
2. Give the emotes library 26.1–26.3 builds and publish.
3. Add the 26.x buildscript and versions to Saturn, and fix what doesn't compile.
4. Do 26.4 once it's released, with a Vulkan test pass.
Sources: [Fabric for Minecraft 26.1](https://fabricmc.net/2026/03/14/261.html), [Migrating Mappings](https://docs.fabricmc.net/develop/porting/mappings/), [Porting to Fabric API 26.1](https://docs.fabricmc.net/develop/porting/fabric-api), [Stonecutter with 1.21.11 and 26.1 (emf-compat #33)](https://github.com/victorkozhokin/emf-compat/pull/33), [Java Edition 26.4 Snapshot 1](https://minecraft.wiki/w/Java_Edition_26.4_Snapshot_1)
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
26 through 26.4
What supporting 26.x involves
Assessed 2026-09-29, at 0.1.4-beta. Short version: it's not a quick refactor, but it splits into steps, and the first can be done before any 26.x work.
1. Mappings: Yarn → Mojang (the biggest change, can be done now)
src/, every version has to be on Mojang mappings, which Loom also supports on 1.21.x (the emotes library already works this way).commonfiles have no Minecraft dependency and don't change.migrateMappings(./gradlew migrateMappings --mappings "net.minecraft:mappings:1.21.11" --overrideInputsIHaveABackup) or the Ravel IntelliJ plugin. Mixins still need checking by hand./* */comments, which the tools can't see. The migration has to run with each version active in turn, and each version-specific block needs checking afterwards.2. Build: a second buildscript for 26.x
net.fabricmc.fabric-loomplugin (no remapping) and no mappings line, while 1.21.x keepsnet.fabricmc.fabric-loom-remap. Aplugins {}block can't choose per version, so other Stonecutter projects use two buildscripts over the samesrc/.modImplementation→implementation,remapJar→jar, and a Java 25 toolchain. It also needs Loom 1.15+ and Gradle 9.4+, which we already have (Loom 1.17, Gradle 9.8).3. Fabric API renames
Fabric API renamed its classes to Mojang's names, and the renames aren't backwards compatible. We only use four:
ClientTickEvents: the world tick events are now level tick events.ClientLifecycleEvents.RenderStateDataKey.KeyBindingHelper, which looks to beKeyMappingHelpernow.These go behind
//? ifconditions.4. The emotes library comes first
Saturn uses
emotes-fabricbuilt for each Minecraft version. The library needs the same two-buildscript setup and a 26.x release before Saturn can build for 26.x. It's already on Mojang mappings, so for the library this is mostly build work.5. Rendering changes per drop
Every drop changes rendering, as 1.21.5, 1.21.6 and 1.21.9 did. The compiler will show where for 26.1–26.3. Raw OpenGL is only in
GlassRenderer's framebuffer copy on the 1.21.4 path; from 1.21.5 up we already use Blaze3D (render pipelines,GpuTexture,CommandEncoder), which Fabric requires on 26.x.6. 26.4 isn't out yet
Its first snapshot (22 September 2026) makes Vulkan the default renderer, and the release is expected around December. Our glass, rounded-corner and cloak shaders go through Blaze3D, so they may carry over, but they need testing on Vulkan.
Suggested order
Sources: Fabric for Minecraft 26.1, Migrating Mappings, Porting to Fabric API 26.1, Stonecutter with 1.21.11 and 26.1 (emf-compat #33), Java Edition 26.4 Snapshot 1