How version numbers work
This page is for reporters, editors and creators who need to write version numbers correctly. Exponential and the packages around it use numbers whose last position keeps counting upward, which surprises people used to other schemes. Getting the order wrong is one of the easiest mistakes to make in release coverage.
Contents
- The parts of a version
- The last position keeps counting
- Tags, branches and the development line
- Sorting versions correctly
- Composer constraints in one table
The parts of a version
| Example | Where you see it | How to write it in text |
|---|---|---|
v6.0.14 | The Git tag of a release | "Exponential 6.0.14" (no v in running text) |
6.0.14 | Changelogs, Packagist | "Exponential 6.0.14" |
6.0.15stable | lib/version.php on the main branch | "the 6.0.15 line", never "6.0.15 stable" |
dev-main, 6.0.x-dev | Composer names for the main branch | "the development branch" |
v0.0.4.50 | A Velocity release tag | "Exponential Velocity 0.0.4.50" |
The rule "Versions have no v in running text; the v belongs to the Git tag" is from the
Brand and naming rules. The 6.0.15stable and
6.0.x-dev details are from Getting the code.
The last position keeps counting
Exponential versions do not roll over at nine. After 6.0.9 came 6.0.10 (28 August 2025), not 6.1.0 (release overview). The same holds for extensions and for Velocity:
- "After
0.1.9the next release is0.1.10; only the last position counts up unless you decide otherwise" (Extensions guide, Release it). - "The last position of a Velocity version counts on past 9 (
0.0.4.9,0.0.4.10, ...)" (Getting the code, the Velocity package). - "Versions count in the last position:
0.0.4.9is followed by0.0.4.10, never0.0.5.0" (Velocity release notes).
So do not read a jump in the last position as a small or large release. The number says the order, not the size. What a release contains is in its changelog (Reading a changelog).
Tags, branches and the development line
| Name | What it is | Source |
|---|---|---|
Release tags v6.0.0 to v6.0.14 | Exact, permanent releases of the 6.0 line | Getting the code |
Older tags such as 4.4.0 | Lines from the eZ Publish years, tagged without v | Same page |
Branch main | "the current development of the 6.0 line, today 6.0.15" | Same page |
Release branches 6.0.7 to 6.0.14 | "the state of each release line" | Same page |
Only a tag is a release. A branch moves every day; a tag never does (Published versions never change).
Sorting versions correctly
A plain alphabetical sort puts v6.0.10 before v6.0.8, so a list sorted by name shows the wrong newest version.
The documentation warns: "Always sort by version (--sort=version:refname or sort -V), never by name"
(Getting the code).
git tag -l 'v6.0.*' # by name: v6.0.10 appears before v6.0.8 - misleading
git tag -l 'v6.0.*' --sort=version:refname # by version: v6.0.14 is last - correctThe same applies to your own tables: order rows by release date or by version, never alphabetically.
Composer constraints in one table
You will meet these in composer.json and in changelogs that list required packages.
| Constraint | Means | Example and source |
|---|---|---|
~0.0.4.57 | >=0.0.4.57 <0.0.5.0, so every later 0.0.4.x | Velocity, Getting the code |
~2.4.11 | >=2.4.11 <2.5.0 | eztags, Getting the code |
^8.0 | PHP 8.0 or any later 8.x | The 6.0.15 line's PHP requirement, same page, section 3.1 |
When a changelog says a package "requires ~1.4.39", write "requires version 1.4.39 or a later 1.4.x", not "uses
version 1.4.39".
Related pages
- Naming rules quick card
- Published versions never change
- Verifying a release yourself
- Free documentation: this page is free to copy, translate and improve under the GNU FDL 1.3.
Become an Exponential Partner
Partners share their information, provide funding, contribute back and develop the products with us, and that is how Exponential grows. A partner website and dashboard are planned for mid-2027: please become a partner today to speed up our growth rate and land new features faster.