This article will break down how versioning works in Minecraft and NeoForge, and will give some recommendations for mod versioning as well.
Minecraft uses semantic versioning. Semantic versioning, or "semver" for short, has the format
major.minor.patch. So for example, Minecraft 1.20.2 has the major version 1, the minor version 20 and the patch version 2.
Minecraft has used
1 as the major version since 2011, when Minecraft 1.0 was introduced. Before that, the versioning scheme changed often, and there were versions like
a1.1 (Alpha 1.1),
b1.7.3 (Beta 1.7.3) or even the
infdev versions, which didn't follow a clear versioning scheme at all. Due to the
1 major version holding up for over a decade now, and due to the in-joke that is Minecraft 2, it is generally considered unlikely that this is ever going to change.
Snapshots deviate from the standard semver scheme. They are labeled as
YY represents the last two digits of the year (e.g.
WW represents the week of that year (e.g.
01). So for example, snapshot
23w01a is the snapshot released in the first week of 2023.
a suffix exists for occasions where two snapshots get released in the same week (where the second snapshot would then be named something like
23w01b). Mojang has occasionally used this in the past. The alternative suffix has also been used for snapshots like
20w14infinite, which was the 2020 infinite dimensions April Fool's joke.
Pre-releases and Release Candidates
When a snapshot cycle is coming completion, Mojang starts releasing so-called pre-releases. Pre-releases are deemed feature-complete for a version and focus solely on bugfixes. They use the semver notation for the version it is for, suffixed by
-preX. So for example, the first pre-release for 1.20.2 was named
1.20.2-pre1. There can be and usually are multiple pre-releases, which are accordingly suffixed with
Similarly, when the pre-release cycle completes, Mojang releases Release Candidate 1 (suffixing the version with
-rc1, for example
1.20.2-rc1). Mojang aims to have one release candidate that they can release if no further bugs occur. However, if an unexpected bug occurs, then there can also be an
-rc3, etc. version, similar to pre-releases.
NeoForge uses an adapted semver system: The major version is Minecraft's minor version, the minor version is Minecraft's patch version, and the patch version is the "actual" NeoForge version. So for example, NeoForge 20.2.59 is the 60th version (we start at 0) for Minecraft 1.20.2. The
1 at the beginning is omitted because it is very unlikely that it will ever change, see above for why that is the case.
A few places in NeoForge also use Maven version ranges, for example the Minecraft and NeoForge version ranges in the
mods.toml file. These are mostly, but not fully compatible with semver (the
pre-tag is not considered by it, for example).
There is no definitive best versioning system. Different styles of development, scopes of projects, etc. all influence the decision of what versioning system to use. Sometimes, versioning system can also be combined. This section attempts to give an overview over some commonly used versioning systems, with real-life examples.
Usually, a mod's file name looks like
modid-<version>.jar. So if our mod id is
examplemod and our version is
1.2.3, our mod file would be named
Versioning systems are suggestions, rather than strictly enforced rules. This is especially true with regard to when the version is changed ("bumped"), and in what way. If you want to use a different versioning system, nobody is going to stop you.
Semantic versioning ("semver") consists of three parts:
major.minor.patch. The major version is bumped when major changes are made to the codebase, which usually correlates with major new features and bugfixes. The minor version is bumped when minor features are introduced, and patch bumps happen when an update only includes bugs.
It is generally agreed upon that any version
0.x.x is a development version, and with the first (full) release, the version should be bumped to
The "minor for features, patch for bugfixes" rule is often disregarded in practice. A popular example for this is Minecraft itself, which does major features through the minor version number, minor features through the patch number, and bugfixes in snapshots (see above).
Depending on how often a mod is updated, these numbers can be smaller or larger. For example, Supplementaries is on version
2.6.31 (at the time of writing). Triple- or even quadruple-digit numbers, especially in the
patch, are absolutely possible.
"Reduced" and "Expanded" Semver
Sometimes, semver can be seen with only two numbers. This is a sort of "reduced" semver, or "2-part" semver. Their version numbers only have a
major.minor scheme. This is commonly used by small mods that only add a few simple objects and thus rarely need updates (except Minecraft version updates), often staying at version
"Expanded" semver, or "4-part" semver, has four numbers (so something like
18.104.22.168). Depending on the mod, the format can be
major.minor.patch.hotfix, or something different entirely - there is no standard way to do it.
major version is decoupled from the
api version. This means that the
major (feature) bit and the
api bit can be bumped independently. This is commonly used by mods that expose an API for other modders to use. For example, Mekanism is currently on version 10.4.5.19 (at the time of writing).
major.minor.patch.hotfix, the patch level is split into two. This is the approach used by the Create mod, which is currently on version 0.5.1f (at the time of writing). Note that Create denotes the hotfix as a letter instead of a fourth number, in order to stay compatible with regular semver.
Reduced semver, expanded semver, 2-part semver and 4-part semver are not official terms or standardized formats in any way.
Alpha, Beta, Release
Like Minecraft itself, modding is often done in the classical
release stages known from software engineering, where
alpha denotes an unstable/experimental version (sometimes also called
beta denotes a semi-stable version, and
release denotes a stable version (sometimes called
stable instead of
Some mods use their major version to denote a Minecraft version bump. An example of this is JEI, which uses
13.x.x.x for Minecraft 1.19.2,
14.x.x.x for 1.19.4, and
15.x.x.x for 1.20.1 (there are no versions for 1.19.3 and 1.20.0). Others append the tag to the mod name, for example the Minecolonies mod, which is on
1.1.328-BETA at the time of writing.
Including the Minecraft Version
It is common to include the Minecraft version a mod is for in the filename. This makes it easier for end users to easily find out what Minecraft version a mod is for. A common place for this is either before or after the mod version, with the former being more widespread than the latter. For example, JEI version
22.214.171.124 (latest at the time of writing) for 1.20.2 would become
Including the Mod Loader
As you probably know, NeoForge is not the only mod loader out there, and many mod developers develop on multiple platforms. As a result, a way to distinguish between two files of the same mod of the same version, but for different mod loaders is needed.
Usually, this is done by including the mod loader somewhere in the name.
jei-1.20.2-126.96.36.199-neoforge are all valid ways to do it. For other mod loaders, the
neoforge bit would be replaced with
quilt or whatever different mod loader you might be developing on alongside NeoForge.
A Note on Maven
Maven, the system used for dependency hosting, uses a versioning system that differs from semver in some details (though the general
major.minor.patch pattern remains the same). The related Maven Versioning Range (MVR) system is used in some places in NeoForge (see above). When choosing your versioning scheme, you should make sure it is compatible with MVR, as otherwise, mods will not be able to depend on specific versions of your mod!