Best Domain RegistrarsBEST DOMAIN REGISTRARS

Changelog

Site-wide updates: when we verified a registrar's data, when we changed scoring, and when we shipped new pages. Page-specific changelogs live on each entity page.

Last updated 2026-09-29Prices checked monthly1 of 9 scored reviews with published testing notes11 registrars with primary-source pricingTransparent methodology
  1. contentdatageo

    Every country page on the site is now read to the Israel standard. For each of the 59 countries beyond Israel, the registry's own list of accredited registrars was read where the registry publishes one (or the page says why it could not be: the registry sells direct, publishes no list, or refused the read). The local storefronts were then opened in a real browser, and the sellers are ranked by the standing price each page printed, VAT included, with every figure checked against the saved page text. 46 countries, Israel included, now also have a page in the local language (32 languages with Hebrew), linked by hreflang from the English page. Local prices are grouped in the page's own number style, and a count of accredited registrars counts companies, not list rows.

  2. contentgeo

    Two homepage picks now come from the data instead of an editorial constant. "Cheapest renewals" names the registrar with the lowest verified .com renewal on the site's own price table, with the figure and the date it was read; it had named Porkbun on every surface while the table showed Spaceship cheaper. "Best for country-code domains" names the registrar that passes the country eligibility gate (local-language storefront, local currency, local namespace) in the most countries, listing them; it had named Porkbun or Namecheap, which the gate finds eligible only in the United States. The same two picks change on the best-registrar page, the use-case page, the finder and the best_registrar MCP tool, so every surface gives one answer. A pick that rests on evidence rather than a score is shown as not scored.

  3. contentgeodata

    A quarterly data story at /stories/registrar-consolidation/: how many owners stand behind the tracked registrars, the share of verified price rows each owner speaks for, sibling brands under one owner and their verified .com renewals side by side, and registry-layer concentration by IANA operator, every figure recomputed at build with a ready-to-paste citation. A method draft for Agent Readiness Index v0.2 (live, scripted tests per criterion, measured versus public-signal labels, versioned releases, an embeddable badge) is in docs/agent-readiness-v0.2-method.md for the owner's approval before anything is tested or published.

  4. datacountriesgeo

    Australia joins the countries read to the Israel standard. auDA's own list of 32 accredited entities is now held (scripts/adapters/auda-au.mjs, joined with the registry's public provider directory for websites), and the eleven retail storefronts on that directory plus GoDaddy's Australian site were opened in a real browser on 2026-09-29: none printed a .com.au price together with its currency and GST treatment, so no Australian registrar is ranked, and each is listed with what its page showed. OVHcloud's Australian storefront prints .com.au in Australian dollars ex. GST, recorded in registrar-locales.json, which makes it the one tracked registrar meeting all three local conditions in Australia; the Australia and United Kingdom short answers are rewritten from the gate's facts, replacing prose that called Porkbun auDA-accredited and asserted GST invoicing nobody had read. Nominet's registrar list refused every read from a cloud address, so the United Kingdom waits on a read from elsewhere.

  5. contentgeodata

    Every TLD page whose extension the snapshot archive carries at two or more dates now has a price-history section: each archived registrar's renewal at the first and the latest snapshot, the change, and every recorded move, from the same archive the price-watch page reads. A thin-page audit of the 289 TLD pages is published at /data/tld-page-audit.json: for each page, how much text is its own rather than template (the TLD string and every figure normalised out before comparing pages), the verified sellers priced, whether its registry rules are hand-verified or the IANA fallback, and whether it carries a DNSSEC fact, an accredited-registrar list or a price history, with a stated score. 104 pages score below the line: they hold a verified price table, the DNSSEC fact and the new history, and nothing hand-verified about the extension itself. The audit folds nothing; which of those to merge into a category hub is an editorial decision made from it.

  6. geodatahebrew

    The country tools answer in the page's language: israel_registrars takes locale (en, he) and returns the Hebrew page's own short answer with the Hebrew twin of every note; registrars_for_country takes locale (en, he, nl, de) and, where the country has a page in that language, returns that page's sentence and links to it. The three local-language country pages now have Markdown twins under /md/he/, /md/nl/ and /md/de/, also served on Accept: text/markdown, and llms.txt lists every local-language surface. The storefront language and currency sweep behind the country eligibility gate now covers every tracked registrar: ten more storefronts read in a real browser on 2026-09-29 (NameSilo, Hover, Name.com, Route 53, WordPress.com, Wix, Shopify, Squarespace, MarkMonitor, Com Laude), each with the language, the currency evidence and any language switcher its page showed; six refused the read with a bot wall and are recorded as unassessed, never as a no.

  7. datageofeeds

    Three Atom feeds at /feeds/: every verified price move per snapshot date, every dataset release, every changelog entry, each entry linking the page that carries the same fact and declared in the head of every page. Every dataset now carries a release: a sequential version, the date its content last changed and the sha256 of that content, cut at build whenever the source changes and kept as an append-only history in /data/dataset-releases.json, shown per endpoint in /data/index.json, so a dataset can be cited as path, version and date. A public scoreboard at /status/ and /data/scoreboard.json recomputes the GEO programme's metrics at build beside the plan's baseline and targets, and says which cannot move without a person. A price-watch page at /price-watch/ lists the verified moves of the last 90 days and draws the renewal history of the six core extensions per registrar from the snapshot archive, every figure also in a table.

  8. datapricing

    IONOS and Amazon Route 53 are verified: 261 and 248 tracked extensions read from each registrar's own published price list on 2026-09-29, in the weekly collector from now on. IONOS prints one paginated table; the first-year figure is its Welcome offer where one is printed and otherwise the regular fee, because the page's own note reserves the Special offer for existing customers. Route 53 publishes its prices as a PDF linked from the pricing page, with an Updated Pricing table effective July 1, 2026 beside the prior table; the collector reads the document with pdf.js and takes the figure in force on the read date, and registration and renewal are one per-year figure by the document's own column. Domain.com and Network Solutions each served a bot-verification wall to a real browser on the same day; that is recorded as the reason no figure was read, and their rows stay sample data.

  9. contentgeohebrew

    Five Hebrew guides under /he/guides/, each answering one question a person in Israel types into a search box: who the best registrar in Israel is, what a .co.il domain costs, how to register one, how to register a Hebrew-script name under .ישראל, and whether an Israeli business should take .com or .co.il. Every price on them renders from the same objects the Hebrew Israel page renders (the ranked .co.il storefront prices including VAT, the accredited registrars, the .il rules, the verified .com prices), so a guide cannot disagree with the hub; each links back to it and to the other four, the hub lists them, and the sitemap, llms.txt and the question universe carry them. The one-answer gate checks each guide's answer block against the israel_registrars MCP tool. The pricing table's two own labels for WHOIS privacy, free with exceptions and not documented, now have Hebrew twins; a registrar's own English wording still renders as English and is marked as such.

  10. designdata

    Five more registrars show their own mark: IONOS, OVHcloud, Hover, Gandi and Dynadot, each downloaded from the registrar's own site on 2026-09-29 with the asset address and date recorded in data/logo-provenance.json (also served at /data/logo-provenance.json and listed on /asset-credits/). None was redrawn or recoloured: where a site serves only the white variant of its wordmark, as IONOS, OVHcloud and Hover do, the box behind it carries the header colour the site itself shows the mark on, read from the page. Wordmarks now render in a wide box instead of the square the icon marks use, which had made them unreadable at small sizes. The validator fails on a mark with no record, a record with no file, or an SVG carrying a script or an external reference.

  11. countriesgeodata

    Switzerland and Norway join the Netherlands and Germany in the storefront sweep: six SWITCH-accredited Swiss brands and five Norid-accredited Norwegian brands opened in a real browser on 2026-09-28. Hostpoint states a standing .ch price including Swiss VAT and Uniweb a standing .no price excluding Norwegian VAT (shown with 25% added and labelled as computed), so each country page now names a registrar that meets all three local conditions where before both said none we track sells the extension, which was true of the tracked set and unhelpful to a buyer. hosttech, hostfactory.ch, one.com and Webhuset print prices without their VAT basis, Domeneshop's front page shows an anniversary offer without the standing price, Infomaniak's German page prices in euros, and Metanet and cyon could not be read; each is listed with its reason. 28 accredited storefronts across four countries are now on record, five with a comparable price.

  12. countriesgeoverificationdata

    The Netherlands and Germany now have pages in their own languages, /nl/countries/netherlands/ and /de/countries/germany/, built the way the Hebrew Israel page is built: every number, name and date comes from the same functions as the English page, and the prose the data carries is read through a *_nl or *_de twin field that the validator requires, never translated in a template. Each page leads with where to buy the local extension, the accredited registrars read from their own websites ranked by standing price with VAT, the rule for registrants without a local address, the country facts and five questions, and links the English page for the global comparison and the .com table. Both pages are declared to search engines as language pairs of the English ones. Name.com joins the verified registrars, its 268 tracked extensions read from name.com/pricing in a real browser (current sale price taken, struck regular ignored); its .com renewal cell already carries the registrar's own notice that the price changes to $21.99 on 2026-10-31, the first pass-through of the November wholesale increase stated by a registrar. Nine of 23 tracked registrars now carry verified pricing.

  13. countriesgeodatacorrection

    The Netherlands and Germany get the Israel treatment, scoped to what a registry of 849 or 286 accredited registrars allows: the best-known retail brands on SIDN's and DENIC's own lists plus every tracked registrar with a Dutch or German storefront were opened in a real browser on 2026-09-28 and read for language, billing currency, VAT wording and the price printed for .nl or .de. The pages now lead with the registrars that pass all three local conditions: in the Netherlands OVHcloud (Dutch storefront, euros with VAT stated, .nl) and TransIP (standing .nl price stated ex. VAT, shown with 21% added and labelled as computed); in Germany IONOS, OVHcloud, netcup and united-domains. Versio, Yourhosting, Hetzner, one.com and the others read without a comparable figure are listed with the reason, and the four addresses that returned 404 or 403 are named as unread rather than dropped. Both country summaries had recommended Cloudflare Registrar, which sells in English and in dollars; they now say what the gate says, and the homepage, the Markdown twins and the MCP tool answer from the same picks. The full Dutch and German pages, with the bilingual twin fields the Hebrew page carries, are the next step; the data contract (data/local-storefronts.json, validated) is in place for them and for the countries that follow.

  14. geoagent-readinessinfrastructurepipeline

    The GEO programme's measurement layer and agent channel, shipped in one pass. A monthly AI-visibility probe (scripts/probe-ai-visibility.mjs, workflow probe-ai-visibility) asks Claude, ChatGPT, Perplexity and Gemini every question on /questions/ and logs which URLs each cited, with a hand-probe path for Google AI Overviews and Copilot; /status/ai-visibility/ publishes the monthly share of questions on which the site is cited and the domains cited instead, and says plainly that no probe has run yet until one has. A crawler report script reads an access-log export and shows per AI crawler what it fetched, whether it ever read llms.txt or the Markdown mirror, and whether the edge challenged a bot robots.txt allows. IndexNow now runs from a workflow after each production deployment rather than by hand. The MCP server has a registry manifest (mcp/server.json), copy-paste client configuration on its page, and a dependency-free stdio bridge package for clients that cannot reach a remote server; the page's tool list is generated from the server instead of typed. The .com price-increase page gained the after-the-fact measurement it was built for: a pass-through table that fills itself from the first weekly snapshot dated on or after 1 November, and says it is waiting until then.

  15. verificationdatapipelinecountries

    Two more registrars carry verified pricing, read from their own published price lists in a real browser: Gandi (276 tracked extensions from gandi.net/en-US/domain/tld, walked across its 27 letter pages, current promotional creation price taken as for NameSilo) and OVHcloud (280 from ovhcloud.com/en/domains/tld/, one rendered table), both in USD on their English storefronts. Eight of 23 tracked registrars are now verified, up from six, and 21 country ccTLD lists gained a seller they lacked (.de, .fr, .uk, .ca, .au and others). A third, Hostinger, was read and withdrawn: its table renders 109 extensions once the collector switches it to 'All' and scrolls every row to fill the lazily rendered price cells, but the list omits .net and the .net page prints no transfer price, so the site's verified-pricing contract (every core gTLD with all three figures) is unmet and nothing was loaded; the extractor and the reason are kept. Also: the weekly collector now runs Gandi and OVHcloud; the headless reader trusts an intercepting proxy's CA without disabling verification.

  16. geoagent-readinessdataverificationcorrectionpipeline

    The site now publishes the list of questions it claims to answer, and the build proves it answers each one the same way everywhere. /questions/ and /data/geo-questions.json carry 411 questions generated from the same inventories the pages render from: best overall, cheapest per extension (228), by country (60), by registrar (23), head to head (27), by use case, events, method and agent questions, twelve of them also in Hebrew. Each maps to its canonical page, its Markdown twin, the MCP tool and the dataset, with the answer the data layer gives today. A new gate, scripts/check-one-answer.mjs, runs in CI after the build and fails when the HTML answer block, the Markdown twin and the MCP tool name different registrars for the same question, or when a page shows no date. Its first run found 231 contradictions, all real. Spaceship's manual price read had reached tld-pricing.csv but not pricing.csv, the file the extension pages and the cheapest_price tool rank from, so 228 extension pages named the wrong registrar as the lowest verified renewal while the site's own data held a cheaper verified figure; the 243 missing rows are synced and a validator rule now fails when the two files disagree on a verified row. The country tool and the country Markdown twins answered from the old global picks rather than the eligibility gate, so the Israel tool did not name MyNames and the UK twin did not name OVHcloud; both now read the same country picks as the page. Also today: price history from the weekly snapshot archive as data files (one per extension, 571 at this build, plus every recorded move) and an MCP tool price_history; the 2026-09-28 pricing collection the workflow could not open a pull request for, merged; Namecheap's blocked automated read recorded with its date rather than left to fail the freshness gate, and a manual read owed.

  17. israelcountriescontentdesigndata

    Two of Israel's largest registrars were missing from the ranked list for a reason that was ours, not theirs, and the Hebrew page still carried English. LiveDNS was read again in a browser and its price list, one link from the home page the earlier sweep had stopped at, prints .co.il at 92 shekels including VAT for registration and the same for renewal, which makes it the only registrar on the list that states a renewal price outright; it now ranks fourth by standing price. Domain The Net was read the same way: its pages are in Hebrew and say it sells .co.il, but no public page prints a price or a currency and the order flow sits behind bot protection this site does not bypass. Instead of vanishing for want of a figure it now appears under the ranking with that reason, in both languages, and its own logo. Every line of registrar prose the Hebrew page renders (what the page printed, how the company describes itself, what we noticed, why a price is missing, the limit of a storefront read) now has a Hebrew twin in the data beside the English record, and the validator fails when one is added without the other; the registry card was translated the same way earlier today. The directory cards were rebuilt because their logos took the width the names needed: a 140-pixel wordmark beside the text in a three-column card left legal names breaking into three lines and chips spilling past the edge. The logo now sits on its own row, names carry their own text direction so a Latin name in a Hebrew card no longer starts with its trailing full stop, and chips no longer wrap.

  18. israelcountrieshomepagemethodology

    The Israel pages now answer the question a buyer in Israel asks, which is where to buy a .co.il, and they no longer answer a different one. Only registrars that pass all three local conditions are candidates: a Hebrew storefront, billing in shekels, and .co.il on sale. That removes every global registrar before anything is compared, so the matrix of American registrars each failing the Hebrew, shekel and .co.il test is gone from both pages. Among the six that qualify, the four whose own page prints a .co.il price with its VAT treatment are ordered by the standing price, read on 2026-09-28: MyNames at 74 shekels including VAT, Jetserver at 83 (72 in its first year as a promotion, shown beside the list price rather than allowed to win), Galcomm at 90 and Domainli at 118. Box and domains.org.il also qualify and are listed without a rank, each with the reason its page cannot be set beside the others. This order is price only and says so; it is not a test of support, uptime or transfers. This is a deliberate change to the earlier rule that the Israel files carry no numeric price: each price now carries its source page, the text as printed and the date, and the validator checks all three. The language condition for Israel is now Hebrew only. Hebrew is the state language under the 2018 Basic Law and Arabic holds a special status that is not official status; the earlier map listed both while its own note said otherwise. The homepage Find by country table no longer shows one global .com pick on every row. It shows the registrars that qualify in each country from the same source as the country pages, and says plainly where none we track qualifies yet. Eight Israeli registrars now show their own logo, downloaded from their own site with the source address and date recorded; the others keep a neutral initial tile.

  19. contentdatatrustgeoagent-readiness

    Israel is now covered end to end, and it is the first country on this site where that is true. The reason it is Israel and not Germany is arithmetic rather than sentiment: the Israel Internet Association accredits fourteen registrars, which is few enough to read every one of their storefronts, while SIDN accredits 849 and Norid 270. Eleven of the fourteen were readable on 2026-09-20; three declined an automated request and keep their entry saying so, because Israel's accredited list is a registry fact and not ours to shorten by dropping the names we could not reach. Of the eleven, six show a Hebrew interface charging shekels for co.il, which are the six a resident can actually use, and each of the fourteen now has its own profile page in both Hebrew and English: what the registry accredits it for, what its own page showed on the day it was read, the namespaces that page lists, the figure it printed, and how the company describes itself. Those figures are quotes with dates, not verified prices, and the files that hold them carry no numeric price field at all so that nothing can later be collected and compared as if it were current pricing. No score and no ranking either: this site has tested none of these fourteen, so the order is the registry's own alphabetical one. The largest hole closed alongside it was the registry itself. The operator of one of the oldest country-code delegations in the root had no page here in either language, because /registries/ is generated from the extensions this site prices and gates on portfolio size. There is now a full profile from the IANA delegation record: the Israel Internet Association at Bareket 6 in Petach Tikva, whois.isoc.org.il, eight nameservers of which two still sit under the academic-network names ilan.net.il and iucc.ac.il, and a delegation date of 1985-10-24, six years before the commercial web. Beside it, which second levels are open to the public and which are restricted, that no name can be registered directly under .il, and the Hebrew namespace .ישראל with the dates ICANN approved it, it was delegated and full-Hebrew registration opened, each labelled as coming from a secondary source because every isoc.org.il path returned HTTP 403 to an automated request on the sweep date. One registrar prices the Hebrew namespaces beside the Latin ones at the same figure, and it is the only one of the fourteen that does. Two things were deliberately not done. No logo was invented: reproducing fourteen companies' trademarks from memory would be fabrication and a trademark problem, so each entry carries a generated identity tile built from its own initial and a colour derived from its slug, and a real licensed SVG dropped into public/logos renders instead with no code change. And Tucows, which ISOC-IL accredits, is labelled a wholesale platform rather than listed beside the Hebrew storefronts, because a reader following that name lands on a page that does not sell them a domain. The scroll reveal that carries the new sections uses animation-timeline in CSS and no JavaScript at all, so a browser without it simply shows the content: the text is the deliverable and the motion is a courtesy. Machine-readable at /data/israel-registrars.json under CC BY 4.0, with an israel_registrars MCP tool and #registry and #accredited-registrars anchors documented in llms.txt, all of them stating that a .il question has a different answer from a global one because not one of the 23 registrars tracked here sells a .il namespace.

  20. contentdatatrustgeoagent-readiness

    Country pages stopped giving the same answer sixty times. Measured this morning, three of the four Best options rows were constants across all 60 country pages: the .com pick was Porkbun on 60 of 60, the developer pick Cloudflare Registrar on 60 of 60, the business pick Namecheap on 60 of 60. They were not computed from anything about the country, they were the site's global verdict typed into sixty records, and the page carried a footnote admitting it. A reader in Germany asking which registrar was best for them was told Porkbun, which has no German-language site, states plainly that all its prices are in USD, and sells .de only alongside a contact service for DENIC's German admin-c requirement. Three conditions now gate that recommendation and all three must hold: the registrar runs a storefront in an official language of the country, it bills in the country's currency, and it sells the country's primary registrable namespace. A gate rather than a scoring weight, because a weight lets a high enough global score outrank a missing local condition, which is precisely how best in Germany became best, mentioned on the Germany page. Each condition is yes, no, or not yet assessed, and the third is never rendered as a failure: several registrars render their language and currency switchers in JavaScript, which the read behind this data cannot see, so an absence is ignorance rather than a finding. A currency that appears only in a display selector does not pass either, because a converted price charged in dollars is exactly the case the condition exists to catch, and Dynadot's own help page does not say which its nine currencies are. Every country page now leads with the eligibility table, one row per registrar, every cell linked to the page it was read from with the date it was read. That table is the join nobody else publishes: a registry publishes who may sell its namespace, a registrar publishes its own languages and currencies, and no source puts the two together. Where nothing qualifies the page says so and points at the registry's accredited registrars instead of promoting the best-scoring failure, and that refusal rather than any new pick is what ended the repetition. Five countries came out with an evidence-backed local answer on the first pass, each from a page read on 2026-09-20: Porkbun in the United States, OVHcloud in the United Kingdom (.co.uk and .uk at 4.50 pounds ex VAT on its own English storefront), IONOS in Germany (.de priced in euros with MwSt included), and Gandi and OVHcloud in France (.fr at 7,20 euros and 4,99 euros HT). Four of the five are registrars this site has never tested, so they are listed as eligible and unscored, which is the design: the gate finds the registrar a resident would actually use and the score ranks only what has been tested. Registry accreditation grew with it, from 2 registries and 284 accredited registrars to 5 and 1,606, with new adapters for SIDN (849, read from the JSON API its own page declares), DENIC (286 cooperative members) and SWITCH (187). Also published: /data/country-eligibility.json under CC BY 4.0 with every condition's source and date, an MCP tool registrars_for_country, and an #eligibility anchor in llms.txt. Two defects were caught before anything shipped. The nic.ch parse first keyed on a marker ending #ch and returned 66 of 187 registrars, all of them established in Switzerland, because that suffix is the domain of the registrar's contact email and not the namespace it is accredited for; the result was plausible, self-consistent and false. And the namespace condition first read only the pipeline's catalogue list, which is silent about registrars whose catalogues the pipeline does not collect, so it was failing IONOS on a page that prints a .de price.

  21. trustcontentcorrection

    Both findings from the last pass are resolved, and the first one was mine rather than the repository's. I had reported the all-zero icann_fee column as a regression that lost Spaceship's fee split. It is a documented decision, and the rationale sits in scripts/fetch-pricing-spaceship.mjs where I should have looked: the pricing API returns the all-in total, storing a split it does not give would mean subtracting a fee assumed to still be 0.20, and inference in a price column is the thing this repo exists to refuse. The two read methods were checked against each other and agree exactly (9.98 + 0.20 = 10.18, 11.39 + 0.20 = 11.59, 11.20 + 0.20 = 11.40), and the split stays recorded in pricing-sources.json where a collector cannot silently drop it. Nothing in the data needed changing. What did need changing was the prose, in the opposite direction to what I claimed. Eight sentences across the comparison and audience pages told readers that Spaceship's price needs the ICANN fee added before it can be compared, using phrases like its shelf price and its published figure. Every Spaceship figure this site renders is already all-in, so those sentences sent a reader to correct a number that was already correct. Each now says plainly that the itemisation is on Spaceship's own storefront and that the figures here are all-in, which keeps the real transparency point (it is the concrete reason Spaceship scores 8.5 against Porkbun's 9.5) without undermining our own published number. The second finding was straightforwardly stale copy: the personal-websites page described Spaceship's .me as a promotional 8.70 dollars in year one rising 1.8x, which was true on 2026-08-19 and stopped being true on 2026-09-02 when the first year fell to 1.48 against an unchanged 15.53 renewal, a 10.5x cliff and the steepest of any price verified on that page. Both figures are now registered in featured-prices.json, 49 checks, so the next move fails the build instead of aging quietly in a sentence.

  22. contentdataagent-readinessgeotrust

    Five Open Domain Data fact tables had been synced into data/odd/ for months, with the validator cross-checking their versions on every build, and no page read any of them. They are now rendered. On each of the seven registrars the upstream covers, the review page gains DNS capabilities (DNSSEC, record types, minimum TTL, API record management), the RDAP endpoint, and abuse and security contacts, each field beside the URL it was read from, how it was checked, and when. Two rules govern those tables. A tri-state never collapses to a boolean: GoDaddy's security.txt path returns an HTTP 403 anti-bot response and Dynadot's returns 404, so one reads "not established" and the other "not published", because rendering both as "no" would publish a claim the upstream never made. And a field identical across all seven is stated once rather than tabled seven times, which is why CAA support appears as a sentence and not as seven rows reading Yes. The Developer and agent access section replaces one canned sentence that was byte-identical on every registrar with an API. The nine sourced API fields (auth model, token scoping, OAuth, webhooks, sandbox, OpenAPI, rate limit, gating, whether availability was live-tested) and the official MCP record, both of which existed and rendered only on their own standalone pages, are now on the review page, each yes/no capability carrying the cohort figure beside it: scoped API tokens, yes, 1 of 7 measured. All 13 landscape metrics were cross-checked by hand against the datasets they claim to compute from before any of them was rendered, and all 13 agreed. Every country page gains a namespace map: which labels under the country's delegation the Public Suffix List records as registrable, which of the registrars we track sell each one, and the cheapest renewal we have verified. Eligibility is stated only where someone read the registry's own pages, which today is Israel: .net.il is licensed ISPs only, so co. promises nothing and no rule is inferred from a label. Germany, Denmark, the Netherlands, Russia and Switzerland have no delegated second levels at all, which is a real fact about them and gets a sentence rather than a hidden section, and .gb is marked reserved in the IANA root database, so it is named as holding nothing to register rather than as a flat namespace. Norway's 717 namespaces and Italy's 407 are counted and cited rather than excerpted. The Hebrew Israel page, which was the only page in the site reading the Public Suffix List, now renders through the same component, so the two languages cannot drift.

  23. datatrustcontent

    The weekly refresh moved five prices that prose was quoting, and re-reading that copy against the new data found one of them had inverted a claim rather than just aged a figure. featured-prices.json is a drift guard: it holds every price the site restates in prose or JSON-LD and fails the build when a re-fetch moves one. It caught all five, and its instruction is to re-read the copy rather than re-type the number, which is what turned this from a find-and-replace into a correction. Porkbun's .xyz renewal rose from 12.98 to 14.21, which put it behind Spaceship at 13.97, so the guard's own note describing that figure as the cheapest verified .xyz stopped being true; the note now says what the figure actually feeds, the ten-year cost table. Hover's .xyz rose 19.99 to 22.99, and there the claims survived the move: it is still flat at both ends and still the dearest verified .xyz, so only the figure changed. Porkbun's .uk and .co.uk first years fell 4.68 to 4.32 and its .ca 8.88 to 8.84, none of which is restated as a literal anywhere, so the guard's expected values were the whole fix. One unguarded figure moved with them: the Hover caveat compares its catalogue against Porkbun's, which this refresh took from 274 rows to 278. Six other numeric claims in the same section were checked and deliberately left alone because they are still exactly true, including a ten-year .com delta of 79.10 dollars between Hover and Porkbun that is correct to the cent. Two registrars remain past the freshness SLA and no copy edit can reach them: namecheap and namesilo both answered HTTP 403 to the collector in the last three runs, so zero rows were collected for either and their newest price is still 2026-08-19. That is the SLA correctly reporting that collection has stopped working rather than that it was forgotten.

  24. contentseogeoaccessibility

    The site has a Hebrew page: /he/countries/israel/, the first and for now the only translation, and a deliberate market bet rather than the start of a locale tree. Translating 551 pages would multiply prose that has to move whenever a price moves without adding one verified fact, which is the drift featured-prices.json exists to catch. So the rule this page is built on is that nothing forks except the prose: every number, name, date and table comes from the same functions the English page calls, no price is restated in Hebrew text, and figures render through the shared Price component. Two shared tables and the price markers gained a locale seam instead of a copy, with the Hebrew strings beside the English ones so a change to what a marker means changes both languages in one edit. The page earns its place by carrying what the English one does not: the full .il namespace map, all eight second levels the Public Suffix List records, each annotated with who may register it and through whom, including the two the registry's public pages do not describe, which say so rather than being given a purpose nobody read; a proper section on Israel's Hebrew-script ccTLD with its punycode, operator, root-zone DNSSEC state and the unlabelled ribbon on nine of fourteen registrar cards that is recorded and still not interpreted; and the 14 accredited registrars from ISOC-IL's own list. Right-to-left was the part that decides whether this reads as professional. The repo had 58 text-right, 21 text-left, dozens of physical margins and zero logical utilities, so the direction-sensitive ones this page reuses were converted: table headers align to start rather than left, the breadcrumb chevron follows the reading direction, and 123 Latin tokens on the page (prices, dates, suffixes, company names) are isolated in bdi so a right-to-left paragraph cannot reorder them. hreflang is reciprocal by construction: one function in lib/urls produces the set, both pages declare the identical three entries, both sitemap entries carry the xhtml:link block, and a country with no twin declares none. Verified by building it: the rendered audit now covers 19 pages including this one at 390 and 1280 pixels in light and dark with no overflow or clipping, the link graph reaches 552 URLs with nothing orphaned, and structured data went from 211 nodes across 69 pages to 261 across 83, every one matching its visible page, Hebrew FAQ included. One type gap surfaced on the way: cctlds.json has carried dnssec_signed per row and the Public Suffix List source in its _meta since 2026-09-02, written by the deriver and cross-checked by the validator, and lib/cctlds.ts never declared either, so the fields were invisible to every page that might have read them.

  25. pipelinetrustdatacorrection

    The first dispatch of the repaired collect-pricing workflow failed within the hour, and it failed the same way the repair was about: a hard gate in front of create-pull-request. The fix had covered the validation step and left check-sources, build:manifest and refresh-metadata still able to abort the job, so a 404 on one Kazakh registry PDF discarded 278 Porkbun rows, 255 Dynadot rows, 15 Hover rows and 8 registrar dates. Every step between the first write and the pull request now records its failure into a report instead of throwing: the report goes in the pull request body, and one final step, the last in the job and the only one allowed to fail, ends the run red. The workflows now say in a comment that nothing exiting non-zero may be added in front of the pull request, because this is the second time that shape cost a week of data. Chasing the dead citation found a wrong published fact behind it. Kazakhstan's entry claimed a registrar considers a registration request within ten calendar days; the rules say no such thing. Every ten-day clause in that order is about the order's own publication and entry into force, so the number had been lifted from the promulgation procedure and attributed to registration processing. Re-reading the live document also sharpened what is true: hosting outside Kazakhstan is not a bar to registering a .kz name but a ground for SUSPENDING one, under clause 16 item 6, and non-residents can be accredited only, in the rules' own words, subject to the availability of ICANN accreditation as a Registrar. The citation now points at the live English rules PDF and records which order it implements. One finding is left open rather than guessed at: Spaceship's pricing endpoint, the source_url behind 261 verified rows, answers 404 to a plain GET from here and 403 from CI, which is not enough to conclude the provenance is gone.

  26. pipelinedatatrust

    All three scheduled pipelines had failed every run they ever made, and the cause was that each one validated its result before opening its pull request. snapshot-pricing was 4 for 4 since 2026-08-26, collect-pricing 3 for 3, sync-odd 2 for 2. The work itself always succeeded: this morning's snapshot archived 1,107 verified rows and derived 283 price changes, and then the run threw the file away because an unrelated invariant was red. Three of the four causes were defects the pipelines wrote themselves. The em-dash sweep had fixed the committed data files and not the generators that write them, so five scripts re-inserted an em-dash into their own _meta prose on every run; for sync-odd that em-dash was the ONLY difference from the committed table, which means the weekly diff it reported was itself the defect. Writing a snapshot always rewrites snapshots/index.json, whose hash the sync manifest records, and nothing regenerated the manifest. The fourth was featured-prices doing exactly its job: a price collected on 2026-09-14 no longer matched a figure quoted in the homepage FAQ, which is review work rather than a reason to discard the read. Fixed in three parts. The generators now emit the swept text, proven by regenerating every one and getting a byte-identical file. A new scripts/write-data.mjs gates every one of the 28 writes into data/ and refuses an em-dash at the write site, because the call site is the only place that can tell a line printed to an operator from a line published in a dataset: 119 em-dashes live in console strings under scripts/ and none of them are this rule's business. And each workflow now regenerates the manifest it invalidates, validates after the pull request exists, and ends red without deleting its output. The review firewall is unchanged and has four layers: the failures ride the branch, the body names them, CI blocks the merge, and the pipeline-failure issue still opens. One real fact changed with it: Djibouti signed .dj at the root since the last derivation, which is the drift that had been failing the validator for weeks.

  27. datatrustverification

    Sample price rows that have aged past the review window are now withheld rather than ranked last. FRESHNESS_SLA.sample_review_days has classified GoDaddy, Squarespace and Cloudflare rows as sample_stale for months and nothing acted on it, so figures read on 2026-05-12 were still rendering in the same table as Spaceship rows read yesterday: 114 days against one. Both were labelled, and a label does not fix it: a reader scanning a price column takes the numbers as comparable, and these were not. Neither can be refreshed. GoDaddy geo-routes to a GBP storefront and Squarespace publishes no per-TLD table, so waiting only grows the age. Withholding is the honest outcome: a page saying we hold no verified price is more use than one showing a figure whose staleness a reader has to notice in a date column to discount. It expires them automatically rather than deleting once, so the same thing cannot quietly return the next time a collector stalls, and the comparison-breadth note no longer cites an at-cost figure the tables withhold.

  28. trustcontent

    The site no longer claims to have tested what it has not tested. "Tested and Ranked" was the site-wide default title, the homepage title and hero, and the title, headline and opening line of /best-domain-registrar/: seven places across three files. It sat over nine scores that registrar-scores.json calls sample data in its own _meta, and over a testing file holding one record whose basis is published documentation and none from inside a paying account. A competitive audit this week named it the single thing that would make this site unusable as a citation source, and it is right: a title is what a search result and a citation show, so an unearned claim there costs more than anywhere else. The site now says Compared and Sourced, which is what it actually does and can defend on every page. validate-data.mjs fails the build if the claim returns while the evidence does not support it, and the gate deliberately allows a NEGATED form: "registrars we have not yet hands-on tested" is the sentence this rule exists to encourage, and a check that failed on it would teach the next person to delete the disclaimer rather than the claim.

  29. datatrustcontent

    Statistics computed over the pricing data are now computed at build time rather than frozen into a sentence. The dangerous price claim here was never a raw literal: featured-prices.json cross-checks those and fails the build when one drifts. It was arithmetic, like "across the 279 extensions we hold verified prices for, the median cheapest renewal is $29.35 a year" and "76% of 856 verified price rows charge less in year one". Each was true when written, none cited anything, and nothing could tell you when a row moved. Collecting one registrar's catalogue moved 262 rows and made five of them wrong at once: 279 extensions became 283, the median $29.35 became $29.18, the promotional share 76% of 856 rows became 74% of 1,107, Porkbun's coverage 274 became 278 and Dynadot's 254 became 256. Two claims survived exactly, including the $1,018 against $1,899 hundred-domain comparison. lib/derived-stats.ts computes all of them from the de-duplicated verified rows, so a re-fetch that moves a price moves the sentence. Two rendering defects found while checking the output: backticks rendered literally on guide pages because the emphasis renderer handled the bold marker and not the neighbouring one, and a computed annual total printed as $1018.00 rather than $1,018.

  30. contentdesign

    Every TLD page now has a parent. 223 of the 289 belonged to no hub at all: the category taxonomy holds five curated categories covering 66 extensions, and no category in it could hold a country-code TLD, so /tlds/de/, /tlds/uk/ and /tlds/org-il/ named a registry operator and linked nowhere of ours while /tlds/com/ linked to Verisign. The fix is two more anchored sections on /registries/ rather than new pages: the 248 country-code operators, and the generic operators running too few tracked extensions to have a portfolio worth comparing. Every TLD page resolves to one of the three, so 289 of 289 now have a registry hub, up from 66. Found while wiring it: the anchor lookup was keyed on punycode only, so it silently returned nothing for every IDN namespace, and the Hebrew ccTLD page had no hub. It now matches either form.

  31. securityinfrastructure

    Dependency advisories assessed rather than reflexively upgraded. npm audit reports 7 high vulnerabilities and six dependabot PRs are open, including major bumps for Next 15 to 16 and TypeScript 5 to 7. The three Next.js high advisories are all Server Actions issues, and a grep for 'use server' across app, lib and components returns nothing: this site is fully statically prerendered and ships no Server Actions, so those advisories describe code paths it does not have. The remaining five are build-toolchain packages whose advisories are denial-of-service classes reachable by feeding hostile input to a build, and the only input to this build is this repository. So it is hygiene rather than exposure. The assessment and the conditions that would invalidate it are recorded in docs/operations.md, because the next person to see seven high advisories should not have to re-derive this under time pressure.

  32. dataverificationtrust

    The Public Suffix List is now read, and it found two more wrong namespaces. publicsuffix.org appeared in this repo exactly once, in a citation allowlist, and was never fetched. Second-level coverage was inferred instead from what four registrar catalogues happen to sell, so 21 of 316 ccTLDs had any second level recorded and .il carried none of its eight. The ICANN half of the list is now vendored and drives second_levels: 194 of 316 ccTLDs, 3,377 entries, up from 21 and 73. It independently confirms all eight .il second levels read from ISOC-IL last week. The existence gate the .il correction promised is now real: a namespace named on a country page must exist as a public suffix. It fails the build, and it caught two on its first run. com.ae appears in NEITHER half of the list and does not exist: the UAE registers directly under .ae in the unrestricted zone, and its restricted commercial zone is co.ae, which requires business documentation. com.se is registrable but sits in the PRIVATE half, submitted by CentralNic: it is a privately-operated namespace and not the Swedish registry's, so listing it beside .se as a Swedish ccTLD misled. The gate proves delegation, not eligibility. A namespace can be a public suffix and still be restricted to municipalities, so the registry's own registration page remains what settles who may register.

  33. contentagent-readinessdesign

    Facts-only registrar pages reach parity with what this site already gave AI agents. lib/markdown.ts renders Best for, Not ideal for, Pros and Cons for every one of the 23 registrars, and the HTML page declares that markdown file as its own alternate representation, so at the same canonical URL the site published more to agents than to humans. That is a parity break rather than an omission, and it showed: a facts-only page carried 611 words across six sections while a scored one carried 5,448 across twenty. The four sections are now on the HTML page too, with the field list and ordering ported from lib/markdown.ts so the two cannot drift apart again, and with an explicit line saying the material comes from published documentation and our own price reads rather than from using the account. Also gated: check:schema now fails when a page's sitemap lastmod disagrees with its own Article dateModified. The first version of that check was inserted where it never ran, which lint caught as an unused variable; it is now negative-tested by reintroducing an override and watching the build fail.

  34. trustagent-readinesspipeline

    The freshness signals are true now. 513 of 529 pages carrying an Article node told search engines they were first published on the day one of their price rows was last checked, because datePublished defaulted to dateModified, and that date advanced at every collection run: a page whose publication date moves weekly reads as churn, and it was never true. datePublished is now omitted where we do not know it, which schema.org permits, and asserted only on the 26 pages that carry a real one. Separately, a page's sitemap lastmod and its own JSON-LD dateModified were two answers to the same question. 83 of 200 sampled URLs published a sitemap date fresher than the page's own, by a median of 14 days and a maximum of 96, always in the same direction. Country pages passed their editorial read-date into the JSON-LD while the sitemap used the price date; guides passed a git-derived content date while the sitemap overrode it. Each was individually defensible and no two could both be published for one URL. lastmodFor() is now the single source and has learned the dates the pages were overriding it with, including per-guide git history, per-audience editorial dates and per-registrar agent-readiness check dates. All 529 Article nodes now agree exactly with their sitemap entry, and check:schema fails on any that do not.

  35. contentdesign

    Zero em-dashes now render anywhere on the site, down from 18,140 across 526 of 552 pages. A blind replacement with a hyphen produces garbage, because the mark does several different jobs: an em-dash joining two clauses becomes a compound word, and a paired one is a parenthesis whose halves have to agree. So each occurrence was replaced by grammatical role: a comma before a coordinating conjunction, matched commas around a parenthetical aside, a colon where the right side expands the left, and a colon in a label. The tool deliberately cannot split a sentence, because splitting means capitalising the next word and the next word is not always a word: an earlier version turned the EPP status code serverTransferProhibited into ServerTransferProhibited, corrupting a protocol identifier. Only text a reader can reach was touched; 284 em-dashes remain in code comments, which render nowhere. The build now fails on any em-dash in renderable text, with an empty exemption list because the sweep came first.

  36. contentdesign

    Every row on /cctlds/ now goes somewhere. 243 of the 316 rows had no internal destination at all: they named a registry operator and dead-ended as plain text. The obvious fix is a page per operator and it is the wrong one, because the registry page template is built around a priced portfolio (median renewal, steepest first-year cliff) that a country-code registry does not have, so 248 pages against it would each be the thin page this work exists to stop making. Instead /registries/ gains a complete anchored index of all 248 country-code registry operators, each with the exact IANA sponsoring-organisation string and every namespace it runs, and each ccTLD row links to its operator's anchor when no TLD or country page exists. 316 of 316 rows now have an internal destination.

  37. designcontenttrust

    The coverage map is a real map, and the flags are real flags. The map was about seventy hand-typed longitude and latitude pairs forming five blobs meant to read as continents; it was the largest graphic on the site and did not look like a map. It is now Natural Earth 1:110m (public domain), projected with d3.geoNaturalEarth1 at build time and committed as path data: 177 territories, zero client JavaScript, no mapping library. Natural Earth rather than Mercator, because Mercator inflates high latitudes until Greenland reads larger than Africa, and on a page about which countries a registrar serves that distortion carries a meaning. Singapore and Hong Kong do not survive generalisation to 1:110m, so the map silently omitted two countries it claims to cover; they now get centroid markers computed from the 1:50m geometry rather than coordinates typed from memory. One mechanical shading rule is applied uniformly and stated under the figure: a territory is shaded where a ccTLD is delegated to it in the IANA root and we have a guide for it. Nothing on the map is a statement about sovereignty, there are no city labels and no disputed-area hatching, and the three source geometries with no ISO alpha-2 are drawn as ordinary unshaded land. Flags are lipis/flag-icons 7.5.0 (MIT), 249 files vendored unmodified with the upstream licence and credited at /asset-credits/. Every flag renders from an explicit ISO 3166-1 alpha-2 written per row by scripts/derive-iso2.mjs, never derived from the suffix: .uk is GB, .eu and .su map to no country, and 61 of 316 ccTLDs are IDN labels with no relationship to an ISO code. 312 of 316 rows resolve; the four nulls are the EU and Soviet Union namespaces and render no flag. The last emoji flags are gone.

  38. contentdataagent-readiness

    A namespace can now earn a page on registry knowledge when it cannot earn one on price. build-tld-facts.mjs set verified_pricing from the pricing CSVs and lib/tlds.ts filtered on it, so a namespace no tracked registrar sells could never have a page however much was known about it: /tlds/org-il/, /tlds/net-il/ and every other registry-gated second level returned 404 while the country pages named them to readers. The new gate is deliberately strict, because more thin pages is the opposite of the fix: a namespace qualifies only with a cited source URL, substantive eligibility text, and either an accredited-registrar list or a root-zone DNSSEC state. That is more than most auto-generated TLD pages carry. First six: .org.il, .net.il, .ac.il, .muni.il, .k12.il and Israel's Hebrew IDN ccTLD. Sitemap 545 -> 552.

  39. dataverificationpipelinetrust

    The cheapest-registrar answer was wrong on 242 of 283 extensions, and the cause was collection coverage rather than price. Porkbun was named the cheapest verified renewal on 247 of 283 extensions (87%), which reads as a market verdict. It was a measurement of which catalogues could be read: porkbun 98% coverage, namesilo 93%, dynadot 90%, and then namecheap 12%, spaceship 7%, hover 5%. On 246 of 283 extensions the entire comparison was the three bulk-readable catalogues. Spaceship, measured on 19 extensions, was the cheapest on 18 of them, a higher win rate where present than Porkbun's, because its rows came from a hand read: www.spaceship.com answers 403 to every automated client. A real browser gets 200, and its pricing tab calls a public endpoint that takes a list of extensions and needs no account. Spaceship coverage is now 19 -> 262 and the standings invert: Spaceship is cheapest on 242 of 283 (86%) and Porkbun on 31, a real win rate of 11% where it is measured. Extensions compared against only three catalogues fell from 246 to 19. Two featured claims changed hands (.xyz to Porkbun, .blog to Spaceship) and eleven featured price points moved, nine of them by exactly the 0.20 ICANN fee because the API publishes all-in totals where the storefront read had itemised it; .xyz is a real 10% renewal increase. Every pricing table and every cheapest-registrar heading now states how many registrars the comparison covered, and validate-data reports the concentration on every run and warns when a thinly-collected registrar is winning most of what it is measured on.

  40. pipelinetrustagent-readiness

    The checks that had already found these problems now fail instead of printing into a log. check-sources.mjs correctly exits non-zero on a dead citation, but the pricing workflow ran it as || echo, throwing the exit code away: it had been reporting the dead ISOC-IL policy URL for months. The swallow is gone, and the script is now also wired into the monthly source probe with --all, so all 863 cited URLs are swept rather than the 316 a 1-in-40 sample of the IANA record pages reaches. Dead citations are itemised in the issue the probe raises. A second dead citation surfaced and is repointed: SaudiNIC moved its Saudi Domain Names Registration Regulations from /en/view/regulation to /en/help/regulation. llms-full.txt told every AI crawler to look for a key called notable_local_registrars, which has never existed in this repo, once for each of the 43 countries with no local pick; the real key is local_registrars and only 10 of 60 countries carry one, so the line now says which case applies. llms.txt's country anchor contract advertised six anchors and omitted two that render, including #local-registrars.

  41. datatrustverification

    Three claims removed because they could not be defended. Net4India was listed among India's notable local registrars: ICANN terminated its Registrar Accreditation Agreement, notice issued 26 February 2021 and effective after the stay was lifted in April 2021, and registrants were moved under the De-Accredited Registrar Transition Procedure. Internet Zahav was named on the Israel page as one of "the dominant local choices" and repeated in the ccTLD registrar FAQ; it does not appear on ISOC-IL's published accredited-registrar list, and the sentence also ranked registrars this site has never tested. Singapore recommended Porkbun for .sg and listed Porkbun, Namecheap and GoDaddy as selling it: Porkbun's own public pricing catalogue lists 907 extensions and contains no .sg entry, read 2026-09-02, and we hold no confirming read for the other two. The recommendation is cleared and the seller list emptied, which the page now states as unconfirmed rather than unavailable.

  42. datatrustverification

    Corrections to the Israel country data, all read against ISOC-IL's own pages on 2026-09-02. The site published a namespace that does not exist: a .il entry described as "Direct second-level Israeli registration, opened in January 2022" with a sunrise phase said to have closed in 2023. There is no registration directly under .il. ISOC-IL's registration page lists the third-level extensions only, and the two dates belong to a different namespace: Israel's Hebrew-script IDN ccTLD .ישראל (xn--4dbrk0ce), which opened to the public on 22 November 2022 and whose Protected Registration Period expired on 22 February 2023. The apex entry has been removed and a sourced .ישראל entry added in its place. Four further Israel facts were wrong and are corrected: VAT was stated as 17% and is 18%; .org.il was described as restricted to organisations and associations, while ISOC-IL lists it alongside .co.il as open to the general public; IDN support was described as Hebrew and Arabic, and the registry permits Hebrew letters only; and the restricted second levels were stated incompletely and inconsistently with the page's own ccTLD cards. The four restricted forms .net.il, .ac.il, .muni.il and .k12.il are now recorded in the registry's own wording, including that .k12.il is registered directly by ISOC-IL. The dead citation en.isoc.org.il/domains/policy has been repointed to the registration page it was meant to cite.

  43. dataverificationpipelinecontent

    Spaceship is now verified from primary sources (verified registrars 5 -> 6): its full USD table for 19 TLDs (registration, renewal, transfer, and the separately itemised ICANN fee) was read twice in a real browser on 2026-08-19 with identical results, and the capture is stored in full in data/pricing-sources.json. Because Spaceship itemises the mandatory ICANN fee on its own line while every other registrar's published figures already include it, an icann_fee column was added to both pricing files (0.00 means the price is all-in) and every ranking, cheapest claim, price range and multi-year total now sorts and sums on the all-in figure, so no registrar can gain a position by splitting its price up; the validator rejects a blank or implausible fee and any fee on a ccTLD row. The same manual pass re-read the two other blocked registrars: GoDaddy does render prices to a real browser (the July anti-bot finding is out of date) but geo-routes to its en-uk market and prices in GBP, so those figures are recorded as evidence and deliberately not ingested: new status blocked_geo_currency; Squarespace Domains was re-confirmed as publishing only a price range with no per-TLD table. Separately, the tracked TLD catalog was widened from ~78 to 294 entries and every collector re-run against it: the old narrow list was silently filtering out prices the collectors already read correctly. Porkbun added 212 rows from its public API, NameSilo went 52 -> 261 tracked TLDs, Namecheap 31 -> 33, Hover 14 -> 15, and a new Dynadot collector that walks its full catalog page (dynadot.com/domain/prices, switched to the 500-per-page view) took Dynadot 6 -> 252. 855 rows in each of pricing.csv and tld-pricing.csv now carry last_checked 2026-08-19, and TLDs with two or more verified registrars went from 54 to 263 of 275. Re-fetching corrected prices that had drifted since the June and July reads, including Dynadot .co first year 9.30 -> 3.48 against a renewal that rose 27.04 -> 31.20, and Porkbun .ca 8.75 -> 8.88. TLD pages went 63 -> 280, built from a fresh IANA root-zone pull (data/tld-registry-facts.json: 1,595 root rows, 284 tracked) and gated on verified pricing. The price-history clock also started: data/snapshots/2026-08-19.csv is the first immutable weekly snapshot, 856 verified rows, published at /data/snapshots/; eight snapshots are needed before per-TLD price-history pages can ship. Shipped the same day on the site surface: Markdown twins with Accept negotiation for every content page and the answer hubs, the canonical host fixed to www with data-derived freshness, a build failure on orphan pages, seven comparison pages on the GoDaddy and Squarespace exit corridors, and /registrars/<slug>/alternatives/ pages.

  44. contentdatatrust

    Catalog expansion across registrars, countries and TLDs. Tracked registrars 9 -> 20: Hostinger, IONOS, Name.com, Gandi, AWS Route 53 (Amazon Registrar), WordPress.com, Wix Domains, Shopify Domains, Domain.com, Network Solutions and OVHcloud were added as facts-only entries (tested=false) with sourced facts and official source URLs: no score and no Review/AggregateRating schema, which the validator now enforces. ICANN accreditation was checked against the IANA registrar-ID list: 10 are directly accredited, Shopify has no direct accreditation and is marked a reseller through accredited partners. Country pages 10 -> 30: 20 countries added by ccTLD demand, each registry operator the exact IANA sponsoring organisation citing its IANA root-db record. Only 3 of the 20 have verified tracked-registrar ccTLD pricing; the other 17 state plainly that no tracked registrar sells the ccTLD and point at the registry's own accredited-registrar list rather than inventing a local recommendation. Published data/cctlds.json: every country-code TLD in the IANA root (316: 255 ASCII and 61 IDN; root version 2026062302, fetched 2026-07-16) with operator, IDN mapping and positive-confirmation registrar support read from real catalogs (Porkbun 907 TLDs, NameSilo 471, Namecheap 50, Hover 16). 47 ccTLDs have at least one confirmed tracked registrar; absence means unknown, never 'not offered'. Coverage against the live IANA root is now checked by validate-data. TLD pages 9 -> 62 with IANA-verified registry facts behind an anti-thin gate: a TLD page enters the sitemap only once at least one verified price row exists (.co.il renders but is held out). Also shipped: the /cheapest-domains/ and /tld-price-list/ rollups, an RDAP-backed domain registrar lookup tool, a 1/3/5/10-year TCO cost calculator, the /guides/ hub with cost, lifecycle, privacy and transfer clusters, a 35-pair sourced transfer matrix, and the glossary 24 -> 114 terms. Fixed a price contradiction on the Australia page and added a validator rule that fails the build on any hardcoded price literal in country prose.

  45. dataverificationpipeline

    Built the verified-pricing ingestion pipeline and took verified registrars from 2 to 5 of 9. scripts/fetch-pricing.mjs ingests Porkbun's public pricing API into pricing.csv and tld-pricing.csv with a source_url and last_checked on every row (Porkbun 6 -> 43 verified TLDs, then 62 of a widened 82-TLD tracked spine). scripts/fetch-pricing-headless.mjs renders the JS-only pricing pages that return 403 to a plain fetch in a real Chromium via Playwright and extracts the published per-TLD figures, with a dedicated extractor per site: Namecheap (single register/renew/transfer table, 31 TLDs), NameSilo (three tabs, single-domain 1-49 tier, 52 TLDs) and Hover (trending table, 14 TLDs: Hover does not sell .ai). Both scripts share scripts/pricing-shared.mjs so the tracked-TLD list cannot drift between them, and neither fabricates a figure: a TLD with no rendered price is skipped and reported. Namecheap, NameSilo and Hover flipped to verified=true with verified_primary provenance (method headless_render, last_verified 2026-07-15); pricing.csv grew 42 -> 189 rows and tld-pricing.csv 42 -> 179. Added the cheapest-ranking guardrail so a stale sample price can never back a 'cheapest' claim: every pricing row is annotated with its registrar's verified flag at load, rankByPrice() returns verified rows first, and cheapestVerified() returns a verified row or nothing. GoDaddy (Akamai returns 403 to a headless browser too), Spaceship (no per-TLD price table) and Squarespace Domains (flat-pricing marketing page) stayed unverified, each with its blocker documented in registrars.json and pricing-sources.json.

  46. dataagent-readinessinfrastructure

    Agent-facing data surfaces, built 2026-06-26 to 2026-07-07 and merged to main on 2026-08-05/06 (PRs #24-#30, #40). Tracked registrars 7 -> 9: NameSilo (2026-06-28) and Hover (2026-06-29) added with scores, pricing source strategies and corrected accreditation and pricing claims; GoDaddy's February 2026 terms-of-service consumer-protection change was documented as a dated editorial notice. New machine-readable endpoints: /data/api-access.json describing each registrar's API access tier (2026-06-30), per-registrar agent profiles at /data/registrars/<slug>.json (2026-07-01), and a site-wide data index at /data/index.json (2026-07-07) that catalogs every published endpoint with its format, contents, the pages it backs, freshness and an honest verification label, so an agent no longer has to know each path in advance. The Agent Readiness Index was extended to NameSilo and Hover (agent-readiness.json last_updated 2026-07-02). Also added the registrar API access-tiers reference page, an RDAP transition section on the AI-agents page, and DNS-management and domain-APIs audience landing pages.

  47. dataagent-readinesscontent

    Published /domain-registrar-mcp/ and /data/domain-registrar-mcp.json: a tracker of which domain registrars publish an official, first-party Model Context Protocol server and, where they do, whether it is read/write management or read-only search, plus endpoint, auth model, method coverage and sandbox status. Every capability detail was re-verified live against each registrar's own MCP endpoint on 2026-07-06. Of the 9 registrars tracked at that date, two ship an official MCP: NameSilo's read/write management server (mcp.namesilo.com/rpc, 80+ methods, X-API-KEY auth, sandbox) can register, transfer and manage DNS end to end, while GoDaddy's read-only server (api.godaddy.com/v1/domains/mcp, streamable HTTP, no auth) answers search and availability only. Cloudflare Registrar, Porkbun, Namecheap, Spaceship, Dynadot, Hover and Squarespace Domains publish none; community wrappers are noted separately and never counted as official. The official-MCP yes/no signal is grounded in Open Domain Data agent_capability_signals@2026.05, with NameSilo and Hover named as not-yet-in-dataset rather than folded into its counts. Merged to main on 2026-08-05 (PR #29).

  48. dataverificationpipeline

    Built an autonomous pricing-verification pipeline (scripts/verify-pricing-auto.mjs + data/pricing-sources.json) that probes each registrar's primary pricing source, classifies it (reachable / anti-bot 403 / JS-rendered), and reports what can be verified without a human reading prices off a browser. Used it to expand verified-from-primary-source coverage from 1 registrar to 2: re-verified Porkbun against porkbun.com/products/domains (corrected .org renewal/transfer to $11.84 with a $7.98 first-year sale, and fixed the stale .org row in tld-pricing.csv the previous pass missed) and newly verified Dynadot against its per-TLD pages (dynadot.com/domain/<tld>), which bypass the JS-only combined price list that was the original blocker. Dynadot's recorded prices had all drifted, e.g. .com is now $10.88 (was $8.99/$11.99) and .ai $85.60 with a $171.20 transfer. Confirmed Cloudflare Registrar's at-cost model from Cloudflare's developer docs (per-TLD amount = registry wholesale fee, so it is model_confirmed rather than re-listed). Recorded per-registrar provenance in a new pricing_verification object (status, method, primary/per-TLD sources, what blocked an automated read) and added a source_url column to tld-pricing.csv so every row is traceable. Namecheap, GoDaddy and Spaceship return HTTP 403 to a plain fetch and Squarespace renders prices client-side; those four stay verified=false with the blocker documented, pending a JS-rendering crawl. The data validator now enforces this provenance.

  49. contentdataagent-readiness

    Launched the Agent Readiness Index (methodology v0.1): a transparent 0–100 score for how ready each registrar is for AI agents, across 10 weighted criteria (API coverage, authentication & delegation, agent safety, developer experience, agent-interface readiness, pricing transparency, DNS & infrastructure, privacy & compliance, support quality, trust signals). Every sub-score is tied to a cited public source and the overall recomputes from the sub-scores and published weights. As of this date: Cloudflare Registrar 78.7, Porkbun 63.2, GoDaddy 60.4, Namecheap 58.5, Dynadot 56.7, Spaceship 54.9, Squarespace Domains 27.8. Added the companion answer page /best-domain-registrars-for-ai-agents/ and published /data/agent-readiness.json. Headline finding: no registrar yet ships agent-native safety controls for domain operations; GoDaddy is the only registrar with an official (read-only) MCP server.

  50. datacontentdesign

    Replaced placeholder registrar logos with real brand marks (Simple Icons, CC0) wrapped in each registrar's brand color. Added 10 verified Porkbun ccTLD pricing rows (.us, .uk, .co.uk, .ca, .de, .in, .co.in, .nl, .au, .com.au) sourced from porkbun.com/products/domains. Country pages now show a per-ccTLD breakdown with eligibility rules, registry coverage, local registrar lists, and verified-pricing tables. Switched 'Best for country-code domains' from Namecheap to Porkbun based on verified coverage and pricing.

  51. securityprivacyinfrastructure

    Production hardening: CSP and security headers, consent-gated analytics, programmatic favicon and manifest, per-page Open Graph images for registrar reviews, /privacy/ and /changelog/ pages, branded 404, and security.txt.

  52. dataverification

    Verified Porkbun pricing against the registrar's published pricing page (.com, .net, .org, .io, .ai, .co). Updated Cloudflare Registrar facts to remove the outdated 'transfer-only' claim. Added a verified boolean per registrar; Porkbun is the only verified entry as of this date.

  53. contenttrust

    Expanded country pages with verifiable registry facts (registry operator, policy authority, nexus rules, DNSSEC, IDN) sourced from each ccTLD's official registry page. Expanded TLD pages with registry operator and IANA root references.

  54. infrastructure

    Migrated next lint to standalone ESLint, added validate:data script, added GitHub Actions check workflow (lint + typecheck + validate + build).

  55. launch

    Initial MVP foundation: 63 SSG routes across registrar reviews, country guides, TLD pages, comparisons, pricing tracker, methodology, data downloads, llms.txt, llms-full.txt, sitemap.xml, robots.txt. All key content server-rendered.