How software is versioned
What does a version number actually look like across the software world, and how much of it writes one the way SemVer says to?
82%
of products write versions SemVer would accept, across 1,250 with enough releases to have a habit.
52%
of readable version strings open with a v. Half overall, and split sharply by channel.
26%
of releases carry no version at all, out of 36,483 in the catalog.
A version number is the one part of a release every reader sees. This page reads all 26,832 of them the catalog holds through one grammar and reports what they look like: how many numbers, whether SemVer would accept the string, who writes the v, and where a version is missing altogether. It measures spelling. What a vendor promises when a number goes up is a different question, and one this corpus cannot see.
Three numbers, and mostly the way SemVer spells them
Of the versions this catalog can read as numbers, 85.2% are three components long, and 81.2% are strings SemVer 2.0.0 would accept as they stand: three integers, no leading zero, an optional tail. Counted per product instead, so that a project tagging nightly counts once, the SemVer-shaped share is 82.5%. Whatever vendors say about their versioning policy, this is the spelling they have settled on. 15.9% of the SemVer-shaped strings carry a prerelease or build tail; the rest are the bare three numbers.
| one component | 0.1%31/24,494 | |
|---|---|---|
| two components | 7.6%1,873/24,494 | |
| three components | 85.2%20,859/24,494 | |
| four components | 7.0%1,708/24,494 | |
| five or more | 0.1%23/24,494 |
Every version string in the catalog, by the grammar it is written in. Releases are a share of all versioned releases; products are the vendors whose releases are mostly written this way, of those with at least 5 the reader recognizes. Examples are the newest releases in each bucket and link to the release counted.
SemVer-shaped
74.2%of releases · 19,898|82.5%of products · 1,031
Three integers with no leading zero, then at most a -prerelease and a +build tail. Exactly what SemVer 2.0.0 would accept.
- v4.1.5Argo Workflows
- v3.20.242-ltsToolJet
- v3.27.0OpenAI Python SDK
- 12.1.4Avalonia
- v5.3.0express
Plain numbers
12.9%of releases · 3,449|9.0%of products · 112
Dotted integers, but not three of them, or one of them carries a leading zero SemVer forbids.
- v2026.10.09.4Gumroad
- v0.102.2814.0PowerToys
- 15.0.245.54v8
- 2026.10Overcast
- 2126.2Azahar
Number plus a suffix
4.3%of releases · 1,147|2.6%of products · 33
A numeric core with a tail SemVer has no grammar for: a glued b5 or esr, a fourth component followed by more.
- v26.8.22.13-ltsClickHouse
- 15.0.245.54-pgov8
- 2026.10.0b2ESPHome
- 1.8.0-rc.1791509415276Radix Primitives
- 6.0.0-b5.20261008180624Matomo
Not a number at all
8.7%of releases · 2,338|4.9%of products · 61
A string the version reader declines because it leads with a word, a package name or a date rather than a number.
- Pre-release-shadPS4-2026-10-09-0c9ca525b8add53e62b3ccd9c9c2f6ef2ebabbfashadPS4
- develop-20261009.3Firefly III
- release_v3.11pycparser
- formatjs_cli_v1.8.1formatjs
- openssl-4.1.0-beta2OpenSSL
SemVer-shaped is a fact about the string, not about the project. A build number written as three dot-separated integers passes the same test as a library that documents every breaking change, and the two are counted together here because the corpus cannot tell them apart.
The channel is a grammar of its own
Where a release is published decides much of how its version is written, because most channels have rules of their own. Package registries validate a version before they accept it, and they sit at 96.1% SemVer-shaped; releases tagged on GitHub, where the string is whatever the maintainer typed, sit at 86.1%. At the other end, Steam publishes patch notes with no version field at all: 100.0% of the releases tracked from it carry none. A vendor blog sits in between: a headline names a version when the writer chose to put one in it, and 57.2% of the releases read from feeds did not.
| registry | 96.1%926/964 | |
|---|---|---|
| gitlab | 91.2%124/136 | |
| github | 86.1%15,022/17,444 | |
| sparkle | 80.0%188/235 | |
| appstore | 77.1%758/983 | |
| feed | 73.4%1,320/1,798 | |
| scrape | 67.9%1,042/1,535 | |
| jetbrains | 62.7%198/316 | |
| versions | 59.1%162/274 | |
| play | 31.0%31/100 | |
| adobe | 28.4%21/74 | |
| riot | 3.1%12/392 |
By category the spread runs from AI at 98.5% to Games at 10.4%. Underneath the ranking, developer-facing software clusters at the top and the categories where a version is printed for an end user rather than parsed by a tool sit lower. A two-part browser version or a four-part build is a perfectly good version; SemVer simply has no grammar for it. One category barely versions at all: Games publishes 93.3% of its releases with no version.
| AI | 98.5%3,337/3,387 | |
|---|---|---|
| Frameworks & Libraries | 96.2%3,754/3,902 | |
| Languages & Runtimes | 91.2%309/339 | |
| Developer Tools | 89.4%3,975/4,447 | |
| Infrastructure & DevOps | 87.4%1,860/2,129 | |
| Security & Privacy | 80.8%954/1,181 | |
| Creative Tools | 80.1%478/597 | |
| System Utilities | 78.6%857/1,091 | |
| Databases & Data | 75.9%802/1,056 | |
| Lifestyle & Apps | 75.4%338/448 | |
| Communication | 72.1%961/1,333 | |
| Media | 66.3%532/803 | |
| Operating Systems | 64.6%332/514 | |
| Firmware | 62.1%82/132 | |
| Drivers | 60.0%60/100 | |
| Gaming Tools | 55.6%258/464 | |
| Productivity | 54.0%888/1,644 | |
| Browsers | 16.2%69/426 | |
| Games | 10.4%52/501 |
The v is a GitHub habit
Whether a version starts with a v gets argued about more than it matters. Across the catalog, 51.6% of readable version strings open with one, and 53.7% of products write it more often than not. That is two populations averaged together, not a field of undecided vendors. On GitHub, where the version is the tag the maintainer pushed, 69.9% lead with a v. On nine channels — registry, sparkle, appstore, scrape, jetbrains, versions, play, adobe and riot — not a single version does. Some of those are stores and registries that normalize the string before anyone reads it. The rest are vendors’ own release-notes pages, where the number is written into prose and nobody types a v.
| registry | 0.0%0/964 | |
|---|---|---|
| gitlab | 28.7%39/136 | |
| github | 69.9%12,188/17,444 | |
| sparkle | 0.0%0/235 | |
| appstore | 0.0%0/983 | |
| feed | 23.0%413/1,798 | |
| scrape | 0.0%0/1,535 | |
| jetbrains | 0.0%0/316 | |
| versions | 0.0%0/274 | |
| play | 0.0%0/100 | |
| adobe | 0.0%0/74 | |
| riot | 0.0%0/392 |
The v is a property of Git tags more than a convention. It appears where the tag is the version and disappears wherever a platform sits between the maintainer and the reader.
About one version in 12 is a date
Calendar versioning has its advocates, and it is visible here without being common: 8.3% of readable versions, from 78 products, either open with a four-digit year or carry a zero-padded component like .09 that only a month explains. 1,534 do the first and 1,231 the second, with some doing both. That figure is a floor: a two-digit year with no padding, like 26.2, cannot be told from a major version in the twenties, so those are counted as plain numbers and the true share is somewhat higher.
- v2026.10.09.4Gumroad
- v2026.10.6mise
- v2026.10.9-canary.912AFFiNE
- 2026.10.0b2ESPHome
- 2026.10Overcast
When the tag is a name
8.7% of the version strings vendors publish are not numbers at all by the reading used here, and 61 products write most of theirs this way. The examples show the shapes: a rolling nightly or preview tag with no number in it, a package name in front of the number because the repository holds several, a branch, a channel or a language in front of it, a date with a commit hash. Each one is a version to the people who wrote it and a name to any tool that has to sort it.
- Pre-release-shadPS4-2026-10-09-0c9ca525b8add53e62b3ccd9c9c2f6ef2ebabbfashadPS4
- develop-20261009.3Firefly III
- release_v3.11pycparser
- formatjs_cli_v1.8.1formatjs
- openssl-4.1.0-beta2OpenSSL
They are counted and left in the denominators on purpose. A report that dropped whatever its reader could not parse would be measuring the reader rather than the vendors.
How this is measured, and how to read it
- Grammar is not policy. A string is SemVer-shaped when SemVer 2.0.0 would accept it: three integers without a leading zero, then an optional -prerelease and +build. Nothing here checks whether a bump meant what SemVer says it should. A vendor can be SemVer-shaped and break compatibility in a patch, or write four numbers and never break anything.
- The string is read as the channel exposed it. Registries and app stores normalize a version before publishing it, so a v that a maintainer typed never reaches them. A version read from a blog headline is taken only when it follows the product name, so a feed that buries the number mid-sentence counts as versionless here. Steam has no version field and this catalog does not guess one from a headline. Each of those is a property of the channel as much as of the vendor, and the channel table is where to read it.
- Releases and products answer different questions. A project that tags every night contributes hundreds of rows; one that ships twice a year contributes two. The release figures are what a reader of changelogs actually meets; the product figures are the vendors, each counted once, and a product needs at least 5 readable versions and a majority grammar among them to be counted at all.
- The catalog leans on GitHub. 56% of the products here are tracked from a GitHub release page, so the overall figures inherit GitHub habits, the v most of all. The channel table corrects for that.
- The date count is a floor. Only a four-digit year or a zero-padded component is read as a date. A version like 26.2 is either a year or a major and the string cannot say which, so it is counted as a plain number.
- The catalog is not the world. These are the products What’s New tracks, which skews towards software that publishes a changelog at all, and towards the parts of the industry that publish in English on the open web.
Recomputed every week. Every figure comes from the catalog at build time rather than being typed in.
The companions to this page are the release note clarity gap, which asks what a release says once it has a number, and when software ships, which asks when. Declarative Changelogs turns the patterns in all three into a practical proposal for clearer release communication.