Open an older freeCodeCamp tutorial and the address bar gives the game away. The headline is clean. The article has been edited, formatted, illustrated. Then the slug ends in 12 characters of hexadecimal that mean nothing to any human being — a machine's fingerprint, left out in the open.
There are thousands of them. We pulled freeCodeCamp's entire declared sitemap on 29 August 2026 and counted every URL in it, and roughly a third of the articles still end that way.
The obvious move is to fix it. A readable slug shares better, reads better in search results, and costs an afternoon of redirect rules. Every tidy-up checklist in circulation would tell you to get on with it.
freeCodeCamp did not get on with it. The decision looks entirely deliberate, and the numbers underneath the site explain why leaving them alone was the cheaper choice.
Results at a glance
freeCodeCamp's sitemap declares 16,212 URLs, and every one of them sits under /news/. A third of the articles in it end in a 12-character hexadecimal string, the format Medium used to stamp on post IDs, and almost none of those URLs have been touched since 2019. They were inherited, and they were kept.
They were kept because they are worth more as they are. Only two sites in this series earn more referring domains per declared URL — calculator.net, which declares barely 200 pages, and Healthline — and those old addresses are where much of freeCodeCamp's link history points.
The tell in the slug
Medium gave every post a 12-character hexadecimal identifier and hung it on the end of the URL. Ghost, the platform the News site runs on now, does not: its own object IDs are 24 characters, and its slugs are words. So a 12-hex ending on a freeCodeCamp article is not a house style. It is a fossil, and it is easy to date.
We counted 4,193 of them among the 12,980 article URLs. That is not a sample and not an estimate: the sitemap index declares only 4 child files, so we fetched all 4 and counted every entry in each. Three separate downloads of the largest file hashed identically, which rules out the usual embarrassment of measuring a truncated response and reporting it as a total.
Links are why the URLs stayed
Here is the number that reframes the whole thing. Measured with our own Backlink Analyzer, freeCodeCamp earns 5.05 referring domains for every URL it declares. MDN, the reference every web developer opens daily, earns 3.9. Nothing else technical in this series comes close: GeeksforGeeks sits at 0.6, and every big marketplace we have measured sits below 0.32.
That density is the whole argument. A library averaging 5 citing domains for every URL it declares is not a library you rename on a whim. Multiply the caution by 4,193 and the maintenance question stops being cosmetic. Every one of those legacy addresses is a live target of somebody else's link, and redirects are a promise you have to keep forever.
Frozen since the migration
The legacy URLs are not merely old. They are still. Of the 4,193 articles carrying a Medium-style ID, 98% have a last-modified date of 2019 or earlier, and only 85 have been touched at any point since. Within that legacy set the two heaviest years are 2018, with 1,816 URLs, and 2019, with 791.
One caution matters here. A sitemap's lastmod is a modification date, not a publication date: it says when a page last changed, not when it was written. So the honest claim is that the legacy half of the library has been left untouched for years, not that it was all written in a particular year.
What that produces is a library with two temperaments: a working front of new tutorials with fresh timestamps, and a preserved back sitting on inherited addresses, returning HTTP 200, collecting links, costing nothing. Most publishers treat the second kind as debt. freeCodeCamp treats it as stock.
One sitemap, and it is news
Now the caveat that changes what all of this describes. freeCodeCamp's robots.txt names exactly one sitemap, and it is the News one. The address you would try first, the sitemap at the root of the domain, returns a 404. So does the index variant. There is no second tree hiding anywhere for a crawler to find by convention.
Which means 16,212 is the site's entire declared footprint, and it is the English News blog by itself. The curriculum — the interactive lessons most people know the name for — is served happily to anybody who visits, and appears in no sitemap whatsoever. The Spanish, Chinese and Portuguese News properties run their own indexes, and nothing points at those either.
This is the sort of gap that never announces itself. Nothing is broken, no page errors. Unless somebody deliberately compares what the sitemap declares against what the site actually is, the difference stays invisible for years.
A fifth of it is signposts
Something else falls out of the count. 3,222 of the 16,212 URLs — call it a fifth — are not articles at all. They are tag pages and author pages: the listings that group the library into topics and by the people who wrote it.
That is a real editorial position, not an accident of the CMS. It says a page collecting everything written about a single shell or framework earns its keep, and that a contributor deserves a permanent address of their own. The averages are modest — a shade under 5 posts per tag — which tells you these were cut fine rather than lumped into broad buckets.
Where the audit loses its points
Our Website Audit gives freecodecamp.org 74. Read the breakdown rather than the headline: the technical section is perfect, 67 out of 67, nothing dropped. The crawl plumbing — the robots handling, the status codes, the canonical behaviour, the mobile rendering — is faultless.
The losses are on-page and on speed. That is exactly the shape you would expect from a library of nearly 13,000 posts written by a large open community over years: the machinery is engineered once and holds, while per-page polish and page weight drift as the volume grows.
Copy this in an afternoon
None of this requires a migration. It requires knowing what you actually declare.
1. Read your own sitemap before you trust it. Fetch the file your robots.txt names, follow every child, and count what comes back. Then try the address at the root of your domain. If one returns pages and the other a 404, half your site is discovered by luck.
2. List the sections that appear nowhere. Write down your real site sections from memory, then tick off the ones the sitemap covers. The ones left unticked are your version of freeCodeCamp's curriculum: live, useful, and undeclared.
3. Find your legacy URL pattern. Every site that has migrated has one — a suffix, a date fragment, a numeric ID from the old CMS. Sort your URLs by it. If those pages still return 200 and still attract citations, the tidy-up you have been postponing is not a task, it is a risk.
4. Audit before you rewrite, not after. Check whether your redirects, canonicals and status codes already behave. Fixing slugs on a site whose technical layer is shaky is how a cosmetic change becomes an outage.
What you cannot copy
The unfair advantage is the 575 people whose names are on the author pages. That is who wrote this library — an average of roughly 22 posts each, hundreds of separate hands rather than one staff desk. It also explains the restraint: with that many contributors, nobody has the appetite to unilaterally rewrite thousands of addresses that other people's work already lives on. The conservatism that looks like neglect is what a shared archive feels like from the inside.
And here is what we could not check:
Our own backlink total does not add up, so we have not published it. The tool returned a total backlinks figure smaller than its own referring-domains figure and wildly out of step with its own dofollow and nofollow split. That is a defect on our side, not a finding about freeCodeCamp. We publish the referring domains and the split, and nothing else from that panel.
Every date in this article is a last-modified date. The sitemap carries no publication dates, so we cannot tell you when anything was written. A page edited once in 2019 and a page published in 2019 look identical to us.
The Medium attribution is an inference from format. A 12-character hexadecimal suffix is Medium's post-ID shape and it is not Ghost's, and the pattern is overwhelmingly concentrated in the oldest material. That is strong, but it is pattern-matching, not a statement anybody made to us.
We counted one sitemap tree, because there is only one to find. The non-English News properties each serve their own index, and nothing references them. We did not count those, and we cannot measure the curriculum at all, since it appears in no sitemap we could locate.
The audit is a single crawl on a single day. Scores move with page weight and third-party assets. Treat 74 as one reading, not a permanent property of the site.
freeCodeCamp's crawl layer is flawless and still declares only part of the site. Run the same check on your own domain: what the sitemap says, what robots.txt points at, and which sections are live but undeclared.
- Checks robots.txt, sitemap discovery and status codes
- Separates technical, on-page, speed and mobile scores
- Flags the critical issues before the cosmetic ones
Frequently asked questions
How many URLs does freeCodeCamp's sitemap declare?
16,212, and that is a complete count rather than an estimate. The index declares 4 child files, all of them were fetched, and every entry was counted: 12,980 posts, 2,647 tags, 575 authors and 10 pages. There were no duplicate URLs within or across the files, and no off-domain entries.
What exactly is the hexadecimal ending on the old URLs?
A 12-character hexadecimal string, which is the format Medium used for post IDs. 4,193 of the 12,980 article URLs end that way, or 32.3% of the articles. Measured against all 16,212 declared URLs rather than the articles alone, the share is 25.9%.
Do those legacy URLs still work?
Yes. A liveness probe of 15 URLs spanning legacy and modern article slugs, tag pages and author pages returned HTTP 200 across the board, and 4 sampled detail pages returned 200 with no redirects. The old addresses are the live addresses.
How stale are the legacy pages?
4,108 of the 4,193 legacy URLs — 98.0% — carry a last-modified date of 2019 or earlier, and only 85 have been modified since. Within that legacy set the two heaviest years are 1,816 URLs with a 2018 lastmod and 791 with a 2019 lastmod. Remember that lastmod records modification, not publication.
Why are a fifth of the URLs not articles?
3,222 of the 16,212 URLs, or 19.9%, are tag and author listing pages: 2,647 tags at an average of 4.90 posts each, and 575 authors at an average of 22.57 posts each. They are navigational surfaces that freeCodeCamp declares alongside the articles themselves.
What did the Backlink Analyzer report?
81,899 referring domains, a domain rank of 93, and a link profile that is 89.0% dofollow — 2,749,937 dofollow against 339,918 nofollow. Against 16,212 declared URLs that works out to 5.05 referring domains per URL. We are not publishing the tool's total backlinks figure, because it does not reconcile with its own split.
What did the website audit find?
An overall score of 74, with 1 critical issue, 4 warnings, 0 notices and 115 checks passed. The section scores were technical 67/67, mobile 2/2, on-page 22/25 and speed 25/29. The technical layer is perfect; the deductions are all in per-page detail and page weight.
Is the freeCodeCamp curriculum in a sitemap anywhere?
Not one we could find. robots.txt lists a single Sitemap line pointing at the News sitemap, while both the root sitemap.xml and sitemap_index.xml return 404. The /learn curriculum returns 200 to any visitor. The Spanish, Chinese and Portuguese News properties each serve their own sitemap index, referenced from nowhere we could see.
The lesson is not that ugly URLs are fine. It is that a URL's job is to keep resolving to the same thing forever, and once it has done that for years, its appearance is the least valuable thing about it. freeCodeCamp inherited thousands of addresses it would never have chosen, and decided the citations attached to them were worth more than the tidiness of replacing them.
The more useful lesson is the one nobody set out to teach. A site can have a flawless technical layer, a perfectly formed sitemap, no duplicates, no pagination faults — and still declare only one part of itself, because the file that lists everything was never asked to list the rest. Crawl quality and crawl coverage are separate problems, and only one of them announces itself when it goes wrong.
Worth 20 minutes on your own domain: fetch the sitemap your robots.txt names, count what is in it, then write down what is missing. The free Website Audit checks sitemap discovery, robots handling and status codes in the same pass.
Measured on 29 August 2026. The URL census is a complete count, not a sample: the sitemap index at /news/sitemap.xml declares 4 child files, all 4 were fetched with a browser user agent, and every entry in each was counted and de-duplicated. An independent recount reproduced the total exactly, and repeated downloads of the largest file hashed identically.
Link and audit figures come from the UNmiss Backlink Analyzer and Website Audit, run against freecodecamp.org on the same day. Backlink data reflects a third-party index and is a snapshot; the tool's total backlinks figure is withheld because it does not reconcile with its own dofollow and nofollow split.