SemVer Range Checker | Test ^ ~ and Version Range Matches
Type a version and a range expression and see whether the version satisfies it. The tool parses carets (^), tildes (~), x-ranges (1.x), comparators (>=1.0.0 <2.0.0), and hyphen ranges (1.0.0 - 2.0.0), then reports a MATCH / NO MATCH verdict alongside the exact minimum and maximum versions the range allows.
💡 About this tool
If you have ever squinted at a package.json dependency and wondered "does ^1.2.3 actually allow 1.9.0?", this is the answer machine. SemVer range operators look simple but each one carves out a different window. ^1.2.3 allows everything up to but not including 2.0.0. ~1.2.3 is much tighter — only patch bumps within 1.2.x. And the caret behaves differently below 1.0.0: ^0.2.3 only allows 0.2.x, because pre-1.0 minors are treated as breaking.
The min/max panel is the part that saves real debugging time. Instead of mentally expanding the operator, you see the resolved boundary versions directly, with ∞ for open-ended ranges like >=1.0.0. Pair that with the plain-language explanation and you can sanity-check a lockfile resolution or a Dependabot bump in seconds, without installing the semver package or spinning up a REPL.
🧐 Frequently Asked Questions
Does ^1.2.3 include 2.0.0?
No. The caret allows >=1.2.3 <2.0.0, so 2.0.0 is just outside the window. The Max Version panel shows the 1.x ceiling.
What is the difference between ^ and ~?
The caret allows changes that do not modify the left-most non-zero version segment (usually minor and patch). The tilde allows only patch-level changes when a minor is specified, so ~1.2.3 permits 1.2.x but not 1.3.0.
Why does ^0.2.3 behave differently?
Below 1.0.0, SemVer treats each minor bump as potentially breaking. So ^0.2.3 resolves to >=0.2.3 <0.3.0 rather than <1.0.0.
How are pre-release versions like 1.0.0-beta handled?
A pre-release has lower precedence than its release, so 1.0.0-beta sorts before 1.0.0. The checker parses the pre-release tag and orders it accordingly when testing the range.
Can I test compound ranges?
Yes. Space-separated comparators are ANDed (>=1.0.0 <2.0.0), and || lets you OR whole ranges together. The explanation line spells out which logic applies.
📚 Fun Facts
Semantic Versioning was popularized by Tom Preston-Werner, GitHub's co-founder, who published the SemVer spec in 2010 to fight what he called "dependency hell." The ^ and ~ operators most developers use day-to-day are not actually part of the core SemVer spec — they come from npm's node-semver library, which became the de facto grammar after npm adopted caret ranges as the default save prefix. That default is why your package.json is full of carets: when you npm install lodash, npm writes ^4.17.21, quietly opting you into every future minor and patch release of the 4.x line. Other ecosystems borrowed the idea but tweaked the rules — Rust's Cargo treats a bare 1.2.3 requirement as caret-like by default, so lodash = "1.2" in Cargo behaves the way ^1.2 would in npm.