Guidefor modders4 min read
NeoForge version numbers: which build for 26.2 or 1.21
NeoForge moved to four part version numbers in the calendar era. How 26.2.0.35-beta maps to Minecraft 26.2, and how the older 21.1.x rule worked.
How NeoForge numbers used to work
NeoForge forked from Minecraft Forge in 2023 and made one deliberate change to versioning: the Minecraft version lives inside the NeoForge version. There is no lookup table for the 1.x era, only a rule.
In the 1.x era the leading 1 never changed, so it was dropped. What remained was three components:
21 . 1 . 244
│ │ └── build counter, increments per build for that Minecraft version
│ └─────── Minecraft patch
└──────────── Minecraft minor
21.1.244 targets Minecraft 1.21.1. 21.11.44 targets 1.21.11. A patch of 0 means the base release with no patch component, so 21.0.167 targets Minecraft 1.21, not 1.21.0.
The four part scheme in the calendar era
Calendar versions have no constant prefix to drop. 26.1.2 is year, drop and patch, with nothing implied. So NeoForge kept the same idea and gained a component:
26 . 2 . 0 . 35 -beta
│ │ │ │ └── channel suffix, absent on a finished build
│ │ │ └─────── build counter
│ │ └──────────── Minecraft patch, 0 means the base release
│ └───────────────── Minecraft drop within the year
└────────────────────── Minecraft year
Both shapes are live at the same time, because the 1.21 line is still maintained. The component count is the tell: three components is a 1.x target, four components is a calendar target.
Reading 26.2.0.35-beta
Taken apart, 26.2.0.35-beta is build 35 for Minecraft 26.2, published on the beta channel. The patch component is 0, so the target is 26.2 rather than 26.2.0. Compare that with 26.1.2.87, which is build 87 for Minecraft 26.1.2 and carries no suffix, so it is a finished build.
The same rule applied in reverse gives you the prefix to search for. For Minecraft 26.2 that prefix is 26.2.0., and every build under it targets your version. Only the trailing build counter changes.
What the beta suffix means for stability
A suffix is a statement about the loader, not about your mod. NeoForge marks a line beta while its API for that Minecraft version is still moving, and alpha earlier than that. Builds like 26.1.0.0-alpha.1+snapshot-1 exist for snapshot targets.
This matters because for several Minecraft versions a beta is the only thing published. Compatibility rows on this site carry the evidence label declared, since NeoForge itself states the target, but the confidence is lowered where the newest build is a beta rather than a release. A declared beta is real support with a caveat, and showing it as equal to a finished build would be dishonest.
Practical consequences: pin an exact build rather than a version range, expect API changes between betas without a deprecation cycle, and re-test after every bump.
Picking a version for your Minecraft release
The newest build recorded per Minecraft version, from the NeoForged Maven repository:
| Minecraft | NeoForge | Channel |
|---|---|---|
| 26.2 | 26.2.0.35-beta | beta |
| 26.1.2 | 26.1.2.87 | release |
| 26.1.1 | 26.1.1.15-beta | beta |
| 26.1 | 26.1.0.19-beta | beta |
| 1.21.11 | 21.11.44 | release |
| 1.21.10 | 21.10.64 | release |
| 1.21.9 | 21.9.16-beta | beta |
| 1.21.8 | 21.8.54 | release |
| 1.21.7 | 21.7.25-beta | beta |
| 1.21.6 | 21.6.20-beta | beta |
| 1.21.5 | 21.5.98 | release |
| 1.21.4 | 21.4.157 | release |
| 1.21.3 | 21.3.97 | release |
| 1.21.2 | 21.2.1-beta | beta |
| 1.21.1 | 21.1.244 | release |
| 1.21 | 21.0.167 | release |
| 1.20.6 | 20.6.139 | release |
| 1.20.4 | 20.4.251 | release |
| 1.20.2 | 20.2.93 | release |
Build counters climb continuously, so the number in this table is a floor, not a fixed answer. Check the NeoForge loader page for the build that is current today.
Two things are worth noting from the table. The counter resets for every Minecraft version, so a high number means a long lived version rather than a newer loader: 1.21.4 reached build 157 and 1.21.1 reached 244, while 26.2 is only at 35 because it is new. And the presence of a version in this table is not a promise that a build is finished, only that one exists.
In a NeoForge MDK the two values sit in gradle.properties:
minecraft_version=26.2
neo_version=26.2.0.35-beta
Keep them consistent. A neo_version whose embedded Minecraft version disagrees with minecraft_version will fail at runtime rather than at build time, which is a slow way to find the mistake.
Where the version list comes from
NeoForge publishes its builds through the NeoForged Maven repository, and the version list is a plain JSON array:
curl -s https://maven.neoforged.net/api/maven/versions/releases/net/neoforged/neoforge \
| jq -r '.versions[-15:][]'
The array is oldest first, so the tail is what you want. Our sync reads this list, applies the two shape rules above, and skips anything that fits neither rather than guessing at a mapping. A version that cannot be mapped is left out, because a confident wrong answer about compatibility is worse than a missing one.
Note the contrast with Forge, which publishes a promotions file keyed by Minecraft version instead. There the mapping is given and nothing is derived, which is covered in the Forge version guide.
What could change
The four part scheme is only a few months old, so it is the part most likely to move. If Minecraft adds a component beyond 26.1.2, or if NeoForge decides the year prefix is redundant, the parsing rule here stops matching and builds will start being skipped rather than mis-mapped.
To check, run the curl command above and compare the newest entries against the NeoForge loader page and the loader row on the Minecraft 26.2 page. If Maven lists a shape that is not in this guide, the rule needs updating. Beta lines also promote to release without any announcement, so a version listed as beta here may be finished by the time you read it.