Paste a website address and this CMS checker names the platform, framework, CDN and server behind it — then shows you the exact header, path, cookie or meta tag each answer rests on, and lists what it checked and did not find.
A domain or a full URL. One public request is made to that address, exactly as a browser would, and the answer is held here briefly so the site is not asked twice.
Quick Answer: how does a CMS detector know what a website is using?
A CMS detector fetches the page and looks for traces the platform cannot easily hide: an asset path like /wp-content/, a response header, a named cookie, or a generator tag. Most tools print the verdict and keep the reasoning to themselves. This one shows you the literal line it read for every result, and lists the signals it checked and did not find.
Christopher Vance
Web Infrastructure Specialist
Christopher works on proxies, datacenter and residential routing, scraping infrastructure and geo-blocking — the layers that sit between a visitor and the application behind them.
This tool was built the way it is because of one thing the research kept turning up: thirteen ranking detector pages were read line by line and not one of them shows the evidence for a detection. Every signal used here was traced to the vendor's own documentation before it was allowed in, and eleven signals that other tools rely on were checked and found to be removable by design. That is why the page shows its working instead of asking to be believed.
Last reviewed 27 September 2026 · Published 27 September 2026
View all articles by Christopher VanceThe question people actually type is what CMS is this website using, and a CMS detector answers it from the outside, with exactly what your browser gets: one HTTP response. That response carries headers, a set of cookies, and a body of HTML full of links to scripts, stylesheets and images. A content management system leaves fingerprints in all three, because it has to serve its own files from somewhere and it has to keep track of a session. Read those traces carefully and you can usually name the platform without ever seeing the server.
Nothing here involves access to the site: no login, no file listing, no database query, no port scanning. The tool above requests the address you give it, the same way a visitor would, and reads what comes back. That is also why the answer is bounded: a platform that hides its traces well is hard to identify from outside at all.
The signals themselves fall into five kinds, and they are not equally trustworthy. Structural signals are paths and endpoints the platform needs in order to function — WordPress serving its own JavaScript from /wp-includes/, or answering with a list of API routes at /wp-json/. Cookies are the named values a platform sets. Response headers are tags a server or a proxy adds. An exact URL is a third-party script the vendor pins to one address, which Cloudflare does with Turnstile in so many words: the file "must be fetched from the exact URL shown above". And a generator tag is the site simply declaring itself in its own markup. The first kind is hard to remove without breaking the site. The last kind takes one line of configuration, which is why a result labels each signal with the kind it is.
Key fact: WordPress publishes the line that deletes its own generator tag in its developer documentation — remove_action( 'wp_head', 'wp_generator' );. Any detector that leans on that tag will report nothing on a hardened site, which is one reason two tools can disagree about the same page.
One more layer matters before you read a result. Between you and the application there is usually a proxy or a CDN, and that machine can add headers, remove headers and answer on the origin's behalf. If you have not met that architecture before, our guide to the role of proxy servers in networking explains what sits where. It matters here because a proxy is entirely capable of stripping the very header a detector was hoping to read.
Any website technology checker worth using has to separate its findings rather than pouring them into one list, so the four tiles at the top of a result answer four different questions. Platform is the content management system or storefront. Framework is the front-end build, which on a modern site is often a different thing entirely. CDN or proxy is whatever answered on the site's behalf. Server is copied straight out of the Server response header, with no interpretation added — and if that header is what you came for, our HTTP Headers Analyzer takes the whole set apart properly.
Each technology then gets a confidence label, and the rule behind it is published rather than implied.
| Label | What it takes | How to treat it |
|---|---|---|
| Confirmed | Two or more independent signals, at least one of them structural — or a single signal at a URL the vendor fixes exactly, such as a Turnstile script | Safe to act on. Two unrelated traces agreeing is much harder to produce by accident than one. |
| Likely | One signal only, or two signals that are both headers, cookies or generator tags | Probably right, worth a second look. Check the evidence line and see whether it could have another explanation. |
| Not detected | Nothing matched | Read the "checked and not found" list. It usually tells you which signal was missing, which is the interesting part. |
| Fronted | A CDN or proxy answered and no platform signal came through | Not the same as "no CMS". The platform is there; the proxy is not passing its traces on. |
When a generator tag carries a version, the tile shows it and labels it as declared by the site. That wording is doing real work. A version string in a meta tag is whatever the site chose to publish there: it can be stale, edited, or left over from a build replaced weeks ago. Treating it as a measurement is how people end up reporting a vulnerability against a version nobody is running.
A Cloudflare signal means the response passed through Cloudflare. It says nothing at all about what is behind it, because that is the entire point of a reverse proxy. There is one case where the tool goes further and suppresses the reading: on a confirmed Shopify store, Shopify's own documentation describes its CDN as backed by Cloudflare, so reporting Cloudflare as the merchant's separate choice would be misleading. To identify the network a site actually sits on, our Cloud IP Check answers that question directly instead.
Thirteen ranking pages for this kind of query were opened and read during the research for this tool. They range from databases with six-figure technology counts to single-purpose pages with no article at all, and they share one thing: not one of them shows you why it reached its answer. Three describe their method in a paragraph somewhere on the page. None puts the signal next to the result.
That gap matters more than it sounds. A technology detector makes a claim about somebody else's property, and usually to inform a decision: whether to pitch an agency's services, whether a migration is feasible, whether a suspicious site is what it appears to be. A claim you cannot check is worth much less than one you can.
Checking this one takes seconds. View the page source, search for the string shown in the evidence box, and you are looking at the same bytes the tool looked at. If it is not there, the tool is wrong and you will know immediately — which is a standard the rest of this category has quietly avoided.
There is a second half to showing your working, and it is the part that stops this page telling you something untrue. A path like /wp-content/ only counts when it appears in something the page actually loads — a stylesheet, a script, an image, a url() reference. It does not count when it appears in a sentence, in an HTML comment, inside a code sample, or in a string in an inline script. A guide about WordPress is not a WordPress site, and a detector that cannot tell the difference will confidently tell you it is.
Host matters too, and less simply. If an asset sits on the site's own domain, the signal is worth its full weight. If it sits on a different host, that is still real — every one of these platforms can legitimately serve its files from a CDN — but it is also exactly what a page linking to somebody else's site looks like from outside. So a match on another host is reported at one step lower, the evidence line says where it was found, and it can never confirm a platform on its own.
The other half of showing your working is admitting what you did not find. Most tools print nothing on an empty result, or an unexplained dash, leaving the reader unable to tell "well hardened" from "not in our list" from "our fetch failed". The list on a result here names every signal tested and absent. On a site with its traces stripped, that list is the answer.
Worth doing: run a site you own and read the not-found list. It is a fair summary of how much your stack tells a stranger, and it is the same list an automated scanner would be working from.
Two of the largest tools in this space serve results out of a crawl database, and one of them charges several times as much for a live check. That makes their answers a different kind of thing from this one. Every result here is a request made when you asked for it, timestamped in the request record at the bottom, and held on our server only briefly so that a site is not asked twice in a row for the same answer.
This is the part that explains almost every disagreement between two detectors, and the research found it published nowhere else. Several of the most widely used signals are documented by their own vendors as optional, movable or removable. Not rumoured — documented.
| Signal | What the vendor documents | What it means for a result |
|---|---|---|
| WordPress generator tag | The developer reference gives the one line that removes it | Absent on most hardened sites. Never treat its absence as evidence against WordPress. |
X-Pingback header | Core sends it only when pings are open for a post | Normally absent on a home page — and the home page is what every detector tests. |
/wp-content/ | Can be relocated with WP_CONTENT_DIR | A WordPress site can legitimately have no /wp-content/ anywhere in its markup. |
| Shopify CDN host | Assets moved from the old CDN host onto the shop's own domain | Match the path, not the host. A detector still looking for the old hostname will miss newer stores. |
Next.js /_next/static/ | The host can be changed with assetPrefix | The path segment survives; the domain does not. Host matching produces false negatives. |
Nuxt /_nuxt/ | buildAssetsDir renames it at build time | A renamed build directory makes a Nuxt site invisible to path matching. |
| Magento signed static path | Signing is a configuration toggle | Both the signed and unsigned path shapes have to be matched, or half of installations are missed. |
Drupal X-Generator | Removable, and the project hosts modules for stripping it | Presence is useful; absence proves nothing. |
| Joomla generator string | Set through public API any template can call | Trivially blanked or replaced with something misleading. |
| Any response header | A proxy can add or remove headers in transit | Header-only detection should always be cross-checked against a path or the HTML. |
Drupal and Joomla are worth calling out together here, because both ship a generator tag and both document ways of removing it, which means a site running either can look like nothing at all. The same applies in reverse to a framework: Next.js is identified by a path that survives a change of host, so it is found more reliably than either of them. That is why the tool ranks signals rather than counting them, and why it will not call a platform confirmed on a generator tag alone no matter how confident that tag sounds. It is also why some technologies are deliberately missing: where a vendor documents no identifying signal at all, there is nothing honest to match on, and a guess in a results table looks exactly like a fact.
Deliberately absent: Squarespace and Webflow are not detected here. Neither vendor documents a response header or generator tag that identifies its platform, so there is no signal this tool could point at and defend. Other detectors will name them. This one would rather be short than wrong.
Most people arriving at a CMS checker already suspect the answer is WordPress, and what they actually want is the theme. That is where the honest answer diverges sharply from what most tools print, so it is worth being precise about what can and cannot be known.
This is also the ground held by the specialists. A dedicated WordPress theme detector, or a Shopify theme detector, does one job and does it in more depth than a general checker will. What follows is what any of them can see from outside, and where all of them run out of road.
A WordPress page loads its theme's stylesheet from a path shaped like /wp-content/themes/<folder>/style.css. The tool reads that folder name and shows it. A forum moderator on the official WordPress support site gives readers exactly the same instruction for doing it by hand: view the source and search for /themes/. There is no secret method; the difference is that this page shows you the line it read.
The folder is what the installation calls the directory, and that is frequently not what the theme is called in public. A commercial theme often ships with a tidy folder matching its name; just as often a developer renames it, builds something bespoke, or wraps a commercial parent in a custom child. So the string a detector prints can be meaningless outside that one server. One merchant described this on their platform's own forum: the detectors all returned the name the file had been saved under, which told them nothing.
So when nothing public matches, "likely custom, or a child theme" is the truthful answer — and in the support threads where people ask this question, custom is usually what it turns out to be. That is a real answer to the underlying question, which is almost always can I buy this.
When a page loads assets from two different theme directories, the ordinary explanation is a child theme plus its parent, which is the pattern WordPress recommends for customising a commercial theme without losing the ability to update it. The tool flags that as likely rather than certain, because a plugin can also enqueue a file from another theme directory and produce the same appearance from the outside.
Plugin folders show up the same way, in the paths of any script or stylesheet they load. That catches the plugins that affect the front end, which is most of the interesting ones — a shop, a page builder, a forms plugin, a caching layer. It does not catch anything that works only in the admin area or entirely server-side, and it never will, because those leave nothing for a visitor to see. An empty plugin list means "nothing visible from outside", not "nothing installed".
This is the single most common complaint about tools in this category, and it is worth naming the causes because every one of them is fixable by the reader rather than mysterious. A user on the official WordPress forums put the frustration plainly: the site was obviously a WordPress theme, and every online tool they tried failed to identify it.
X-Pingback is absent by design. A detector treating that header as a requirement will decide the site is not WordPress.The tool handles the fourth case by reporting both layers rather than picking one. If a site runs a modern front-end framework and still exposes a WordPress API, each gets its own tile and its own evidence — a more accurate description of that architecture than either answer alone. The sixth case is reported as a thin response, not as an absence of technology, because the two are different findings.
If you are checking your own site and it comes back unidentified, that is usually good news about your hardening rather than bad news about the tool. Read the not-found list to see which traces you have already removed and which are still published.
Every honest diagnostic has an edge, and knowing where it is makes the results in the middle more useful rather than less.
Some sites refuse automated requests outright and answer with a 403. When that happens the tool says so and names the status, rather than reporting an empty result as though the site had no technology. If you are researching infrastructure at any scale, that refusal is itself useful information. It is also a pattern worth understanding before you start, and our guide to proxies for web scraping covers why a site treats some requests differently from others.
Every request this page makes identifies itself in its user agent, with a link back to this page, so any site owner reading their logs can see exactly what asked and why. At most two extra requests are ever made, and only when a first-pass signal already pointed at that platform. There is no sweep of speculative paths against a stranger's server.
A CMS detector reads a page the way a browser does and looks for traces the platform leaves behind: an asset path such as /wp-content/, a response header, a named cookie, or a generator meta tag. It cannot see your server, your database or your admin area. Everything on this page comes from one public request, and each result names the exact signal it rests on.
Usually because it looked for a signal the site removed. WordPress documents the single line that deletes its generator tag, and core only sends the X-Pingback header when pings are open — so it is normally absent on a home page. A detector leaning on either one reports nothing. This tool checks structural paths as well, and lists everything it tested so you can see which signal was missing.
This tool reports the theme folder name it found in the page source. Often that folder is a commercial theme you can buy, and often it is a custom build or a child theme with a name that means nothing outside that server. When nothing public matches, "likely custom" is the honest answer — and in most forum threads asking this question, custom is exactly what it turns out to be.
Because the folder name is what the page actually contains, and a theme's public title is not. One Shopify merchant put it plainly on the vendor's own forum: "I tried different detectors, but all I see is the name they used to save the file." Printing that string as if it were the theme's name is how detectors mislead people. This page labels it as a folder and lets you judge.
Partly, and only the ones that load something. Any plugin whose scripts or styles appear in the page source leaves its folder name behind, and those are listed. A plugin that only works in the admin area, or that runs entirely server-side, leaves nothing a visitor can see — so an empty list means "nothing visible from outside", not "no plugins".
A proxy answers on the site's behalf, and it can add or strip response headers before they reach you — Cloudflare ships rules for exactly that. When only a proxy signal comes back, this page says a proxy is in front of the site and no platform signal came through it. That is a different finding from "no CMS", and calling it "no CMS" would be wrong. Identifying the network the site actually sits on is a separate job, and a separate tool.
Because they lean on different signals, and vendors document how to remove most of them. A generator tag can be deleted, /wp-content/ can be relocated, Nuxt's asset folder can be renamed, and Magento's signed static path can be switched off. A tool that shows you which signal it used lets you settle the disagreement yourself instead of picking the answer you prefer.
No, and the omission is deliberate rather than an oversight. Searching both vendors' developer documentation turned up nothing that marks a page as theirs — no header, no tag, no required path — so there is nothing here that could be defended if you asked why. Competing tools will still put a name in the box. This one reports only what it can prove.
Once you know what a site runs, these answer the next questions about the same address.
Knowing the platform is the first half. The second is whether its security headers are set, and whose network is answering for it.
Last updated 27 September 2026 · every detection signal traced to the vendor's own documentation, quoted in full on each result