<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: robzepdev</title>
    <description>The latest articles on DEV Community by robzepdev (@robzepdev).</description>
    <link>https://dev.to/robzepdev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4137777%2F6f1fb863-032d-422a-8cb9-34994ad266eb.png</url>
      <title>DEV Community: robzepdev</title>
      <link>https://dev.to/robzepdev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/robzepdev"/>
    <language>en</language>
    <item>
      <title>TypeScript never ships x.y.0: classifying releases the way projects actually version</title>
      <dc:creator>robzepdev</dc:creator>
      <pubDate>Tue, 22 Sep 2026 14:13:13 +0000</pubDate>
      <link>https://dev.to/robzepdev/typescript-never-ships-xy0-classifying-releases-the-way-projects-actually-version-56a</link>
      <guid>https://dev.to/robzepdev/typescript-never-ships-xy0-classifying-releases-the-way-projects-actually-version-56a</guid>
      <description>&lt;p&gt;I'm building a tracker that tells developers which releases of their stack actually matter.&lt;br&gt;
The first problem wasn't AI or scraping. It was a deceptively simple question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Given a version string, how important is this release?&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Why "just use SemVer" doesn't work
&lt;/h2&gt;

&lt;p&gt;The naive rule: &lt;code&gt;x.0.0&lt;/code&gt; is a major, &lt;code&gt;x.y.0&lt;/code&gt; is a minor, everything else is a patch.&lt;br&gt;
It holds for many libraries, and breaks for some of the most popular ones.&lt;/p&gt;

&lt;p&gt;I ended up with one &lt;em&gt;classification strategy&lt;/em&gt; per project, mapping a version&lt;br&gt;
to one of four buckets: &lt;strong&gt;Spotlight&lt;/strong&gt; (you should look), &lt;strong&gt;Latest&lt;/strong&gt; (new stuff),&lt;br&gt;
&lt;strong&gt;Digest&lt;/strong&gt; (patches, batched weekly) and &lt;strong&gt;Preview&lt;/strong&gt; (beta and rc).&lt;/p&gt;
&lt;h3&gt;
  
  
  1. &lt;code&gt;semver&lt;/code&gt;: the default
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;x.0.0&lt;/code&gt; → Spotlight, &lt;code&gt;x.y.0&lt;/code&gt; → Latest, patches → Digest. Vite fits perfectly:&lt;br&gt;
after 8.0.0 came 16 patches, 8.0.1 through 8.0.16, in under three months.&lt;br&gt;
A good tracker shows you 8.0.0 and quietly folds the rest into a digest.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. &lt;code&gt;node&lt;/code&gt;: even majors become LTS
&lt;/h3&gt;

&lt;p&gt;Node's even majors (20, 22, 24) become Long Term Support; odd ones don't.&lt;br&gt;
So an even &lt;code&gt;x.0.0&lt;/code&gt; goes to Spotlight, while odd majors and &lt;code&gt;x.y.0&lt;/code&gt; go to Latest.&lt;br&gt;
Same version shape, different meaning.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. &lt;code&gt;typescript&lt;/code&gt;: there is no stable x.y.0
&lt;/h3&gt;

&lt;p&gt;TypeScript doesn't follow SemVer: every &lt;code&gt;x.y&lt;/code&gt; can contain breaking changes.&lt;br&gt;
And the numbering is unusual:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;5.9.0-beta → 5.9.1-rc → 5.9.2   ← first stable 5.9
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A rule that looks for &lt;code&gt;x.y.0&lt;/code&gt; would never flag TypeScript 5.9 at all.&lt;br&gt;
So the strategy is: &lt;strong&gt;the first stable version of each &lt;code&gt;x.y&lt;/code&gt; that the sources observed is Spotlight&lt;/strong&gt;;&lt;br&gt;
later ones are Digest. The strategy has to look at history, not just the string.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;code&gt;zerover&lt;/code&gt;: in 0.x the minor breaks
&lt;/h3&gt;

&lt;p&gt;For libraries still in &lt;code&gt;0.x&lt;/code&gt;, &lt;code&gt;0.y.0&lt;/code&gt; is effectively a major.&lt;br&gt;
So &lt;code&gt;0.y.0&lt;/code&gt; → Spotlight, other &lt;code&gt;0.y.z&lt;/code&gt; → Digest, and from &lt;code&gt;1.0.0&lt;/code&gt; on it falls back to &lt;code&gt;semver&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Previews and noise
&lt;/h2&gt;

&lt;p&gt;Every strategy treats pre-releases the same way. Only suffixes that are exactly&lt;br&gt;
&lt;code&gt;beta&lt;/code&gt; or &lt;code&gt;rc&lt;/code&gt; (optionally numbered, like &lt;code&gt;-rc.1&lt;/code&gt;) count as previews.&lt;br&gt;
Canary, nightly, experimental, alpha and hash- or date-stamped builds&lt;br&gt;
(&lt;code&gt;-rc.0-next-…&lt;/code&gt;) aren't tracked at all. They're the bulk of the noise.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep it pure, test it on real versions
&lt;/h2&gt;

&lt;p&gt;Each strategy is a pure TypeScript function, with no I/O,&lt;br&gt;
tested against real version histories from npm and GitHub.&lt;br&gt;
Real data catches what toy examples don't: TypeScript's &lt;code&gt;.2&lt;/code&gt;, React's&lt;br&gt;
&lt;code&gt;-rc.0-next-&amp;lt;hash&amp;gt;&lt;/code&gt; tags, &lt;code&gt;v&lt;/code&gt;-prefixed tags.&lt;/p&gt;

&lt;p&gt;And when a rule is still wrong for an edge case, a manual override lives&lt;br&gt;
in the database and is never overwritten by the next sync.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;Classification decides &lt;em&gt;what deserves your attention&lt;/em&gt;. The next step decides&lt;br&gt;
&lt;em&gt;what to do about it&lt;/em&gt;: an AI summary of each important release, with breaking changes,&lt;br&gt;
migration steps and an explicit &lt;strong&gt;Action required / Safe to upgrade&lt;/strong&gt; verdict.&lt;br&gt;
It will be grounded only in the official release notes. If they don't mention&lt;br&gt;
a breaking change, neither will the summary.&lt;/p&gt;

&lt;p&gt;You can see the classification at work on an early preview:&lt;br&gt;
&lt;a href="https://release-tracker-drab.vercel.app/technologies/vite" rel="noopener noreferrer"&gt;Vite's release page&lt;/a&gt;: 8.0.0 up front,&lt;br&gt;
the 16 patches folded into a digest. Name and domain are still provisional.&lt;/p&gt;

&lt;p&gt;I'm building this in public. If your stack has a versioning scheme that would&lt;br&gt;
break these rules, I'd love to hear about it in the comments.&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>versioning</category>
    </item>
  </channel>
</rss>
